From a06a44c1728e701e6e050fa09525eeca00b40ca6 Mon Sep 17 00:00:00 2001 From: EXPORTS-bot Date: Tue, 8 Aug 2023 02:00:18 +0000 Subject: [PATCH] Updated exports --- exports/export.edn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exports/export.edn b/exports/export.edn index dc3a170..7483bb9 100644 --- a/exports/export.edn +++ b/exports/export.edn @@ -1 +1 @@ -{:created-at 1691313994823, :description "ClojureDocs Data Export", :vars [{:ns "clojure.core", :name "def", :type "var", :see-alsos [{:created-at 1289040035000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defn", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b15"} {:created-at 1289040039000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "fn", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b16"} {:created-at 1289040051000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defmacro", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b17"} {:created-at 1289040055000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defmulti", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b18"} {:created-at 1421928720188, :author {:login "Gitward", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8510849?v=3"}, :to-var {:ns "clojure.core", :name "defonce", :library-url "https://github.com/clojure/clojure"}, :_id "54c0e910e4b0e2ac61831cce"} {:created-at 1426949770053, :author {:login "ryoakg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/23413?v=3"}, :to-var {:ns "clojure.core", :name "ns-unmap", :library-url "https://github.com/clojure/clojure"}, :_id "550d868ae4b056ca16cfecf8"}], :examples [{:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (def my-val 5)\n#'user/my-val\n\nuser=> my-val\n5", :created-at 1289040027000, :updated-at 1411962925119, :_id "542692cfc026201cdc326e95"} {:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [], :body "user=> (def my-function (fn [x] (* x x x)))\n#'user/my-function\nuser=> (my-function 4)\n64", :created-at 1289040110000, :updated-at 1289040110000, :_id "542692cfc026201cdc326e96"} {:author {:login "puredanger", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/89c8afd032c7b3473f67c9b00d3acd5a?r=PG&default=identicon"}, :editors [{:login "puredanger", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/89c8afd032c7b3473f67c9b00d3acd5a?r=PG&default=identicon"} {:login "pjlegato", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4ce55cfd8b3ae2f63f5ecbc8fc1c05d4?r=PG&default=identicon"} {:login "pjlegato", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4ce55cfd8b3ae2f63f5ecbc8fc1c05d4?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; This is an example of setting a docstring during a def.\n;; (Note that the clojure.repl namespace which contains the\n;; doc function is not loaded by default in Emacs' SLIME mode.)\n\nuser> (def ted-nugent \"The nuge rocks\" 123)\n#'user/ted-nugent\nuser> (doc ted-nugent)\n-------------------------\nuser/ted-nugent\n The nuge rocks\nuser> ted-nugent\n123\n", :created-at 1300830366000, :updated-at 1411962895678, :_id "542692cfc026201cdc326e97"} {:author {:login "jamesqiu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc1268deaa7f2e78fe2b5ea76e6481d8?r=PG&default=identicon"}, :editors [{:login "jamesqiu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc1268deaa7f2e78fe2b5ea76e6481d8?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; give function another name\nuser=> (def sys-map map)\n\n;; give macro another name\nuser=> (def #^{:macro true} sys-loop #'loop)", :created-at 1313515810000, :updated-at 1411962917894, :_id "542692cfc026201cdc326e9b"} {:updated-at 1518778836326, :created-at 1518778836326, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;Assign a Function to a Variable\n\n(def say-hello\n (fn [name]\n (str \"Hello \" name)))\n\n(say-hello \"World\")\n;;\"Hello World\"\n\n\n;;the same but using an anonymous function\n(def say-hello\n #(str \"Hello \" %))\n\n(say-hello \"World\")\n;;\"Hello World\"\n\n\n;;anonymous function using two arguments\n(def hello-doc #(str \"Hello \" %1 %2))\n\n(hello-doc \"Dr.\" \"House\")\n;;\"Hello Dr.House\"\n\n", :_id "5a86b9d4e4b0316c0f44f8c6"} {:updated-at 1640101185494, :created-at 1640101185494, :author {:login "deadghost", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1156996?v=4"}, :body ";; Private var\n(def ^:private foobar\n \"I am the docstring.\"\n \"I am the value.\")\n", :_id "61c1f541e4b0b1e3652d758c"} {:updated-at 1654772119878, :created-at 1654772119878, :author {:login "clojer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/107184681?v=4"}, :body "\n;; function checks: variable = 9 or not\nuser=> (def ?9 #(= % 9))\n#'user/?9\nuser=> (?9 9)\ntrue\nuser=> (?9 5)\nfalse", :_id "62a1d197e4b0b1e3652d75fa"}], :notes nil, :arglists [], :doc "Creates and interns or locates a global var with the name of symbol and a\nnamespace of the value of the current namespace (*ns*). See\nhttp://clojure.org/special_forms for more information.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/def"} {:ns "clojure.core", :name "if", :type "var", :see-alsos [{:created-at 1302510837000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "cond", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e12"} {:created-at 1311797747000, :author {:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "when", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e13"} {:created-at 1334293230000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "if-let", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e14"} {:created-at 1340541172000, :author {:login "jhulten", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b15299ac3f0bf5347d14a1232338b1cd?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "if-not", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e15"} {:created-at 1545243343724, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "when-let", :ns "clojure.core"}, :_id "5c1a8acfe4b0ca44402ef5ed"}], :examples [{:author {:login "Victor", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc41ebab54cc0e0fbe99d753876d45ce?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "(defn is-small? [number]\n (if (< number 100) \"yes\" \"no\"))\n\nuser=> (is-small? 50)\n\"yes\"\n\nuser=> (is-small? 500)\n\"no\"", :created-at 1288222254000, :updated-at 1288871229000, :_id "542692cfc026201cdc326e9d"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; Be aware that the only two values considered \"logical false\" in Clojure\n;; are nil and false, where Clojure's \"false\" is the Java value Boolean/FALSE\n;; under the hood. Everything else is \"logical true\". Particularly surprising\n;; may be that the Java Object with class Boolean and value (Boolean. false) is\n;; considered logical true.\n\n;; This notion of logical true and logical false holds for at least the following\n;; conditional statements in Clojure: if, cond, when, if-let, when-let.\n;; It also applies to functions like filter, remove, and others that use\n;; these conditional statements in their implementation.\n\n;; nil and false are logical false\nuser=> (if nil \"logical true\" \"logical false\")\n\"logical false\"\nuser=> (if false \"logical true\" \"logical false\")\n\"logical false\"\n;; Boolean/FALSE is how Clojure's \"false\" is represented internally.\nuser=> (if Boolean/FALSE \"logical true\" \"logical false\")\n\"logical false\"\n\n;; Everything else that is the value of the condition, including numbers (even 0),\n;; characters, strings (even the empty string), vectors, maps, _and_ a freshly\n;; constructed Boolean class object (Boolean. false), is logical true.\n\nuser=> (if 0 \"logical true\" \"logical false\")\n\"logical true\"\n;; A vector containing nil is not the same as nil.\nuser=> (if [nil] \"logical true\" \"logical false\")\n\"logical true\"\nuser=> (if (first [nil]) \"logical true\" \"logical false\")\n\"logical false\"\n\n;; Bad idea even in Java. See below for more details.\nuser=> (if (Boolean. false) \"logical true\" \"logical false\")\n\"logical true\"\n\n;; Java documentation itself warns:\n;; Note: It is rarely appropriate to use this constructor. Unless a new instance\n;; is required, the static factory valueOf(boolean) is generally a better choice.\n;; It is likely to yield significantly better space and time performance.\n\n;; (boolean x) converts a value to a primitive boolean. It converts nil, false,\n;; and (Boolean. false) to primitive false.\nuser=> (if (boolean (Boolean. false)) \"logical true\" \"logical false\")\n\"logical false\"\n\n;; (Boolean/valueOf ) is similar:\nuser=> (if (Boolean/valueOf (Boolean. false)) \"logical true\" \"logical false\")\n\"logical false\"\n", :created-at 1334293223000, :updated-at 1422027142917, :_id "542692d6c026201cdc3270cc"} {:updated-at 1603184553184, :created-at 1603184553184, :author {:login "agodde", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/18694682?v=4"}, :body ";; if vs. when\n\n;; An if without an else branch...\nuser=> (if true \"then branch\")\n\"then branch\"\nuser=> (if false \"then branch\")\nnil\n\n;; ...is the same as when.\nuser=> (when true \"then branch\")\n\"then branch\"\nuser=> (when false \"then branch\")\nnil\n\n;; Use of when instead of if is recommended in cases where you do not need the else branch.", :_id "5f8ea7a9e4b0b1e3652d73e6"}], :notes [{:author {:login "kimtg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7685905?v=3"}, :updated-at 1441174250945, :created-at 1441174250945, :body "```\nuser=> (doc if)\n-------------------------\nif\n (if test then else?)\nSpecial Form\n Evaluates test. If not the singular values nil or false,\n evaluates and yields then, otherwise, evaluates and yields else. If\n else is not supplied it defaults to nil.\n\n Please see http://clojure.org/special_forms#if\n```\nhttp://clojure.org/special_forms#if", :_id "55e692eae4b0efbd681fbb92"}], :arglists [], :doc "Evaluates test.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/if"} {:ns "clojure.core", :name "do", :type "var", :see-alsos nil, :examples [{:author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; do is used to evaluate multiple expressions in order, usually for the\n;; purpose of evaluating exprs that have side-effects (such as printing\n;; or I/O). do returns the value of its last expression.\n;;\n;; do w/o args returns nil.\n\n=> (do\n (println \"LOG: Computing...\")\n (+ 1 1))\nLOG: Computing...\n2\n\n=> (do)\nnil\n", :created-at 1287999552000, :updated-at 1287999682000, :_id "542692cfc026201cdc326e9f"} {:body ";; `fn` (`defn` by extension) and `let` have an implicit `do`\n\n=> ((fn []\n (println \"Something\") ; printed in stdout\n (str \"Return this\")))\n\"Return this\"\n\n=> (defn do-example []\n (println \"Something\") ; printed in stdout\n (str \"Return this\")))\n=> (do-example)\n\"Return this\"\n\n=> (let [name \"John\"]\n (println \"Something\") ; printed in stdout\n (str \"Hello \" name))\n\"Hello John\"", :author {:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"}, :created-at 1432926921112, :updated-at 1432927054881, :editors [{:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"}], :_id "5568bac9e4b03e2132e7d180"} {:updated-at 1456676930045, :created-at 1456676817498, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body "user=> (if (> 2 1)\n (do\n (print \"2 greater than 1\") ; with 'do' you can extend if block\n true))\n\n;;=>\"2 greater than 1\"\n;;=>true", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3", :account-source "github", :login "ertugrulcetin"}], :_id "56d31fd1e4b0b41f39d96cd6"} {:updated-at 1500223229802, :created-at 1500223229802, :author {:login "joncorr", :account-source "github", :avatar-url "https://avatars6.githubusercontent.com/u/908484?v=4"}, :body ";; Print the result of time without the output of (range 1000)\n\n=> (do (time (range 1000)) nil)", :_id "596b96fde4b0d19c2ce9d6fe"}], :notes nil, :arglists [], :doc "Evaluates the expressions in order and returns the value of the last. If no\nexpressions are supplied, returns nil. See http://clojure.org/special_forms\nfor more information.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/do"} {:ns "clojure.core", :name "quote", :type "var", :see-alsos [{:created-at 1537911884113, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unquote", :ns "clojure.core"}, :_id "5baaac4ce4b00ac801ed9ea7"}], :examples [{:updated-at 1650678469915, :created-at 1293674217000, :body ";; ' is the shortcut for quote\nuser> (= 'a (quote a))\ntrue\n\n;; quoting keeps something from being evaluated\nuser> (quote (println \"foo\"))\n(println \"foo\")\n\n=> *clojure-version*\n{:major 1, :minor 5, :incremental 0, :qualifier \"RC17\"}\n=> (quote)\nnil\n=> (quote 1)\n1\n=> (quote 1 2 3 4 5) ; this worked in Clojure 1.0 through 1.7 but stopped working in 1.8\n1\n=> quote\nCompilerException java.lang.RuntimeException: Unable to resolve symbol: quote in this context, compiling:(NO_SOURCE_PATH:1:42)\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon", :account-source "clojuredocs", :login "AtKaaZ"} {:avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon", :account-source "clojuredocs", :login "AtKaaZ"} {:login "seancorfield", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/43875?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon", :account-source "clojuredocs", :login "dakrone"}, :_id "542692d0c026201cdc326ea2"} {:body ";; Proof that ' is just a syntactic sugar for quote:\nuser=> (macroexpand ''(1 2 3))\n(quote (1 2 3))\n\n;; Two ' must be used because reader processes and removes the first one", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423019653856, :updated-at 1423019653856, :_id "54d18e85e4b081e022073c54"} {:updated-at 1549280175530, :created-at 1549280175530, :author {:login "Bost", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1174677?v=4"}, :body ";; Quote returns the argument you pass it, without evaluation. So:\n;; In the expression `(quote 42)` the argument is the number 42 and...\nuser> (= (quote 42) 42)\ntrue ;; ... it is returned without any evaluation and...\nuser> (= (type (quote 42)) (type 42) java.lang.Long)\ntrue ;; ... as expected, without changing it's type.\n\n;; In the expression `(quote (quote 42))` the argument is the list of two\n;; elements `(quote 42)` ...\nuser> (= (quote (quote 42)) (list (read-string \"quote\") (read-string \"42\")))\ntrue ;; ... and it is returned without any evaluation and...\nuser> (= (type (quote (quote 42))) (type (list \"1st-elem\" \"2nd-elem\"))\n clojure.lang.PersistentList)\ntrue ;; ... again, without changing it's type.", :_id "5c5823afe4b0ca44402ef662"} {:editors [{:login "soulawaker", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/5372217?v=4"}], :body ";; Since clojure 1.9, if all keys in a map have the same namespace qualifier\n;; then the common namespace become the prefix of the map.\nuser> 'org.clojure/clojure\norg.clojure/clojure\n\nuser> '{org.clojure/clojure 3}\n#:org.clojure{clojure 3} ;; expecting {org.clojure/clojure 3} but not\n\nuser> '{org.clojure/clojure 3 :k 8}\n{org.clojure/clojure 3, :k 8} ;; Because of the keys' different namespaces \n\n;; If you want to avoid second case then flip *print-namespace-maps* temporally.\nuser> (binding [*print-namespace-maps* false]\n (pprint '{org.clojure/clojure 3}))\n{org.clojure/clojure 3}\nnil\n\n;; 'This is not a thing about quote. It is about map with key of namespaced keyword.'\n;; (@ShiTianshu's reply is quoted from below link)\n;; To know the detail reason, go to the below link and see the reply of @didibus.\n;; https://clojureverse.org/t/the-quote-special-form-behaves-strangely-on-maps/4879#post_2", :author {:avatar-url "https://avatars2.githubusercontent.com/u/5372217?v=4", :account-source "github", :login "soulawaker"}, :created-at 1569190020566, :updated-at 1569354172296, :_id "5d87f084e4b0ca44402ef7ba"}], :notes [{:updated-at 1289668928000, :body "Quote gives you the unevaluated form. That is:\r\n\r\n
user=> '(foo bar baz)
\r\n\r\nWill not attempt to evaluate foo as a function but rather just return the data structure as is (with the three symbols unevaluated).", :created-at 1289662273000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fa3"} {:updated-at 1371659988000, :body "I found this blog post interesting: http://blog.8thlight.com/colin-jones/2012/05/22/quoting-without-confusion.html\r\n\r\nCheers", :created-at 1371659988000, :author {:login "santeron", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/27a696b2606968635d5f4a5c6e2c7871?r=PG&default=identicon"}, :_id "542692edf6e94c6970522006"}], :arglists [], :doc "Yields the unevaluated form. See http://clojure.org/special_forms for more\ninformation.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/quote"} {:ns "clojure.core", :name "var", :type "var", :see-alsos [{:created-at 1289212861000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "meta", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c12"} {:created-at 1289212876000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "symbol", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c13"} {:created-at 1289212908000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "symbol?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c14"} {:created-at 1289212912000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "var?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c15"} {:created-at 1349393081000, :author {:login "eric", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2b0c9ae6f1da9716451e7c86bc87230b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "binding", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c17"} {:created-at 1349393092000, :author {:login "eric", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2b0c9ae6f1da9716451e7c86bc87230b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-redefs", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c18"} {:created-at 1349393097000, :author {:login "eric", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2b0c9ae6f1da9716451e7c86bc87230b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-redefs-fn", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c19"} {:created-at 1349393197000, :author {:login "eric", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2b0c9ae6f1da9716451e7c86bc87230b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "set!", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c1a"} {:created-at 1362015211000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "var-set", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c1b"} {:created-at 1362015214000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "var-get", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c1c"} {:created-at 1362015219000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-local-vars", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c1d"}], :examples [{:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body ";;getting meta-data for a defined symbol (as opposed to what it's pointing to.\n\nuser=> meta\n#\n\nuser=> (var meta)\n#'clojure.core/meta\n\n;; Reader shortcut for var is #'\nuser=> #'meta\n#'clojure.core/meta\n\nuser=> (meta (var meta))\n{:ns #, :name meta, :file \"clojure/core.clj\", :line 178, :arglists ([obj]), :doc \"Returns the metadata of obj, returns nil if there is no metadata.\", :added \"1.0\"}\n", :created-at 1289212848000, :updated-at 1423522981079, :_id "542692d0c026201cdc326ea5"} {:author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :editors [{:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}], :body "=> *clojure-version*\n{:major 1, :minor 5, :incremental 0, :qualifier \"RC17\"}\n=> var\n;CompilerException java.lang.RuntimeException: Unable to resolve symbol: var in this context, compiling:(NO_SOURCE_PATH:1:42) \n=> (var)\n;CompilerException java.lang.NullPointerException, compiling:(NO_SOURCE_PATH:1:1) \n=> (var 1)\n;CompilerException java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.Symbol, compiling:(NO_SOURCE_PATH:1:1) \n=> (var defn)\n#'clojure.core/defn\n=> (var defn 1 2 3 4)\n#'clojure.core/defn\n", :created-at 1362014971000, :updated-at 1362015006000, :_id "542692d6c026201cdc3270d0"} {:editors [{:login "beoliver", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1413969?v=4"}], :body "user> (def a 1)\n#'user/a\n\nuser> (def b (var a))\n#'user/b\n\nuser> (alter-var-root (var a) inc)\n2\n\nuser> (alter-var-root b inc)\n3\n\nuser> (deref b)\n3\n", :author {:avatar-url "https://avatars2.githubusercontent.com/u/1413969?v=4", :account-source "github", :login "beoliver"}, :created-at 1509263736051, :updated-at 1509263779264, :_id "59f58978e4b0a08026c48c80"}], :notes nil, :arglists [], :doc "The symbol must resolve to a var, and the Var object itself (not its value)\nis returned. The reader macro #'x expands to (var x). See\nhttp://clojure.org/special_forms for more information.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/var"} {:ns "clojure.core", :name "recur", :type "var", :see-alsos [{:created-at 1289618026000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "loop", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e3a"} {:created-at 1289618032000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "trampoline", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e3b"}], :examples [{:updated-at 1524485644327, :created-at 1290256018000, :body "(def factorial\n (fn [n]\n (loop [cnt n\n acc 1]\n (if (zero? cnt)\n acc\n (recur (dec cnt) (* acc cnt))\n; in loop cnt will take the value (dec cnt)\n; and acc will take the value (* acc cnt)\n))))", :editors [{:avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon", :account-source "clojuredocs", :login "john.r.woodward"} {:login "allentiak", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1922297?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/a06d0fc5d5b9a1d254e566c1d0e449a8?r=PG&default=identicon", :account-source "clojuredocs", :login "ique"}, :_id "542692d0c026201cdc326ea6"} {:author {:login "ique", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a06d0fc5d5b9a1d254e566c1d0e449a8?r=PG&default=identicon"}, :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/1922297?v=4", :account-source "github", :login "allentiak"}], :body "; A loop that sums the numbers 10 + 9 + 8 + ...\n\n; Set initial values count (cnt) from 10 and down\n(loop [sum 0\n cnt 10]\n ; If count reaches 0 then exit the loop and return sum\n (if (= cnt 0)\n sum\n ; Otherwise add count to sum, decrease count and \n ; use recur to feed the new values back into the loop\n (recur (+ cnt sum) (dec cnt))))", :created-at 1290256169000, :updated-at 1524485722720, :_id "542692d0c026201cdc326ea8"} {:author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :editors [], :body "(loop [i 0] \n (when (< i 5) \n (println i) \n (recur (inc i)); loop i will take this value\n))", :created-at 1342658004000, :updated-at 1342658004000, :_id "542692d6c026201cdc3270d2"} {:author {:login "azkesz", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/467196a4f2498080c9740a81fcbde855?r=PG&default=identicon"}, :editors [{:login "azkesz", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/467196a4f2498080c9740a81fcbde855?r=PG&default=identicon"}], :body "(defn compute-across [func elements value]\n (if (empty? elements)\n value\n (recur func (rest elements) (func value (first elements)))))\n\n(defn total-of [numbers]\n (compute-across + numbers 0))\n\n(defn larger-of [x y]\n (if (> x y) x y))\n\n(defn greatest-of [numbers]\n (compute-across larger-of numbers (first numbers)))", :created-at 1345941881000, :updated-at 1345942092000, :_id "542692d6c026201cdc3270d3"} {:editors [{:login "jdwaterson", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2714395?v=3"}], :body "; Note that recur can be surprising when using variadic functions.\n\n(defn foo [& args]\n (let [[x & more] args]\n (prn x)\n (if more (recur more) nil)))\n\n(defn bar [& args]\n (let [[x & more] args]\n (prn x)\n (if more (bar more) nil)))\n\n; The key thing to note here is that foo and bar are identical, except\n; that foo uses recur and bar uses \"normal\" recursion. And yet...\n\nuser=> (foo :a :b :c)\n:a\n:b\n:c\nnil\n\nuser=> (bar :a :b :c)\n:a\n(:b :c)\nnil\n\n; The difference arises because recur does not gather variadic/rest args\n; into a seq.", :author {:avatar-url "https://avatars.githubusercontent.com/u/2714395?v=3", :account-source "github", :login "jdwaterson"}, :created-at 1442790612342, :updated-at 1442872934681, :_id "55ff3cd4e4b08e404b6c1c7f"} {:updated-at 1443215990041, :created-at 1443215347637, :author {:login "teymuri", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/13352033?v=3"}, :body ";;This will generate the first 1000 Fibonacci numbers \n;;(using incrementing and decrementing): \n\n(loop [res [0 1]]\n (if (>= (count res) 1000)\n res\n (recur (conj res (+' (inc (last res)) (dec (last (butlast res))))))))", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/13352033?v=3", :account-source "github", :login "teymuri"}], :_id "5605b7f3e4b08e404b6c1c82"} {:editors [{:login "clojurianix", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19415437?v=3"}], :body ";; The recursion point can be a 'loop' or a 'fn' method.\n\n(loop [n (bigint 5), accumulator 1]\n (if (zero? n)\n accumulator ; we're done\n (recur (dec n) (* accumulator n))))\n;;=> 120N\n\n\n((fn factorial\n ([n] (factorial n 1))\n\n ([n accumulator]\n (if (zero? n)\n accumulator ; we're done\n (recur (dec n) (* accumulator n)))))\n\n (bigint 5))\n;;=> 120N", :author {:avatar-url "https://avatars.githubusercontent.com/u/19415437?v=3", :account-source "github", :login "clojurianix"}, :created-at 1463825907835, :updated-at 1463826090672, :_id "574035f3e4b0a1a06bdee495"} {:updated-at 1608716871582, :created-at 1608716871582, :author {:login "caumond", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11491686?v=4"}, :body ";; Trailing position could be multiple\n(loop [x 1]\n (println \"x= \" x)\n (cond\n (> x 10) (println \"ending at \" x )\n (even? x) (recur (* 2 x))\n :else (recur (+ x 1))))", :_id "5fe31247e4b0b1e3652d7420"}], :notes nil, :arglists [], :doc "Evaluates the exprs in order, then, in parallel, rebinds the bindings of\nthe recursion point to the values of the exprs. See\nhttp://clojure.org/special_forms for more information.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/recur"} {:ns "clojure.core", :name "throw", :type "var", :see-alsos [{:created-at 1341631202000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "try", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f2e"} {:created-at 1341631204000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "catch", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f2f"} {:created-at 1341631207000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "finally", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f30"} {:created-at 1430235342019, :author {:login "ljosa", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/197881?v=3"}, :to-var {:ns "clojure.core", :name "ex-info", :library-url "https://github.com/clojure/clojure"}, :_id "553fa8cee4b06eaacc9cda7f"} {:created-at 1460277375628, :author {:login "ryoakg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/23413?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ex-data", :ns "clojure.core"}, :_id "570a107fe4b075f5b2c864df"}], :examples [{:author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :editors [], :body "=> (throw (Exception. \"my exception message\"))\njava.lang.Exception: my exception message (NO_SOURCE_FILE:0)\n", :created-at 1288000015000, :updated-at 1288000015000, :_id "542692d0c026201cdc326ea9"} {:editors [{:login "green-coder", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4"}], :body ";; Different types of exception can be thrown\n=> (throw (AssertionError. \"Wrong input.\"))\njava.lang.AssertionError: Wrong input.", :author {:avatar-url "https://avatars3.githubusercontent.com/u/10631263?v=4", :account-source "github", :login "asiegfried"}, :created-at 1501935005004, :updated-at 1533054136477, :_id "5985b59de4b0d19c2ce9d70b"} {:updated-at 1603831007076, :created-at 1603831007076, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/8271291?v=4"}, :body ";; ClojureScript usage\n=> (throw (js/Error. \"something went wrong...\"))", :_id "5f9884dfe4b0b1e3652d73f6"}], :notes nil, :arglists [], :doc "The expr is evaluated and thrown, therefore it should yield an instance of\nsome derivee of Throwable. Please see http://clojure.org/special_forms#throw", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/throw"} {:ns "clojure.core", :name "try", :type "var", :see-alsos [{:created-at 1287995793000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "catch", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f49"} {:created-at 1341631154000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "finally", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f4a"} {:created-at 1341631196000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "throw", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f4b"} {:created-at 1517506079914, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ex-info", :ns "clojure.core"}, :_id "5a734e1fe4b076dac5a728af"} {:created-at 1517506631341, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ex-data", :ns "clojure.core"}, :_id "5a735047e4b076dac5a728b0"}], :examples [{:author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :editors [], :body "=> (try\n (/ 1 0)\n (catch Exception e (str \"caught exception: \" (.getMessage e))))\n\n\"caught exception: Divide by zero\"", :created-at 1287995834000, :updated-at 1287995834000, :_id "542692d0c026201cdc326eaa"} {:author {:login "acagle", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7df8ebcd99fdbdd4a2f7682513897692?r=PG&default=identicon"}, :editors [], :body ";; for Clojurescript use js/Object as type\n(try\n (/ 1 0)\n (catch js/Object e\n (.log js/console e)))", :created-at 1344400343000, :updated-at 1344400343000, :_id "542692d6c026201cdc3270d5"} {:editors [{:login "masmatsum", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8317204?v=4"}], :body ";; Example with multiple catch clauses and a finally clause.\n(try (f)\n (catch SQLException se (prn (.getNextException e)))\n (catch Exception2 e (prn \"Handle generic exception\"))\n (finally (prn \"Release some resource\")))", :author {:avatar-url "https://avatars.githubusercontent.com/u/632775?v=3", :account-source "github", :login "Rovanion"}, :created-at 1463816138311, :updated-at 1633612258613, :_id "57400fcae4b00a9b70be566b"} {:editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :body ";; The catch/finally clause is an implicit do.\n(try\n (/ 1 0)\n (catch Exception ex \n (.printStackTrace ex)\n (str \"caught exception: \" (.getMessage ex))))\n;; java.lang.ArithmeticException: Divide by zero\n;;\tat clojure.lang.Numbers.divide(Numbers.java:163)\n;;\tat clojure.lang.Numbers.divide(Numbers.java:3833)\n;; ...\n;; at main.java:37)\n;;=> \"caught exception: Divide by zero\"\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}, :created-at 1513121596628, :updated-at 1513202809575, :_id "5a30673ce4b0a08026c48cd4"} {:updated-at 1554055517810, :created-at 1554055517810, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :body ";; try multiple expressions\n(try (println \"expression 1\")\n (println \"expression 2\")\n (/ 1 0)\n (println \"expression 4\")\n (catch Exception e (println \"expression 3 throws\")))\n;;=> expression 1\n;;=> expression 2\n;;=> expression 3 throws", :_id "5ca1015de4b0ca44402ef6f4"} {:updated-at 1661740260118, :created-at 1661740260118, :author {:login "Obscerno", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33399601?v=4"}, :body ";; The last value in the body of try will be returned.\n(try \"I will not be returned.\"\n \"I will be returned\"\n (catch Exception e (.getMessage e))\n (finally \"I will also not be returned.\"))\n;; => \"I will be returned\"\n\n;; If there's an exception the last value in the body of catch will be returned.\n(try (throw (RuntimeException.))\n \"I will not be returned\"\n (catch Exception e \"I will be returned\")\n (finally \"I will also not be returned.\"))\n;; => \"I will be returned\"", :_id "630c24e4e4b0b1e3652d765d"}], :notes nil, :arglists [], :doc "The exprs are evaluated and, if no exceptions occur, the value of the last\nis returned. If an exception occurs and catch clauses are provided, each is\nexamined in turn and the first for which the thrown exception is an instance\nof the named class is considered a matching catch clause. If there is a\nmatching catch clause, its exprs are evaluated in a context in which name is\nbound to the thrown exception, and the value of the last is the return value\nof the function. If there is no matching catch clause, the exception\npropagates out of the function. Before returning, normally or abnormally,\nany finally exprs will be evaluated for their side effects. See\nhttp://clojure.org/special_forms for more information.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/try"} {:ns "clojure.core", :name "catch", :type "var", :see-alsos [{:created-at 1287995785000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "try", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ad9"} {:created-at 1288000232000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "finally", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ada"} {:created-at 1517620569282, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "throw", :ns "clojure.core"}, :_id "5a750d59e4b0e2d9c35f740b"} {:created-at 1517620590089, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ex-data", :ns "clojure.core"}, :_id "5a750d6ee4b0e2d9c35f740c"} {:created-at 1517620611031, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ex-info", :ns "clojure.core"}, :_id "5a750d83e4b0e2d9c35f740d"} {:created-at 1518042276700, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "print-stack-trace", :ns "clojure.stacktrace"}, :_id "5a7b7ca4e4b0316c0f44f8a7"}], :examples [{:author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :editors [], :body "=> (try\n (/ 1 0)\n (catch Exception e (str \"caught exception: \" (.getMessage e))))\n\n\"caught exception: Divide by zero\"", :created-at 1287995772000, :updated-at 1287995772000, :_id "542692d0c026201cdc326eae"} {:updated-at 1474647298976, :created-at 1474647298976, :author {:login "JoshAaronJones", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19951591?v=3"}, :body ";; multiple catch clauses which handle different exceptions\n\n=> (let [divisor [2 0 \"clojure\"]]\n (try\n (/ 4 (rand-nth divisor))\n (catch ArithmeticException e\n (println \"Probably trying to divide by zero...\")\n 111)\n (catch ClassCastException e\n (println \"Did you try to do math with a string?\")\n 222)\n (catch Exception e\n (println \"Some other exception, won't be caught in this case...\")\n 333)\n (finally\n (println \"Always executed but won't return a value!\"))))\n\n;; first case\nAlways executed but won't return a value!\n=> 2\n\n;; second case\nProbably trying to divide by zero...\nAlways executed but won't return a value!\n=> 111\n\n;; third case\nDid you try to do math with a string?\nAlways executed but won't return a value!\n=> 222", :_id "57e55502e4b0709b524f050a"} {:updated-at 1482420504337, :created-at 1482420504337, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :body ";; Note that in ClojureScript, one can use (catch :default e ...) to catch any \n;; type of value, roughly equivalent to (catch Exception e ...) in JVM Clojure.\n\n(try\n (/ 2 (rand-nth [0 \"oops\"]))\n (catch :default e ; Note: ClojureScript only!\n (println \"Error!\" e)))\n\n;; This is not currently possible in JVM Clojure, though the ticket CLJ-1293 \n;; proposes adding the same behavior there and has some background info.", :_id "585bf118e4b0123d4c9dfa35"}], :notes nil, :arglists [], :doc "The exprs are evaluated and, if no exceptions occur, the value of the last\nis returned. If an exception occurs and catch clauses are provided, each is\nexamined in turn and the first for which the thrown exception is an instance\nof the named class is considered a matching catch clause. If there is a\nmatching catch clause, its exprs are evaluated in a context in which name is\nbound to the thrown exception, and the value of the last is the return value\nof the function. If there is no matching catch clause, the exception\npropagates out of the function. Before returning, normally or abnormally,\nany finally exprs will be evaluated for their side effects. See\nhttp://clojure.org/special_forms for more information.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/catch"} {:ns "clojure.core", :name "finally", :type "var", :see-alsos [{:created-at 1288000213000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "try", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e23"} {:created-at 1288000217000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "catch", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e24"} {:created-at 1517617085736, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ex-data", :ns "clojure.core"}, :_id "5a74ffbde4b0e2d9c35f7406"} {:created-at 1517620981684, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "throw", :ns "clojure.core"}, :_id "5a750ef5e4b0e2d9c35f7410"}], :examples [{:updated-at 1317221828000, :created-at 1288260604000, :body "(try\n (/ 1 0)\n (catch ArithmeticException e (str \"caught exception: \" (.getMessage e)))\n (finally (prn \"final exception.\")))\n\"final exception.\"\n\"caught exception: Divide by zero\"", :editors [{:avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon", :account-source "clojuredocs", :login "philos99"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692d0c026201cdc326eaf"} {:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; finally will always run before returning, even if there is no exception.\n(try\n (+ 1 1)\n (catch ArithmeticException e (str \"caught exception: \" (.getMessage e)))\n (finally (prn \"final print.\")))\n\"final print.\"\n2\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4", :account-source "github", :login "huahaiy"}, :created-at 1592604689313, :updated-at 1663143524487, :_id "5eed3811e4b0b1e3652d7309"}], :notes nil, :arglists [], :doc "The exprs are evaluated and, if no exceptions occur, the value of the last\nis returned. If an exception occurs and catch clauses are provided, each is\nexamined in turn and the first for which the thrown exception is an instance\nof the named class is considered a matching catch clause. If there is a\nmatching catch clause, its exprs are evaluated in a context in which name is\nbound to the thrown exception, and the value of the last is the return value\nof the function. If there is no matching catch clause, the exception\npropagates out of the function. Before returning, normally or abnormally,\nany finally exprs will be evaluated for their side effects. See\nhttp://clojure.org/special_forms for more information.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/finally"} {:ns "clojure.core", :name ".", :type "var", :see-alsos [{:created-at 1461732266533, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "..", :ns "clojure.core"}, :_id "572043aae4b0fc95a97eab5c"}], :examples [{:updated-at 1514391136118, :created-at 1461732237604, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=3"}, :body "(def date (java.util.Date.))\n;; => #'date\n(. date getMonth)\n;; => 11 ; 0-based, so this indicates \"December\"", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/430319?v=4", :account-source "github", :login "jcburley"}], :_id "5720438de4b0fc95a97eab5a"} {:updated-at 1471001203866, :created-at 1471001203866, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body "user=> (. \"abc\" (toUpperCase)) \n;;=> \"ABC\"\n\nuser=> (. \"abc\" toUpperCase) \n;;=> \"ABC\"\n;;if function has one arg you can use non-parenthesis form\n\n", :_id "57adb273e4b0bafd3e2a04f0"} {:updated-at 1555179101611, :created-at 1555175138250, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; '.' For static access\n(. Thread sleep 1000) ; static method of 1 arg.\n(. Math random) ; static field access first, static method of no args next.\n(. Math (random)) ; static method of no args (unambiguously).\n(. Math -PI) ; static field access (unambiguously).\n(. Thread$State NEW) ; inner class static method.\n\n;; Corresponding slashed forms are converted internally to dotted:\n(Thread/sleep 1000) ; static method of 1 arg.\n(Math/random) ; static field access first, static method of no args next.\n(Math/-PI) ; static field access (unambiguously).\n\n;; For instance access \n(import 'java.awt.Point)\n(. (Point. 1 2) x) ; instance field first, method of no args next\n(.x (Point. 1 2)) ; same as above\n(. (Point. 1 2) (getX)) ; instance method (unambiguously)\n(.-x (Point. 1 2)) ; instance field (unambiguously)\n\n;; Showing how to compose names dynamically\n(eval `(. (Point. 1 2) ~(symbol (str \"get\" \"X\"))))\n;; 1.0", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5cb216e2e4b0ca44402ef708"}], :notes nil, :arglists [], :doc "The '.' special form is the basis for access to Java. It can be considered\na member-access operator, and/or read as 'in the scope of'. See\nhttp://clojure.org/special_forms for more information.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/_."} {:ns "clojure.core", :name "set!", :type "var", :see-alsos [{:created-at 1361164008000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "reset!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dc5"} {:created-at 1361164022000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "binding", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dc6"} {:created-at 1361164032000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "alter-var-root", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dc7"} {:created-at 1546021427673, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "atom", :ns "clojure.core"}, :_id "5c266a33e4b0ca44402ef603"}], :examples [{:author {:login "ninjudd", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7ced25585a7556e9b9b975c1f9e136e3?r=PG&default=identicon"}, :editors [], :body "(set! var-symbol expr)", :created-at 1307137727000, :updated-at 1307137727000, :_id "542692d0c026201cdc326ead"} {:author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :editors [], :body "(set! *warn-on-reflection* true)", :created-at 1361163932000, :updated-at 1361163932000, :_id "542692d6c026201cdc3270d6"} {:updated-at 1552509115019, :created-at 1552509115019, :author {:login "nhlx2", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4058121?v=4"}, :body "user=> (let [object (java.awt.Point. 1 2)]\n (set! (. object -y) 8)\n (bean object)\n )\n{:class java.awt.Point, :location #object[java.awt.Point 0x383fc59b \"java.awt.Point[x=1,y=8]\"], :x 1.0, :y 8.0}\n", :_id "5c8968bbe4b0ca44402ef6b4"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; A mutable (and thread unsafe) Counter class.\n;; set! is used to mutate the internal cnt attribute.\n\n(deftype Counter [^:unsynchronized-mutable cnt]\n clojure.lang.IFn\n (invoke [this] (set! cnt (inc cnt))))\n\n(def counter (->Counter 0))\n(counter) ;; 1\n(counter) ;; 2", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1554278192236, :updated-at 1554278208406, :_id "5ca46730e4b0ca44402ef6fb"}], :notes [{:updated-at 1298369674000, :body "As of Clojure 1.2, the basic info for set! has moved to http://clojure.org/vars.", :created-at 1298369674000, :author {:login "gregg-williams", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/58610a64fc8638eec8d2239d80d4046f?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fb3"}], :arglists [], :doc "Assignment special form. When the first operand is a field member access\nform, the assignment is to the corresponding field. If it is an instance\nfield, the instance expr will be evaluated, then the expr. In all cases\nthe value of expr is returned. Note - you cannot assign to function params\nor local bindings. Only Java fields, Vars, Refs and Agents are mutable in\nClojure. See http://clojure.org/special_forms for more information.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/set!"} {:ns "clojure.core", :name "monitor-enter", :type "var", :see-alsos nil, :examples nil, :notes [{:body "\"should be avoided\". OK. But why is it available? How might it be used?\n\nhttp://stackoverflow.com/questions/36485155/use-locking-macro-or-monitor-enter-and-monitor-exit-in-java-from-clojure/36485607", :created-at 1461052938480, :updated-at 1461053268343, :author {:avatar-url "https://avatars.githubusercontent.com/u/11754710?v=3", :account-source "github", :login "terjedahl"}, :_id "5715e60ae4b0fc95a97eab4e"}], :arglists [], :doc "A synchronization primitive that should be avoided in user code. Use the\nlocking macro. See http://clojure.org/special_forms for more information.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/monitor-enter"} {:ns "clojure.core", :name "monitor-exit", :type "var", :see-alsos nil, :examples nil, :notes nil, :arglists [], :doc "A synchronization primitive that should be avoided in user code. Use the\nlocking macro. See http://clojure.org/special_forms for more information.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/monitor-exit"} {:ns "clojure.core", :name "new", :type "var", :see-alsos [{:created-at 1352083329000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name ".", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bf1"}], :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; Create a Java ArrayList using the 0 argument constructor\nuser=> (def a (new java.util.ArrayList))\n#'user/a\nuser=> (.add a \"aaa\")\ntrue\nuser=> (.add a \"bbb\")\ntrue\nuser=> a\n#\n", :created-at 1313491605000, :updated-at 1313491605000, :_id "542692d0c026201cdc326eab"} {:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; Create another ArrayList and add integers using the doto macro\nuser=> (def ai (doto (new java.util.ArrayList) (.add 1) (.add 2) (.add 0)))\n#'user/ai\nuser=> ai\n#", :created-at 1313491629000, :updated-at 1313491629000, :_id "542692d0c026201cdc326eac"}], :notes nil, :arglists [], :doc "Instantiate a class. See http://clojure.org/java_interop#new for\nmore information.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/new"} {:ns "clojure.core", :name "primitives-classnames", :file "clojure/core_print.clj", :type "var", :column 1, :see-alsos nil, :line 372, :examples [{:body "user=> (use 'clojure.pprint)\nuser=> (pprint primitives-classnames)\n{float \"Float/TYPE\",\n int \"Integer/TYPE\",\n long \"Long/TYPE\",\n boolean \"Boolean/TYPE\",\n char \"Character/TYPE\",\n double \"Double/TYPE\",\n byte \"Byte/TYPE\",\n short \"Short/TYPE\"}", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423019236792, :updated-at 1423019236792, :_id "54d18ce4e4b081e022073c53"}], :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/primitives-classnames"} {:added "1.0", :ns "clojure.core", :name "+'", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1412881252224, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "+", :library-url "https://github.com/clojure/clojure"}, :_id "5436db64e4b06dbffbbb00c0"} {:created-at 1423526974611, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "unchecked-add", :library-url "https://github.com/clojure/clojure"}, :_id "54d94c3ee4b081e022073c83"}], :line 972, :examples [{:body "(+')\n;;=> 0\n\n(+' 1)\n;;=> 1\n\n(+' -10)\n;;=> -10\n\n(+' 1 2)\n;;=> 3\n\n(+' 1 2 3)\n;;=> 6\n\n(apply + (range 10000000000000 10000000001000))\n;; ArithmeticException: integer overflow\n\n(apply +' (range 10000000000000 10000000001000))\n;;=> 1000000000499500", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1412881234729, :updated-at 1412881548215, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :_id "5436db52e4b0ae7956031576"} {:body "(class 1)\n;; => java.lang.Long\n\n(+ 1 Long/MAX_VALUE)\n;; => java.lang.ArithmeticException: integer overflow\n;; Numbers.java:1388 clojure.lang.Numbers.throwIntOverflow\n;; Numbers.java:1687 clojure.lang.Numbers.add\n\n(+' 1 Long/MAX_VALUE)\n;; => 9223372036854775808N\n\n(class (+' 1 Long/MAX_VALUE))\n;; => clojure.lang.BigInt\n", :author {:login "yangwansu", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/89217?v=3"}, :created-at 1422876391721, :updated-at 1422876391721, :_id "54cf5ee7e4b081e022073c3e"}], :notes nil, :arglists ["" "x" "x y" "x y & more"], :doc "Returns the sum of nums. (+') returns 0. Supports arbitrary precision.\n See also: +", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/+'"} {:added "1.0", :ns "clojure.core", :name "decimal?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1496006134313, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "bigdec?", :ns "clojure.core"}, :_id "592b3df6e4b093ada4d4d78b"} {:created-at 1496006153201, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "double?", :ns "clojure.core"}, :_id "592b3e09e4b093ada4d4d78c"} {:created-at 1496006158570, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "float?", :ns "clojure.core"}, :_id "592b3e0ee4b093ada4d4d78d"}], :line 3598, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [], :body "user=> (decimal? 1)\nfalse\n\nuser=> (decimal? 1.0)\nfalse\n\nuser=> (decimal? 1M)\ntrue\n\nuser=> (decimal? 99999999999999999999999999999999999)\nfalse\n\nuser=> (decimal? 1.0M)\ntrue", :created-at 1286508904000, :updated-at 1286508904000, :_id "542692cbc026201cdc326bd0"}], :notes nil, :arglists ["n"], :doc "Returns true if n is a BigDecimal", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/decimal_q"} {:added "1.2", :ns "clojure.core", :name "restart-agent", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1326769275000, :author {:login "Mark", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4d7c9ac1dd03a71c7d6b548e80c9d4f9?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "agent-error", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b32"} {:created-at 1326769279000, :author {:login "Mark", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4d7c9ac1dd03a71c7d6b548e80c9d4f9?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "agent", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b33"}], :line 2177, :examples [{:updated-at 1497900418842, :created-at 1497900418842, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/7083783?v=3"}, :body "(deftest t-rstart\n (future (println \"running in a thread...\"))\n (let [agt (agent 0)\n\n ; This doesn't work\n h01 (fn [a e]\n (println :10 \"agent error found:\" )\n (println :11 \"restarting agent...\")\n (restart-agent a 100)\n (Thread/sleep 100)\n (println :12 \"agent restarted, state=\" @a))\n\n ; This works. Need to call restart-agent in a separate thread\n h02 (fn [a e]\n (println :20 \"agent error found:\" )\n (future\n (println :21 \"restarting agent...\")\n (restart-agent a 200)\n (println :22 \"agent restarted, state=\" @a))) ;=> 200\n ]\n (set-error-handler! agt h02)\n (send agt inc)\n (Thread/sleep 100) (println :01 @agt) ;=> 1\n (Thread/sleep 100) (send agt #(/ % 0))\n (Thread/sleep 100) (println :02 @agt) ;=> 200\n (Thread/sleep 100) (send agt inc)\n (Thread/sleep 100) (println :03 @agt) ;=> 201\n))\n\n; Output\n; running in a thread...\n; :01 1\n; :20 agent error found:\n; :21 restarting agent...\n; :22 agent restarted, state= 200\n; :02 200\n; :03 201\n", :_id "59482582e4b06e730307db3b"}], :notes nil, :arglists ["a new-state & options"], :doc "When an agent is failed, changes the agent state to new-state and\n then un-fails the agent so that sends are allowed again. If\n a :clear-actions true option is given, any actions queued on the\n agent that were being held while it was failed will be discarded,\n otherwise those held actions will proceed. The new-state must pass\n the validator if any, or restart will throw an exception and the\n agent will remain failed with its old state and error. Watchers, if\n any, will NOT be notified of the new state. Throws an exception if\n the agent is not failed.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/restart-agent"} {:added "1.0", :ns "clojure.core", :name "sort-by", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1302917800000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sort", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ca1"} {:created-at 1361334368000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "compare", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ca2"}], :line 3119, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user=> (sort-by count [\"aaa\" \"bb\" \"c\"])\n(\"c\" \"bb\" \"aaa\")\n\nuser=> (sort-by first [[1 2] [2 2] [2 3]]) \n([1 2] [2 2] [2 3])\n\nuser=> (sort-by first > [[1 2] [2 2] [2 3]]) \n([2 2] [2 3] [1 2])", :created-at 1281552743000, :updated-at 1423276838828, :_id "542692cbc026201cdc326c28"} {:author {:login "kotarak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (sort-by :rank [{:rank 2} {:rank 3} {:rank 1}])\n({:rank 1} {:rank 2} {:rank 3})", :created-at 1281554134000, :updated-at 1332949762000, :_id "542692cbc026201cdc326c2a"} {:updated-at 1465979342950, :created-at 1305342274000, :body "(def x [{:foo 2 :bar 11}\n {:bar 99 :foo 1}\n {:bar 55 :foo 2}\n {:foo 1 :bar 77}])\n\n;sort by :foo, and where :foo is equal, sort by :bar\n(sort-by (juxt :foo :bar) x)\n;=>({:foo 1, :bar 77} {:bar 99, :foo 1} {:foo 2, :bar 11} {:bar 55, :foo 2})", :editors [{:avatar-url "https://www.gravatar.com/avatar/d1906fc5df2c8ce5b2d58cc6ea855aab?r=PG&default=identicon", :account-source "clojuredocs", :login "shuaybi"} {:avatar-url "https://www.gravatar.com/avatar/47018db2b156f6c7f606950e19cf6134?r=PG&default=identicon", :account-source "clojuredocs", :login "ordnungswidrig"} {:login "bfontaine", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1334295?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/d1906fc5df2c8ce5b2d58cc6ea855aab?r=PG&default=identicon", :account-source "clojuredocs", :login "shuaybi"}, :_id "542692cbc026201cdc326c2c"} {:author {:login "jamesqiu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc1268deaa7f2e78fe2b5ea76e6481d8?r=PG&default=identicon"}, :editors [], :body "(def x [{:foo 2 :bar 11}\n {:bar 99 :foo 1}\n {:bar 55 :foo 2}\n {:foo 1 :bar 77}])\n; sort-by given key order (:bar)\n(def order [55 77 99 11])\n(sort-by \n #((into {} (map-indexed (fn [i e] [e i]) order)) (:bar %)) \n x)\n;=> ({:bar 55, :foo 2} {:foo 1, :bar 77} {:bar 99, :foo 1} {:foo 2, :bar 11})", :created-at 1313489274000, :updated-at 1313489274000, :_id "542692cbc026201cdc326c2f"} {:author {:login "Yogthos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a2640fb40f901598b3789ac2f5c5b701?r=PG&default=identicon"}, :editors [{:login "Yogthos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a2640fb40f901598b3789ac2f5c5b701?r=PG&default=identicon"}], :body ";sort entries in a map by value\nuser=> (sort-by val > {:foo 7, :bar 3, :baz 5})\n([:foo 7] [:baz 5] [:bar 3])", :created-at 1327752237000, :updated-at 1327752286000, :_id "542692d5c026201cdc327090"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; Warning: You can sort a Java array and get back a sorted immutable Clojure\n;; data structure, but it will also change the input Java array, by sorting it.\n;; Copy the array before sorting if you want to avoid this.\n\nuser=> (def x (to-array [32 -5 4 11]))\n#'user/x\n\nuser=> (seq x)\n(32 -5 4 11)\n\nuser=> (def y (sort-by - x))\n#'user/y\n\n;; Return sorted sequence\nuser=> y\n(32 11 4 -5)\n\n;; but also modifies x, because it used the array to do the sorting.\nuser=> (seq x)\n(32 11 4 -5)\n\n;; One way to avoid this is copying the array before sorting:\nuser=> (def y (sort-by - (aclone x)))\n#'user/y", :created-at 1331771914000, :updated-at 1332833698000, :_id "542692d5c026201cdc327092"} {:body ";;; from the joy of clojure 2nd\n;;; function as arguments\n\n(def plays [{:band \"Burial\", :plays 979, :loved 9}\n {:band \"Eno\", :plays 2333, :loved 15}\n {:band \"Bill Evans\", :plays 979, :loved 9}\n {:band \"Magma\", :plays 2665, :loved 31}])\n\n(def sort-by-loved-ratio (partial sort-by #(/ (:plays %) (:loved %))))\n\n(sort-by-loved-ratio plays)\n\n;=> ({:band \"Magma\", :plays 2665, :loved 31}\n {:band \"Burial\", :plays 979, :loved 9}\n {:band \"Bill Evans\", :plays 979, :loved 9}\n {:band \"Eno\", :plays 2333, :loved 15})\n\n\n;;; others.\n(sort-by second [[:a 7], [:c 13], [:b 21]])\n;;=> ([:a 7] [:c 13] [:b 21])\n\n(sort-by str [\"z\" \"x\" \"a\" \"aa\" 1 5 8])\n;;=> (1 5 8 \"a\" \"aa\" \"x\" \"z\")\n\n(sort-by :age [{:age 99}, {:age 13}, {:age 7}])\n;;=> ({:age 7} {:age 13} {:age 99})", :author {:login "foxlog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/150418?v=3"}, :created-at 1429710293523, :updated-at 1429710293523, :_id "5537a5d5e4b033f34014b770"} {:updated-at 1551027269645, :created-at 1471045254496, :author {:login "egracer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4086884?v=3"}, :body ";; you can pass a comparator to specify the order to sort in\n\n;; typical sort, low to high\n(sort-by :value [{:value 1 :label \"a\"} {:value 3 :label \"c\"} {:value 2 :label \"b\"}])\n;=> ({:value 1, :label \"a\"} {:value 2, :label \"b\"} {:value 3, :label \"c\"})\n\n;; override the default comparator to sort high to low\n(sort-by :value #(> %1 %2) [{:value 1 :label \"a\"} {:value 3 :label \"c\"} {:value 2 :label \"b\"}])\n;=> ({:value 3 :label \"c\"} {:value 2, :label \"b\"} {:value 1, :label \"a\"})\n\n;; sort-by behavior when :value is absent\n(sort-by :value [{:value 1 :label \"a\"} {:label \"c\"} {:value 2 :label \"b\"}])\n=> ({:label \"c\"} {:value 1, :label \"a\"} {:value 2, :label \"b\"})\n\n;; now if you provide custom comparator when :value is absent you will get NullPointerException\n(sort-by :value #(> %1 %2) [{:value 1 :label \"a\"} {:label \"c\"} {:value 2 :label \"b\"}])\n=> Execution error (NullPointerException) at user/eval1515$fn (form-init71750676547201835.clj:1).\nnull\n\n;; make above working by simple or; considering absence of \"value\" as invaluable or highest value :)\n(sort-by :value #(> (or %1 Integer/MAX_VALUE) (or %2 Integer/MAX_VALUE)) [{:value 1 :label \"a\"} {:label \"c\"} {:value 2 :label \"b\"}])\n=> ({:label \"c\"} {:value 2, :label \"b\"} {:value 1, :label \"a\"})", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/4086884?v=3", :account-source "github", :login "egracer"} {:login "gautamr", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/70894?v=4"}], :_id "57ae5e86e4b0bafd3e2a04f1"} {:editors [{:login "overset", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/34342?v=3"}], :body ";; to sort by nested hash-map values\n;; with the help of get-in and custom comparator\n\n> (sort-by #(get-in (val %) [:price]) {:chair {:price 10} :table {:price 9} :lamp {:price 9}})\n;;=> ([:table {:price 9}] [:lamp {:price 9}] [:chair {:price 10}])\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/34342?v=3", :account-source "github", :login "overset"}, :created-at 1488583557264, :updated-at 1488842435985, :_id "58b9fb85e4b01f4add58fe69"} {:updated-at 1557361208644, :created-at 1557361208644, :author {:login "fdhenard", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/884972?v=4"}, :body ";; sort-by descending (reverse)\n\nuser=> (sort-by :rank #(compare %2 %1) [{:rank 2} {:rank 3} {:rank 1}])\n({:rank 3} {:rank 2} {:rank 1})", :_id "5cd37238e4b0ca44402ef71d"} {:editors [{:login "cgaustin", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/16307176?v=4"}], :body ";; Warning: sort-by will not apply the keyfn on coll's of length 1\n\nuser=> (sort-by (fn [i] (nth i) 4) [[1 2 3]])\n([1 2 3])\n\nuser=> (nth [1 2 3] 4)\n; IndexOutOfBoundsException clojure.lang.PersistentVector.arrayFor (PersistentVector.java:158)...", :author {:avatar-url "https://avatars2.githubusercontent.com/u/16307176?v=4", :account-source "github", :login "cgaustin"}, :created-at 1602184227139, :updated-at 1602184337489, :_id "5f7f6423e4b0b1e3652d73cf"} {:editors [{:login "naxels", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3195443?v=4"}], :body ";; Using comp as a way to sort descending\n(def unordered '({:created_at 1612637437}\n {:created_at 1610998684}\n {:created_at 1622245799}))\n\n(sort-by (comp - :created_at) unordered)\n;;=> ({:created_at 1622245799} {:created_at 1612637437} {:created_at 1610998684})\n\n;; Note: using the negative - as a comparator won't work\n;; so you need to combine the functions\n;; same example without comp:\n(sort-by #(- (:created_at %)) unordered)\n;;=> ({:created_at 1622245799} {:created_at 1612637437} {:created_at 1610998684})", :author {:avatar-url "https://avatars.githubusercontent.com/u/3195443?v=4", :account-source "github", :login "naxels"}, :created-at 1622382371391, :updated-at 1622382870076, :_id "60b39723e4b0b1e3652d7504"}], :notes nil, :arglists ["keyfn coll" "keyfn comp coll"], :doc "Returns a sorted sequence of the items in coll, where the sort\n order is determined by comparing (keyfn item). If no comparator is\n supplied, uses compare. comparator must implement\n java.util.Comparator. Guaranteed to be stable: equal elements will\n not be reordered. If coll is a Java array, it will be modified. To\n avoid this, sort a copy of the array.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/sort-by"} {:added "1.0", :ns "clojure.core", :name "macroexpand", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1284957731000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "macroexpand-1", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d2e"} {:created-at 1304099187000, :author {:login "pauldoo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5cb916d3c8abc9f45a093209e72489fb?r=PG&default=identicon"}, :to-var {:ns "clojure.walk", :name "macroexpand-all", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d2f"}], :line 4026, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [], :body ";; It is useful to combine macroexpand with pprint as the\n;; default output can be hard to read.\nuser=> (clojure.pprint/pprint (macroexpand '(time (print \"timing\"))))\n(let*\n [start__3917__auto__\n (. java.lang.System (clojure.core/nanoTime))\n ret__3918__auto__\n (print \"timing\")]\n (clojure.core/prn\n (clojure.core/str\n \"Elapsed time: \"\n (clojure.core//\n (clojure.core/double\n (clojure.core/-\n (. java.lang.System (clojure.core/nanoTime))\n start__3917__auto__))\n 1000000.0)\n \" msecs\"))\n ret__3918__auto__)\n\n;; Even after pretty printing you may benefit from some\n;; manual cleanup.\n\n;; Also worth noting that most of the time macroexpand-1 is\n;; a better alternative to avoid over expanding down too \n;; many levels.", :created-at 1286272649000, :updated-at 1286272649000, :_id "542692ccc026201cdc326c5e"} {:author {:login "BertrandDechoux", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/528360?v=3"}, :editors [{:login "raxod502", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6559064?v=3"}], :body "user=> (macroexpand '(-> c (+ 3) (* 2))) \n(* (+ c 3) 2)\n", :created-at 1339248908000, :updated-at 1457991523840, :_id "542692d4c026201cdc326ff9"}], :notes nil, :arglists ["form"], :doc "Repeatedly calls macroexpand-1 on form until it no longer\n represents a macro form, then returns it. Note neither\n macroexpand-1 nor macroexpand expand macros in subforms.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/macroexpand"} {:added "1.0", :ns "clojure.core", :name "ensure", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1299215930000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "commute", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bfa"} {:created-at 1299215941000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref-set", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bfb"} {:created-at 1364879934000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bfc"} {:created-at 1371688442000, :author {:login "juan.facorro", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d6f59d93cc17c698f16e550034a2d1ad?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "alter", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bfd"}], :line 2488, :examples [{:updated-at 1553541533678, :created-at 1553536468220, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Count votes to elect the favorite color.\n;; Batches of votes are processed concurrently using a map of shared refs.\n;; The competition stops immediately if there are more than 3 \"honeypots\" votes.\n;; \"ensure\" ensures other transactions cannot change the honeypot count,\n;; guaranteeing no votes are counted after a possible fraud.\n\n(def colors\n {:blue (ref 0)\n :green (ref 0)\n :red (ref 0)\n :honeypots (ref 0)})\n\n(defn batch [prefs]\n (future\n (dosync\n (ensure (:honeypots colors))\n (doseq [color prefs\n :while (< @(:honeypots colors) 3)]\n (update colors color commute inc)))))\n\n(let [b1 (batch [:red :honeypots :green :blue :blue :red :honeypots])\n b2 (batch [:green :blue :blue :green :red :blue :red :red])\n b3 (batch [:honeypots :blue :red :red :blue :green :green :red])]\n [@b1 @b2 @b3]\n {:total-votes (reduce + (map deref (vals colors)))\n :winner (ffirst (sort-by (comp deref second) > colors))\n :fraud? (= @(:honeypots colors) 3)})\n\n;; {:total-votes 16, :winner :blue, :fraud? true}", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5c9915d4e4b0ca44402ef6c2"}], :notes [{:updated-at 1299280980000, :body "This is for preventing [write skew](http://clojure.higher-order.net/?p=50), which Clojure's concurrency model is susceptible to. If you have a transaction where several refs' values must remain in some consistent relationship to each other, but you are only writing to some of them, you should use ensure on the other refs to prevent other transactions from writing to them in the meantime.", :created-at 1299215917000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fb6"} {:author {:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}, :updated-at 1574323395658, :created-at 1574323395658, :body "The doc string says:\n\n> Allows for more concurrency than (ref-set ref @ref)\n\nWhat it doesn’t say is that `ensure` may degrade performance very seriously, as\nit is prone to livelock: see\n[CLJ-2301](https://clojure.atlassian.net/projects/CLJ/issues/CLJ-2301).\n`(ref-set ref @ref)` is certainly more reliable than `(ensure ref)`.\n", :_id "5dd644c3e4b0ca44402ef7e1"}], :arglists ["ref"], :doc "Must be called in a transaction. Protects the ref from modification\n by other transactions. Returns the in-transaction-value of\n ref. Allows for more concurrency than (ref-set ref @ref)", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ensure"} {:ns "clojure.core", :name "chunk-first", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1443934291486, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-next", :ns "clojure.core"}, :_id "5610b053e4b08e404b6c1c93"} {:created-at 1443934297249, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-rest", :ns "clojure.core"}, :_id "5610b059e4b0686557fcbd44"}], :line 701, :examples [{:updated-at 1443934874463, :created-at 1443934874463, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :body "(let [chunked-cons (seq (range 1 42))\n first-chunk (chunk-first chunked-cons)]\n\n (class chunked-cons)\n ;; => clojure.lang.ChunkedCons\n\n (class first-chunk)\n ;; clojure.lang.ArrayChunk\n\n ;; Demonstrating chunk size of 32.\n (.nth first-chunk 0)\n ;; => 1\n (.nth first-chunk 31)\n ;; => 32\n)", :_id "5610b29ae4b08e404b6c1c94"}], :notes nil, :tag "clojure.lang.IChunk", :arglists ["s"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/chunk-first"} {:added "1.7", :ns "clojure.core", :name "eduction", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1496674622028, :author {:login "vspinu", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1363467?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "transduce", :ns "clojure.core"}, :_id "5935713ee4b06e730307db2a"} {:created-at 1496674683706, :author {:login "vspinu", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1363467?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reduce", :ns "clojure.core"}, :_id "5935717be4b06e730307db2b"} {:created-at 1496674762346, :author {:login "vspinu", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1363467?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reductions", :ns "clojure.core"}, :_id "593571cae4b06e730307db2c"} {:created-at 1520634073209, :author {:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "sequence", :ns "clojure.core"}, :_id "5aa308d9e4b0316c0f44f918"}], :line 7694, :examples [{:editors [{:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"} {:login "JoshAaronJones", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19951591?v=3"} {:avatar-url "https://avatars0.githubusercontent.com/u/1363467?v=3", :account-source "github", :login "vspinu"} {:login "Bost", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1174677?v=4"}], :body ";; `eduction` calls the stack of transformers on each element, each time.\n;; `->>` calls the transformer named 'left' on a collection, then the transformer\n;; named 'right' on the result, etc.\n\n(def cnt (atom nil))\n\n;; inc with debugging output\n(defn inc-with-print [fn-id coll-idx x]\n (printf \";; fn-id: %s; coll-idx: %s; cnt: %s; x: %s\\n\" fn-id coll-idx @cnt x)\n (swap! cnt inc)\n (inc x))\n\n(reset! cnt 0)\n(eduction\n (map-indexed (fn [coll-idx x] (inc-with-print \" left\" coll-idx x)))\n (map-indexed (fn [coll-idx x] (inc-with-print \"right\" coll-idx x)))\n (range 3))\n\n;; fn-id: left; coll-idx: 0; cnt: 0; x: 0\n;; fn-id: right; coll-idx: 0; cnt: 1; x: 1\n;; fn-id: left; coll-idx: 1; cnt: 2; x: 1\n;; fn-id: right; coll-idx: 1; cnt: 3; x: 2\n;; fn-id: left; coll-idx: 2; cnt: 4; x: 2\n;; fn-id: right; coll-idx: 2; cnt: 5; x: 3\n;;=> (2 3 4)\n\n(reset! cnt 0)\n(->> (range 3)\n (map-indexed (fn [coll-idx x] (inc-with-print \" left\" coll-idx x)))\n (map-indexed (fn [coll-idx x] (inc-with-print \"right\" coll-idx x))))\n\n;; fn-id: left; coll-idx: 0; cnt: 0; x: 0\n;; fn-id: left; coll-idx: 1; cnt: 1; x: 1\n;; fn-id: left; coll-idx: 2; cnt: 2; x: 2\n;; fn-id: right; coll-idx: 0; cnt: 3; x: 1\n;; fn-id: right; coll-idx: 1; cnt: 4; x: 2\n;; fn-id: right; coll-idx: 2; cnt: 5; x: 3\n;;=> (2 3 4)", :author {:avatar-url "https://avatars.githubusercontent.com/u/17842?v=3", :account-source "github", :login "ghiden"}, :created-at 1452742324167, :updated-at 1608819387090, :_id "569716b4e4b060004fc217ad"} {:editors [{:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"} {:login "JoshAaronJones", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19951591?v=3"}], :body ";; eduction: just run an xform over a collection\n\n(eduction (map inc) [1 2 3]) ; => (2 3 4)\n(eduction (filter even?) (range 5)) ; => (0 2 4)\n\n;; several transducers can be given, without using 'comp'\n(eduction (filter even?) (map inc)\n (range 5)) ; => (1 3 5)\n\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3", :account-source "github", :login "freckletonj"}, :created-at 1480456257096, :updated-at 1485277360753, :_id "583df841e4b0782b632278cd"} {:updated-at 1483046915116, :created-at 1483046915116, :author {:login "jvanderhyde", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6516608?v=3"}, :body ";; This will run out of memory eventually,\n;; because the entire seq is realized, \n;; because the head of the lazy seq is retained.\n(let \n [s (range 100000000)] \n (do (apply print s) (first s)))\n\n;; This iterates through the lazy seq without realizing the seq.\n(let \n [s (eduction identity (range 100000000))] \n (do (apply print s) (first s)))\n\n", :_id "58658003e4b0fd5fb1cc964c"} {:editors [{:login "vspinu", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1363467?v=3"} {:avatar-url "https://avatars0.githubusercontent.com/u/1174677?v=4", :account-source "github", :login "Bost"} {:login "jngbng", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/552977?v=4"}], :body ";; Result of eduction is of the `clojure.core.Eduction` type which acts as a\n;; lazy collection that re-executes all the steps again and again. This could be\n;; useful when you don't want to store the collection separately.\n;;\n;; Eductions can be efficiently used with `reduce` and `transduce`.\n\n(defn inc-with-print [x]\n (println \";;\" x)\n (inc x))\n\n(def ed (eduction (map inc-with-print) (map inc-with-print) (range 3)))\n\n(defn identity-with-print [x]\n (println \"identity:\" x)\n x)\n\n(map identity-with-print ed)\n;; 0\n;; 1\n;; 1\n;; 2\n;; 2\n;; 3\n;; identity: 2\n;; identity: 3\n;; identity: 4\n;; => (2 3 4)\n\n(defn sum-with-print [x y]\n (println \"sum:\" x \"+\" y)\n (+ x y))\n\n(reduce sum-with-print ed)\n;; 0\n;; 1\n;; 1\n;; 2\n;; sum: 2 + 3\n;; 2\n;; 3\n;; sum: 5 + 4\n;; => 9\n\n;; The above line does not work in Clojure 1.10.1\n;; Execution error (ClassCastException) at user/eval193 (REPL:1).\n;; clojure.core.Eduction cannot be cast to clojure.lang.IReduce\n\n\n(transduce (map identity-with-print) + ed)\n;; 0\n;; 1\n;; identity: 2\n;; 1\n;; 2\n;; identity: 3\n;; 2\n;; 3\n;; identity: 4\n;; => 9\n", :author {:avatar-url "https://avatars0.githubusercontent.com/u/1363467?v=3", :account-source "github", :login "vspinu"}, :created-at 1496674440865, :updated-at 1633576431878, :_id "59357088e4b06e730307db26"}], :notes [{:author {:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}, :updated-at 1520634037505, :created-at 1520634037505, :body "`eduction` is particularly useful as an adapter for collection-processing functions that don’t have a transducers arity. For example, you might want to transform a collection before passing it to `frequencies`. `eduction` makes that possible and efficient:\n\n
\n(->> coll\n     (eduction (map #(quot % 5))\n               (filter odd?))\n     frequencies)\n
\n\nSo `eduction` turns out to be quite powerful in that it brings the benefits of transducers to all collection-processing functions, even those that predate transducers: `first`, `last`, `group-by`, `run!`, `str/join`, …\n", :_id "5aa308b5e4b0316c0f44f917"} {:author {:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}, :updated-at 1520634630501, :created-at 1520634630501, :body "Interesting background about `sequence` versus `eduction`: https://groups.google.com/d/msg/clojure/9I6MtgOTD0w/NiG5PimBCP8J", :_id "5aa30b06e4b0316c0f44f919"} {:body "`eduction` does not cache the result while `sequence` does. `eduction` is intended to be used when you are eventually going to `reduce` over the sequence.\n\nhttps://groups.google.com/d/msg/clojure/9I6MtgOTD0w/NiG5PimBCP8J", :created-at 1577794782807, :updated-at 1577824559009, :author {:avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4", :account-source "github", :login "Hindol"}, :_id "5e0b3cdee4b0ca44402ef803"}], :arglists ["xform* coll"], :doc "Returns a reducible/iterable application of the transducers\n to the items in coll. Transducers are applied in order as if\n combined with comp. Note that these applications will be\n performed every time reduce/iterator is called.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/eduction"} {:added "1.0", :ns "clojure.core", :name "tree-seq", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1454531860990, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "walk", :ns "clojure.walk"}, :_id "56b26514e4b060004fc217bb"} {:created-at 1519124143092, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "file-seq", :ns "clojure.core"}, :_id "5a8bfeafe4b0316c0f44f8d5"}], :line 4931, :examples [{:updated-at 1454531766626, :created-at 1280776531000, :body ";; Each node is a number or a seq, \n;; so branch?==seq? and children==identity\n;; \n;; .\n;; / \\\n;; . .\n;; /|\\ |\n;; 1 2 . 4\n;; | \n;; 3\n;;\n;; ... each sub-tree is serialized in depth-first order\n(tree-seq seq? identity '((1 2 (3)) (4)))\n\n;;=> (((1 2 (3)) (4)) \n;; (1 2 (3)) \n;; 1 \n;; 2 \n;; (3) \n;; 3 \n;; (4) \n;; 4)\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/4b71cdf53bc76edd1a2ab66c446954b5?r=PG&default=identicon", :account-source "clojuredocs", :login "algal"} {:avatar-url "https://www.gravatar.com/avatar/4b71cdf53bc76edd1a2ab66c446954b5?r=PG&default=identicon", :account-source "clojuredocs", :login "algal"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692ccc026201cdc326c82"} {:updated-at 1454531340455, :created-at 1321413864000, :body "(tree-seq map? #(interleave (keys %) (vals %)) {:a 1 :b {:c 3 :d 4 :e {:f 6 :g 7}}})\n;;=> ({:a 1, :b {:c 3, :d 4, :e {:f 6, :g 7}}} \n;; :a 1 :b {:c 3, :d 4, :e {:f 6, :g 7}} \n;; :c 3 :d 4 :e {:f 6, :g 7} \n;; :f 6 :g 7)", :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/d790f5851d80da498e475ece4487e92?r=PG&default=identicon", :account-source "clojuredocs", :login "patazj"}, :_id "542692d5c026201cdc3270aa"} {:updated-at 1454530812433, :created-at 1321841153000, :body ";; Each node is a (node-root child1 child2 ...),\n;; so branch?==next and children==rest\n;;\n;; A\n;; / \\\n;; B C\n;; / \\ |\n;; D E F\n;;\n(map first (tree-seq next rest '(:A (:B (:D) (:E)) (:C (:F)))))\n;;=> (:A :B :D :E :C :F)", :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/4b71cdf53bc76edd1a2ab66c446954b5?r=PG&default=identicon", :account-source "clojuredocs", :login "algal"}, :_id "542692d5c026201cdc3270ab"} {:author {:login "gregginca", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bad5f5cb177b0968d4288596691ec3cd?r=PG&default=identicon"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :body ";; The previous example seems to be a flatten function,\n;; where every node's value is added to the returned sequence\n;; as it is visited in a depth first search.\n;; That is not the case as the following example illustrates: \n;; *\n;; / \\\n;; * 4\n;; /|\\\n;; 1 2 *\n;; |\n;; 3\n(map first (tree-seq next rest '((1 2 (3)) (4))))\n;;=> ((1 2 (3)) 4)\n\n;; For a proper 'flatten' function see below.", :created-at 1334020823000, :updated-at 1454531099621, :_id "542692d5c026201cdc3270ac"} {:updated-at 1471103831802, :created-at 1335429840000, :body ";; The nodes are filtered based on their collection type, \n;; here they must be a list.\n(tree-seq seq? seq [[1 2 [3]] [4]])\n;;=> ([[1 2 [3]] [4]])\n\n;; notice the difference between seq? and sequential?\n(tree-seq sequential? seq [[1 2 [3]] [4]])\n;;=> ([[1 2 [3]] [4]] [1 2 [3]] 1 2 [3] 3 [4] 4)\n\n;; If the nodes in the tree are a specific type of collection...\n;; a vector\n(tree-seq vector? seq [[1 2 [3]] [4]])\n([[1 2 [3]] [4]] [1 2 [3]] 1 2 [3] 3 [4] 4)\n\n;; ... or a list\n(tree-seq seq? seq '((1 2 (3)) (4)))\n(((1 2 (3)) (4)) (1 2 (3)) 1 2 (3) 3 (4) 4)\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "bbakersmith", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1828358?v=3"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692d5c026201cdc3270ad"} {:editors [{:avatar-url "https://avatars.githubusercontent.com/u/89076?v=3", :account-source "github", :login "shark8me"} {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :updated-at 1519124120018, :created-at 1423128977650, :author {:avatar-url "https://avatars.githubusercontent.com/u/89076?v=3", :account-source "github", :login "shark8me"}, :body ";; Use tree-seq to recursively find all files \n;; given a root directory (here for didactic purposes. See file-seq)\n(let [directory (clojure.java.io/file \"/path/to/directory/\")\n dir? #(.isDirectory %)]\n ;we want only files, therefore filter items that are not directories.\n (filter (comp not dir?) \n (tree-seq dir? #(.listFiles %) directory)))", :_id "54d33991e4b0e2ac61831d15"} {:editors [{:login "zackteo", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/7510179?v=4"}], :body "\n(def t '((1 2 (3)) (4)))\n;;=> #'user/t\n\n;; Here the tree-seq uses 'sequential?' as the 'branch?' predicate.\n;; This causes the 'children' function to run for any collection.\n;; The 'seq' ('children') function recurses on all items in the collection.\n;; This results in a sequence of sub-trees, rooted at each node.\n(tree-seq sequential? seq t)\n;;=> (((1 2 (3)) (4))\n;; (1 2 (3)) 1 2 \n;; (3) 3 (4) 4)\n\n;; (The following example is from 4Clojure)\n;; It returns the leaves of a tree as a sequence.\n;; \n(defn flatten [x]\n (filter (complement sequential?)\n (rest (tree-seq sequential? seq x))))\n(flatten t)\n;;=> (1 2 3 4)\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}, :created-at 1454529390718, :updated-at 1603927166586, :_id "56b25b6ee4b060004fc217b6"} {:updated-at 1503909100023, :created-at 1503908769269, :author {:login "MokkeMeguru", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/30849444?v=4"}, :body "(tree-seq seq? identity '(1 2 (3 (4))))\n;; ((1 2 (3 (4))) 1 2 (3 (4)) 3 (4) 4)\n\n;; It's same as ...\n(tree-seq seq? seq '(1 2 (3 (4))))\n(tree-seq sequential? seq '(1 2 (3 (4))))\n;; ((1 2 (3 (4))) 1 2 (3 (4)) 3 (4) 4)\n\n;; This processing ...\n(sequential? '(1 2 (3 (4)))) ;; returns true ... -> (1 2 (3 (4))) <--- !!!\n(sequential? 1) ;; returns false ... -> 1\n(sequential? 2) ;; returns false ... -> 2\n(sequential? '(3 (4)) ;; returns true ... -> (3 (4)) <--- !!! \n(sequential? 3) ;; returns false ... -> 3\n(sequential? '(4)) ;; returns true ... -> (4) <--- !!!\n(sequential? 4) ;; return false ... -> 4\n\n;; so, #tree-seq returns...\n;; ((1 2 (3 (4))) 1 2 (3 (4)) 3 (4) 4)", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/30849444?v=4", :account-source "github", :login "MokkeMeguru"}], :_id "59a3d3a1e4b09f63b945ac54"} {:editors [{:login "kovasap", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8763010?v=4"}], :body ";; When traversing a map tree, it's sometimes useful to have a back-reference\n;; to the parent. This tree-seq variant provides that.\n\n(defn tree-seq-adding-parent\n \"Like tree-seq, but takes in a tree of maps and a unique :parent key to each map.\"\n [branch? children root]\n (let [walk (fn walk [parent node]\n (lazy-seq\n (cons (assoc node :parent parent)\n (when (branch? node)\n (mapcat (partial walk node) (children node))))))]\n (walk nil root)))\n\n(def map-tree\n {:name \"root\"\n :children [{:name \"child1\"\n :children [{:name \"grandchild1\"}\n {:name \"grandchild2\"}]}\n {:name \"child2\"}]})\n\n(tree-seq-adding-parent associative? :children map-tree)\n;; =>\n;; ({:name \"root\",\n;; :children\n;; [{:name \"child1\",\n;; :children [{:name \"grandchild1\"} {:name \"grandchild2\"}]}\n;; {:name \"child2\"}],\n;; :parent nil\n;; {:name \"child1\",\n;; :children [{:name \"grandchild1\"} {:name \"grandchild2\"}],\n;; :parent\n;; {:name \"root\",\n;; :children\n;; [{:name \"child1\",\n;; :children [{:name \"grandchild1\"} {:name \"grandchild2\"}]}\n;; {:name \"child2\"}]}}\n;; {:name \"grandchild1\",\n;; :parent\n;; {:name \"child1\",\n;; :children [{:name \"grandchild1\"} {:name \"grandchild2\"}]}}\n;; {:name \"grandchild2\",\n;; :parent\n;; {:name \"child1\",\n;; :children [{:name \"grandchild1\"} {:name \"grandchild2\"}]}}\n;; {:name \"child2\",\n;; :parent\n;; {:name \"root\",\n;; :children\n;; [{:name \"child1\",\n;; :children [{:name \"grandchild1\"} {:name \"grandchild2\"}]}\n;; {:name \"child2\"}]}})\n\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/8763010?v=4", :account-source "github", :login "kovasap"}, :created-at 1652035527222, :updated-at 1652035548192, :_id "62780fc7e4b0b1e3652d75ea"}], :notes [{:body "The 'branch?' and 'children' functions perform different types of filtering.\nThe 'branch?' function examines a node and determines whether there are children that need to be included in the processing.\nThe 'children' function selects (or generates) the children to be included in the returned sequence.", :created-at 1454529614571, :updated-at 1508445428109, :author {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}, :_id "56b25c4ee4b0ceed88ce8d21"} {:author {:login "lostdiaspora", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4893998?v=3"}, :updated-at 1462851110244, :created-at 1462851110244, :body "Example 5 has for the second example \n(tree-seq seq? seq [[1 2 [3]] [4]])\nwhen it should be \n(tree-seq sequential? seq [[1 2 [3]] [4]])", :_id "57315626e4b012fa59bdb2ed"}], :arglists ["branch? children root"], :doc "Returns a lazy sequence of the nodes in a tree, via a depth-first walk.\n branch? must be a fn of one arg that returns true if passed a node\n that can have children (but may not). children must be a fn of one\n arg that returns a sequence of the children. Will only be called on\n nodes for which branch? returns true. Root is the root node of the\n tree.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/tree-seq"} {:added "1.0", :ns "clojure.core", :name "unchecked-remainder-int", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 1240, :examples nil, :notes nil, :arglists ["x y"], :doc "Returns the remainder of division of x by y, both int.\n Note - uses a primitive operator subject to truncation.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-remainder-int"} {:added "1.0", :ns "clojure.core", :name "seq", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1323104884000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "seq?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f01"} {:created-at 1350272113000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "empty?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f02"} {:created-at 1398980077000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "iterator-seq", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f03"} {:created-at 1495638720841, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "seqable?", :ns "clojure.core"}, :_id "5925a2c0e4b093ada4d4d727"} {:created-at 1550706027921, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "sequential?", :ns "clojure.core"}, :_id "5c6de56be4b0ca44402ef69d"} {:created-at 1550706149555, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "sequence", :ns "clojure.core"}, :_id "5c6de5e5e4b0ca44402ef69e"}], :line 126, :examples [{:updated-at 1552553839711, :created-at 1280777400000, :body "(seq '(1)) ;;=> (1)\n(seq [1 2]) ;;=> (1 2)\n(seq \"abc\") ;;=> (\\a \\b \\c)\n\n;; Corner cases\n(seq nil) ;;=> nil\n(seq '()) ;;=> nil\n(seq []) ;;=> nil\n(seq \"\") ;;=> nil", :editors [{:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"} {:login "notake", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/17588518?v=4"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692cac026201cdc326b53"} {:author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :editors [{:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; (seq x) is the recommended idiom for testing if a collection is not empty\n(every? seq [\"1\" [1] '(1) {:1 1} #{1}])\n;;=> true", :created-at 1350272074000, :updated-at 1422038529310, :_id "542692d5c026201cdc327079"} {:author {:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:login "osipaandr", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/14186734?v=4"}], :body ";; 'seq' can be used to turn a map into a list of vectors.\n;; Notice how the list is built adding elements to the beginning \n;; of the seq (list) not to the end, as with vectors.\n;; (Of course, the order that items are \n;; taken from a map should not be relied upon\n;; unless a deterministic 'sorted-map' is used.)\n(seq {:key1 \"value1\" :key2 \"value2\"})\n;;=> ([:key2 \"value2\"] [:key1 \"value1\"])", :created-at 1380601368000, :updated-at 1616180554494, :_id "542692d5c026201cdc32707b"} {:updated-at 1585288063944, :created-at 1470910164741, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body ";; Here is the difference between seq and sequence\n\n(seq nil)\n;;=> nil\n\n(seq ())\n;;=> nil\n\n(sequence ())\n;;=> ()\n\n(sequence nil)\n;;=> ()", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4", :account-source "github", :login "green-coder"}], :_id "57ac4ed4e4b0bafd3e2a04e1"} {:editors [{:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"} {:login "osipaandr", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/14186734?v=4"}], :body ";; seq is very similar to not-empty:\n\n(every? seq [\"1\" [1] '(1) {:1 1} #{1}])\n;;=> true\n(every? not-empty [\"1\" [1] '(1) {:1 1} #{1}])\n;;=> true\n\n(seq '(1)) ;;=> (1)\n(not-empty '(1)) ;;=> (1)\n\n(seq [1 2]) ;;=> (1 2)\n(not-empty [1 2]) ;;=> [1 2]\n\n\n(seq \"abc\") ;;=> (\\a \\b \\c)\n(not-empty \"abc\") ;;=> \"abc\"\n\n(map seq [nil '() [] \"\" {}])\n;;=> (nil nil nil nil nil)\n\n(map not-empty [nil '() [] \"\" {}])\n;;=> (nil nil nil nil nil)", :author {:avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4", :account-source "github", :login "bfontaine"}, :created-at 1602257369027, :updated-at 1616180682337, :_id "5f8081d9e4b0b1e3652d73d1"}], :notes nil, :tag "clojure.lang.ISeq", :arglists ["coll"], :doc "Returns a seq on the collection. If the collection is\n empty, returns nil. (seq nil) returns nil. seq also works on\n Strings, native Java arrays (of reference types) and any objects\n that implement Iterable. Note that seqs cache values, thus seq\n should not be used on any Iterable whose iterator repeatedly\n returns the same mutable object.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/seq"} {:added "1.0", :ns "clojure.core", :name "reduce", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1289800599000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "reductions", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e01"} {:created-at 1289816968000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "apply", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e02"} {:created-at 1289816979000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "frequencies", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e03"} {:created-at 1416151510249, :author {:login "ljos", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/585174?v=2"}, :to-var {:ns "clojure.core", :name "reduced", :library-url "https://github.com/clojure/clojure"}, :_id "5468c1d6e4b0dc573b892fd2"} {:created-at 1416151518003, :author {:login "ljos", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/585174?v=2"}, :to-var {:ns "clojure.core", :name "reduced?", :library-url "https://github.com/clojure/clojure"}, :_id "5468c1dee4b03d20a10242aa"} {:created-at 1461185368746, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reduce-kv", :ns "clojure.core"}, :_id "5717eb58e4b0fc95a97eab4f"} {:created-at 1514410007011, :author {:login "jcburley", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/430319?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "fold", :ns "clojure.core.reducers"}, :_id "5a441017e4b0a08026c48cdf"} {:created-at 1550086607808, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "partition-by", :ns "clojure.core"}, :_id "5c6471cfe4b0ca44402ef683"}], :line 6810, :examples [{:updated-at 1453975469787, :created-at 1278185820000, :body "(reduce + [1 2 3 4 5]) ;;=> 15\n(reduce + []) ;;=> 0\n(reduce + [1]) ;;=> 1\n(reduce + [1 2]) ;;=> 3\n(reduce + 1 []) ;;=> 1\n(reduce + 1 [2 3]) ;;=> 6", :editors [{:avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon", :account-source "clojuredocs", :login "dakrone"} {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "mobyte", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/207296?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/43db6edb2c82a7c76cb5b5911391f02a?r=PG&default=identicon", :account-source "clojuredocs", :login "cody"}, :_id "542692ccc026201cdc326c36"} {:updated-at 1561377314389, :created-at 1278632532000, :body ";; Converting a vector to a set:\n\n(reduce conj #{} [:a :b :c])\n;; => #{:a :c :b}\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon", :account-source "clojuredocs", :login "boxie"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "IwoHerka", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/9204550?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/693b9bfd287e55741c2a4af6f7de0d72?r=PG&default=identicon", :account-source "clojuredocs", :login "jkkramer"}, :_id "542692ccc026201cdc326c39"} {:updated-at 1343775932000, :created-at 1279060391000, :body ";; Create a word frequency map out of a large string s.\n\n;; `s` is a long string containing a lot of words :)\n(reduce #(assoc %1 %2 (inc (%1 %2 0)))\n {}\n (re-seq #\"\\w+\" s))\n\n; (This can also be done using the `frequencies` function.)\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon", :account-source "clojuredocs", :login "boxie"} {:avatar-url "https://www.gravatar.com/avatar/34f159f89cbd1d9beac0276f5a7af552?r=PG&default=identicon", :account-source "clojuredocs", :login "uvtc"} {:avatar-url "https://www.gravatar.com/avatar/34f159f89cbd1d9beac0276f5a7af552?r=PG&default=identicon", :account-source "clojuredocs", :login "uvtc"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/1453?v=4", :account-source "github", :login "ghoseb"}, :_id "542692ccc026201cdc326c3b"} {:author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "goodmike", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/42e0998c3077ba0ac435423941a3978e?r=PG&default=identicon"} {:login "goodmike", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/42e0998c3077ba0ac435423941a3978e?r=PG&default=identicon"} {:login "goodmike", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/42e0998c3077ba0ac435423941a3978e?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; Calculate primes until 1000\n\n(reduce\n (fn [primes number]\n (if (some zero? (map (partial mod number) primes))\n primes\n (conj primes number)))\n [2]\n (take 1000 (iterate inc 3)))\n\n;;=> [2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 \n;; 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 \n;; 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 \n;; 257 263 269 271 277 281 283 293 307 311 313 317 331 337 347 349 \n;; 353 359 367 373 379 383 389 397 401 409 419 421 431 433 439 443 \n;; 449 457 461 463 467 479 487 491 499 503 509 521 523 541 547 557 \n;; 563 569 571 577 587 593 599 601 607 613 617 619 631 641 643 647 \n;; 653 659 661 673 677 683 691 701 709 719 727 733 739 743 751 757 \n;; 761 769 773 787 797 809 811 821 823 827 829 839 853 857 859 863 \n;; 877 881 883 887 907 911 919 929 937 941 947 953 967 971 977 983 \n;; 991 997]", :created-at 1279066766000, :updated-at 1420654061502, :_id "542692ccc026201cdc326c40"} {:author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; Add one collection to another (combining sequences is done with cons):\n(reduce conj [1 2 3] [4 5 6])\n;;=> [1 2 3 4 5 6]\n\n(reduce #(cons %2 %1) [1 2 3] [4 5 6])\n;;=> '(6 5 4 1 2 3)", :created-at 1279163552000, :updated-at 1420654295036, :_id "542692ccc026201cdc326c46"} {:author {:login "gradysw", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a2d549191f2863bf87489949edebb548?r=PG&default=identicon"}, :editors [{:login "gradysw", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a2d549191f2863bf87489949edebb548?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; Combine a vector of collections into a single collection \n;; of the type of the first collection in the vector.\n(reduce into [[1 2 3] [:a :b :c] '([4 5] 6)])\n;;=> [1 2 3 :a :b :c [4 5] 6]\n\n;; The flatten function can be used to completely fuse \n;; all of the items of a nested tree into a single sequence.\n;; Sometimes all that is needed is to fuse the first level\n;; of a tree. This can be done with 'reduce' and 'into'.\n(reduce into [] '([] [[10 18]] [[8 18]] [[10 12]] [[0 -6]] [[2 6]]))\n;;=> [[10 18] [8 18] [10 12] [0 -6] [2 6]]\n", :created-at 1325573490000, :updated-at 1426023239324, :_id "542692d5c026201cdc327064"} {:author {:login "octopusgrabbus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon"}, :editors [], :body "(defn key-pres?\n \"This function accepts a value (cmp-val) and a vector of vectors\n (parsed output from clojure-csv) and returns the match value\n back if found and nil if not found. \n\n Using reduce, the function searches every vector row to see \n if cmp-val is at the col-idx location in the vector.\"\n\n [cmp-val cmp-idx csv-data]\n (reduce\n (fn [ret-rc csv-row]\n (if (= cmp-val (nth csv-row col-idx nil))\n (conj ret-rc cmp-val)))\n [] \n csv-data))", :created-at 1334260928000, :updated-at 1334260928000, :_id "542692d5c026201cdc327066"} {:author {:login "octopusgrabbus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon"}, :editors [{:login "octopusgrabbus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon"}], :body "(defn reduce-csv-row\n \"Accepts a csv-row (a vector) a list of columns to extract, \n and reduces (and returns) a csv-row to a subset based on \n selection using the values in col-nums (a vector of integer \n vector positions.)\"\n\n [csv-row col-nums]\n\n (reduce\n (fn [out-csv-row col-num]\n ; Don't consider short vectors containing junk.\n (if-not (<= (count csv-row) 1)\n (conj out-csv-row (nth csv-row col-num nil))))\n []\n col-nums))\n\n", :created-at 1334261221000, :updated-at 1334261450000, :_id "542692d5c026201cdc327067"} {:editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "IwoHerka", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/9204550?v=4"}], :updated-at 1561323174151, :created-at 1426023157581, :author {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}, :body ";; Some functions update a collection with a single item.\n;; A number of functions have a 'more' argument which lets\n;; them work over collections.\n;; These functions can benefit 'reduce' which lets them work \n;; a collection of items...\n(into {} {:dog :food})\n\n(reduce into {} [{:dog :food} {:cat :chow}])\n;;=> {:dog :food, :cat :chow}", :_id "54ff62f5e4b0b716de7a6539"} {:updated-at 1561377338656, :created-at 1441139931232, :author {:login "lwm", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1991377?v=3"}, :body ";; The reduction will terminate early if an intermediate result uses the \n;; `reduced` function.\n\n(defn limit [x y] \n (let [sum (+ x y)] \n (if (> sum 10) (reduced sum) sum)))\n\n(reduce + 0 (range 10))\n;; => 45\n\n(reduce limit 0 (range 10))\n;; => 15", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/25400?v=3", :account-source "github", :login "miner"} {:login "IwoHerka", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/9204550?v=4"}], :_id "55e60cdbe4b072d7f27980f5"} {:editors [{:login "teymuri", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/13352033?v=3"} {:login "IwoHerka", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/9204550?v=4"}], :body ";; This will generate the first 100 Fibonacci numbers\n;; (size of (range) + 2):\n\n(reduce \n (fn [a b] (conj a (+' (last a) (last (butlast a))))) \n [0 1] \n (range 98))\n\n;; [0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155 165580141 267914296 433494437 701408733 1134903170 1836311903 2971215073 4807526976 7778742049 12586269025 20365011074 32951280099 53316291173 86267571272 139583862445 225851433717 365435296162 591286729879 956722026041 1548008755920 2504730781961 4052739537881 6557470319842 10610209857723 17167680177565 27777890035288 44945570212853 72723460248141 117669030460994 190392490709135 308061521170129 498454011879264 806515533049393 1304969544928657 2111485077978050 3416454622906707 5527939700884757 8944394323791464 14472334024676221 23416728348467685 37889062373143906 61305790721611591 99194853094755497 160500643816367088 259695496911122585 420196140727489673 679891637638612258 1100087778366101931 1779979416004714189 2880067194370816120 4660046610375530309 7540113804746346429 12200160415121876738N 19740274219868223167N 31940434634990099905N 51680708854858323072N 83621143489848422977N 135301852344706746049N 218922995834555169026N]", :author {:avatar-url "https://avatars.githubusercontent.com/u/13352033?v=3", :account-source "github", :login "teymuri"}, :created-at 1443219853505, :updated-at 1561377380394, :_id "5605c98de4b08e404b6c1c85"} {:editors [{:login "IwoHerka", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/9204550?v=4"}], :body ";; Reduce can be used to reimplement a map function:\n\n(defn map* [f & c]\n (let [c* (partition (count c)\n (apply interleave c))]\n (reduce (fn [s k] (conj s (apply f k))) [] c*)))\n\n;; user=> (map* * [0.5 0.5 0.5] (range))\n;; [0.0 0.5 1.0]\n;; user=> (map* str \"clojure\" (range))\n;; [\"c0\" \"l1\" \"o2\" \"j3\" \"u4\" \"r5\" \"e6\"]\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/13352033?v=3", :account-source "github", :login "teymuri"}, :created-at 1447891132480, :updated-at 1561323290402, :_id "564d10bce4b0538444398272"} {:editors [{:login "IwoHerka", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/9204550?v=4"}], :body ";; Update map entries:\n(defn update-map-entries [m e]\n (reduce #(update-in %1 [(first %2)] (fn [_] (last %2))) m e))\n\n;; => (update-map-entries {:a 1 :b 2 :c 3} {:a 5 :b 9})\n;; {:a 5, :b 9, :c 3}\n;; => (update-map-entries {:a 1 :b 2 :c 3} {:a 5 :b 9 :d 8})\n;; {:a 5, :b 9, :c 3, :d 8}", :author {:avatar-url "https://avatars.githubusercontent.com/u/1223207?v=3", :account-source "github", :login "hadielmougy"}, :created-at 1470237574017, :updated-at 1561377421060, :_id "57a20b86e4b0bafd3e2a04c5"} {:editors [{:login "IwoHerka", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/9204550?v=4"}], :body ";; Flatten values in a map.\n(reduce\n (fn [flattened [k v]]\n (clojure.set/union flattened v))\n #{}\n {:e #{:m :f}, :c #{:f}, :b #{:c :f}, :d #{:m :f}, :a #{:c :f}})\n\n;; => #{:m :c :f}", :author {:avatar-url "https://avatars.githubusercontent.com/u/528932?v=3", :account-source "github", :login "sleyzerzon"}, :created-at 1471131155930, :updated-at 1561323131079, :_id "57afae13e4b02d8da95c26fa"} {:editors [{:login "IwoHerka", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/9204550?v=4"}], :body ";; A simple factorial function using reduce:\n\n(defn fact\n [x] \n (reduce * (range 1 (inc x))))", :author {:avatar-url "https://avatars.githubusercontent.com/u/2006175?v=3", :account-source "github", :login "cloxure"}, :created-at 1479851336416, :updated-at 1561377519723, :_id "5834bd48e4b0782b632278c7"} {:updated-at 1561377553253, :created-at 1485475889351, :author {:login "mahonbaldwin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2431381?v=3"}, :body ";; Reduce over maps by destructuring keys:\n(def x {:a 1 :b 2})\n\n(reduce (fn [p [k v]]\n (into p {k (+ 1 v)}))\n {} ; First value for p\n x)\n\n;; => {:a 2, :b 3}", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/838526?v=3", :account-source "github", :login "isaacm"} {:login "IwoHerka", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/9204550?v=4"}], :_id "588a9031e4b01f4add58fe32"} {:editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :body ";; conj! over transient array for speed.\n;; This example flattens over one level.\n;; To do so uses reduce twice.\n(persistent!\n (reduce\n (fn [acc0 item-vector]\n (reduce \n (fn [acc1 item]\n (conj! acc1 item))\n acc0 item-vector))\n (transient [])\n [[:foo :bar :baz] [] [:fred :barney]]))\n ;;=> [:foo :bar :baz :fred :barney] ", :author {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}, :created-at 1508890297162, :updated-at 1508890336628, :_id "59efd6b9e4b0a08026c48c76"} {:updated-at 1516050550051, :created-at 1516050550051, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;reduce with side effects\n;;given a collection return a new collection\n\n(def initial-coll [1 2 3 4 5])\n\n(defn byten\n [coll]\n (reduce (fn [new-coll unit]\n (into new-coll [(* 10 unit)]))\n []\n coll))\n\n(byten initial-coll)\n;;[10 20 30 40 50]\n\n\n", :_id "5a5d1876e4b0a08026c48cf5"} {:editors [{:login "IwoHerka", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/9204550?v=4"}], :body ";; Reduce with side effects using an anonymous function\n;; given a collection return a new collection:\n\n(def initial-coll [1 2 3 4 5])\n\n(defn byten\n [coll]\n (reduce #(into %1 [(* 10 %2)])\n []\n coll))\n\n(byten initial-coll)\n;; => [10 20 30 40 50]", :author {:avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4", :account-source "github", :login "ibercode"}, :created-at 1516050752043, :updated-at 1561377738301, :_id "5a5d1940e4b0a08026c48cf6"} {:editors [{:login "IwoHerka", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/9204550?v=4"}], :body ";; A practical example of mapping over values\n;; in a hash-map with the `upper-case` function:\n\n(reduce\n (fn [acc [k v]]\n (assoc acc k (clojure.string/upper-case v)))\n {}\n {:a \"aaaaaaa\" :b \"bbbbbbb\"})\n\n;; => {:a \"AAAAAAA\", :b \"BBBBBBB\"}", :author {:avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4", :account-source "github", :login "ibercode"}, :created-at 1517738937897, :updated-at 1561377698196, :_id "5a76dbb9e4b0e2d9c35f7418"} {:editors [{:login "ftravers", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/443507?v=4"}], :body "(reduce\n (fn [accumulator current-item] ; <-- accumulator is FIRST argument to function\n ...) ; <-- your fn definition goes here\n [] ; <-- initial value for your accumulator \n [:a :b]) ; <-- collection to operate on\n", :author {:avatar-url "https://avatars1.githubusercontent.com/u/443507?v=4", :account-source "github", :login "ftravers"}, :created-at 1555521629477, :updated-at 1555521659756, :_id "5cb7605de4b0ca44402ef70b"} {:editors [{:login "tanrax", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/4553672?v=4"}], :body "(reduce #(str %1 %2) \"\" [\"Woody\" \"Potato\" \"Buzz\"])\n;;=> \"WoodyPotatoBuzz\"\n\n;; or\n\n(reduce (fn [accumulator current-item] (str accumulator current-item)) \"\" [\"Woody\" \"Potato\" \"Buzz\"])\n;;=> \"WoodyPotatoBuzz\"\n\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/4553672?v=4", :account-source "github", :login "tanrax"}, :created-at 1583079460917, :updated-at 1584265812224, :_id "5e5be024e4b087629b5a18b0"}], :notes [{:updated-at 1278794710000, :body "clojure.core/reduce seems to be a special case of a function that's defined twice in core.clj, and the first definition (at the line cited above: 773) is just a temporary definition; the real definition is later at line 5323, which contains the docstring.", :created-at 1278794710000, :author {:login "JoshuaEckroth", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ef8bb10e14b41f71f8ea9ed9d66d07b7?r=PG&default=identicon"}, :_id "542692ebf6e94c6970521f80"} {:author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :updated-at 1505006701520, :created-at 1505006701520, :body "The reducing function f is of shape:\n\n(f [accumulator next-element] ...)", :_id "59b4946de4b09f63b945ac67"} {:author {:login "iljaf", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/35742698?v=4"}, :updated-at 1598124872512, :created-at 1598124872512, :body "The 4th example (generating prime numbers) is kind of nice conceptually, but running it for the first 1m integers is taking 2 min on i7 2.7GHz machine, so it seems to be a very inefficient way of generating prime numbers. ", :_id "5f417348e4b0b1e3652d7385"}], :arglists ["f coll" "f val coll"], :doc "f should be a function of 2 arguments. If val is not supplied,\n returns the result of applying f to the first 2 items in coll, then\n applying f to that result and the 3rd item, etc. If coll contains no\n items, f must accept no arguments as well, and reduce returns the\n result of calling f with no arguments. If coll has only 1 item, it\n is returned and f is not called. If val is supplied, returns the\n result of applying f to val and the first item in coll, then\n applying f to that result and the 2nd item, etc. If coll contains no\n items, returns val and f is not called.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/reduce"} {:added "1.0", :ns "clojure.core", :name "when-first", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1405367822000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "when-let", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b77"}], :line 4600, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user=> (when-first [a [1 2 3]] a)\n1\nuser=> (when-first [a []] :x)\nnil\nuser=> (when-first [a nil] :x)\nnil", :created-at 1280737783000, :updated-at 1423524033466, :_id "542692cac026201cdc326b30"} {:editors [{:login "totorigolo", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1183296?v=4"}], :body ";; Note that the 'when' switches on the truthiness of the sequence, not the\n;; truthiness of the elements within the sequence.\n\nuser=> (when-first [a [nil 2 3]] \n (print (str \"Picked: \" (prn-str a))))\nPicked: nil\nnil", :author {:avatar-url "https://avatars3.githubusercontent.com/u/1634344?v=3", :account-source "github", :login "peterwestmacott"}, :created-at 1490868547686, :updated-at 1542136234692, :_id "58dcd943e4b01f4add58fe80"} {:updated-at 1522689850199, :created-at 1522689850199, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; A concise way to write the basic lazy loop.\n\n(defn dechunk [xs]\n (lazy-seq\n (when-first [x xs]\n (cons x\n (dechunk (rest xs))))))\n\n;; would print 32 dots otherwise:\n(first (map #(do (print \".\") %) (dechunk (range 100))))\n;; .0", :_id "5ac2673ae4b045c27b7fac2e"}], :macro true, :notes nil, :arglists ["bindings & body"], :doc "bindings => x xs\n\n Roughly the same as (when (seq xs) (let [x (first xs)] body)) but xs is evaluated only once", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/when-first"} {:added "1.0", :ns "clojure.core", :name "find-ns", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1284970272000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "create-ns", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bd5"} {:created-at 1284970279000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "remove-ns", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bd6"} {:created-at 1489760484301, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ns-map", :ns "clojure.core"}, :_id "58cbf0e4e4b01f4add58fe76"}], :line 4126, :examples [{:author {:login "teyc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd6e62afb4881ab0f617611b8b65d003?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "(find-ns 'clojure.string)\n;;=> nil\n\n(require 'clojure.string)\n;;=> nil\n\n(find-ns 'clojure.string)\n;;=> #", :created-at 1283925753000, :updated-at 1422932795101, :_id "542692ccc026201cdc326c90"}], :notes nil, :arglists ["sym"], :doc "Returns the namespace named by the symbol or nil if it doesn't exist.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/find-ns"} {:added "1.1", :ns "clojure.core", :name "get-thread-bindings", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1350609423000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bound-fn", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cbb"} {:created-at 1350609426000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bound-fn*", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cbc"}], :line 1939, :examples [{:updated-at 1615494273716, :created-at 1615493864771, :author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :body "(get-thread-bindings) \n;;=> {#'cider.nrepl.middleware.debug/*skip-breaks* #atom[nil 0x6683434], \n;; #'clojure.core/*unchecked-math* false, \n;; # nil, # 1, \n... \n;; #'clojure.test/*test-out* #object[java.io.PrintWriter 0x7aa21648 \n;; \"java.io.PrintWriter@7aa21648\"], # true}\n;; # true}", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4", :account-source "github", :login "Crowbrammer"}], :_id "604a7ae8e4b0b1e3652d7482"}], :notes nil, :arglists [""], :doc "Get a map with the Var/value pairs which is currently in effect for the\n current thread.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/get-thread-bindings"} {:added "1.0", :ns "clojure.core", :name "contains?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1307097029000, :author {:login "stand", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d7f9ed2753f8b3517f1539f6129f0a17?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "some", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d35"} {:created-at 1354058314000, :author {:login "uvtc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/34f159f89cbd1d9beac0276f5a7af552?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "get", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d36"}], :line 1484, :examples [{:author {:login "Brian Marick", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon"}, :editors [{:login "Brian Marick", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"} {:login "alex_ndc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/289cf5fb7dc48bc0d1237a779b8b107?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:avatar-url "https://avatars2.githubusercontent.com/u/20086?v=3", :account-source "github", :login "reborg"} {:login "mdave16", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/15642321?v=4"}], :body ";; `contains?` is straightforward for maps:\n(contains? {:a 1} :a) ;=> true\n(contains? {:a nil} :a) ;=> true\n(contains? {:a 1} :b) ;=> false\n\n;; It's likely to surprise you for other sequences because it's \n;; about *indices* or *keys*, not *contents*:\n\n(contains? [:a :b :c] :b) ;=> false\n(contains? [:a :b :c] 2) ;=> true\n(contains? [\"a\" \"b\"] \"b\") ;=> false\n(contains? \"f\" 0) ;=> true\n(contains? \"f\" 1) ;=> false\n\n;; Although lists are sequences, they are not keyed sequences.\n;; `contains?` should not be used for lists.\n\n(contains? '(1 2 3) 1) \n;; IllegalArgumentException (Clojure >=1.5)\n\n;; It also works on native arrays, HashMaps or HashSets:\n(import '[java.util HashMap HashSet])\n(contains? (doto (HashSet.) (.add 1)) 1) ;=> true\n(contains? (doto (HashMap.) (.put \"a\" 1)) \"a\") ;=> true\n(contains? (int-array [1 2 3]) 0) ;=> true", :created-at 1278821806000, :updated-at 1633737531627, :_id "542692cdc026201cdc326d2a"} {:author {:login "stand", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d7f9ed2753f8b3517f1539f6129f0a17?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; Can be used to test set membership\n(def s #{\"a\" \"b\" \"c\"})\n\n;; The members of a set are the keys of those elements.\n(contains? s \"a\") ;=> true\n(contains? s \"z\") ;=> false", :created-at 1307097549000, :updated-at 1422318705818, :_id "542692cdc026201cdc326d2f"} {:updated-at 1498597995922, :created-at 1498584367639, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/20086?v=3"}, :body ";; When \"key\" is a number, it is expected to be an integer. \n;; Beyond that limit, lossy truncation may result in unexpected results:\n\n(contains? [1 2 3] 4294967296) ;=> true", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/20086?v=3", :account-source "github", :login "reborg"}], :_id "5952952fe4b06e730307db46"}], :notes [{:updated-at 1279546429000, :body "If like me you wanted to find a value in a collection and read this article then you'll need to find an alternative. So instead of:\r\n
\r\n(contains (1 2 3) 1)\r\n
\r\nI used:\r\n
\r\n(some #(= 1 %) (1 2 3))\r\n
\r\n\r\nHope that helps.", :created-at 1279546429000, :author {:login "robertpostill", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16aae57aa6b16e96fa81089bea6acad8?r=PG&default=identicon"}, :_id "542692ebf6e94c6970521f81"} {:updated-at 1279552212000, :body "For collections I use the `java.util.Collection#contains()` method:\r\n\r\n
\r\nuser=> (.contains [1 2 3] 1)\r\ntrue\r\nuser=> (.contains [1 2 3] 4)\r\nfalse\r\n
", :created-at 1279552212000, :author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :_id "542692ebf6e94c6970521f82"} {:updated-at 1354058595000, :body "As Rich points out on the ML: \r\n\r\n`contains?` tells you whether or not `get` will succeed. It is not a \"rummager\".\r\n\r\n`contains?` and `get` abstract over fast lookup.\r\n", :created-at 1354058595000, :author {:login "uvtc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/34f159f89cbd1d9beac0276f5a7af552?r=PG&default=identicon"}, :_id "542692edf6e94c6970521ff5"} {:updated-at 1388617095000, :body "If you have a vector or list and want to check whether a *value* is contained in it, you will find that `contains?` does not work.\r\n\r\n
; does not work as you might expect\r\n(contains? [:a :b :c] :b) ; = false
\r\n\r\nThere are four things you can try in this case:\r\n\r\n1. Consider whether you really need a vector or list. If you use a set instead, `contains?` will work.\r\n
(contains? #{:a :b :c} :b) ; = true
\r\n2. Use [`some`](http://clojuredocs.org/clojure_core/clojure.core/some) instead, wrapping the target in a set, as follows:\r\n
(some #{:b} [:a :b :c]) ; = :b, which is truthy
\r\n3. The set-as-function shortcut will not work if you might be searching for a falsy value (`false` or `nil`).\r\n
; will not work\r\n(some #{false} [true false true]) ; = nil
\r\n In that case, you will have to write the predicate function the long way:\r\n
(some #(= false %) [true false true]) ; = true
\r\n4. If you will need to do this kind of search a lot, write a function for it:\r\n
(defn seq-contains? [coll target] (some #(= target %) coll))\r\n(seq-contains? [true false true] false) ; = true
", :created-at 1385323398000, :author {:login "roryokane", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5b2b185c814bb25f2f95a1152e58f033?r=PG&default=identicon"}, :_id "542692edf6e94c697052200f"} {:author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :updated-at 1462902144512, :created-at 1462902144512, :body "In order to determine if an element is contained in the collection, it may be easiest to use the `Vector.indexOf()` function from java:\n\n (.indexOf (range 10) 5)\n ;=> 5\n (.indexOf [:a :b :c] :b)\n ;=> 1\n\n[Java API Docs are here](http://docs.oracle.com/javase/7/docs/api/java/util/Vector.html#indexOf%28java.lang.Object%29)", :_id "57321d80e4b012fa59bdb2f1"} {:body "You may wonder why this statement evaluates to true:
\n\n(contains? [1 1 1 1 1] 4)
\n;=> true\n
\n\nLet's do some investigation to find the answer. First we start by finding out the type of [1 1 1 1 1]:\n\n(class [1 1 1 1 1])
\n;=> clojure.lang.PersistentVector\n
\n\nSo when the statement (contains? [1 1 1 1 1] 4) is evaluated, the function contains? in core.clj is called.\n\nThis function delegates to the static Java function contains(Object coll, Object key) in clojure.lang.RT, which discovers that the incoming vector is an instance of Associative (PersistentVector > APersistentVector > IPersistentVector > Associative) and exits with:
\n\nreturn ((Associative) coll).containsKey(key)\n\n\nThis means that these two statements are equivalent, based on the current implementation of PersistentVector:
\n\n(contains? [1 1 1 1 1] 4) ; true
\n(.containsKey [1 1 1 1 1 1] 4) ; true\n
\n\nThe method containsKey of APersistentVector is finally called. It checks if the vector has at least four elements (size >= 4) which it has (5) and that's why it returns true. Mystery solved!\n", :created-at 1469650697268, :updated-at 1469653287748, :author {:avatar-url "https://avatars.githubusercontent.com/u/631272?v=3", :account-source "github", :login "tengstrand"}, :_id "57991709e4b0bafd3e2a04c1"} {:author {:login "coutego", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/86327033?v=4"}, :updated-at 1670094879509, :created-at 1670094709380, :body "This `in?` function could be a convenient one line replacement for `contains?` implementing the expected semantics for containers:\n \n
\n(defn in? [xs el] (some #(= % el) xs))\n
", :_id "638b9f75e4b0b1e3652d7693"}], :arglists ["coll key"], :doc "Returns true if key is present in the given collection, otherwise\n returns false. Note that for numerically indexed collections like\n vectors and Java arrays, this tests if the numeric key is within the\n range of indexes. 'contains?' operates constant or logarithmic time;\n it will not perform a linear search for a value. See also 'some'.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/contains_q"} {:added "1.0", :ns "clojure.core", :name "every?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1302013840000, :author {:login "pauldoo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5cb916d3c8abc9f45a093209e72489fb?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "some", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d9e"} {:created-at 1315793054000, :author {:login "wdkrnls", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/6d08a2f792f289b95fe1d982d4133d71?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "not-any?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d9f"} {:created-at 1422932256217, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "not-every?", :library-url "https://github.com/clojure/clojure"}, :_id "54d03920e4b081e022073c43"}], :line 2672, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (every? even? '(2 4 6))\ntrue\nuser=> (every? even? '(1 2 3))\nfalse", :created-at 1279073869000, :updated-at 1332951153000, :_id "542692cfc026201cdc326e56"} {:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "Rich_Morin", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d4d28bd014f9e7324bad99dcc3b0d390?r=PG&default=identicon"}], :body ";; you can use every? with a set as the predicate to return true if \n;; every member of a collection is in the set\nuser=> (every? #{1 2} [1 2 3])\nfalse\nuser=> (every? #{1 2} [1 2])\ntrue\n\n;; or use a hash-map as the predicate with every? to return true \n;; if every member of a collection is a key within the map\nuser=> (every? {1 \"one\" 2 \"two\"} [1 2])\ntrue\nuser=> (every? {1 \"one\" 2 \"two\"} [1 2 3])\nfalse", :created-at 1310851356000, :updated-at 1358775095000, :_id "542692cfc026201cdc326e58"} {:author {:login "dkvasnicka", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/55c9f4624d94a0c87c4f4fcb7f152393?r=PG&default=identicon"}, :editors [{:login "dkvasnicka", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/55c9f4624d94a0c87c4f4fcb7f152393?r=PG&default=identicon"} {:avatar-url "https://avatars3.githubusercontent.com/u/1195619?v=3", :account-source "github", :login "jeffi"} {:login "beoliver", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1413969?v=4"} {:avatar-url "https://avatars2.githubusercontent.com/u/22192927?v=4", :account-source "github", :login "elenacanovi"} {:login "PEZ", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/30010?v=4"}], :body ";; this is kind of weird IMO... but it works that way (the same for vectors)\n;; See: https://en.wikipedia.org/wiki/Vacuous_truth\nuser=> (every? true? '())\ntrue\nuser=> (every? false? '())\ntrue\n\n;; and similarly\nuser=> (every? map? '())\ntrue\nuser=> (every? vector? '())\ntrue\nuser=> (every? string? '())\ntrue\nuser=> (every? number? '())\ntrue\n\n;; and even\nuser=> (every? :foo nil)\ntrue\n\n;; As such a better description of every? would be\n\n;; Returns false if there exists a value x in coll \n;; such that (pred? x) is false, else true.\" \n", :created-at 1356575084000, :updated-at 1670431457567, :_id "542692d3c026201cdc326fa1"} {:updated-at 1512078155897, :created-at 1512078155897, :author {:login "chbrown", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/360279?v=4"}, :body ";; every? can replace clojure.set/subset? if and only if\n;; the sets do not contain false / nil values\n\n(subset? #{1} #{1 2}) ;;=> true\n(every? #{1 2} #{1} ) ;;=> true ✔\n\n(subset? #{1 3} #{1 2}) ;;=> false\n(every? #{1 2} #{1 3}) ;;=> false ✔\n\n;; however, invoking a set with a value returns the matched element,\n;; causing the comparison below to fail\n\n(subset? #{true false} #{true false}) ;;=> true\n(every? #{true false} #{true false}) ;;=> false ✘ 😦\n", :_id "5a207b4be4b0a08026c48cca"}], :notes nil, :tag "java.lang.Boolean", :arglists ["pred coll"], :doc "Returns true if (pred x) is logical true for every x in coll, else\n false.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/every_q"} {:added "1.0", :ns "clojure.core", :name "proxy-mappings", :file "clojure/core_proxy.clj", :type "function", :column 1, :see-alsos nil, :line 323, :examples [{:updated-at 1683032923886, :created-at 1683032784200, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body "(def my-proxy\n (proxy [java.lang.Object] []\n (equals [_] false)\n (toString [] \"I'm an object\")))\n;; => #'user/my-proxy\n\n(proxy-mappings my-proxy)\n;; => {\"equals\" #function[user/fn--43785/fn--43786],\n;; \"toString\" #function[user/fn--43785/fn--43788]}\n\n(let [to-string-fn (-> my-proxy proxy-mappings (get \"toString\"))]\n (to-string-fn :foo))\n;; => \"I'm an object\"\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4", :account-source "github", :login "tomdl89"}], :_id "64510ad0e4b08cf8563f4ba9"}], :notes nil, :arglists ["proxy"], :doc "Takes a proxy instance and returns the proxy's fn map.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/proxy-mappings"} {:added "1.2", :ns "clojure.core", :name "keep-indexed", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1324314274000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "map-indexed", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b55"} {:created-at 1337189104000, :author {:login "SoniaH", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/56a007a4b2c47b141bd39790278f88a7?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "keep", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b56"}], :line 7346, :examples [{:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "SoniaH", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/56a007a4b2c47b141bd39790278f88a7?r=PG&default=identicon"}], :body "user=> (keep-indexed #(if (odd? %1) %2) [:a :b :c :d :e])\n(:b :d)", :created-at 1282318865000, :updated-at 1337189353000, :_id "542692c9c026201cdc326a84"} {:author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :editors [], :body "user=> (keep-indexed #(if (pos? %2) %1) [-9 0 29 -7 45 3 -8])\n(2 4 5)\n;; f takes 2 args: 'index' and 'value' where index is 0-based\n;; when f returns nil the index is not included in final result\nuser=> (keep-indexed (fn [idx v]\n (if (pos? v) idx)) [-9 0 29 -7 45 3 -8])\n(2 4 5)", :created-at 1292177237000, :updated-at 1292177237000, :_id "542692c9c026201cdc326a87"} {:author {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}, :editors [{:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "clojureking", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/92625b8a6be91bb8c688d0d07b4e2a32?r=PG&default=identicon"} {:login "clojureking", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/92625b8a6be91bb8c688d0d07b4e2a32?r=PG&default=identicon"}], :body "(defn position [x coll & {:keys [from-end all] :or {from-end false all false}}]\n (let [all-idxs (keep-indexed (fn [idx val] (when (= val x) idx)) coll)]\n (cond\n (true? from-end) (last all-idxs)\n (true? all) all-idxs\n :else (first all-idxs))))\n\nuser> (position [1 1] [[1 0][1 1][2 3][1 1]])\n1\nuser> (position [1 1] [[1 0][1 1][2 3][1 1]] :from-end true)\n3\nuser> (position [1 1] [[1 0][1 1][2 3][1 1]] :all true)\n(1 3)\n\nuser> (def foo (shuffle (range 10)))\n#'user/foo\nuser> foo\n(5 8 9 1 2 7 0 6 3 4)\nuser> (position 5 foo)\n0\nuser> (position 0 foo)\n6", :created-at 1306319468000, :updated-at 1409547666000, :_id "542692c9c026201cdc326a88"} {:updated-at 1444409466360, :created-at 1444409466360, :author {:login "PetrGlad", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/124476?v=3"}, :body ";; Simpler version of \"position\" above\n;; Get position of first element that satisfies the predicate\n(let [predicate #(= 1 %)\n sequence [3 2 4 1 5 6 7]]\n (first (keep-indexed (fn [i x] (when (predicate x) i)) \n sequence)))\n\n;; The same logic but implemented with map-indexed\n(let [predicate #(= 1 %)\n sequence [3 2 4 1 5 6 7]]\n (some identity \n (map-indexed (fn [i x] (when (predicate x) i)) \n sequence)))", :_id "5617f07ae4b084e61c76ecbf"} {:updated-at 1528067828447, :created-at 1528067828447, :author {:login "statcompute", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/4590938?v=4"}, :body "(require '[clojure.pprint :as p]\n '[clojure.java.jdbc :as j])\n \n(def db\n {:classname \"org.sqlite.JDBC\"\n :subprotocol \"sqlite\"\n :subname \"/home/liuwensui/Downloads/chinook.db\"})\n \n(def orders (j/query db \"select billingcountry as country, count(*) as orders from invoices group by billingcountry;\"))\n \n(def clist '(\"USA\" \"India\" \"Canada\" \"France\")\n\n(def country (map #(get % :country) orders))\n\n(p/print-table \n (map #(nth orders %) \n (flatten (pmap (fn [c] (keep-indexed (fn [i v] (if (= v c) i)) country)) clist))))\n\n;| :country | :orders |\n;|----------+---------|\n;| USA | 91 |\n;| India | 13 |\n;| Canada | 56 |\n;| France | 35 |", :_id "5b1476f4e4b00ac801ed9e0a"} {:updated-at 1545622986549, :created-at 1542944952784, :author {:login "gluer", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/22495106?v=4"}, :body ";; a simple example\n(map-indexed #(when (< % 2) (str % %2)) [:a :b :c])\n;;=> (\"0:a\" \"1:b\" nil)\n\n(keep-indexed #(when (< % 2) (str % %2)) [:a :b :c])\n;;=> (\"0:a\" \"1:b\")", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/22495106?v=4", :account-source "github", :login "gluer"}], :_id "5bf778b8e4b0ca44402ef5c8"} {:editors [{:login "kevinmungai", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/23656776?v=4"}], :body ";; returns a new list by removing the elements at odd positions\n(defn filter-list-by-position\n [lst]\n (into []\n (keep-indexed #(when (odd? %1) %2)) ;; transducer\n lst))\n\n;; 0 1 2 3 4 5 6 8\n(def nums [2 5 3 4 6 7 9 8])\n\n(filter-list-by-position nums)\n;;=> [5 4 7 8]", :author {:avatar-url "https://avatars3.githubusercontent.com/u/23656776?v=4", :account-source "github", :login "kevinmungai"}, :created-at 1594505780319, :updated-at 1594505852298, :_id "5f0a3a34e4b0b1e3652d731f"}], :notes nil, :arglists ["f" "f coll"], :doc "Returns a lazy sequence of the non-nil results of (f index item). Note,\n this means false return values will be included. f must be free of\n side-effects. Returns a stateful transducer when no collection is\n provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/keep-indexed"} {:added "1.5", :ns "clojure.core", :name "cond->>", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1432152383427, :author {:login "x", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/693546?v=3"}, :to-var {:ns "clojure.core", :name "cond->", :library-url "https://github.com/clojure/clojure"}, :_id "555ce93fe4b01ad59b65f4d4"} {:created-at 1432152404184, :author {:login "x", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/693546?v=3"}, :to-var {:ns "clojure.core", :name "as->", :library-url "https://github.com/clojure/clojure"}, :_id "555ce954e4b03e2132e7d165"} {:created-at 1432152431951, :author {:login "x", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/693546?v=3"}, :to-var {:ns "clojure.core", :name "->", :library-url "https://github.com/clojure/clojure"}, :_id "555ce96fe4b01ad59b65f4d6"} {:created-at 1432152437689, :author {:login "x", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/693546?v=3"}, :to-var {:ns "clojure.core", :name "->>", :library-url "https://github.com/clojure/clojure"}, :_id "555ce975e4b03e2132e7d167"} {:created-at 1537310356172, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "cond", :ns "clojure.core"}, :_id "5ba17e94e4b00ac801ed9ea0"} {:created-at 1537310390943, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "case", :ns "clojure.core"}, :_id "5ba17eb6e4b00ac801ed9ea1"}], :line 7555, :examples [{:editors [{:login "x", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/693546?v=3"}], :updated-at 1458757086103, :created-at 1432152126897, :author {:avatar-url "https://avatars.githubusercontent.com/u/693546?v=3", :account-source "github", :login "x"}, :body ";; useful for when you want to control doing a bunch of things to a lazy sequence \n;; based on some conditions or, commonly, keyword arguments to a function.\n\n(defn do-stuff\n [coll {:keys [map-fn max-num-things batch-size]}]\n (cond->> coll\n map-fn (map map-fn)\n max-num-things (take max-num-things)\n batch-size (partition batch-size)))\n\nuser=> (do-stuff [1 2 3 4] {})\n[1 2 3 4]\nuser=> (do-stuff [1 2 3 4] {:map-fn str})\n(\"1\" \"2\" \"3\" \"4\")\nuser=> (do-stuff [1 2 3 4] {:map-fn str :batch-size 2})\n((\"1\" \"2\") (\"3\" \"4\"))\nuser=> (do-stuff [1 2 3 4] {:map-fn str :max-num-things 3})\n(\"1\" \"2\" \"3\")", :_id "555ce83ee4b01ad59b65f4d2"}], :macro true, :notes nil, :arglists ["expr & clauses"], :doc "Takes an expression and a set of test/form pairs. Threads expr (via ->>)\n through each form for which the corresponding test expression\n is true. Note that, unlike cond branching, cond->> threading does not short circuit\n after the first true test expression.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/cond->>"} {:added "1.0", :ns "clojure.core", :name "subs", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1318625011000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "replace", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f3a"} {:created-at 1318625250000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "split", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f3b"} {:created-at 1379039766000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.string", :name "replace-first", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f3c"} {:created-at 1379039915000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "re-find", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f3d"} {:created-at 1379039920000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "re-seq", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f3e"} {:created-at 1379039970000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "re-matches", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f3f"}], :line 4981, :examples [{:author {:login "citizen428", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3881a28fe402dd2d1de44717486cae8?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (subs \"Clojure\" 1) \n\"lojure\"\nuser=> (subs \"Clojure\" 1 3)\n\"lo\"\n\n\n;; String indexes have to be between 0 and (.length s)\n\nuser=> (subs \"Clojure\" 1 20)\njava.lang.StringIndexOutOfBoundsException: String index out of range: 20 (NO_SOURCE_FILE:0)\n", :created-at 1280470619000, :updated-at 1285496389000, :_id "542692ccc026201cdc326cab"} {:updated-at 1513303984796, :created-at 1379039736000, :body ";; Note that subs uses method java.lang.String/substring\n;; http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#substring%28int,%20int%29\n\n;; See this link for more details:\n\n;; https://dzone.com/articles/changes-stringsubstring-java-7\n\n;; This link was the original, but seems to no longer exist as of Nov 2017:\n;; http://www.javaadvent.com/2012/12/changes-to-stringsubstring-in-java-7.html\n\n;; Briefly, before Java version 7u6, Java's substring method was\n;; guaranteed to work in O(1) time, by creating a String that refers\n;; to the original string's characters, rather than copying them.\n\n;; After Java 7u6, substring was changed to copy the string's original\n;; characters, thus taking time linear in the length of the substring,\n;; but it never refers to the original string.\n\n;; The potential disadvantage of the pre-version-7u6 behavior is that\n;; if you read in one or more strings with a large total size, and then\n;; use methods based on substring to keep only a small subset of that,\n;; e.g., because you parsed and found a small collection of substrings of\n;; interest for your computation, the large strings will still have\n;; references to them, and thus cannot be garbage collected, even if you\n;; have no other references to them.\n\n;; You can use the Java constructor (String. s) to guarantee that you\n;; copy a string s. (String. (subs s 5 20)) will copy the substring once\n;; pre-version-7u6, but it will copy the substring twice\n;; post-version-7u6.\n\n;; I believe java.util.regex.Matcher method group, and\n;; java.util.regex.Pattern method split, also have the same\n;; behavior as substring.\n\n;; This affects the behavior of Clojure functions such as:\n\n;; In clojure.core:\n;; subs, re-find, re-matches, re-seq\n;; In clojure.string:\n;; replace replace-first split\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}, :_id "542692d5c026201cdc32709d"} {:updated-at 1517506971847, :created-at 1517506971847, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body ";; Suppose you want to shorten a string of blanks [outdent]\n;; Starting with a string of length 5\n;; [Here I do not use blanks to illustrate what is happening]\n(def s5 \"abcdef\")\n;; and reducing its length by 2\n(subs s5 (min 2 (count s5))) \n;=> \"cdef\"\n(subs s5 (min 10 (count s5))) \n;=> \"\"", :_id "5a73519be4b0c974fee49d19"}], :notes nil, :arglists ["s start" "s start end"], :doc "Returns the substring of s beginning at start inclusive, and ending\n at end (defaults to length of string), exclusive.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/subs"} {:added "1.1", :ns "clojure.core", :name "ref-min-history", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1364770283000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c63"} {:created-at 1364770288000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref-max-history", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c64"} {:created-at 1364770294000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref-history-count", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c65"}], :line 2470, :examples [{:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body "(def r (ref 0))\n(ref-min-history r)\n;; 0\n\n(ref-min-history r 1) ; setter\n;; #object[clojure.lang.Ref 0x1f3f02ee {:status :ready, :val 0}]\n\n(ref-min-history r) ; getter\n;; 1\n", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1550443391880, :updated-at 1553683971669, :_id "5c69e37fe4b0ca44402ef68d"} {:updated-at 1550443972155, :created-at 1550443972155, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Setting the min history > 0 \n;; prevents read faults and related TX restart.\n;; Here T2 changes r after T1 started but haven't deref r yet.\n\n(def r (ref 0)) ; min-history is zero\n\n(future\n (dosync\n (println \"-Tx starting-\")\n (Thread/sleep 10000)\n (println \"T1:\" @r)))\n;; -Tx starting-\n\n(future\n (dosync\n (println \"T2:\" (alter r inc))))\n;; T2: 1\n;; -Tx starting-\n;; T1: 1\n\n;; Here T1 has one ref history value available and\n;; does not restart.\n(def r (ref 0))\n(ref-min-history r 1)\n\n(future\n (dosync\n (println \"-Tx starting-\")\n (Thread/sleep 10000)\n (println \"T1:\" @r)))\n;; -Tx starting-\n\n(future\n (dosync\n (println \"T2:\" (alter r inc))))\n;; T2: 1\n;; T1: 0", :_id "5c69e5c4e4b0ca44402ef68e"}], :notes nil, :arglists ["ref" "ref n"], :doc "Gets the min-history of a ref, or sets it and returns the ref", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ref-min-history"} {:added "1.0", :ns "clojure.core", :name "set", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1289811222000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "hash-set", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f12"} {:created-at 1289811227000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sorted-set", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f13"} {:created-at 1289811237000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "conj", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f14"} {:created-at 1313621942000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "join", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f15"} {:created-at 1313621949000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "select", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f16"} {:created-at 1313621954000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "difference", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f17"} {:created-at 1313621961000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "intersection", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f18"} {:created-at 1313621965000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "union", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f19"} {:created-at 1313621977000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "index", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f1a"} {:created-at 1313621988000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "project", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f1b"} {:created-at 1313621999000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "rename", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f1c"} {:created-at 1313622003000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "rename-keys", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f1d"} {:created-at 1313622018000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "map-invert", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f1e"} {:created-at 1313622048000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "disj", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f1f"} {:created-at 1315819885000, :author {:login "wdkrnls", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/6d08a2f792f289b95fe1d982d4133d71?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "distinct", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f20"}], :line 4105, :examples [{:author {:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"}, :editors [{:login "seancorfield", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9354eec0679e2d3b36b77ff62165f717?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body ";; returns distinct elements\nuser=> (set '(1 1 2 3 2 4 5 5))\n#{1 2 3 4 5}\n\n;; returns distinct elements (different nomenclature)\nuser=> (set [1 1 2 3 2 4 5 5])\n#{1 2 3 4 5}\n\nuser=> (set [1 2 3 4 5]) \n#{1 2 3 4 5}\n\nuser=> (set \"abcd\")\n#{\\a \\b \\c \\d}\n\nuser=> (set '(\"a\" \"b\" \"c\" \"d\"))\n#{\"a\" \"b\" \"c\" \"d\"}\n\nuser=> (set {:one 1 :two 2 :three 3})\n#{[:two 2] [:three 3] [:one 1]}\n\nuser=> (set nil)\n#{}", :created-at 1279417897000, :updated-at 1423275927213, :_id "542692cbc026201cdc326bfb"} {:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [{:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}], :body "(set [1 2 3 2 1 2 3])\n-> #{1 2 3}\n\n#{:a :b :c :d}\n-> #{:d :a :b :c}\n\n(hash-set :a :b :c :d)\n-> #{:d :a :b :c}\n \n(sorted-set :a :b :c :d)\n-> #{:a :b :c :d}\n\n;------------------------------------------------\n\n(def s #{:a :b :c :d})\n(conj s :e)\n-> #{:d :a :b :e :c}\n \n(count s)\n-> 4\n \n(seq s)\n-> (:d :a :b :c)\n \n(= (conj s :e) #{:a :b :c :d :e})\n-> true\n\n(s :b)\n-> :b\n \n(s :k)\n-> nil", :created-at 1289811205000, :updated-at 1289811299000, :_id "542692cbc026201cdc326bff"}], :notes [{:updated-at 1316747546000, :body "The documentation doesn't mention the order, is it undefined?\r\n\r\n#{:a :b :c :d}\r\n-> #{:d :a :b :c}\r\n", :created-at 1316747546000, :author {:login "icefox", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/dc848256f8954abd612cbe7e81859f91?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fce"} {:author {:login "venantius", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1824859?v=3"}, :updated-at 1476386802865, :created-at 1476386802865, :body "Sets are a core data structure that by definition do not store elements in a sorted order. The actual order will ultimately be determined by the specific hashing function underpinning the data structure. ", :_id "57ffdff2e4b001179b66bdcc"} {:author {:login "dhbarnett", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1676252?v=4"}, :updated-at 1568233525282, :created-at 1568233525282, :body "Is the order guaranteed to be consistent if so is it not ordered (just not asc/desc)? ", :_id "5d795835e4b0ca44402ef7b2"} {:author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :updated-at 1573849219982, :created-at 1573849219982, :body "Sets are not ordered, so there’s not guarantee on their “order”.", :_id "5dcf0883e4b0ca44402ef7e0"}], :arglists ["coll"], :doc "Returns a set of the distinct elements of coll.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/set"} {:added "1.1", :ns "clojure.core", :name "take-last", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1306817623000, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "last", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d0d"} {:created-at 1306817710000, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "butlast", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d0e"} {:created-at 1306817740000, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "drop-last", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d0f"} {:created-at 1473271791957, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "subvec", :ns "clojure.core"}, :_id "57d057efe4b0709b524f04ea"}], :line 2941, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user=> (take-last 2 [1 2 3 4])\n(3 4)\n\nuser=> (take-last 2 [4])\n(4)\n\nuser=> (take-last 2 [])\nnil\n\nuser=> (take-last 2 nil)\nnil\n\nuser=> (take-last 0 [1])\nnil\n\nuser=> (take-last -1 [1])\nnil", :created-at 1280323099000, :updated-at 1423278794590, :_id "542692cec026201cdc326de0"}], :notes [{:author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :updated-at 1521555189789, :created-at 1521555189789, :body "Unlike \"drop-last\" (but like \"last\"), \"take-last\" is not lazy:\n\n
\n(def bomb (take-last 1 (range))) ;; infinite evaluation, never returns\n(def lazy-bomb (drop-last 1 (range))) ;; good, but don't use!\n
", :_id "5ab116f5e4b045c27b7fac1a"}], :arglists ["n coll"], :doc "Returns a seq of the last n items in coll. Depending on the type\n of coll may be no better than linear time. For vectors, see also subvec.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/take-last"} {:added "1.0", :ns "clojure.core", :name "bit-set", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1461359248259, :author {:login "fasiha", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/37649?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "bit-test", :ns "clojure.core"}, :_id "571a9290e4b0e6b5e3f27e5c"} {:created-at 1527805055459, :author {:login "NealEhardt", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1338977?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "bit-clear", :ns "clojure.core"}, :_id "5b10747fe4b045c27b7fac8a"}], :line 1337, :examples [{:updated-at 1461359232399, :created-at 1280337241000, :body "user=> (bit-set 2r1011 2) ; index is 0-based\n15 \n;; 15 = 2r1111\n\n;; the same in decimal\nuser=> (bit-set 11 2) \n15", :editors [{:avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon", :account-source "clojuredocs", :login "zmila"} {:avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon", :account-source "clojuredocs", :login "zmila"} {:login "fasiha", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/37649?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon", :account-source "clojuredocs", :login "zmila"}, :_id "542692c7c026201cdc32696f"} {:editors [{:login "fasiha", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/37649?v=3"}], :body ";; Returns a long, like all Clojure bit operations\nuser=> (bit-set 0 63)\n-9223372036854775808\n; A signed 64-bit number with only the sign bit (most significant bit) on.\n; This is the most negative number representable by signed 64 bits: -(2**63).\n; Same as:\nuser=> (bit-shift-left 1 63)\n-9223372036854775808\n\n;; And in case you forget your common powers to two, here's a reference ^^\nuser=> (bit-set 0 32)\n4294967296\nuser=> (bit-set 0 16)\n65536\nuser=> (bit-set 0 8)\n256\nuser=> (bit-set 0 4)\n16", :author {:avatar-url "https://avatars.githubusercontent.com/u/37649?v=3", :account-source "github", :login "fasiha"}, :created-at 1461359743597, :updated-at 1461359793455, :_id "571a947fe4b0e6b5e3f27e5d"}], :notes nil, :arglists ["x n"], :doc "Set bit at index n", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bit-set"} {:added "1.7", :ns "clojure.core", :name "reader-conditional", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495962203638, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reader-conditional?", :ns "clojure.core"}, :_id "592a925be4b093ada4d4d776"} {:created-at 1495962209101, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "read", :ns "clojure.core"}, :_id "592a9261e4b093ada4d4d777"} {:created-at 1495962222485, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "read-string", :ns "clojure.core"}, :_id "592a926ee4b093ada4d4d778"}], :line 7738, :examples [{:updated-at 1495962191755, :created-at 1495962191755, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body ";;;; The data representation for reader conditionals is used by Clojure\n;;;; when reading a string/file into Clojure data structures but choosing \n;;;; to preserve the conditionals themselves (instead of replacing them with\n;;;; the appropriate platform-specific code)\n\n;;;; Create a data representation for a NON-SPLICING reader conditional\n\n(def r-cond (reader-conditional '(:clj (Math/random)) false))\n;;=> #'user/r-cond\nr-cond\n;;=> #?(:clj (Math/random))\n(:form r-cond)\n;;=> (:clj (Math/random))\n(:splicing? r-cond)\n;;=> false\n\n;;;; Data representation is same as the one produced by (read-string)\n;;;; and (read) when provided with the option to preserve data conditionals\n\n(= r-cond (read-string {:read-cond :preserve} \"#?(:clj (Math/random))\"))\n;;=> true\n\n;;;; Create a data representation for a SPLICING reader conditional\n\n(def r-cond (reader-conditional '(:clj [Math/PI Math/E]) true))\n;;=> #'user/r-cond\n(:clj [Math/PI Math/E])\n;;=> #?@(:clj [Math/PI Math/E])\n(:form r-cond)\n;;=> (:clj [Math/PI Math/E])\n(:splicing? r-cond)\n;;=> true\n\n;;;; Data representation is same as the one produced by (read-string)\n;;;; and (read) when provided with the option to preserve data conditionals\n\n(= r-cond (read-string {:read-cond :preserve} \"#?@(:clj [Math/PI Math/E])\"))\n;;=> true", :_id "592a924fe4b093ada4d4d775"}], :notes nil, :arglists ["form splicing?"], :doc "Construct a data representation of a reader conditional.\n If true, splicing? indicates read-cond-splicing.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/reader-conditional"} {:added "1.0", :ns "clojure.core", :name "gen-class", :file "clojure/genclass.clj", :type "macro", :column 1, :see-alsos [{:created-at 1360270663000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "proxy", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bd7"} {:created-at 1360270670000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "gen-interface", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bd8"}], :line 507, :examples [{:author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :editors [{:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"} {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "(gen-class\n\t:name \"some.package.RefMap\"\n\t:implements [java.util.Map]\n\t:state \"state\"\n\t:init \"init\"\n\t:constructors {[] []}\n\t:prefix \"ref-map-\")\n\n(defn ref-map-init []\n\t[[] (ref {})])\n\n(defn ref-map-size [this]\n\t(let [state (.state this)] (.size @state)))\n\t\n(defn ref-map-isEmpty [this]\n\t(let [state (.state this)] (.isEmpty @state)))\n\n(defn ref-map-containsKey [this o]\n\t(let [state (.state this)] (.containsKey @state o)))\n\t\n(defn ref-map-containsValue [this o]\n\t(let [state (.state this)] (.containsValue @state o)))\n\t\n(defn ref-map-get [this o]\n\t(let [state (.state this)] (.get @state o)))\n\t\n(defn ref-map-keySet [this]\n\t(let [state (.state this)] (.keySet @state)))\n\t\n(defn ref-map-values [this]\n\t(let [state (.state this)] (.values @state)))\n\t\n(defn ref-map-entrySet [this]\n\t(let [state (.state this)] (.entrySet @state)))\n\t\n(defn ref-map-equals [this o]\n\t(let [state (.state this)] (.equals @state o)))\n\t\n(defn ref-map-hashCode [this]\n\t(let [state (.state this)] (.hashCode @state)))\n\t\n(defn ref-map-put [this k v]\n\t(let [state (.state this)] \n\t\t(dosync (alter state assoc k v)) v))\n\t\n(defn ref-map-putAll [this m]\n\t(let [state (.state this)]\n\t\t(doseq [[k v] (map identity m)] (.put this k v))))\n\t\t\n(defn ref-map-remove [this o]\n\t(let [state (.state this) v (get @state o)] \n\t\t(dosync (alter state dissoc o)) v))\n\t\n(defn ref-map-clear [this]\n\t(let [state (.state this)] \n\t\t(dosync (ref-set state {}))))\n\t\n(defn ref-map-toString [this]\n\t(let [state (.state this)] (.toString @state)))", :created-at 1279770352000, :updated-at 1332952789000, :_id "542692cec026201cdc326dab"} {:author {:login "daviddurand", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1316941?v=2"}, :editors [], :body ";; I found managing state a bit confusing at first.\n;; here's a dumb little class with a getter and setter for a \"location\" field.\n\n(ns com.example )\n\n(gen-class\n :name com.example.Demo\n :state state\n :init init\n :prefix \"-\"\n :main false\n ;; declare only new methods, not superclass methods\n :methods [[setLocation [String] void]\n [getLocation [] String]])\n\n;; when we are created we can set defaults if we want.\n(defn -init []\n \"store our fields as a hash\"\n [[] (atom {:location \"default\"})])\n\n;; little functions to safely set the fields.\n(defn setfield\n [this key value]\n (swap! (.state this) into {key value}))\n\n(defn getfield\n [this key]\n (@(.state this) key))\n\n;; \"this\" is just a parameter, not a keyword\n(defn -setLocation [this loc]\n (setfield this :location loc))\n\n(defn -getLocation\n [this]\n (getfield this :location))\n\n;; running it -- you must compile and put output on the classpath\n;; create a Demo, check the default value, then set it and check again.\nuser=> (def ex (com.example.Demo.))\n#'user/ex\nuser=> (.getLocation ex)\n\"default\"\nuser=> (.setLocation ex \"time\")\nnil\nuser=> (.getLocation ex)\n\"time\"\n", :created-at 1325884685000, :updated-at 1325884685000, :_id "542692d3c026201cdc326fbb"} {:editors [{:login "mars0i", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1836941?v=4"}], :body ";; This example illustrates the syntax intended by the docstring's remark that \n;; \"Static methods can be specified with ^{:static true} in the signature's \n;; metadata\", and notes a case in which you might not think that you need to use\n;; :methods.\n\n;; The docs say, about :methods, \"Do not repeat superclass/interface\n;; signatures here.\" That applies to non-static methods. If you want to\n;; define a static method to hide a static method in the superclass, you\n;; are not overriding the superclass method (the behavior is different).\n;; You are simply defining a new method with the same name. In this case,\n;; you should add a signature to :methods if you want your function to be\n;; visible to Java, with metadata indicating that it is static placed\n;; before the signature vector:\n\n(ns \n ...\n (:gen-class \n ...\n :methods [[...] ...\n ^{:static true} [name [] java.lang.String]\n [...] ...]\n ...))\n\n(defn -name [] \"My name is Foo\")\n\n;; Also note that you can replace \"^{:static true}\" with \"^:static\".", :author {:avatar-url "https://avatars0.githubusercontent.com/u/1836941?v=4", :account-source "github", :login "mars0i"}, :created-at 1554533983608, :updated-at 1554575687135, :_id "5ca84e5fe4b0ca44402ef6fe"} {:updated-at 1558971581245, :created-at 1558971581245, :author {:login "holyjak", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/624958?v=4"}, :body ";; It is possible to attach Java annotations to the class,\n;; constructors, and methods \n;; Source: https://github.com/clojure/clojure/blob/8af7e9a92570eb28c58b15481ae9c271d891c028/test/clojure/test_clojure/genclass/examples.clj#L34\n(gen-class :name ^{Deprecated {}\n SuppressWarnings [\"Warning1\"] ; discarded\n java.lang.annotation.Target []}\n clojure.test_clojure.genclass.examples.ExampleAnnotationClass\n :prefix \"annot-\"\n :methods [[^{Deprecated {}\n Override {}} ;discarded\n foo [^{java.lang.annotation.Retention java.lang.annotation.RetentionPolicy/SOURCE\n java.lang.annotation.Target [java.lang.annotation.ElementType/TYPE\n java.lang.annotation.ElementType/PARAMETER]}\n String] void]])\n", :_id "5cec04bde4b0ca44402ef72b"} {:updated-at 1625726462164, :created-at 1625726462164, :author {:login "mattiuusitalo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/47240847?v=4"}, :body ";; Defining a custom constructor which calls a superclass constructor:\n(ns my.CustomException\n (:gen-class\n :implements [clojure.lang.IExceptionInfo]\n :extends java.lang.RuntimeException\n :constructors {[String Throwable clojure.lang.IPersistentMap] [String Throwable]} ; mapping of my-constructor -> superclass constuctor\n :init init\n :state state ; name for the var that holds your internal state\n :main false\n :prefix \"my-ex-\"))\n\n(defn my-ex-init [msg t context]\n ;; first element of vector contains parameters for the superclass constructor\n ;; Second element will be your internal state \n [[msg t] context]) \n\n(defn my-ex-getData [this]\n (.state this)) ; accessing the internal state\n", :_id "60e69dfee4b0b1e3652d7513"}], :macro true, :notes [{:updated-at 1280115806000, :body "When implementing interface methods with `gen-class` (when using `:implements`) watch out for primitive return types in interface methods.\r\n\r\nWhen you get weird `NullPointerException`s or `ClassPathException`s then make sure whether the value returned by your functions can be converted by Clojure to the primitive return type defined in the interface for that method.\r\n\r\nExample:\r\n\r\nGiven:\r\n\r\n
\r\ninterface Test {\r\n   boolean isTest();\r\n}\r\n
\r\n\r\nClojure implementation:\r\n\r\n
\r\n(gen-class :name \"MyTest\" :implements [Test])\r\n\r\n; Will throw NPE when executed, \r\n; can't be converted to boolean\r\n(defn -isTest [this] nil) \r\n
\r\n\r\n
\r\n(gen-class :name \"MyTest\" :implements [Test])\r\n\r\n; Will throw ClassCastExcpetion when executed, \r\n; can't be converted to boolean\r\n(defn -isTest [this] (Object.)) \r\n
", :created-at 1280115806000, :author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f8a"} {:updated-at 1311325790000, :body "When implementing an interface or extending an abstract class that implements an interface, be careful to implement all methods in the implemented interfaces. Note: The abstract class is not required to implement all methods in the interface. The clojure compiler does not throw compiler errors if you do not implement a method. A runtime error will be thrown when someone tries to use the function. The documentation suggests that you will receive UnsupportedOperationException, however in the case of the abstract class a java.lang.AbstractMethodError is thrown. \r\n\r\n**example:**\r\n\r\nLog4j appender - Extending AppenderSkeleton will fail with runtime error\r\n
(gen-class :name clj.TestAppender :extends  org.apache.log4j.AppenderSkeleton)\r\n\r\n(defn -append [this event]\r\n  (println (.getMessage event)))\r\n
\r\n\r\n\r\nNeed to implement close and requireLayout. These are not in AppenderSkeleton but are required by the interface Appender.\r\n
(gen-class :name TstAppender :extends org.apache.log4j.AppenderSkeleton)\r\n\r\n(defn -append [this event]\r\n  (println (.getMessage event)))\r\n\r\n(defn -close [this]) ;nothing to clean up\r\n\r\n(defn -requireLayout [this] false)\r\n\r\n
\r\n\r\n\r\n", :created-at 1306791528000, :author {:login "ckirkendall", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c29cd3a5f182e6de85cbd172fb9b5ab8?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fbf"} {:body "If your namespace has dashes in it, then the class name will be mangled so the dashes become underscores, unless you have a :name directive. Your naive instantiation will fail with ClassNotFoundException.\n\n (ns my-project.MyClass\n (:gen-class))\n\n (my-project.MyClass.) ;;=> java.lang.ClassNotFoundException\n (my_project.MyClass.) ;;=> #", :created-at 1418209544515, :updated-at 1418209661100, :author {:login "alilee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/16739?v=3"}, :_id "54882908e4b04e93c519ffa1"} {:author {:login "staypufd", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/10730?v=4"}, :updated-at 1518392816391, :created-at 1518392816391, :body "Note: If you are using :extends you must use the fully qualified class name even if the class is in the :import list for the namespace. ", :_id "5a80d5f0e4b0316c0f44f8b8"} {:author {:login "mars0i", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1836941?v=4"}, :updated-at 1554575508996, :created-at 1554575508996, :body "Not strictly speaking a `gen-class` issue, but if you need to override a Java method that's overloaded by specifying different classes for its arguments, this can be done by incorporating the class names into Clojure function names. See:\n\nhttps://groups.google.com/forum/#!topic/clojure/TVRsy4Gnf70\n\nhttps://puredanger.github.io/tech.puredanger.com/2011/08/12/subclassing-in-clojure\n\nhttp://stackoverflow.com/questions/32773861/clojure-gen-class-for-overloaded-and-overridden-methods\n\nhttp://dishevelled.net/Tricky-uses-of-Clojure-gen-class-and-AOT-compilation.html\n", :_id "5ca8f094e4b0ca44402ef705"}], :arglists ["& options"], :doc "When compiling, generates compiled bytecode for a class with the\n given package-qualified :name (which, as all names in these\n parameters, can be a string or symbol), and writes the .class file\n to the *compile-path* directory. When not compiling, does\n nothing. The gen-class construct contains no implementation, as the\n implementation will be dynamically sought by the generated class in\n functions in an implementing Clojure namespace. Given a generated\n class org.mydomain.MyClass with a method named mymethod, gen-class\n will generate an implementation that looks for a function named by \n (str prefix mymethod) (default prefix: \"-\") in a\n Clojure namespace specified by :impl-ns\n (defaults to the current namespace). All inherited methods,\n generated methods, and init and main functions (see :methods, :init,\n and :main below) will be found similarly prefixed. By default, the\n static initializer for the generated class will attempt to load the\n Clojure support code for the class as a resource from the classpath,\n e.g. in the example case, ``org/mydomain/MyClass__init.class``. This\n behavior can be controlled by :load-impl-ns\n\n Note that methods with a maximum of 18 parameters are supported.\n\n In all subsequent sections taking types, the primitive types can be\n referred to by their Java names (int, float etc), and classes in the\n java.lang package can be used without a package qualifier. All other\n classes must be fully qualified.\n\n Options should be a set of key/value pairs, all except for :name are optional:\n\n :name aname\n\n The package-qualified name of the class to be generated\n\n :extends aclass\n\n Specifies the superclass, the non-private methods of which will be\n overridden by the class. If not provided, defaults to Object.\n\n :implements [interface ...]\n\n One or more interfaces, the methods of which will be implemented by the class.\n\n :init name\n\n If supplied, names a function that will be called with the arguments\n to the constructor. Must return [ [superclass-constructor-args] state] \n If not supplied, the constructor args are passed directly to\n the superclass constructor and the state will be nil\n\n :constructors {[param-types] [super-param-types], ...}\n\n By default, constructors are created for the generated class which\n match the signature(s) of the constructors for the superclass. This\n parameter may be used to explicitly specify constructors, each entry\n providing a mapping from a constructor signature to a superclass\n constructor signature. When you supply this, you must supply an :init\n specifier. \n\n :post-init name\n\n If supplied, names a function that will be called with the object as\n the first argument, followed by the arguments to the constructor.\n It will be called every time an object of this class is created,\n immediately after all the inherited constructors have completed.\n Its return value is ignored.\n\n :methods [ [name [param-types] return-type], ...]\n\n The generated class automatically defines all of the non-private\n methods of its superclasses/interfaces. This parameter can be used\n to specify the signatures of additional methods of the generated\n class. Static methods can be specified with ^{:static true} in the\n signature's metadata. Do not repeat superclass/interface signatures\n here.\n\n :main boolean\n\n If supplied and true, a static public main function will be generated. It will\n pass each string of the String[] argument as a separate argument to\n a function called (str prefix main).\n\n :factory name\n\n If supplied, a (set of) public static factory function(s) will be\n created with the given name, and the same signature(s) as the\n constructor(s).\n \n :state name\n\n If supplied, a public final instance field with the given name will be\n created. You must supply an :init function in order to provide a\n value for the state. Note that, though final, the state can be a ref\n or agent, supporting the creation of Java objects with transactional\n or asynchronous mutation semantics.\n\n :exposes {protected-field-name {:get name :set name}, ...}\n\n Since the implementations of the methods of the generated class\n occur in Clojure functions, they have no access to the inherited\n protected fields of the superclass. This parameter can be used to\n generate public getter/setter methods exposing the protected field(s)\n for use in the implementation.\n\n :exposes-methods {super-method-name exposed-name, ...}\n\n It is sometimes necessary to call the superclass' implementation of an\n overridden method. Those methods may be exposed and referred in \n the new method implementation by a local name.\n\n :prefix string\n\n Default: \"-\" Methods called e.g. Foo will be looked up in vars called\n prefixFoo in the implementing ns.\n\n :impl-ns name\n\n Default: the name of the current ns. Implementations of methods will be \n looked up in this namespace.\n\n :load-impl-ns boolean\n\n Default: true. Causes the static initializer for the generated class\n to reference the load code for the implementing namespace. Should be\n true when implementing-ns is the default, false if you intend to\n load the code via some other method.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/gen-class"} {:added "1.9", :ns "clojure.core", :name "qualified-keyword?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495715351421, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "keyword?", :ns "clojure.core"}, :_id "5926ce17e4b093ada4d4d766"} {:created-at 1495715368644, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "simple-keyword?", :ns "clojure.core"}, :_id "5926ce28e4b093ada4d4d767"}], :line 1642, :examples [{:editors [{:login "troglotit", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/10955264?v=4"}], :body "(qualified-keyword? :user/:keyword)\n;;=> true\n(qualified-keyword? ::keyword)\n;;=> true\n\n(qualified-keyword? :keyword)\n;;=> false\n\n(qualified-keyword? \"string\")\n;;=> false\n(qualified-keyword? 42)\n;;=> false\n(qualified-keyword? nil)\n;;=> false", :author {:avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3", :account-source "github", :login "svenschoenung"}, :created-at 1495722029967, :updated-at 1525876162343, :_id "5926e82de4b093ada4d4d768"}], :notes nil, :arglists ["x"], :doc "Return true if x is a keyword with a namespace", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/qualified-keyword_q"} {:added "1.0", :ns "clojure.core", :name "while", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1360216659000, :author {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "loop", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e4c"} {:created-at 1423524433851, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "dotimes", :library-url "https://github.com/clojure/clojure"}, :_id "54d94251e4b081e022073c7c"} {:created-at 1502829799304, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "repeatedly", :ns "clojure.core"}, :_id "59935ce7e4b0d19c2ce9d718"} {:created-at 1608681273224, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "swap!", :ns "clojure.core"}, :_id "5fe28739e4b0b1e3652d741d"} {:created-at 1608681301934, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "atom", :ns "clojure.core"}, :_id "5fe28755e4b0b1e3652d741e"}], :line 6333, :examples [{:updated-at 1608681521678, :created-at 1280547677000, :body ";; a var to be used for its side effects\n(def a (atom 10)) \n;; #'user/a\n\n(while (pos? @a)\n (println @a)\n (swap! a dec))\n;; 10\n;; 9\n;; 8\n;; 7\n;; 6\n;; 5\n;; 4\n;; 3\n;; 2\n;; 1\n;;=> nil", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon", :account-source "clojuredocs", :login "dakrone"}, :_id "542692ccc026201cdc326c69"} {:editors [{:login "slipset", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5894926?v=3"} {:avatar-url "https://avatars2.githubusercontent.com/u/87162?v=4", :account-source "github", :login "rafaelrinaldi"} {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; calculate the MD5 of a file incrementally:\n\n(import\n 'java.io.File\n 'javax.xml.bind.DatatypeConverter\n 'java.security.MessageDigest\n 'java.security.DigestInputStream)\n\n(require '[clojure.java.io :as io])\n\n(defn md5-file [file]\n (let [sha (MessageDigest/getInstance \"MD5\")] \n (with-open [dis (DigestInputStream. (io/input-stream file) sha)] \n (while (> (.read dis) -1))) \n (DatatypeConverter/printHexBinary (.digest sha)))) \n\n(md5-file (File. \"/etc/hosts\"))\n;; \"04F186E74288A10E09DFBF8A88D64A1F33C0E698AAA6B75CDB0AC3ABA87D5644\"", :author {:avatar-url "https://avatars.githubusercontent.com/u/20086?v=3", :account-source "github", :login "reborg"}, :created-at 1469865962017, :updated-at 1518975645400, :_id "579c5feae4b0bafd3e2a04c3"}], :macro true, :notes nil, :arglists ["test & body"], :doc "Repeatedly executes body while test expression is true. Presumes\n some side-effect will cause test to become false/nil. Returns nil", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/while"} {:ns "clojure.core", :name "->Eduction", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 7682, :examples nil, :notes nil, :arglists ["xform coll"], :doc "Positional factory function for class clojure.core.Eduction.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/->Eduction"} {:added "1.0", :ns "clojure.core", :name "butlast", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1289038922000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "first", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c0b"} {:created-at 1289038928000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rest", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c0c"} {:created-at 1289038933000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "last", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c0d"} {:created-at 1289038937000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "next", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c0e"} {:created-at 1322055950000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "drop-last", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c0f"} {:created-at 1360842503000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "take-last", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c10"} {:created-at 1442106939048, :author {:login "miner", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25400?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pop", :ns "clojure.core"}, :_id "55f4ce3be4b06a9ffaad4fbd"}], :line 272, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}], :body "user=> (butlast [1 2 3])\n(1 2)\nuser=> (butlast (butlast [1 2 3]))\n(1)\nuser=> (butlast (butlast (butlast [1 2 3])))\nnil", :created-at 1279073589000, :updated-at 1289038906000, :_id "542692c8c026201cdc326a4c"} {:updated-at 1438337824330, :created-at 1289038828000, :body ";really slow reverse\n;put the last item of the list at the start of a new list, and recur over all but the last item of the list.\n;butlast acts similar to next in that it returns null for a 1-item list.\n\n(defn my-reverse [xs]\n (when xs\n (cons (last xs) (my-reverse (butlast xs)))))", :editors [{:login "danneu", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/529580?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon", :account-source "clojuredocs", :login "boxie"}, :_id "542692c8c026201cdc326a4e"} {:updated-at 1521202617879, :created-at 1521202617879, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; A version of (into) that doesn't require (comp)\n;; for transducers arguments.\n\n(defn into* [to & args]\n (into to\n (apply comp (butlast args))\n (last args)))\n\n(into* [] (range 10))\n;; [0 1 2 3 4 5 6 7 8 9]\n\n(into* [] (map inc) (range 10))\n;; [1 2 3 4 5 6 7 8 9 10]\n\n(into* [] (map inc) (filter odd?) (range 10))\n;; [1 3 5 7 9]", :_id "5aabb5b9e4b0316c0f44f926"} {:updated-at 1615302673505, :created-at 1615235547686, :author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :body ";; `butlast` (linear time) vs. `drop-last` (lazy, efficient, more flexible, \n;; constant time(?)) vs. `pop` (fast but requires a vector).\n\n(def r (range 10000))\n\n(time (butlast r)) ;;=> \"Elapsed time: 6.379 msecs\"\n(time (drop-last r)) ;;=> \"Elapsed time: 0.0475 msecs\"\n(time (drop-last 2 r)) ;;=> \"Elapsed time: 0.0569 msecs\"\n(time (drop-last 0 r)) ;;=> \"Elapsed time: 0.098 msecs\"\n(time (drop-last -1 r)) ;;=> \"Elapsed time: 0.0615 msecs\"\n\n(def r-vec (vec r)) ;; to work like `butlast` pop needs a vector \n(time (pop r-vec)) ;;=> \"Elapsed time: 0.062 msecs\"", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4", :account-source "github", :login "Crowbrammer"}], :_id "604689dbe4b0b1e3652d7477"}], :notes [{:author {:login "miner", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25400?v=3"}, :updated-at 1442107338476, :created-at 1442107338476, :body "When using a vector, `pop` is faster than `butlast`.", :_id "55f4cfcae4b05246bdf20a8c"} {:author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :updated-at 1524422433918, :created-at 1524422433918, :body "`pop` will throw exception if the vector is empty, whereas `butlast` will return `nil`", :_id "5adcd721e4b045c27b7fac4c"} {:author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :updated-at 1615236256681, :created-at 1615235954399, :body "In my example, `but-last` is ~100 x slower than `drop-last`. `butlast` cannot remove multiple elements from the end, but `drop-last` can. `butlast` seems eager, and `drop-last` seems lazy. 'butlast' will return nil when empty, and `drop-last` will return `'()` when empty. ", :_id "60468b72e4b0b1e3652d747b"}], :arglists ["coll"], :doc "Return a seq of all but the last item in coll, in linear time", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/butlast"} {:added "1.2", :ns "clojure.core", :name "satisfies?", :file "clojure/core_deftype.clj", :type "function", :column 1, :see-alsos [{:created-at 1326611358000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "extend", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b64"} {:created-at 1345918796000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defprotocol", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b65"} {:created-at 1432578777116, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "instance?", :library-url "https://github.com/clojure/clojure"}, :_id "55636ad9e4b03e2132e7d16e"} {:created-at 1501651305911, :author {:login "chbrown", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/360279?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "extends?", :ns "clojure.core"}, :_id "59816169e4b0d19c2ce9d706"} {:created-at 1542365684479, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "extenders", :ns "clojure.core"}, :_id "5beea1f4e4b00ac801ed9efe"}], :line 569, :examples [{:author {:login "Jeff Rose", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/567898c496278341be69087507d5ed24?r=PG&default=identicon"}, :editors [], :body "(ns foo)\n\n(defprotocol Foo\n (foo [this]))\n\n(defprotocol Bar\n (bar [this]))\n\n(extend java.lang.Number\n Bar\n {:bar (fn [this] 42)})\n\n(extend java.lang.String\n Foo\n {:foo (fn [this] \"foo\")}\n Bar\n {:bar (fn [this] \"forty two\")})\n\n(satisfies? Foo \"zam\") ; => true\n(satisfies? Bar \"zam\") ; => true\n(satisfies? Foo 123) ; => false\n(satisfies? Bar 123) ; => true", :created-at 1294900425000, :updated-at 1294900425000, :_id "542692cfc026201cdc326e5a"} {:updated-at 1557925978004, :created-at 1557925978004, :author {:login "thenonameguy", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/2217181?v=4"}, :body ";; Note that protocol argument should be the var generated by the \n;; defprotocol call, not the Java interface.\n\n(ns a)\n\n(defprotocol Foo\n (foo [this]))\n\n(ns b\n (:require [a])\n (:import a.Foo))\n\n;; bad\n(satisfies? Foo :test) ; => NPE\n;; good\n(satisfies? a/Foo :test) ; => false", :_id "5cdc105ae4b0ca44402ef725"}], :notes [{:author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :updated-at 1593310454862, :created-at 1593310294294, :body "Unless this issue is resolved, do not use this function in a hot path, for it is extremely slow. See also this post ", :_id "5ef7fc56e4b0b1e3652d7313"}], :arglists ["protocol x"], :doc "Returns true if x satisfies the protocol", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/satisfies_q"} {:added "1.0", :ns "clojure.core", :name "line-seq", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1420222290902, :author {:login "kappa", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/47310?v=3"}, :to-var {:ns "clojure.core", :name "read-line", :library-url "https://github.com/clojure/clojure"}, :_id "54a6df52e4b09260f767ca82"}], :line 3085, :examples [{:author {:login "juergenhoetzel", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2736dfffc803c704dcf25b45ff63cede?r=PG&default=identicon"}, :editors [{:login "juergenhoetzel", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2736dfffc803c704dcf25b45ff63cede?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Count lines of a file (loses head):\nuser=> (with-open [rdr (clojure.java.io/reader \"/etc/passwd\")]\n (count (line-seq rdr)))\n\n", :created-at 1279948343000, :updated-at 1285497370000, :_id "542692cec026201cdc326de3"} {:author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :editors [], :body "(import '(java.io BufferedReader StringReader))\n\n;; line terminators are stripped\nuser=> (line-seq (BufferedReader. (StringReader. \"1\\n2\\n\\n3\")))\n(\"1\" \"2\" \"\" \"3\")\n\n;; empty string gives nil\nuser=> (line-seq (BufferedReader. (StringReader. \"\")))\nnil\n", :created-at 1301874056000, :updated-at 1301874056000, :_id "542692cec026201cdc326de7"} {:body ";; read from standard input\nuser=> (nth (line-seq (java.io.BufferedReader. *in*)) 2)\n #_=> 0\n #_=> 1\n #_=> 2\n\"2\"\n", :author {:login "kappa", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/47310?v=3"}, :created-at 1420222563716, :updated-at 1420222563716, :_id "54a6e063e4b04e93c519ffb0"}], :notes [{:body "Documentation says that `line-seq` returns a lazy sequence, however
\nthe actual return value is a `Cons` cell of the first line to a `LazySeq` of
\nthe second line. Calling `realized?` on the `Cons` cell will fail with an exception.\n\n`(cons (.readLine rdr) (lazy-seq (line-seq rdr)))`
\n\nExample:
\n`(def rdr (BufferedReader. (StringReader. \" 1\\n 2\\n 3\")))`
\n`(def x (line-seq rdr))`
\n`(class x)`
\n`=> clojure.lang.Cons`\n\n`(realized? x)`
\n`=> Execution error (ClassCastException) class clojure.lang.Cons cannot be cast to class clojure.lang.IPending`\n\nThe first line was eagerly realized by the initial call to the `line-seq`.
\n`(.readLine rdr)`
\n`=> \" 2\"`", :created-at 1620895381108, :updated-at 1620896615263, :author {:avatar-url "https://avatars.githubusercontent.com/u/28925709?v=4", :account-source "github", :login "nxtk"}, :_id "609ce695e4b0b1e3652d74fa"}], :arglists ["rdr"], :doc "Returns the lines of text from rdr as a lazy sequence of strings.\n rdr must implement java.io.BufferedReader.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/line-seq"} {:added "1.0", :ns "clojure.core", :name "unchecked-subtract-int", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1488034774618, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unchecked-add-int", :ns "clojure.core"}, :_id "58b19bd6e4b01f4add58fe65"}], :line 1205, :examples [{:updated-at 1488034725028, :created-at 1488034725028, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :body ";; Subtracting two int-range Longs works\n(unchecked-subtract-int 1 1)\n;;=> 0\n\n;; Subtracting two int-range BigInts works\n(unchecked-subtract-int 1N 1N)\n;;=> 0\n\n;; Doubles are truncated\n(unchecked-subtract-int 1 1.9)\n;;=> 0\n\n;; BigDecimals are truncated\n(unchecked-subtract-int 1 1.9M)\n;;=> 0\n\n;; Uncaught integer overflow\n(unchecked-subtract-int Integer/MAX_VALUE -1)\n;;=> -2147483648\n\n;; Uncaught integer underflow\n(unchecked-subtract-int Integer/MIN_VALUE 1)\n;;=> 2147483647\n\n;; Fails for Longs outside of int range\n(unchecked-subtract-int 2147483648 0)\n;;=> IllegalArgumentException Value out of range for int: 2147483648 clojure.lang.RT.intCast (RT.java:1205)\n\n;; Fails for BigInts outside of int range\n(unchecked-subtract-int 2147483648N 0)\n;;=> IllegalArgumentException Value out of range for int: 2147483648 clojure.lang.RT.intCast (RT.java:1205)\n\n;; Fails for Doubles outside of int range\n(unchecked-subtract-int 2147483648.0 0)\n;;=> IllegalArgumentException Value out of range for int: 2147483648 clojure.lang.RT.intCast (RT.java:1205)\n\n;; Fails for BigDecimals outside of int range\n(unchecked-subtract-int 2147483648.0M 0)\n;;=> IllegalArgumentException Value out of range for int: 2147483648 clojure.lang.RT.intCast (RT.java:1205)", :_id "58b19ba5e4b01f4add58fe64"}], :notes nil, :arglists ["x y"], :doc "Returns the difference of x and y, both int.\n Note - uses a primitive operator subject to overflow.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-subtract-int"} {:added "1.9", :ns "clojure.core", :name "*print-namespace-maps*", :file "clojure/core_print.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 41, :examples [{:updated-at 1540400673371, :created-at 1540400673371, :author {:login "mainej", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/6774?v=4"}, :body ";; In a REPL:\n\n(prn {:num/val 1 :num/name \"one\"})\n;; #:num{:val 1, :name \"one\"}\n;;=> nil\n\n(binding [*print-namespace-maps* false] \n (prn {:num/val 1 :num/name \"one\"}))\n;; {:num/val 1, :num/name \"one\"}\n;;=> nil\n", :_id "5bd0a621e4b00ac801ed9ee9"}], :notes [{:author {:login "katox", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/287639?v=4"}, :updated-at 1588435708523, :created-at 1588435708523, :body "In the Cursive or CIDER REPL the dynamic var is already set (defaults to `true`). Changing the binding would only work within bound expressions but it won't change the behaviour of the REPL itself.\n\nChanging the printing multi-method allows you to \"turn it off\" completely:\n```\n; don't use namespaced maps by default in the REPL\n(defmethod print-method clojure.lang.IPersistentMap [m, ^java.io.Writer w]\n (#'clojure.core/print-meta m w)\n (#'clojure.core/print-map m #'clojure.core/pr-on w))\n```", :_id "5ead9afce4b087629b5a18fc"}], :arglists [], :doc "*print-namespace-maps* controls whether the printer will print\n namespace map literal syntax. It defaults to false, but the REPL binds\n to true.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*print-namespace-maps*"} {:added "1.0", :ns "clojure.core", :name "take-nth", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1421519147165, :author {:login "kappa", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/47310?v=3"}, :to-var {:ns "clojure.core", :name "partition", :library-url "https://github.com/clojure/clojure"}, :_id "54baa92be4b0e2ac61831cbb"} {:created-at 1544035011111, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nth", :ns "clojure.core"}, :_id "5c081ac3e4b0ca44402ef5db"} {:created-at 1544035026986, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "rand-nth", :ns "clojure.core"}, :_id "5c081ad2e4b0ca44402ef5dc"}], :line 4288, :examples [{:updated-at 1285495759000, :created-at 1280776443000, :body "user=> (take-nth 2 (range 10))\n(0 2 4 6 8)\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692cec026201cdc326dd9"} {:body ";; N <= 0 is a special case\n(take 3 (take-nth 0 (range 2)))\n;;=> (0 0 0)\n\n(take 3 (take-nth -10 (range 2)))\n;;=> (0 0 0)", :author {:login "miner", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25400?v=3"}, :created-at 1432222807506, :updated-at 1432222807506, :_id "555dfc57e4b03e2132e7d169"}], :notes [{:body "`(take-nth 0 (range 10))` will loop forever.", :created-at 1423278929350, :updated-at 1423278929350, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :_id "54d58351e4b081e022073c6c"} {:body "(take-nth 0 coll) will return an infinite sequence repeating for first item from coll. A negative N is treated the same as 0.", :created-at 1432222489733, :updated-at 1432222489733, :author {:login "miner", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25400?v=3"}, :_id "555dfb19e4b03e2132e7d168"} {:author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :updated-at 1522313231902, :created-at 1522253561476, :body "
\n;; In case you are searching for it, drop-nth is not in core.\n\n(defn drop-nth [n coll]\n  (lazy-seq\n    (when-let [s (seq coll)]\n      (concat (take (dec n) (rest s))\n              (drop-nth n (drop n s))))))\n\n(drop-nth 3 (range 10))\n;; (1 2 4 5 7 8)\n\n;; or alternatively: (keep-indexed #(when-not (zero? (rem %1 n)) %2) coll)\n
", :_id "5abbbef9e4b045c27b7fac29"}], :arglists ["n" "n coll"], :doc "Returns a lazy seq of every nth item in coll. Returns a stateful\n transducer when no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/take-nth"} {:added "1.0", :ns "clojure.core", :name "first", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1289038142000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rest", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f64"} {:created-at 1289038147000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "next", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f65"} {:created-at 1303125616000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "nth", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f66"} {:created-at 1303125622000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "second", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f67"} {:created-at 1328341708000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "take", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f68"} {:created-at 1348637402000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ffirst", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f69"} {:created-at 1493777583103, :author {:login "Juve-yescas", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/26342224?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "butlast", :ns "clojure.core"}, :_id "59093cafe4b01f4add58fea4"}], :line 49, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(first '(:alpha :bravo :charlie))\n;;=> :alpha", :created-at 1279071245000, :updated-at 1420735684016, :_id "542692ccc026201cdc326c6c"} {:updated-at 1545256959607, :created-at 1303680354000, :body ";; nil is a valid (but empty) collection.\n(first nil)\n;;=> nil\n\n;; if collection is empty, returns nil.\n(first [])\n;;=> nil\n\n;; if first item in collection is nil, returns nil\n(first [nil])\n;;=> nil", :editors [{:avatar-url "https://www.gravatar.com/avatar/69ad2af1f028b1b7e76c14f83bdf26cb?r=PG&default=identicon", :account-source "clojuredocs", :login "jszakmeister"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "vaer-k", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4069456?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon", :account-source "clojuredocs", :login "belun"}, :_id "542692ccc026201cdc326c6e"} {:updated-at 1493775730548, :created-at 1493775730548, :author {:login "Juve-yescas", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/26342224?v=3"}, :body "=> (first [1 2])\n1\n\n=> (first [ [1 2] [3 4] ])\n[1 2]", :_id "59093572e4b01f4add58fea3"} {:updated-at 1661100444310, :created-at 1661100444310, :author {:login "zuzhi", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/11850845?v=4"}, :body "=> (first \"j\")\n\\j\n\n=> (int (first \"j\"))\n106", :_id "6302619ce4b0b1e3652d7647"}], :notes nil, :arglists ["coll"], :doc "Returns the first item in the collection. Calls seq on its\n argument. If coll is nil, returns nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/first"} {:added "1.0", :ns "clojure.core", :name "re-groups", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1282039215000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "re-find", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e6a"} {:created-at 1444479086186, :author {:login "muhuk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/40178?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "re-matcher", :ns "clojure.core"}, :_id "5619006ee4b084e61c76ecc1"}], :line 4858, :examples [{:author {:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"}, :editors [], :body "user=> (def phone-number \"672-345-456-3212\")\n#'user/phone-number\n\nuser=> (def matcher (re-matcher #\"((\\d+)-(\\d+))\" phone-number))\n#'user/matcher\n\nuser=> (re-find matcher)\n[\"672-345\" \"672-345\" \"672\" \"345\"]\n\n;; re-groups gets the most recent find or matches\nuser=> (re-groups matcher)\n[\"672-345\" \"672-345\" \"672\" \"345\"]\nuser=> (re-groups matcher)\n[\"672-345\" \"672-345\" \"672\" \"345\"]\n\n\nuser=> (re-find matcher)\n[\"456-3212\" \"456-3212\" \"456\" \"3212\"]\n\nuser=> (re-groups matcher)\n[\"456-3212\" \"456-3212\" \"456\" \"3212\"]\nuser=> (re-groups matcher)\n[\"456-3212\" \"456-3212\" \"456\" \"3212\"]\n\n\nuser=> (re-find matcher)\nnil\n\nuser=> (re-groups matcher)\nIllegalStateException No match found java.util.regex.Matcher.group (Matcher.java:468)", :created-at 1312374649000, :updated-at 1312374649000, :_id "542692c9c026201cdc326a7f"} {:editors [{:login "jgrodziski", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/408494?v=4"}], :body ";;given a string to match\nuser=> (def flight \"AF-22-CDG-JFK-2017-09-08\")\n#'User/flight\n;; groups and give a name to matches\nuser=> (def flight-regex #\"(?[A-Z0-9]+)-(?[0-9]+[A-Z]?)-(?[A-Z]+)-(?[A-Z]+)-(?[0-9]+)-(?[0-9]+)-(?[0-9]+)\")\n#'user/flight-regex\nuser=> (def matcher (re-matcher flight-regex flight))\n#'user/matcher\n;; it allows good grasp of meaning and understanding of the data extraction from the regex\nuser=> (if (.matches matcher)\n {:airline-code (.group matcher \"airlineCode\") \n :flight-number (.group matcher \"flightNumber\") \n :from (.group matcher \"from\") \n :to (.group matcher \"to\") \n :year (.group matcher \"year\") \n :month (.group matcher \"month\") \n :day (.group matcher \"day\")}\n (throw (ex-info (str \"Can't extract detailed value from flight\"))))\n{:airline-code \"AF\", :flight-number \"22\", :from \"CDG\", :to \"JFK\", :year \"2017\", :month \"09\", :day \"08\"}\nuser=>\n;;Beware that groups are available in Java Regex not in Javascript ones...", :author {:avatar-url "https://avatars3.githubusercontent.com/u/408494?v=4", :account-source "github", :login "jgrodziski"}, :created-at 1504879066415, :updated-at 1504880637927, :_id "59b2a1dae4b09f63b945ac64"} {:editors [{:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=4"}], :body ";\n; Java supports named capture groups\n;\n; Define a phone number pattern with some named groups\n(let [patt (re-pattern \"(?\\\\d{3})-(?\\\\d{3})-(?\\\\d{4})\")]\n ; `re-matches` will find the capturing groups and stick them in a vector\n ; after the full match The capture groups are numbered starting with 1.\n ; The full match is like group zero.\n (is= [\"619-239-5464\" \"619\" \"239\" \"5464\"] (re-matches patt \"619-239-5464\"))\n\n ; Construct a java.util.regex.Matcher. Keep in mind that it is a mutable object!\n (let [matcher (re-matcher patt \"619-239-5464\")]\n ; Execute the Matcher via `re-find`. It returns all 4 groups and caches them\n (is= [\"619-239-5464\" \"619\" \"239\" \"5464\"] (re-find matcher))\n\n ; `re-groups` simply returns the cached result from the Matcher\n (is= [\"619-239-5464\" \"619\" \"239\" \"5464\"] (re-groups matcher))\n\n ; We need the instance function Matcher.group( ) to\n ; extract the named group\n (is= \"619\" (.group matcher \"area\"))\n (is= \"239\" (.group matcher \"prefix\"))\n (is= \"5464\" (.group matcher \"tail\"))))\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/7083783?v=4", :account-source "github", :login "cloojure"}, :created-at 1622895257068, :updated-at 1622895336509, :_id "60bb6a99e4b0b1e3652d7506"}], :notes nil, :arglists ["m"], :doc "Returns the groups from the most recent match/find. If there are no\n nested groups, returns a string of the entire match. If there are\n nested groups, returns a vector of the groups, the first element\n being the entire match.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/re-groups"} {:added "1.0", :ns "clojure.core", :name "seq?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1286870491000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "seq", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bc7"} {:created-at 1304804140000, :author {:login "0x89", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/56bc4acd59315ed4dc1cb99c3be71102?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sequential?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bc8"} {:created-at 1304804146000, :author {:login "0x89", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/56bc4acd59315ed4dc1cb99c3be71102?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vector?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bc9"} {:created-at 1304804161000, :author {:login "0x89", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/56bc4acd59315ed4dc1cb99c3be71102?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "coll?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bca"} {:created-at 1304804189000, :author {:login "0x89", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/56bc4acd59315ed4dc1cb99c3be71102?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "list?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bcb"} {:created-at 1304804202000, :author {:login "0x89", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/56bc4acd59315ed4dc1cb99c3be71102?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "map?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bcc"} {:created-at 1304804206000, :author {:login "0x89", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/56bc4acd59315ed4dc1cb99c3be71102?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "set?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bcd"} {:created-at 1495638773577, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "seqable?", :ns "clojure.core"}, :_id "5925a2f5e4b093ada4d4d728"}], :line 146, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [], :body "user> (seq? 1)\nfalse\nuser> (seq? [1])\nfalse\nuser> (seq? (seq [1]))\ntrue", :created-at 1286870431000, :updated-at 1286870431000, :_id "542692c8c026201cdc326a5e"} {:updated-at 1604526011911, :created-at 1334018590000, :body ";; contrast to example code for sequential?\n;;\nuser> (seq? '(1 2 3))\ntrue\nuser=> (seq? #{1 2 3})\nfalse\nuser> (seq? [1 2 3]) ; for sequential?, returns true\nfalse\nuser> (seq? (range 1 5))\ntrue\nuser> (seq? 1)\nfalse\nuser> (seq? {:a 2 :b 1})\nfalse\nuser> ", :editors [{:login "allentiak", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1922297?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/bad5f5cb177b0968d4288596691ec3cd?r=PG&default=identicon", :account-source "clojuredocs", :login "gregginca"}, :_id "542692d5c026201cdc32707c"} {:updated-at 1485952236986, :created-at 1485952236986, :author {:login "yochannah", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/9271438?v=3"}, :body ";; Don't use seq? when you want to check for a vector.\n;; you may have intended to use seq instead\n\ncljs.user=> (def x [:a :b :c])\n#'cljs.user/x\ncljs.user=> (if (seq x) \"Seq ok\" \"No Seqing here\")\n\"Seq ok\"\ncljs.user=> (if (seq? x) \"Seq ok\" \"No Seqing here\")\n\"No Seqing here\"", :_id "5891d4ece4b01f4add58fe35"}], :notes nil, :arglists ["x"], :doc "Return true if x implements ISeq", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/seq_q"} {:added "1.0", :ns "clojure.core", :name "dec'", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1415177726472, :author {:login "rvlieshout", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/139665?v=2"}, :to-var {:ns "clojure.core", :name "dec", :library-url "https://github.com/clojure/clojure"}, :_id "5459e5fee4b0dc573b892fb9"} {:created-at 1495706257856, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "inc'", :ns "clojure.core"}, :_id "5926aa91e4b093ada4d4d753"}], :line 1135, :examples [{:author {:login "szemek", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/78b14dbb96afe3befc04757dc5e06225?r=PG&default=identicon"}, :editors [], :body "user=> (dec' 0.1)\n-0.9\n\nuser=> (dec' 1)\n0\n\nuser=> (dec' 1.0)\n0.0", :created-at 1335130392000, :updated-at 1335130392000, :_id "542692d2c026201cdc326f77"} {:updated-at 1495706067200, :created-at 1495706067200, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body ";;;; (dec') auto-promotes on integer overflow:\n\n(dec' (Long/MIN_VALUE))\n;;=> -9223372036854775809N\n\n;;;; Unlike (dec) which does not:\n\n(dec (Long/MIN_VALUE))\n;;=> ArithmeticException integer overflow", :_id "5926a9d3e4b093ada4d4d751"}], :notes nil, :arglists ["x"], :doc "Returns a number one less than num. Supports arbitrary precision.\n See also: dec", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/dec'"} {:added "1.0", :ns "clojure.core", :name "ns-unmap", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1288683645000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "remove-ns", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d33"} {:created-at 1341280172000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ns-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d34"} {:created-at 1426949911751, :author {:login "ryoakg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/23413?v=3"}, :to-var {:ns "clojure.core", :name "def", :library-url "https://github.com/clojure/clojure"}, :_id "550d8717e4b056ca16cfecf9"} {:created-at 1484215112470, :author {:login "rauhs", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/11081351?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "intern", :ns "clojure.core"}, :_id "58775348e4b09108c8545a57"} {:created-at 1512578699260, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ns-unalias", :ns "clojure.core"}, :_id "5a281e8be4b0a08026c48cd1"}], :line 4178, :examples [{:author {:login "james", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4b163432c99a124feee4be046a3f9d66?r=PG&default=identicon"}, :editors [{:login "MicahElliott", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/159047?v=3"}], :body "user=> (def foo 1)\n#'user/foo\n\nuser=> foo\n1\n\nuser=> (ns-unmap 'user 'foo) ; explicit\nnil\n\nuser=> (ns-unmap *ns* 'foo) ; convenient\nnil\n\nuser=> foo\n\"Unable to resolve symbol: foo in this context\"\n", :created-at 1290213451000, :updated-at 1335243941000, :_id "542692c7c026201cdc3269a3"}], :notes [{:author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :updated-at 1512036603446, :created-at 1512036603446, :body "Note this function doesn’t work for namespaces aliases; you need to use `ns-unalias` if you want to remove one.", :_id "5a1fd8fbe4b0a08026c48cc8"}], :arglists ["ns sym"], :doc "Removes the mappings for the symbol from the namespace.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ns-unmap"} {:added "1.0", :ns "clojure.core", :name "println-str", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1318573842000, :author {:login "haplo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/890d46f8c0e24dd6fb8546095b1144e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "println", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e07"} {:created-at 1374264235000, :author {:login "lbeschastny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/416170465e4045f810f09a9300dda4dd?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "print-str", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e08"} {:created-at 1592850187673, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "str", :ns "clojure.core"}, :_id "5ef0f70be4b0b1e3652d730d"}], :line 4763, :examples [{:author {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"} {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"} {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"} {:login "matthewg", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b29dd31d183124d9e87d8037bb30e326?r=PG&default=identicon"}], :body ";; Create a newline-terminated string from the items and store it in x.\nuser=> (def x (println-str 1 \"foo\" \\b \\a \\r {:a 2}))\n#'user/x\n\n;; It's a string.\nuser=> (string? x)\ntrue\n\n;; Notice that the items are separated by a space. Also, the newline string is\n;; platform-specific. See clojure.core/newline.\nuser=> x\n\"1 foo b a r {:a 2}\\r\\n\"\n", :created-at 1284257337000, :updated-at 1323234147000, :_id "542692cfc026201cdc326e4c"}], :notes nil, :tag "java.lang.String", :arglists ["& xs"], :doc "println to a string, returning it", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/println-str"} {:added "1.1", :ns "clojure.core", :name "with-bindings*", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1374313837000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-bindings", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bb4"}], :line 1973, :examples [{:updated-at 1335591761000, :created-at 1335591761000, :body "user=> (let [f (fn [] *warn-on-reflection*)]\n (with-bindings* {#'*warn-on-reflection* true} f))\ntrue", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692d6c026201cdc3270b8"}], :notes nil, :arglists ["binding-map f & args"], :doc "Takes a map of Var/value pairs. Installs for the given Vars the associated\n values as thread-local bindings. Then calls f with the supplied arguments.\n Pops the installed bindings after f returned. Returns whatever f returns.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/with-bindings*"} {:added "1.9", :ns "clojure.core", :name "inst-ms", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495635499100, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "inst?", :ns "clojure.core"}, :_id "5925962be4b093ada4d4d721"}], :line 6787, :examples [{:updated-at 1495636375815, :created-at 1495636375815, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body "(inst-ms (java.util.Date.))\n;;=> 1495636054438\n(inst-ms (java.time.Instant/now))\n;;=> 1495636054438\n\n(inst-ms (java.sql.Date. 1495636054438))\n;;=> 1495636054438\n(inst-ms (java.sql.Timestamp. 1495636054438))\n;;=> 1495636054438", :_id "59259997e4b093ada4d4d723"}], :notes nil, :arglists ["inst"], :doc "Return the number of milliseconds since January 1, 1970, 00:00:00 GMT", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/inst-ms"} {:added "1.0", :ns "clojure.core", :name "iterator-seq", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1398980083000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "seq", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e96"}], :line 5721, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Note this is not strictly necessary since keySet is a collection\n;; implementing Iterable but it does show the usage.\n\nuser=> (iterator-seq (.iterator (.keySet (java.lang.System/getProperties))))\n\n(\"java.runtime.name\" \"sun.boot.library.path\" \"java.vm.version\" \"java.vm.vendor\" \"java.vendor.url\" \"path.separator\" \"java.vm.name\" \"file.encoding.pkg\" \"sun.java.launcher\" \"user.country\" \"sun.os.patch.level\" \"java.vm.specification.name\" \"user.dir\" \"java.runtime.version\" \"java.awt.graphicsenv\" \"java.endorsed.dirs\" \"os.arch\" \"javax.accessibility.assistive_technologies\" \"java.io.tmpdir\" \"line.separator\" \"java.vm.specification.vendor\" \"os.name\" \"cljr.home\" \"sun.jnu.encoding\" \"java.library.path\" \"java.specification.name\" \"java.class.version\" \"sun.management.compiler\" \"os.version\" \"user.home\" \"user.timezone\" \"java.awt.printerjob\" \"file.encoding\" \"java.specification.version\" \"include.cljr.repo.jars\" \"java.class.path\" \"user.name\" \"java.vm.specification.version\" \"java.home\" \"sun.arch.data.model\" \"user.language\" \"java.specification.vendor\" \"java.vm.info\" \"java.version\" \"java.ext.dirs\" \"sun.boot.class.path\" \"java.vendor\" \"file.separator\" \"java.vendor.url.bug\" \"clojure.home\" \"sun.io.unicode.encoding\" \"sun.cpu.endian\" \"sun.desktop\" \"sun.cpu.isalist\")\n", :created-at 1284711960000, :updated-at 1287995124000, :_id "542692cdc026201cdc326d15"} {:updated-at 1519828356542, :created-at 1519828356542, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Java 8 streams as sequences\n(->> \"Clojure is the best language\"\n (.splitAsStream #\"\\s+\")\n .iterator\n iterator-seq)\n\n;; (\"Clojure\" \"is\" \"the\" \"best\" \"language\")", :_id "5a96bd84e4b0316c0f44f903"}], :notes [{:updated-at 1287834466000, :body "I've noticed that I needed to use iterator-seq when trying to map over a Java function that returns an AbstractList Iterator. It was not directly seq-able.", :created-at 1287834466000, :author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f9d"}], :arglists ["iter"], :doc "Returns a seq on a java.util.Iterator. Note that most collections\n providing iterators implement Iterable and thus support seq directly.\n Seqs cache values, thus iterator-seq should not be used on any\n iterator that repeatedly returns the same mutable object.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/iterator-seq"} {:added "1.0", :ns "clojure.core", :name "iterate", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1291953286000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "cycle", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b0d"} {:created-at 1335482527000, :author {:login "metajack", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/194d8437f5baed192c90be27369c4922?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "repeatedly", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b0e"} {:created-at 1343152603000, :author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "repeat", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b0f"} {:created-at 1455301227264, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "take", :ns "clojure.core"}, :_id "56be226be4b060004fc217c1"} {:created-at 1455301237712, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nth", :ns "clojure.core"}, :_id "56be2275e4b060004fc217c2"}], :line 3013, :examples [{:author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :editors [{:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"} {:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"} {:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"} {:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/2746668?v=4", :account-source "github", :login "victoraldecoa"} {:login "stoat1", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2543524?v=4"}], :body ";; iterate Ad Infinitum starting at 5 using the inc (increment) function\nuser=> (iterate inc 5)\n(5 6 7 8 9 10 11 12 13 14 15 ... n ...\n\n;; limit results\nuser=> (take 3 (iterate inc 5))\n(5 6 7)\n\nuser=> (take 10 (iterate (partial + 2) 0))\n(0 2 4 6 8 10 12 14 16 18)\n\nuser=> (take 20 (iterate (partial + 2) 0))\n(0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38)\n\n", :created-at 1279048785000, :updated-at 1615738001527, :_id "542692cac026201cdc326b22"} {:author {:login "citizen428", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3881a28fe402dd2d1de44717486cae8?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (def powers-of-two (iterate (partial * 2) 1))\n#'user/powers-of-two\n\nuser=> (nth powers-of-two 10)\n1024\nuser=> (take 10 powers-of-two)\n(1 2 4 8 16 32 64 128 256 512)\n", :created-at 1280707793000, :updated-at 1285496060000, :_id "542692cac026201cdc326b29"} {:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"} {:login "Bobby", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c0541baac8a638e07f5895c7224f8b7e?r=PG&default=identicon"} {:login "Bobby", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c0541baac8a638e07f5895c7224f8b7e?r=PG&default=identicon"} {:login "maacl", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8ff89765136c38707e0f57cf48679a13?r=PG&default=identicon"}], :body ";; demonstrating the power of iterate\n;; to generate the Fibonacci sequence\n;; uses +' to promote to BigInt\nuser=> (def fib (map first (iterate (fn [[a b]] [b (+' a b)]) [0 1])))\n#'user/fib\n\nuser=> (take 10 fib)\n(0 1 1 2 3 5 8 13 21 34)", :created-at 1310850870000, :updated-at 1388690059000, :_id "542692cac026201cdc326b2b"} {:updated-at 1520938144240, :created-at 1520938144240, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; iterate (also range, repeat and cycle) have a reduce\n;; fast path. Use with reduce, transduce, eduction etc.\n\n(defn pi\n \"Approximate Pi to the 1/n decimal with Leibniz formula\"\n [n]\n (transduce\n (comp (map #(/ 4 %)) (take n))\n +\n (iterate #(* ((if (pos? %) + -) % 2) -1) 1.0)))\n\n(time (pi 1e8))\n\"Elapsed time: 9776.924934 msecs\"\n;; 3.141592643589326", :_id "5aa7aca0e4b0316c0f44f923"}], :notes nil, :arglists ["f x"], :doc "Returns a lazy sequence of x, (f x), (f (f x)) etc. f must be free of side-effects", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/iterate"} {:added "1.0", :ns "clojure.core", :name "slurp", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1330170507000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "reader", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521efd"} {:created-at 1314301885000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "spit", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f54"} {:created-at 1529010527201, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "resource", :ns "clojure.java.io"}, :_id "5b22d95fe4b00ac801ed9e16"}], :line 6942, :examples [{:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (spit \"blubber.txt\" \"test\")\nnil\nuser=> (slurp \"blubber.txt\")\n\"test\"", :created-at 1280458838000, :updated-at 1332952657000, :_id "542692cac026201cdc326b32"} {:updated-at 1603841965576, :created-at 1314221982000, :body ";; To access web page. Note the use of https://\n;; prefix\n\nuser=> (slurp \"https://clojuredocs.org\")\n; This will return the html content of clojuredocs.org", :editors [{:login "fhightower", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/3599813?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon", :account-source "clojuredocs", :login "OnesimusUnbound"}, :_id "542692cac026201cdc326b34"} {:author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :editors [], :body ";; Access absolute location on Windows\n\nuser=> (slurp \"C:\\\\tasklists.xml\")\n", :created-at 1314301837000, :updated-at 1314301837000, :_id "542692cac026201cdc326b35"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; On Linux, some JVMs have a bug where they cannot read a file in the /proc\n;; filesystem as a buffered stream or reader. A workaround to this JVM issue\n;; is to open such a file as unbuffered:\n(slurp (java.io.FileReader. \"/proc/cpuinfo\"))", :created-at 1330170476000, :updated-at 1330170476000, :_id "542692d5c026201cdc327086"} {:author {:login "nils.grunwald", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/6c7661b3ea6397abbf5a2048ee07d995?r=PG&default=identicon"}, :editors [{:login "nils.grunwald", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/6c7661b3ea6397abbf5a2048ee07d995?r=PG&default=identicon"} {:login "nils.grunwald", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/6c7661b3ea6397abbf5a2048ee07d995?r=PG&default=identicon"}], :body ";; You can specify what encoding to use by giving a :encoding param, and an encoding string recognized by your JVM\n\nuser=> (slurp \"/path/to/file\" :encoding \"ISO-8859-1\")", :created-at 1342145976000, :updated-at 1342146268000, :_id "542692d5c026201cdc327087"} {:updated-at 1464367678770, :created-at 1464367678770, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :body ";; you can fetch URLs\n\n(slurp \"http://www.example.com\")", :_id "57487a3ee4b0bafd3e2a0467"} {:updated-at 1485689448487, :created-at 1485689448487, :author {:login "mhmdsalem1993", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10787314?v=3"}, :body ";; you can read bytes also\n\n(def arr-bytes (into-array Byte/TYPE (range 128)))\n(slurp arr-bytes)", :_id "588dd268e4b01f4add58fe33"}], :notes [{:updated-at 1309555971000, :body "Use slurp also to read an input stream into a string.", :created-at 1309555971000, :author {:login "mjg123", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2d7180cd610e068c47d3ba7337f1425c?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fc3"} {:updated-at 1387184994000, :body "With link: “See [`clojure.java.io/reader`](http://clojuredocs.org/clojure_core/clojure.java.io/reader) for a complete list of supported arguments.â€�\r\n\r\nAccording to those docs, here are the supported types for `f`, the object to read:\r\n\r\n* [`Reader`](http://docs.oracle.com/javase/7/docs/api/java/io/Reader.html)\r\n* [`BufferedReader`](http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html)\r\n* [`InputStream`](http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html)\r\n* [`File`](http://docs.oracle.com/javase/7/docs/api/java/io/File.html)\r\n* [`URI`](http://docs.oracle.com/javase/7/docs/api/java/net/URI.html)\r\n* [`URL`](http://docs.oracle.com/javase/7/docs/api/java/net/URL.html)\r\n* [`Socket`](http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html)\r\n* byte arrays (`byte[]`)\r\n* character arrays (`char[]`)\r\n* [`String`](http://docs.oracle.com/javase/7/docs/api/java/lang/String.html)\r\n\r\n`slurp` can read objects of any of these types into a string.", :created-at 1387183993000, :author {:login "roryokane", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5b2b185c814bb25f2f95a1152e58f033?r=PG&default=identicon"}, :_id "542692edf6e94c6970522015"} {:body "
\n(defn slurp-bytes\n  \"Slurp the bytes from a slurpable thing\"\n  [x]\n  (with-open [out (java.io.ByteArrayOutputStream.)]\n    (clojure.java.io/copy (clojure.java.io/input-stream x) out)\n    (.toByteArray out)))\n
", :created-at 1522121921297, :updated-at 1522121998843, :author {:avatar-url "https://avatars0.githubusercontent.com/u/13529973?v=4", :account-source "github", :login "nevesjorgelucio"}, :_id "5ab9bcc1e4b045c27b7fac27"} {:author {:login "didibus", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/601540?v=4"}, :updated-at 1585180980301, :created-at 1585180980301, :body "Valid options include:\n\n :encoding string name of encoding to use, e.g. \\\"UTF-8\\\".", :_id "5e7bf134e4b087629b5a18c3"}], :tag "java.lang.String", :arglists ["f & opts"], :doc "Opens a reader on f and reads all its contents, returning a string.\n See clojure.java.io/reader for a complete list of supported arguments.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/slurp"} {:added "1.0", :ns "clojure.core", :name "newline", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 3697, :examples [{:author {:login "jjcomer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ef581bba2f97adb539c67a35465b3e1b?r=PG&default=identicon"}, :editors [{:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"}], :body ";; This is equivalent to System.out.println() in Java\nuser=> (newline)\n\nnil\n; Calling println w/o args is equivalent.\nuser=> (println)\n\nnil\nuser=>", :created-at 1330655016000, :updated-at 1402384428000, :_id "542692d4c026201cdc327012"}], :notes nil, :arglists [""], :doc "Writes a platform-specific newline to *out*", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/newline"} {:added "1.1", :ns "clojure.core", :name "short-array", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "shorts", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917718000, :_id "542692eaf6e94c6970521ad6"}], :line 5309, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}], :body ";; create an array of shorts using short-array\n;; and demonstrate how it can be used with the java Arrays functions\n;; (note the needed coercions)\n\nuser=> (def ss (short-array (map short (range 3 10))))\n#'user/ss\nuser=> (type ss)\n[S\nuser=> (vec ss)\n[3 4 5 6 7 8 9]\nuser=> (java.util.Arrays/binarySearch ss (short 6))\n3\nuser=> (java.util.Arrays/fill ss (short 99))\nnil\nuser=> (vec ss)\n[99 99 99 99 99 99 99]\nuser=>", :created-at 1313908642000, :updated-at 1313962982000, :_id "542692c7c026201cdc326987"}], :notes nil, :arglists ["size-or-seq" "size init-val-or-seq"], :doc "Creates an array of shorts", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/short-array"} {:added "1.0", :ns "clojure.core", :name "fn?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1321052077000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ifn?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b3c"}], :line 6237, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:login "replore", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e7869fe1a48cb1814c657eaca6bea3eb?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (fn? 5)\nfalse\nuser=> (fn? inc)\ntrue\nuser=> (fn? (fn []))\ntrue\nuser=> (fn? #(5))\ntrue", :created-at 1279073964000, :updated-at 1332952252000, :_id "542692c6c026201cdc3268f8"} {:author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Even though maps, sets, vectors and keywords behave as functions:\nuser=> ({:a 1} :a)\n1\n\n;; fn? still returns false for them because they are not created using fn:\nuser=> (fn? {:a 1})\nfalse\n", :created-at 1279155323000, :updated-at 1285500252000, :_id "542692c6c026201cdc3268fc"}], :notes [{:author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :updated-at 1504887813989, :created-at 1504887813989, :body "Note `fn?` only tests if something was created using `fn`, *not* if it’s a function. Use [`ifn?`](https://clojuredocs.org/clojure.core/ifn_q) for that. Some things are functions even though they weren’t created with `fn`, such as maps, vectors and keywords.", :_id "59b2c405e4b09f63b945ac66"}], :arglists ["x"], :doc "Returns true if x implements Fn, i.e. is an object created via fn.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/fn_q"} {:added "1.0", :ns "clojure.core", :name "doall", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1289672752000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "dorun", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a8b"} {:created-at 1289672768000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "doseq", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a8c"} {:created-at 1659463132215, :author {:login "puredanger", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/171129?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "run!", :ns "clojure.core"}, :_id "62e965dce4b0b1e3652d7636"}], :line 3148, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [{:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"} {:login "orivej", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cab90c7de5efde92a29f1eacb603ba9a?r=PG&default=identicon"}], :body ";; Nothing is printed because map returns a lazy-seq\nuser=> (def foo (map println [1 2 3]))\n#'user/foo\n\n;; doall forces the seq to be realized\nuser=> (def foo (doall (map println [1 2 3])))\n1\n2\n3\n#'user/foo\n\n;; where\n(doall (map println [1 2 3]))\n1\n2\n3\n(nil nil nil)", :created-at 1280548280000, :updated-at 1362554691000, :_id "542692cbc026201cdc326ba2"} {:updated-at 1436248770172, :created-at 1436248770172, :author {:login "gdeer81", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1340575?v=3"}, :body ";;map a function which makes database calls to either retrieve or \n;;create and retrieves records from the database over a vector of values. \n;;The function returns a map of fields and values\nuser=> (map #(db/make-n-get-or-get :person {:name %}) [\"Fred\" \"Ethel\" \"Lucy\" \"Ricardo\"])\nJdbcSQLException The object is already closed [90007-170] org.h2.message.DbE\nxception.getJdbcSQLException (DbException.java:329)\n\n;;database connection was closed before we got a chance to do our transactions\n;;lets wrap it in doall\nuser=> (doall (map #(db/make-n-get-or-get :person {:name %}) \n[\"Fred\" \"Ethel\" \"Lucy\" \"Ricardo\"]))\nDEBUG :db insert into person values name = 'Fred'\nDEBUG :db insert into person values name = 'Ethel'\nDEBUG :db insert into person values name = 'Lucy'\nDEBUG :db insert into person values name = 'Ricardo'\n({:name \"Fred\"} {:name \"Ethel\"} {:name \"Lucy\"} {:name \"Ricardo\"})\n\n;;notice that unlike using dorun, this returns a list of maps", :_id "559b6ac2e4b020189d740548"} {:updated-at 1493187295161, :created-at 1493187295161, :author {:login "chbrown", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/360279?v=3"}, :body ";; The (doall n coll) form only forces the first n (or more) items in coll to\n;; be realized, but still returns the entire coll.\n(def pr-123 (lazy-seq (cons (pr 1)\n (lazy-seq (cons (pr 2)\n (lazy-seq (cons (pr 3) nil)))))))\n#'user/pr-123\n\n;; Since doall returns the collection, be careful not to let the REPL realize\n;; the whole thing, as it would if we were to call (doall 1 pr-123) instead.\nuser=> (do (doall 1 pr-123) (println))\n12\nnil\n;; The 1 is triggered when (seq pr-123) is called, then the 2 is triggered\n;; when (next pr-123) is called (both inside dorun, via doall).\n\nuser=> pr-123\n3(nil nil nil)\n;; The 3 is finally triggered when the REPL realizes the entirety of pr-123\n\n;; pr-123 is built of nested lazy-seq's because (map pr coll) isn't very lazy:\n(do (doall 1 (map pr (range 100))) (println))\n012345678910111213141516171819202122232425262728293031\nnil\n;; Due to occult clojure.lang.RT/JVM internals (?), (next coll) on this sort\n;; of coll realizes the items in batches of 32 each.\n", :_id "59003adfe4b01f4add58fe9c"} {:updated-at 1510465598561, :created-at 1510464241601, :author {:login "elect000", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/18697629?v=4"}, :body ";; #'for is create lazy-seq\n(def x (for [i (range 10)]\n i)\n\n(type x) ;;=> clojure.lang.LazySeq\n\n;; doall return evaluated value\n(doall x) ;;=> (0 1 2 3 4 ...)\n\n\n;; Notice!\n;; but it is clojure.lang.LazySeq\n(type (doall x)) ;;=> clojure.lang.LazySeq\n\n;; if you want to get list ...\n(into-array x)\n(type (into-array x)) ;;=> [Ljava.lang.Long;", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/18697629?v=4", :account-source "github", :login "elect000"}], :_id "5a07daf1e4b0a08026c48cb1"}], :notes [{:updated-at 1341951212000, :body "Shouldn't we use seq instead of coll in the function signature since we should really pass a sequence?", :created-at 1341951200000, :author {:login "johnnyluu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ba99f2dc1064733c7badbb16db9254a?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fe5"} {:updated-at 1390120527000, :body "'seq' is a function; using it in the function args as a value would shadow the function (and thereby making the function seq unusable in that scope)", :created-at 1390120527000, :author {:login "zephjc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/47639b1aa7a7ccb90000a3ea12b84d7e?r=PG&default=identicon"}, :_id "542692edf6e94c697052201a"}], :arglists ["coll" "n coll"], :doc "When lazy sequences are produced via functions that have side\n effects, any effects other than those needed to produce the first\n element in the seq do not occur until the seq is consumed. doall can\n be used to force any effects. Walks through the successive nexts of\n the seq, retains the head and returns it, thus causing the entire\n seq to reside in memory at one time.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/doall"} {:added "1.0", :ns "clojure.core", :name "prefers", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1337584993000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "prefer-method", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b6f"} {:created-at 1337585000000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "methods", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b70"} {:created-at 1337585004000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "get-method", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b71"}], :line 1824, :examples [{:updated-at 1475527508775, :created-at 1475527508775, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body "(def m {:os ::osx})\n\n(defmulti ex :os)\n\n(defmethod ex ::unix\n [_]\n \"unix\")\n\n(derive ::osx ::unix)\n\n(defmethod ex ::bsd\n [_]\n \"bsd\")\n\n(derive ::osx ::bsd)\n\n(prefer-method ex ::unix ::bsd)\n\n(prefers ex)\n;;=> {:user/unix #{:user/bsd}}", :_id "57f2c354e4b0709b524f051d"}], :notes nil, :arglists ["multifn"], :doc "Given a multimethod, returns a map of preferred value -> set of other values", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/prefers"} {:added "1.0", :ns "clojure.core", :name "enumeration-seq", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 5731, :examples [{:author {:login "leifp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d2f37720f063404ef83b987d2824353d?r=PG&default=identicon"}, :editors [], :body "user=> (enumeration-seq (java.util.StringTokenizer. \"exciting example\"))\n(\"exciting\" \"example\")\n", :created-at 1342527173000, :updated-at 1342527173000, :_id "542692d2c026201cdc326f9d"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; A parallel distinct, using ConcurrentHashMap as a\n;; set of keys to get rid of duplicates. \n;; Keys at the end can be retrieved as an enumeration, \n;; and from that as a sequence, thanks to enumeration-seq\n\n(import '[java.util.concurrent ConcurrentHashMap])\n(require '[clojure.core.reducers :refer [fold]])\n\n(defn parallel-distinct [v]\n (let [m (ConcurrentHashMap.)\n combinef (fn ([] m) ([_ _]))\n reducef (fn [^ConcurrentHashMap m k] (.put m k 1) m)]\n (fold combinef reducef v)\n (enumeration-seq (.keys m))))\n\n(defn many-repeating-numbers [n]\n (into [] (take n (apply concat (repeat (range 10))))))\n\n(parallel-distinct (many-repeating-numbers 1e6))\n;; (0 1 2 3 4 5 6 7 8 9)", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1519838098877, :updated-at 1519838192224, :_id "5a96e392e4b0316c0f44f904"}], :notes nil, :arglists ["e"], :doc "Returns a seq on a java.util.Enumeration", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/enumeration-seq"} {:added "1.7", :ns "clojure.core", :name "dedupe", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1440188329568, :author {:login "blx", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/887504?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "distinct", :ns "clojure.core"}, :_id "55d787a9e4b072d7f27980ea"}], :line 7655, :examples [{:editors [{:login "blx", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/887504?v=3"}], :body "user=> (dedupe [1 2 3 3 3 1 1 6])\n(1 2 3 1 6)", :author {:avatar-url "https://avatars.githubusercontent.com/u/887504?v=3", :account-source "github", :login "blx"}, :created-at 1440188225498, :updated-at 1440188473719, :_id "55d78741e4b0831e02cddf18"} {:updated-at 1558989991424, :created-at 1558989991424, :author {:login "AMacGregor27", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/46518023?v=4"}, :body ";; This is taken from a problem on 4Clojure (30. Compress a sequence).\nuser=> (dedupe \"Leeeeroy\")\n(\\L \\e \\r \\o \\y)\n\nuser=> (dedupe [[1 2] [1 2] [3 4] [1 2]])\n([1 2] [3 4] [1 2])\n\nuser=> (dedupe [[1 [1 2]] [1 [2 3]] [1 [1 2]] [1 [1 2]]])\n([1 [1 2]] [1 [2 3]] [1 [1 2]])\n\n;; This does not remove all duplicates from a collection, only consecutive ones.\nuser=> (dedupe [1 2 2 1 1 1 2 1 2 2])\n(1 2 1 2 1 2)\n\n;; To remove all duplicates, use distinct.\nuser=> (distinct [1 2 2 1 1 1 2 1 2 2])\n(1 2)", :_id "5cec4ca7e4b0ca44402ef72f"} {:updated-at 1607179810709, :created-at 1607179810709, :author {:login "siddharthjain-in", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/6537820?v=4"}, :body "user=> (dedupe [1/2 2/4])\n(1/2)\n\nuser=>(dedupe [1/2 2/6])\n(1/2 1/3)\n\nuser=>(dedupe [1/2 0.5 2/4])\n(1/2 0.5 1/2)", :_id "5fcb9e22e4b0b1e3652d7416"} {:editors [{:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=4"}], :body ";; parentheses can be omitted in thread macro \nuser> (->> [1 1 2 2] (map inc) dedupe)\n(2 3)\n;; transducer version that does not work, parentheses cannot be omitted\nuser> (sequence (comp (map inc) dedupe) [1 1 2 2])\nExecution error (IllegalArgumentException) at user/eval15380 (form-init7517833771916228311.clj:104).\nDon't know how to create ISeq from: clojure.lang.TransformerIterator$1\n;; transducer that works\nuser> (sequence (comp (map inc) (dedupe)) [1 1 2 2])\n(2 3)", :author {:avatar-url "https://avatars.githubusercontent.com/u/889685?v=4", :account-source "github", :login "huahaiy"}, :created-at 1639422117065, :updated-at 1639422160521, :_id "61b798a5e4b0b1e3652d7589"}], :notes nil, :arglists ["" "coll"], :doc "Returns a lazy sequence removing consecutive duplicates in coll.\n Returns a transducer when no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/dedupe"} {:added "1.0", :ns "clojure.core", :name "dissoc", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1293866784000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "assoc", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c5a"} {:created-at 1351064004000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "disj", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c5c"} {:created-at 1367625873000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "select-keys", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c5d"}], :line 1504, :examples [{:updated-at 1565336715281, :created-at 1280340610000, :body "(dissoc {:a 1 :b 2 :c 3}) ; dissoc nothing \n;;=> {:a 1, :b 2, :c 3} \n\n(dissoc {:a 1 :b 2 :c 3} :b) ; dissoc key :b\n;;=> {:a 1, :c 3} \n\n(dissoc {:a 1 :b 2 :c 3} :d) ; dissoc not existing key\n;;=> {:a 1, :b 2, :c 3} \n\n(dissoc {:a 1 :b 2 :c 3} :c :b) ; several keys at once\n;;=> {:a 1} \n", :editors [{:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/201852?v=3", :account-source "github", :login "michaelcameron"} {:login "dominem", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11671382?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon", :account-source "clojuredocs", :login "zmila"}, :_id "542692cfc026201cdc326e63"} {:updated-at 1442111008755, :created-at 1442111008755, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :body ";; There is no (dissoc-in) analogous to (get-in) or (assoc-in), but \n;; you can achieve a similar effect using (update-in):\n\n(update-in {:a {:b {:x 3} :c 1}} [:a :b] dissoc :x)\n;;=> {:a {:b {}, :c 1}}", :_id "55f4de20e4b05246bdf20a8e"} {:updated-at 1492776031769, :created-at 1492776031769, :author {:login "skuro", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/186085?v=3"}, :body ";; When applied to a record and one of its base fields, \n;; dissoc produces a plain map instead of a record\n\n(defrecord Widget [id])\n(def w (->Widget \"id\"))\n\n(class w)\n;; user.Widget\n\n(class (dissoc w :id))\n;; clojure.lang.PersistentArrayMap", :_id "58f9f45fe4b01f4add58fe99"} {:updated-at 1516223401897, :created-at 1516223370479, :author {:login "RobinNagpal", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/745748?v=4"}, :body ";; Removing multiple from nested map\n(update-in {:a {:b {:x 3 :y 5} :c 1}} [:a :b] \n (fn [nested] (apply dissoc nested [:x :y] )) )\n=> {:a {:b {}, :c 1}} ", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/745748?v=4", :account-source "github", :login "RobinNagpal"}], :_id "5a5fbb8ae4b0a08026c48cfc"} {:updated-at 1608027071533, :created-at 1608027071533, :author {:login "Em-AK", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1518393?v=4"}, :body ";; dissoc keys in a coll\nuser=> (apply (partial dissoc {:a 1 :b 2 :c 3}) #{:b :c})\n{:a 1}", :_id "5fd88bbfe4b0b1e3652d7418"}], :notes [{:author {:login "u473t8", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/17592435?v=4"}, :updated-at 1629458054605, :created-at 1629458054605, :body "`(update {} :a dissoc :b) => {:a nil}`", :_id "611f8e86e4b0b1e3652d7533"}], :arglists ["map" "map key" "map key & ks"], :doc "dissoc[iate]. Returns a new map of the same (hashed/sorted) type,\n that does not contain a mapping for key(s).", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/dissoc"} {:added "1.0", :ns "clojure.core", :name "atom", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1281849237000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "reset!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eeb"} {:created-at 1281849248000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "swap!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eec"} {:created-at 1341623864000, :author {:login "johnnyluu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ba99f2dc1064733c7badbb16db9254a?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "compare-and-set!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eed"} {:created-at 1349392634000, :author {:login "eric", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2b0c9ae6f1da9716451e7c86bc87230b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "add-watch", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eee"} {:created-at 1349392638000, :author {:login "eric", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2b0c9ae6f1da9716451e7c86bc87230b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "remove-watch", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eef"} {:created-at 1364873735000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "set-validator!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ef0"} {:created-at 1527705006799, :author {:login "agarman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/138454?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "swap-vals!", :ns "clojure.core"}, :_id "5b0eedaee4b045c27b7fac7d"} {:created-at 1527705359815, :author {:login "agarman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/138454?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reset-vals!", :ns "clojure.core"}, :_id "5b0eef0fe4b045c27b7fac84"}], :line 2327, :examples [{:author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}], :body "user=> (def my-atom (atom 0))\n#'user/my-atom\n\nuser=> @my-atom\n0\n\nuser=> (swap! my-atom inc)\n1\n\nuser=> @my-atom\n1\n\nuser=> (swap! my-atom (fn [n] (* (+ n n) 2)))\n4\n\nuser=> (reset! my-atom 0)\n0\n\nuser=> @my-atom\n0", :created-at 1281460949000, :updated-at 1476155071423, :_id "542692cec026201cdc326db7"} {:body "user=> (def a (atom #{}))\n#'user/a\n\nuser=>(swap! a conj :tag)\n#{:tag}\n\nuser=> @a\n#{:tag}", :author {:login "mzenzie", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1862891?v=3"}, :created-at 1433438207582, :updated-at 1433438207582, :_id "557087ffe4b01ad59b65f4ee"} {:updated-at 1450892672375, :created-at 1450892672375, :author {:login "bostonaholic", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/362146?v=3"}, :body "user=> (def my-atom (atom 0 :validator even?))\n#'user/my-atom\n\nuser=> @my-atom\n0\n\nuser=> (swap! my-atom inc)\nIllegalStateException Invalid reference state clojure.lang.ARef.validate (ARef.java:33)\n\nuser=> (swap! my-atom (partial + 2))\n2\n\nuser=> @my-atom\n2", :_id "567add80e4b01f598e267e8f"} {:updated-at 1518532012281, :created-at 1518532012281, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body "(def car\n (atom {:make \"Audi\"\n :model \"Q3\"}))\n\n@car\n;;{:make \"Audi\", :model \"Q3\"}\n\n(swap!\n car\n assoc :model \"Q5\")\n;;{:make \"Audi\", :model \"Q5\"}\n\n(reset! car {:make \"\" :model \"\"})\n;;{:make \"\", :model \"\"}", :_id "5a82f5ace4b0316c0f44f8bc"} {:editors [{:login "djblue", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1986211?v=4"}], :body "(defn atom? [v]\n #?(:clj (instance? clojure.lang.Atom v)\n :cljs (satisfies? cljs.core/IAtom v)))\n\n(atom? (atom nil)) ;; => true", :author {:avatar-url "https://avatars.githubusercontent.com/u/1986211?v=4", :account-source "github", :login "djblue"}, :created-at 1661551176193, :updated-at 1661551230443, :_id "63094248e4b0b1e3652d7658"}], :notes nil, :arglists ["x" "x & options"], :doc "Creates and returns an Atom with an initial value of x and zero or\n more options (in any order):\n\n :meta metadata-map\n\n :validator validate-fn\n\n If metadata-map is supplied, it will become the metadata on the\n atom. validate-fn must be nil or a side-effect-free fn of one\n argument, which will be passed the intended new state on any state\n change. If the new state is unacceptable, the validate-fn should\n return false or throw an exception.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/atom"} {:added "1.0", :ns "clojure.core", :name "import", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1291627622000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "require", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ace"} {:created-at 1291628363000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "use", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521acf"} {:created-at 1291628388000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ns", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ad0"}], :line 3425, :examples [{:author {:login "nipra", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/142529?v=3"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "YizhePKU", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/42838469?v=4"}], :body "user=> (import java.util.Date)\njava.util.Date\n\nuser=> (def now (Date.))\n#'user/now\n\nuser=> (str now)\n\"Tue Jul 13 17:53:54 IST 2010\"\n", :created-at 1279049126000, :updated-at 1588421112835, :_id "542692c8c026201cdc326a01"} {:author {:login "dale", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a7a1eca257c6cea943fea41e5cc3e9a3?r=PG&default=identicon"}, :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/169654?v=4", :account-source "github", :login "noisesmith"} {:login "YizhePKU", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/42838469?v=4"}], :body ";; You can import multiple classes at once.\n(import (java.util Date Calendar)\n (java.net URI ServerSocket)\n java.sql.DriverManager)", :created-at 1294019024000, :updated-at 1588421172276, :_id "542692c8c026201cdc326a03"} {:author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :editors [], :body ";; importing multiple classes in a namespace\n(ns foo.bar\n (:import (java.util Date\n Calendar)\n (java.util.logging Logger\n Level)))", :created-at 1320992711000, :updated-at 1320992711000, :_id "542692d3c026201cdc326fce"} {:editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"} {:login "Rooke", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1158538?v=4"} {:avatar-url "https://avatars1.githubusercontent.com/u/42838469?v=4", :account-source "github", :login "YizhePKU"}], :body ";; For cases when 'import' does not do it for you, i.e. \"live-coding\"\n;; You can use the DynamicClassLoader, ClassReader and the Resolver.\n\n(def dcl (clojure.lang.DynamicClassLoader.))\n\n(defn dynamically-load-class! \n [class-loader class-name]\n (let [class-reader (clojure.asm.ClassReader. class-name)]\n (when class-reader\n (let [bytes (.-b class-reader)]\n (.defineClass class-loader \n class-name \n bytes\n \"\")))))\n\n(dynamically-load-class! dcl \"java.lang.Long\")\n(dynamically-load-class! dcl 'org.joda.time.DateTime)\n\n;; From that point the dynamically loaded class can be\n;; used by the Reflector to invoke constructors, methods and to get fields. ", :author {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}, :created-at 1508173740564, :updated-at 1588421462200, :_id "59e4e7ace4b03026fe14ea8d"} {:editors [{:login "ooooak", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1457253?v=4"}], :body "(import [org.apache.commons.codec.digest DigestUtils])\n\n(defn md5-hash [input] \n (DigestUtils/md5Hex input))\n\n(md5-hash \"hello world!\") \n;; fc3ff98e8c6a0d3087d515c0473f8677", :author {:avatar-url "https://avatars1.githubusercontent.com/u/1457253?v=4", :account-source "github", :login "ooooak"}, :created-at 1580227890599, :updated-at 1580227900588, :_id "5e305d32e4b0ca44402ef824"}], :macro true, :notes [{:updated-at 1291628547000, :body "Good description of use/require/import here:\r\n\r\nhttp://blog.8thlight.com/articles/2010/12/6/clojure-libs-and-namespaces-require-use-import-and-ns", :created-at 1291628547000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fa9"} {:updated-at 1403035286000, :body "`import` will also accept vectors instead of lists, but I would discourage folks from doing so:\r\n\r\n* It's undocumented.\r\n* Lists and vectors have different meanings for `require`, so there's precedent for making a distinction.\r\n* Lists have a distinguished first element, and so they indent more meaningfully here. :-P", :created-at 1403035286000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :_id "542692edf6e94c697052202a"} {:author {:login "YizhePKU", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/42838469?v=4"}, :updated-at 1588421551270, :created-at 1588421551270, :body "You don't need to use `import` if you fully qualify the class name, e.g. `(java.util.Date.)`.", :_id "5ead63afe4b087629b5a18fb"}], :arglists ["& import-symbols-or-lists"], :doc "import-list => (package-symbol class-name-symbols*)\n\n For each name in class-name-symbols, adds a mapping from name to the\n class named by package.name to the current namespace. Use :import in the ns\n macro in preference to calling this directly.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/import"} {:added "1.0", :ns "clojure.core", :name "bit-shift-right", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1405719667000, :author {:login "phreed", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a0c739cf289be18be932dc3022e6fd3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bit-shift-left", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aaf"} {:created-at 1405719682000, :author {:login "phreed", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a0c739cf289be18be932dc3022e6fd3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bit-xor", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ab0"} {:created-at 1405719694000, :author {:login "phreed", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a0c739cf289be18be932dc3022e6fd3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bit-or", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ab1"} {:created-at 1405719700000, :author {:login "phreed", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a0c739cf289be18be932dc3022e6fd3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bit-and", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ab2"} {:created-at 1405719706000, :author {:login "phreed", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a0c739cf289be18be932dc3022e6fd3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bit-set", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ab3"} {:created-at 1405719712000, :author {:login "phreed", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a0c739cf289be18be932dc3022e6fd3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bit-test", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ab4"} {:created-at 1405719724000, :author {:login "phreed", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a0c739cf289be18be932dc3022e6fd3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bit-flip", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ab5"} {:created-at 1405719732000, :author {:login "phreed", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a0c739cf289be18be932dc3022e6fd3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bit-and-not", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ab6"} {:created-at 1405719739000, :author {:login "phreed", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a0c739cf289be18be932dc3022e6fd3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bit-clear", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ab7"} {:created-at 1412094678691, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=2"}, :to-var {:ns "clojure.core", :name "unsigned-bit-shift-right", :library-url "https://github.com/clojure/clojure"}, :_id "542adad6e4b0df9bb778a5a4"}], :line 1362, :examples [{:author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; Convert number into list of bits:\n(defn bits [n s]\n (take s\n (map\n (fn [i] (bit-and 0x01 i))\n (iterate\n (fn [i] (bit-shift-right i 1))\n n))))\n;; #'user/bits\n\n(map (fn [n] (bits n 3)) (range 8))\n;;=> ((0 0 0) (1 0 0) (0 1 0) (1 1 0) (0 0 1) (1 0 1) (0 1 1) (1 1 1))\n", :created-at 1280029081000, :updated-at 1421878196402, :_id "542692cec026201cdc326dbb"} {:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "replore", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e7869fe1a48cb1814c657eaca6bea3eb?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(bit-shift-right 2r1101 0) ;;=> 13\n(bit-shift-right 2r1101 1) ;;=> 6\n(bit-shift-right 2r1101 2) ;;=> 3\n(bit-shift-right 2r1101 3) ;;=> 1\n(bit-shift-right 2r1101 4) ;;=> 0", :created-at 1280339098000, :updated-at 1421877723171, :_id "542692cec026201cdc326dbe"} {:editors [{:login "fasiha", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/37649?v=3"}], :body ";; Warning: bit-shift-right upcasts arguments to Long and returns Long\n(format \"0x%x\" (byte -128))\n; => \"0x80\"\n(format \"0x%x\" (bit-shift-right (byte -128) 1)) ; You'd expect 0x40?\n; => \"0xffffffffffffffc0\"\n; You'd expect 0x40, but (byte -128) was converted to (long -128) and then\n; right-shifted, with the negative sign bit of 1 propagated.\n\n; This can't be avoided by using unsigned-bit-shift-right:\n(format \"0x%x\" (unsigned-bit-shift-right (byte -128) 1))\n; => \"0x7fffffffffffffc0\"\n\n; If you want unsigned \"byte\" operations, upcast the byte yourself via bit-and:\n(format \"0x%x\" (bit-shift-right (bit-and 0xff (byte -128)) 1))\n; => \"0x40\"\n\n; This works because the output of bit-and is always Long:\n(type (bit-and 0xff (byte -128)))\n; => java.lang.Long\n; Note that bit-and returns Long even if both arguments are smaller:\n(type (bit-and (short 0xff) (byte -128)))\n; => java.lang.Long", :author {:avatar-url "https://avatars.githubusercontent.com/u/37649?v=3", :account-source "github", :login "fasiha"}, :created-at 1460044794475, :updated-at 1460044978009, :_id "570683fae4b0fc95a97eab30"} {:editors [{:login "Sophia-Gold", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19278114?v=3"}], :body ";; floating point bit-shifting\n;; thanks to Gary Fredericks: https://github.com/gfredericks/doubles\n(defn bit-shift-double [x shifts]\n (let [x-long (Double/doubleToRawLongBits x)]\n (Double/longBitsToDouble\n (bit-or (bit-and 1 x-long)\n (bit-shift-left (- (bit-shift-right x-long 52) shifts) 52)\n (bit-and 0xfffffffffffff x-long)))))", :author {:avatar-url "https://avatars.githubusercontent.com/u/19278114?v=3", :account-source "github", :login "Sophia-Gold"}, :created-at 1483958434391, :updated-at 1484376283481, :_id "587368a2e4b09108c8545a53"}], :notes [{:updated-at 1326789497000, :body "From the IRC channel, a way to get zero-fill bit-shift-right:\r\n\r\n
06:08 < mikera> (defn >>> [v bits] (bit-shift-right (bit-and 0xFFFFFFFF v) bits))
\r\n\r\nThere's also an open ticket for a [built-in version](http://dev.clojure.org/jira/browse/CLJ-827).", :created-at 1326786313000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fd7"} {:body "unsigned-bit-shift-right was added in Clojure 1.6.0. Click the link in the See Also section above.", :created-at 1415350996576, :updated-at 1415350996576, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=2"}, :_id "545c8ad4e4b03d20a102429f"}], :arglists ["x n"], :doc "Bitwise shift right", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bit-shift-right"} {:ns "clojure.core", :name "print-method", :file "clojure/core.clj", :type "var", :column 1, :see-alsos [{:created-at 1340861043000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "print-dup", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dda"}], :line 3663, :examples [{:author {:login "pangloss", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1202c95dec14eee416717e8c0add0f0c?r=PG&default=identicon"}, :editors [], :body "(deftype XYZ [])\n\n; without custom print-method defined:\nuser=> (prn (XYZ.))\n# \n\n(defmethod print-method XYZ [v ^java.io.Writer w]\n (.write w \"<<-XYZ->>\"))\n\n; with print-method\nuser=> (prn (XYZ.))\n<<-XYZ->>\n", :created-at 1369992423000, :updated-at 1369992423000, :_id "542692d4c026201cdc327037"} {:updated-at 1618155203105, :created-at 1618155203105, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :body "(import '[java.net URL] [java.io File])\n\n;; Extends pr-str to URL objects with a form suitable for \n;; read-string to read back into an URL with the related\n;; https://clojuredocs.org/clojure.core/*data-readers* binding:\n\n(defmethod print-method URL [url writer]\n (doto writer\n (.write \"#url \")\n (.write \"\\\"\")\n (.write (.toString url))\n (.write \"\\\"\")))\n\n(-> \"/etc/hosts\" File. .toURL pr-str)\n;; \"#url \\\"file:/etc/hosts\\\"\"\n", :_id "607316c3e4b0b1e3652d74c3"}], :notes [{:author {:login "mrzor", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/54230?v=3"}, :updated-at 1471957106762, :created-at 1471957106762, :body "Take care when writing things that look like a reader macro, like `#mything<42 42 42>`.\nIt may break your AOT compilations with a `java.lang.RuntimeException: No reader function for tag mything`.\n\nA quick workaround is not to emit a `#` character.\nThe thorough solution starts by reading https://clojuredocs.org/clojure.core/*data-readers* and is beyond the scope of this note.", :_id "57bc4872e4b0709b524f04d3"}], :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/print-method"} {:added "1.0", :ns "clojure.core", :name "peek", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1400493737000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "first", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ab8"} {:created-at 1400493750000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pop", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ab9"} {:created-at 1400493759000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "conj", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aba"}], :line 1460, :examples [{:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (def large-vec (vec (range 0 10000)))\n#'user/large-vec\n\nuser=> (time (last large-vec))\n\"Elapsed time: 1.279841 msecs\"\n9999\n\nuser=> (time (peek large-vec))\n\"Elapsed time: 0.049238 msecs\"\n9999\n", :created-at 1282321027000, :updated-at 1285494456000, :_id "542692ccc026201cdc326c33"} {:author {:login "TravisHeeter", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fe491d07493e45af083b89b767342c6?r=PG&default=identicon"}, :editors [], :body "user=> (peek '(:a :b :c))\n:a", :created-at 1385176400000, :updated-at 1385176400000, :_id "542692d4c026201cdc32702f"} {:updated-at 1470911342408, :created-at 1470911342408, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body "user=> (peek [1 2 3 4])\n;;=> 4\n\nuser=> (peek [])\n;;=> nil\n\nuser=> (peek '(1 2 3 4))\n;;=> 1\n\nuser=> (peek '())\n;;=> nil\n\nuser=> (peek nil)\n;;=> nil", :_id "57ac536ee4b0bafd3e2a04e2"} {:updated-at 1518706830878, :created-at 1518706830878, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;peek on vector returns the last element\n(peek [1 2 3])\n;; 3\n\n;;peek on list retunrs the first element\n(peek '(1 2 3))\n;; 1", :_id "5a85a08ee4b0316c0f44f8bd"}], :notes [{:updated-at 1349888814000, :body "Small reminder:\r\n\r\n
\r\nDo not work for arbitrary seq but just for persistent types implementing clojure.lang.IPersistentStack (like clojure.lang.Persistent*).\r\n\r\n
\r\nExample:\r\n
user> (peek (cons 1 '()))\r\n; Evaluation aborted.\r\n
\r\ndo not work because type is clojure.lang.Cons but\r\n\r\n
user> (peek (conj '() 1))\r\n1\r\n
\r\nworks because type is clojure.lang.PersistentList.", :created-at 1349884718000, :author {:login "tomby42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/305033855efb82d6041586b874b5bb24?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fea"}], :arglists ["coll"], :doc "For a list or queue, same as first, for a vector, same as, but much\n more efficient than, last. If the collection is empty, returns nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/peek"} {:added "1.0", :ns "clojure.core", :name "aget", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1359687973000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "aclone", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521af2"} {:created-at 1389744326000, :author {:login "jw0", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ca45063da41a9f3aa9028295d8b66d89?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "get", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521af3"} {:created-at 1389744330000, :author {:login "jw0", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ca45063da41a9f3aa9028295d8b66d89?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "nth", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521af4"} {:created-at 1454023320808, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "contains?", :ns "clojure.core"}, :_id "56aaa298e4b060004fc217b3"} {:created-at 1593147984636, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "aset", :ns "clojure.core"}, :_id "5ef58250e4b0b1e3652d7310"}], :line 3912, :examples [{:updated-at 1454082671521, :created-at 1284178036000, :body "\n;; create two arrays\n(def a1 (double-array '(1.0 2.0 3.0 4.0)))\n;;=> #'user/a1\n(def a2 (int-array '(9 8 7 6)))\n;;=> #'user/a2\n\n;; get an item by index\n(aget a1 2)\n;;=> 3.0\n(aget a2 3)\n;;=> 6\n\n;; 2d array and 2 indicies\n(def a3 (make-array Integer/TYPE 100 100))\n;;=> #'user/a3\n(aget a3 23 42)\n;;=> 0", :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/363fd6c774471e207b327fda11b246c7?r=PG&default=identicon", :account-source "clojuredocs", :login "dermatthias"}, :_id "542692cec026201cdc326da0"} {:editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; aget can be used to check the existence of an element\n;; this approach works with documents in ClojureScript where core/contains? does not\n(aget js/document \"getElementById\")\n;;=> #object[getElementById \"function getElementById() { [native code] }\"]\n(contains? js/document \"getElementById\")\n;;=> false", :author {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}, :created-at 1454022947998, :updated-at 1454082875581, :_id "56aaa123e4b0ceed88ce8d19"}], :notes nil, :arglists ["array idx" "array idx & idxs"], :doc "Returns the value at the index/indices. Works on Java arrays of all\n types.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/aget"} {:added "1.0", :ns "clojure.core", :name "pvalues", :file "clojure/core.clj", :static true, :type "macro", :column 1, :see-alsos [{:created-at 1329792245000, :author {:login "cmccoy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cf46d3ffedb153a97fe69cb4719e0fd?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pmap", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e7d"} {:created-at 1336537825000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "future", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e7e"} {:created-at 1423019380983, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "pcalls", :library-url "https://github.com/clojure/clojure"}, :_id "54d18d74e4b0e2ac61831d0a"}], :line 7044, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; expressions are calculated in parallel\n\nuser=> (pvalues (expensive-calc-1) (expensive-calc-2))\n(2330 122)\n", :created-at 1280322280000, :updated-at 1285496725000, :_id "542692cac026201cdc326b59"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; pvalues is implemented using Clojure futures. See examples for 'future'\n;; for discussion of an undesirable 1-minute wait that can occur before\n;; your standalone Clojure program exits if you do not use shutdown-agents.", :created-at 1336537820000, :updated-at 1406853126000, :_id "542692d4c026201cdc327046"}], :macro true, :notes nil, :arglists ["& exprs"], :doc "Returns a lazy sequence of the values of the exprs, which are\n evaluated in parallel", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/pvalues"} {:added "1.1", :ns "clojure.core", :name "bound-fn", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1331766568000, :author {:login "metajack", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/194d8437f5baed192c90be27369c4922?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bound-fn*", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d55"}], :line 2006, :examples [{:author {:login "metajack", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/194d8437f5baed192c90be27369c4922?r=PG&default=identicon"}, :editors [], :body "(def ^:dynamic *some-var* nil)\n\n(defn f [] (println *some-var*))\n\n;; run f without a new binding\nuser=> (f)\nnil\nnil\n\n;; run f with a new binding\nuser=> (binding [*some-var* \"hello\"]\n (f))\nhello\nnil\n\n;; run f in a thread with a new binding\nuser=> (binding [*some-var* \"goodbye\"]\n (.start (Thread. f)))\nnil\nnil\n\n;; run a bound f in a thread with a new binding\nuser=> (binding [*some-var* \"goodbye\"]\n (.start (Thread. (bound-fn [] (f)))))\ngoodbye\nnil\n", :created-at 1331769907000, :updated-at 1331769907000, :_id "542692d2c026201cdc326f5c"}], :macro true, :notes nil, :arglists ["& fntail"], :doc "Returns a function defined by the given fntail, which will install the\n same bindings in effect as in the thread at the time bound-fn was called.\n This may be used to define a helper function which runs on a different\n thread, but needs the same bindings in place.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bound-fn"} {:added "1.7", :ns "clojure.core", :name "vswap!", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1469617377040, :author {:login "kumarshantanu", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109792?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "volatile!", :ns "clojure.core"}, :_id "579894e1e4b0bafd3e2a04bf"} {:created-at 1492398573657, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "vreset!", :ns "clojure.core"}, :_id "58f431ede4b01f4add58fe91"} {:created-at 1492398581193, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "volatile?", :ns "clojure.core"}, :_id "58f431f5e4b01f4add58fe92"} {:created-at 1492398620716, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "swap!", :ns "clojure.core"}, :_id "58f4321ce4b01f4add58fe93"}], :line 2539, :examples [{:updated-at 1492398484318, :created-at 1492398484318, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :body "(let [interrupt (volatile! false)\n f1 (future (Thread/sleep 1000)\n (vswap! interrupt not))\n f2 (future (while (not @interrupt)\n (println \"Another cycle!\")\n (Thread/sleep 100)))]\n @f1\n @f2)", :_id "58f43194e4b01f4add58fe90"}], :macro true, :notes nil, :arglists ["vol f & args"], :doc "Non-atomically swaps the value of the volatile as if:\n (apply f current-value-of-vol args). Returns the value that\n was swapped in.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/vswap!"} {:added "1.0", :ns "clojure.core", :name "last", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1289038378000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "first", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e58"} {:created-at 1289038381000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "next", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e59"} {:created-at 1289038385000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rest", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e5a"} {:created-at 1289038414000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "butlast", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e5b"} {:created-at 1306817792000, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "take-last", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e5c"} {:created-at 1436712121100, :author {:login "sindux", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1397898?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "peek", :ns "clojure.core"}, :_id "55a27cb9e4b020189d740550"}], :line 262, :examples [{:updated-at 1473264230717, :created-at 1279416204000, :body "user=> (last [1 2 3 4 5])\n5\nuser=> (last [\"a\" \"b\" \"c\" \"d\" \"e\"])\n\"e\"\nuser=> (last {:one 1 :two 2 :three 3})\n[:three 3]\nuser=> (last [])\nnil\n\n;; but be careful with what you expect from a map (or set):\nuser=> (last {:a 1 :b 2 :c 3 :d 4 :e 5 :f 6 :g 7 :h 8 :i 9})\n[:a 1]", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"} {:avatar-url "https://www.gravatar.com/avatar/69ad2af1f028b1b7e76c14f83bdf26cb?r=PG&default=identicon", :account-source "clojuredocs", :login "jszakmeister"} {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"} {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=3"}], :author {:login "MrHus", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4"}, :_id "542692c8c026201cdc326a2c"} {:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [], :body ";really slow reverse\n;put the last item of the list at the start of a new list, and recur over all but the last item of the list.\n;butlast acts similar to next in that it returns null for a 1-item list.\n\n(defn my-reverse\n ([a-list]\n (cond (= a-list nil) nil\n :else (cons (last a-list)\n (my-reverse (butlast a-list))))))", :created-at 1289038818000, :updated-at 1289038818000, :_id "542692c8c026201cdc326a2f"} {:updated-at 1499968174976, :created-at 1499966780539, :author {:login "webappzero", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1661060?v=3"}, :body ";; Prefer clojure.core/peek over `last` for potentially large vectors.\n\nuser=> (def v (into [] (take 900900 (range))))\n#'user/v\n\nuser=> (time (last v))\n\"Elapsed time: 24.460958 msecs\"\n900899\n\nuser=> (def v2 (into [] (take 900900 (range))))\n#'user/v2\n\nuser=> (time (peek v2))\n\"Elapsed time: 0.020498 msecs\"\n900899\n\n;; For a deep dive into why Rich Hickey chose not to make `last` performant\n;; for large vectors, please see:\n;; https://gist.github.com/reborg/dc8b0c96c397a56668905e2767fd697f\n\n", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/1661060?v=3", :account-source "github", :login "webappzero"}], :_id "5967ad3ce4b0d19c2ce9d6f9"} {:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; last is also inefficient for sorted-sets and sorted-maps, and\n;; peek doesn't work for these, so we can combine `first` with `rseq`\n;; to efficiently get the last element on large sorted- collections instead\n\n(def sm (into (sorted-map)\n (map vector (range 1e6) (repeatedly #(rand-int 100)))))\n\n(time (last sm))\n\"Elapsed time: 144.298867 msecs\"\n;; => [999999 42]\n\n(time (first (rseq sm)))\n\"Elapsed time: 0.024408 msecs\"\n;; => [999999 42]", :author {:avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4", :account-source "github", :login "tomdl89"}, :created-at 1680193851632, :updated-at 1680196828207, :_id "6425b93be4b08cf8563f4b89"}], :notes nil, :arglists ["coll"], :doc "Return the last item in coll, in linear time", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/last"} {:added "1.0", :ns "clojure.core", :name "pr", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1290689171000, :author {:login "dale", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a7a1eca257c6cea943fea41e5cc3e9a3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "print", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bd2"} {:created-at 1299623874000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "prn", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bd3"} {:created-at 1299623879000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pr-str", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bd4"} {:created-at 1470508478634, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "read", :ns "clojure.edn"}, :_id "57a62dbee4b0bafd3e2a04ca"}], :dynamic true, :line 3677, :examples [{:author {:login "srid", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd3a68d670372cd09876c26270a4299a?r=PG&default=identicon"}, :editors [], :body "user=> (pr \"foo\")\n\"foo\"nil", :created-at 1315392482000, :updated-at 1315392482000, :_id "542692cec026201cdc326da1"} {:author {:login "srid", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd3a68d670372cd09876c26270a4299a?r=PG&default=identicon"}, :editors [], :body "user=> (pr {:foo \"hello\" :bar 34.5})\n{:foo \"hello\", :bar 34.5}nil", :created-at 1315392515000, :updated-at 1315392515000, :_id "542692cec026201cdc326da2"} {:body ";; Difference between pr and print\n\nuser=> (pr ['a :b \"\\n\" \\space \"c\"])\n[a :b \"\\n\" \\space \"c\"]nil\n\nuser=> (print ['a :b \"\\n\" \\space \"c\"])\n[a :b\n c]nil\n", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423019089923, :updated-at 1423019089923, :_id "54d18c51e4b0e2ac61831d09"} {:updated-at 1470507649207, :created-at 1470507649207, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :body ";; WARNING: Clojure's keyword and symbol functions allow you to create\n;; values that cannot be printed then later read and recreate those same\n;; values.\n\n;; For most common symbols and keywords, they round-trip through pr\n;; then read-string, as this example shows.\nuser=> (read-string (with-out-str (pr {:a 1, :b 2})))\n{:a 1, :b 2}\n\n;; But these values do not round-trip through the same steps:\nuser=> (def kw1 (keyword \"foo bar\"))\n#'user/kw1\nuser=> kw1\n:foo bar\nuser=> (def s2 (with-out-str (pr {kw1 1, :b 2})))\n#'user/s2\nuser=> s2\n\"{:foo bar 1, :b 2}\"\nuser=> (read-string s2)\n\nRuntimeException Map literal must contain an even number of forms clojure.lang.Util.runtimeException (Util.java:221)\n\n;; Similarly for a symbol like (symbol \"a;b\")\nuser=> (def sym1 (symbol \"a;b\"))\n#'user/sym1\nuser=> sym1\na;b\nuser=> (def s3 (with-out-str (pr sym1)))\n#'user/s3\nuser=> s3\n\"a;b\"\nuser=> (read-string s3)\na\n\n;; If you wish to transmit data that may contain such values, one suggestion\n;; is to use the transit library: https://github.com/cognitect/transit-format\n\n;; It is much faster and formally specified.", :_id "57a62a81e4b0bafd3e2a04c9"}], :notes [{:author {:login "jcburley", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/430319?v=4"}, :updated-at 1514410889866, :created-at 1514410889866, :body "\"Readable by the reader\" means, for example, that a string is printed with surrounding double quotes and with quotes, backslashes, and nonprinting characters being escaped via a backslash prefix.", :_id "5a441389e4b0a08026c48ce2"}], :arglists ["" "x" "x & more"], :doc "Prints the object(s) to the output stream that is the current value\n of *out*. Prints the object(s), separated by spaces if there is\n more than one. By default, pr and prn print in a way that objects\n can be read by the reader", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/pr"} {:added "1.0", :ns "clojure.core", :name "namespace", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1366844136000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ns", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d8a"} {:created-at 1385200446000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "name", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d8b"} {:created-at 1523484084873, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/10404?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "def", :ns "clojure.core"}, :_id "5ace85b4e4b045c27b7fac3d"}], :line 1597, :examples [{:author {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}], :body "user=> (def x \"Foobar\")\n#'user/x\n\nuser=> (namespace 'user/x)\n\"user\"\n", :created-at 1284256918000, :updated-at 1287791961000, :_id "542692cbc026201cdc326c1d"} {:editors [{:login "dominem", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11671382?v=4"}], :body "(namespace :admin/live-playlist-details)\n;;=> \"admin\"\n\n(namespace :about)\n;;=> nil", :author {:avatar-url "https://avatars3.githubusercontent.com/u/11671382?v=4", :account-source "github", :login "dominem"}, :created-at 1565335391711, :updated-at 1565335408498, :_id "5d4d1f5fe4b0ca44402ef795"}], :notes [{:body "Note this does not try to be \"smart\"\n\n```\nuser=>(namespace 'no-such-name/no-such-var)\n\"no-such-name\"\n\nuser=>(def a-var)\n#'user-a-var\n\nuser=>(namespace 'a-var)\nnil\n```", :created-at 1443303990722, :updated-at 1443304019556, :author {:avatar-url "https://avatars.githubusercontent.com/u/159998?v=3", :account-source "github", :login "merriam"}, :_id "56071236e4b08e404b6c1c89"}], :tag "java.lang.String", :arglists ["x"], :doc "Returns the namespace String of a symbol or keyword, or nil if not present.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/namespace"} {:added "1.1", :ns "clojure.core", :name "push-thread-bindings", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1374313643000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pop-thread-bindings", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d2b"} {:created-at 1374313651000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "binding", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d2c"} {:created-at 1374313699000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-bindings", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d2d"}], :line 1913, :examples nil, :notes nil, :arglists ["bindings"], :doc "WARNING: This is a low-level function. Prefer high-level macros like\n binding where ever possible.\n\n Takes a map of Var/value pairs. Binds each Var to the associated value for\n the current thread. Each call *MUST* be accompanied by a matching call to\n pop-thread-bindings wrapped in a try-finally!\n \n (push-thread-bindings bindings)\n (try\n ...\n (finally\n (pop-thread-bindings)))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/push-thread-bindings"} {:added "1.0", :ns "clojure.core", :name "bases", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1519504605797, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "supers", :ns "clojure.core"}, :_id "5a91ccdde4b0316c0f44f8ee"} {:created-at 1519504691579, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "type", :ns "clojure.core"}, :_id "5a91cd33e4b0316c0f44f8ef"}], :line 5543, :examples [{:author {:login "teyc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd6e62afb4881ab0f617611b8b65d003?r=PG&default=identicon"}, :editors [], :body "
user=> (import 'java.io.File)\r\n\r\nuser=> (bases java.io.File)\r\n(java.lang.Object java.io.Serializable java.lang.Comparable)
", :created-at 1283977099000, :updated-at 1283977099000, :_id "542692c9c026201cdc326ac4"} {:body ";; what is a hash-map?\n(bases (class {}))\n;;=> (clojure.lang.APersistentMap \n;;+> clojure.lang.IObj \n;;+> clojure.lang.IEditableCollection)\n\n;; what is a set?\n(bases (class #{}))\n;;=> (clojure.lang.APersistentSet \n;;+> clojure.lang.IObj \n;;+> clojure.lang.IEditableCollection)\n\n;; what is a vector?\n(bases (class []))\n;;=> (clojure.lang.APersistentVector \n;;+> clojure.lang.IObj \n;;+> clojure.lang.IEditableCollection)\n\n;; what is a list? \n(bases (class ()))\n;;=> (clojure.lang.Obj \n;;+> clojure.lang.IPersistentList \n;;+> java.util.List \n;;+> clojure.lang.ISeq \n;;+> clojure.lang.Counted \n;;+> clojure.lang.IHashEq)", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1414510940403, :updated-at 1414510965758, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :_id "544fb95ce4b03d20a102428b"} {:updated-at 1598220307317, :created-at 1598220307317, :author {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}, :body ";; what is a defrecord\n\nuser=> (defprotocol Fly\n (fly [this]))\n\nuser=> (defrecord Bird [name] Fly\n (fly [this] (str (:name this) \" flies....\")))\n\nuser=> (ancestors Bird)\n;; (java.lang.Object \n;; user.Fly \n;; clojure.lang.IRecord \n;; clojure.lang.IHashEq \n;; clojure.lang.IObj \n;; clojure.lang.ILookup \n;; clojure.lang.IKeywordLookup \n;; clojure.lang.IPersistentMap \n;; java.util.Map \n;; java.io.Serializable)\n", :_id "5f42e813e4b0b1e3652d73a5"}], :notes nil, :arglists ["c"], :doc "Returns the immediate superclass and direct interfaces of c, if any", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bases"} {:added "1.0", :ns "clojure.core", :name "=", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1287469623000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "==", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f25"} {:created-at 1291975060000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "not=", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f26"} {:created-at 1298162787000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "identical?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f27"}], :line 783, :examples [{:updated-at 1474477801279, :created-at 1280470020000, :body "user=> (= 1)\ntrue\nuser=> (= 1 1)\ntrue\nuser=> (= 1 2)\nfalse\nuser=> (= 1 1 1)\ntrue\nuser=> (= 1 1 2)\nfalse\nuser=> (= '(1 2) [1 2])\ntrue\nuser=> (= nil nil)\ntrue\nuser=> (= (sorted-set 2 1) (sorted-set 1 2))\ntrue\n\n;; It should be noted that equality is not defined for Java arrays.\n;; Instead you can convert them into sequences and compare them that way.\n;; (= (seq array1) (seq array2))\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon", :account-source "clojuredocs", :login "gstamp"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/b3881a28fe402dd2d1de44717486cae8?r=PG&default=identicon", :account-source "clojuredocs", :login "citizen428"}, :_id "542692ccc026201cdc326c72"} {:editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=2", :account-source "github", :login "phreed"} {:login "iammegatron", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/406013?v=3"}], :updated-at 1450298371193, :created-at 1412883142742, :author {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=2", :account-source "github", :login "phreed"}, :body ";; There are functional differences between = and == \n;; = may introduce java autoboxing \n\n;; true:\n(= 1)\n(= 1 1) \n(= 1/1, 2/2, 3/3, 4/4) \n(= :foo)\n(= nil anything) ; anything = nil\n\n\n;; false:\n(= 1, 1.0, 1/1) ; differs from ==\n(= 1 2)\n(= 1 \\1) ; differs from ==\n(= 1 \"1\") ; differs from ==\n\n", :_id "5436e2c6e4b06dbffbbb00c7"} {:body ";; If passed a single value (= x) the result is always true.\n(= 1)\n(= nil)\n(= false)\n(= true)\n(= {:a 1 :b2})\n(= 'false)\n;;=> true \n", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1418923922664, :updated-at 1418923922664, :_id "54930f92e4b04e93c519ffa9"} {:updated-at 1543388969936, :created-at 1543388779355, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :body ";; = can be used to compare the equality of nested Clojure data structures\n(= {:a [1 {1 2}] :b 'ok :c \"string\"} \n {:b 'ok :c \"string\" :a '(1 {1 2})})\n;;=> true", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4", :account-source "github", :login "huahaiy"}], :_id "5bfe3e6be4b0ca44402ef5cc"} {:editors [{:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"} {:avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4", :account-source "github", :login "jafingerhut"}], :body ";; See the Clojure Equality guide for more details:\n;; https://clojure.org/guides/equality\n\n;; One perhaps surprising case is comparing regular expressions.\n;; In Clojure, regular expressions only equal one another if they are\n;; the same object in memory, i.e. if (identical? x y) is also true.\n;; Therefore, any data structure containing regular expression will \n;; only be equal to one another if the corresponding regular expressions are\n;; identical.\n;; See https://dev.clojure.org/jira/browse/CLJ-1182\n(= #\"fav*\" #\"fav*\")\n;;=> false\n\n;; Another exception is the special floating point value ##NaN for \"Not a Number\".\n;; In Clojure on Java, this value is never equal to itself, and any collections\n;; containing such \"values\" are never equal to any other collections, either:\n(= ##NaN ##NaN)\n;;=> false\n\n(= [1 2 3 ##NaN] [1 2 3 ##NaN])\n;;=> false\n\n;; There are a few other minor exceptions where clojure.core/= might behave in\n;; ways that surprise you. You can find an article describing the known cases\n;; for Clojure on Java here: https://clojure.org/guides/equality", :author {:avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4", :account-source "github", :login "huahaiy"}, :created-at 1543389091657, :updated-at 1565641554721, :_id "5bfe3fa3e4b0ca44402ef5cf"} {:updated-at 1645209415531, :created-at 1645209415531, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}, :body ";; You can test for a Java infinity, but there are quirks to know about. \n\n;; Note particularly that Double/POSITIVE_INFINITY and Float/POSITIVE_INFINITY\n;; are = and ==, but they are neither identical? nor .equals. However, the\n;; value these Java objects return has the same representation, ##Inf, in\n;; Clojure. Further, the literal ##Inf is parsed as something that is\n;; .equals to Double/POSITIVE_INFINITY but not identical? to it. Similar\n;; points hold for the Java NEGATIVE_INFINITY's and their Clojure\n;; representation, ##-Inf.\n\nuser=> Double/POSITIVE_INFINITY\n;;=> ##Inf\nuser=> Float/POSITIVE_INFINITY\n;;=> ##Inf\nuser=> (= Double/POSITIVE_INFINITY Float/POSITIVE_INFINITY)\n;;=> true\nuser=> (= ##Inf ##Inf)\n;;=> true\nuser=> (== Double/POSITIVE_INFINITY Float/POSITIVE_INFINITY)\n;;=> true\nuser=> (== ##Inf ##Inf)\n;;=> true\nuser=> (identical? Double/POSITIVE_INFINITY Float/POSITIVE_INFINITY)\n;;=> false\nuser=> (identical? ##Inf ##Inf)\n;;=> true\nuser=> (.equals Double/POSITIVE_INFINITY Float/POSITIVE_INFINITY)\n;;=> false\nuser=> (.equals ##Inf ##Inf)\n;;=> true\nuser=> (identical? ##Inf Double/POSITIVE_INFINITY)\n;;=> false\nuser=> (identical? ##Inf Float/POSITIVE_INFINITY)\n;;=> false\nuser=> (.equals ##Inf Double/POSITIVE_INFINITY)\n;;=> true\nuser=> (.equals ##Inf Float/POSITIVE_INFINITY)\n;;=> false\n\n;; (Tested with Clojure 1.10.3.)", :_id "620fe747e4b0b1e3652d75a8"} {:updated-at 1655019041411, :created-at 1655019041411, :author {:login "clojer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/107184681?v=4"}, :body "user=> (= + +)\ntrue\nuser=> (= = =)\ntrue\nuser=> (= inc inc)\ntrue\nuser=> (= #() #())\nfalse", :_id "62a59621e4b0b1e3652d75fd"}], :notes [{:updated-at 1287470783000, :body "There is a difference between \"=\" and \"==\". For primitives you definitely want to use \"==\" as \"=\" will result in a cast to the wrapped types for it's arguments. \r\n\r\nThis may not be the case come Clojure 1.3 (see [1])\r\n\r\n[1] http://github.com/clojure/clojure/commit/df8c65a286e90e93972bb69392bc106128427dde", :created-at 1287470783000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f9b"} {:author {:login "domokato", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2388832?v=4"}, :updated-at 1674772771853, :created-at 1674772771853, :body "`=` compares collections in a type-independent manner but not numbers, despite what the docs say. See examples above.", :_id "63d30123e4b08cf8563f4b6c"}], :arglists ["x" "x y" "x y & more"], :doc "Equality. Returns true if x equals y, false if not. Same as\n Java x.equals(y) except it also works for nil, and compares\n numbers and collections in a type-independent manner. Clojure's immutable data\n structures define equals() (and thus =) as a value, not an identity,\n comparison.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/="} {:added "1.10", :ns "clojure.core", :name "read+string", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 3770, :examples [{:updated-at 1638567988480, :created-at 1638567988480, :author {:login "earthfail", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/21296448?v=4"}, :body ";; read from *in*\n;; notice that whitespace is trimmed\nuser=> (read+string)\n :a\n[:a \":a\"]\nuser=> (read+string)\n 1234 56 7\n[1234 \"1234\"]\nuser=> (read+string)\n[56 \"56\"]\nuser=> (read+string)\n[7 \"7\"]\n\n;; if there is a comment it is included in the string read\nuser=> (read+string)\n;comment\n:value\n[:value \";comment\\n:value\"] ", :_id "61aa9034e4b0b1e3652d757f"}], :notes nil, :arglists ["" "stream" "stream eof-error? eof-value" "stream eof-error? eof-value recursive?" "opts stream"], :doc "Like read, and taking the same args. stream must be a LineNumberingPushbackReader.\n Returns a vector containing the object read and the (whitespace-trimmed) string read.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/read+string"} {:added "1.0", :ns "clojure.core", :name "dosync", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1285922303000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sync", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cdf"} {:created-at 1326521625000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ce0"} {:created-at 1343102755000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "locking", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ce1"}], :line 5076, :examples [{:author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :editors [{:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Keep dosync body free of side-effects:\n(defn my-thread-unsafe-fn [important-ref]\n (let [start-work (ref false)]\n (dosync\n (when (not @important-ref)\n ;\"If a conflict occurs between 2 transactions \n ;trying to modify the same reference, \n ;one of them will be retried.\"\n ;http://clojure.org/concurrent_programming\n (ref-set important-ref true)\n (ref-set start-work true)))\n (when @start-work \n ;launch side-effects here\n )))\n", :created-at 1279380650000, :updated-at 1285500150000, :_id "542692c7c026201cdc32698d"} {:body ";; Create 2 bank accounts\n(def acc1 (ref 100))\n(def acc2 (ref 200))\n\n;; How much money is there?\n(println @acc1 @acc2)\n;; => 100 200\n\n;; Either both accounts will be changed or none\n(defn transfer-money [a1 a2 amount]\n (dosync\n (alter a1 - amount)\n (alter a2 + amount)\n amount)) ; return amount from dosync block and function (just for fun)\n\n;; Now transfer $20\n(transfer-money acc1 acc2 20)\n;; => 20\n\n;; Check account balances again\n(println @acc1 @acc2)\n;; => 80 220\n\n;; => We can see that transfer was successful", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423044726004, :updated-at 1423044726004, :_id "54d1f076e4b081e022073c5b"}], :macro true, :notes nil, :arglists ["& exprs"], :doc "Runs the exprs (in an implicit do) in a transaction that encompasses\n exprs and any nested calls. Starts a transaction if none is already\n running on this thread. Any uncaught exception will abort the\n transaction and flow out of dosync. The exprs may be run more than\n once, but any effects on Refs will be atomic.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/dosync"} {:added "1.0", :ns "clojure.core", :name "remove-ns", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1284970244000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "create-ns", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b5c"} {:created-at 1284970256000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "find-ns", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b5d"}], :line 4140, :examples [{:author {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"}, :editors [{:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "sillitor", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c6e7b175eb48c8e3db32f3ff7c2a205d?r=PG&default=identicon"}], :body ";; Let's create a namespace and then remove it\n\nuser=> (create-ns 'my-new-namespace)\n#\n\n;; removing a namespace will give you the namespace you just deleted, if one existed\nuser=> (remove-ns 'my-new-namespace)\n#\n\n;; removing a namespace that does not exist, will tell you that nothing was removed, \n;; by returning nil, and won't give any errors\nuser=> (remove-ns 'my-new-namespace)\nnil\n", :created-at 1284948400000, :updated-at 1375854900000, :_id "542692c9c026201cdc326a90"} {:updated-at 1546107636355, :created-at 1546107636355, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Unlikely you'll ever want to use \"remove-ns\" unless you know what you're\n;; doing. Prefer libs like tools.namespace whenever possible. For example,\n;; here we are preventing garbage collecting the namespace and getting a\n;; stale read.\n\n(create-ns 'go-away)\n(intern 'go-away 'my-var 0)\n(refer 'go-away :only ['my-var])\n(remove-ns 'go-away)\n\n;; nope, still here:\n(.ns #'my-var)\n;; #object[clojure.lang.Namespace 0x1f658731 \"go-away\"]\n\n;; replace\n(create-ns 'go-away)\n(intern 'go-away 'my-var 1)\n\n;; stale\nmy-var\n;; 0\n\n;; correct\n@#'go-away/my-var\n;; 1", :_id "5c27baf4e4b0ca44402ef607"}], :notes nil, :arglists ["sym"], :doc "Removes the namespace named by the symbol. Use with caution.\n Cannot be used to remove the clojure namespace.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/remove-ns"} {:added "1.0", :ns "clojure.core", :name "take", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1288872407000, :author {:login "jartur", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8eae7b45fd8d383bc1a49e24bee51c9b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "drop", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521db2"} {:created-at 1288872422000, :author {:login "jartur", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8eae7b45fd8d383bc1a49e24bee51c9b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "take-while", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521db3"} {:created-at 1288872427000, :author {:login "jartur", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8eae7b45fd8d383bc1a49e24bee51c9b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "take-last", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521db4"} {:created-at 1288872434000, :author {:login "jartur", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8eae7b45fd8d383bc1a49e24bee51c9b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "take-nth", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521db5"}], :line 2861, :examples [{:author {:login "jandot", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/90df4ddea707147ac2ac11383108d700?r=PG&default=identicon"}, :editors [{:login "jandot", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/90df4ddea707147ac2ac11383108d700?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jszakmeister", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/69ad2af1f028b1b7e76c14f83bdf26cb?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body ";; return a lazy seq of the first 3 items\n(take 3 '(1 2 3 4 5 6))\n;;=> (1 2 3)\n\n(take 3 [1 2 3 4 5 6])\n;;=> (1 2 3)\n\n;; returns all items if there are fewer than n\n(take 3 [1 2])\n;;=> (1 2)\n\n(take 1 [])\n;;=> ()\n\n(take 1 nil)\n;;=> ()\n\n(take 0 [1])\n;;=> ()\n\n(take -1 [1])\n;;=> ()", :created-at 1278905054000, :updated-at 1423278637171, :_id "542692cec026201cdc326de8"} {:author {:login "citizen428", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3881a28fe402dd2d1de44717486cae8?r=PG&default=identicon"}, :editors [{:login "citizen428", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3881a28fe402dd2d1de44717486cae8?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; similar to subvec but lazy and with seqs\n(take 3 (drop 5 (range 1 11)))\n;;=> (6 7 8)", :created-at 1280469743000, :updated-at 1420736101515, :_id "542692cec026201cdc326ded"} {:updated-at 1435879568191, :created-at 1435879568191, :author {:login "bsvingen", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1647562?v=3"}, :body ";; Used without a collection, take will create a transducer:\n(def xf (take 5))\n\n;; We can now apply this transducer to a sequence:\n(transduce xf conj (range 5))\n;; => [0 1 2 3 4]\n", :_id "5595c890e4b00f9508fd66f3"} {:editors [{:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}], :body ";; Note that usually more items are realized than needed.\n;; In the example below we want a lazy sequence of 1 item\n;; (the first item of the range), but actually the first 32 items are calculated.\n;; This can be especially important when this extra realization requires a lot of\n;; resources (CPU, time, memory, etc.) and at the end not needed at all.\n;; Tip: try 32 and 33 instead of 1 in the take below.\n\nuser=> (let [x (map (fn [i]\n (println i)\n (Thread/sleep 100)\n i)\n (range 50))]\n (take 1 x))\n0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n(0)\n\n;; Another interesting case (especially for debugging) when\n;; an exception is thrown during this extra realization.\n\nuser=> (let [x (map (fn [i]\n (when (> i 40)\n (throw (Exception. (str i \" is not accepted!\")))))\n (range 50))]\n (take 33 x))\n\n;; result: Exception 41 is not accepted!\n\n;; When pmap is used instead of map, then not only one, but many exceptions might\n;; be thrown during this extra realization. However, all of them are \"swallowed\"\n;; by pmap: they are thrown inside, but never get out:\n\nuser=> (let [x (pmap (fn [i]\n (when (> i 40)\n (println \"Exception is thrown...\")\n (throw (Exception. (str i \" is not accepted!\")))))\n (range 50))]\n (take 33 x))\n(nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil\nException is thrown...Exception is thrown...\n\nException is thrown...Exception is thrown...\n\nException is thrown...\nException is thrown...\nnil nil nil nil nil nil nil nil nil nil nil nil)\nException is thrown...\nException is thrown...Exception is thrown...\n;; Note: the REPL sees no exception!\n\n;; \"Normal\" exceptions arrive as expected:\nuser=> (let [x (pmap (fn [i]\n (when (> i 40)\n (println \"Exception is thrown...\" i)\n (throw (Exception. (str i \" is not accepted!\")))))\n (range 50))]\n (take 42 x))\n(nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil\nException is thrown... Exception is thrown...Exception is thrown... 42\n44Exception is thrown...Exception is thrown... 46 \nnilException is thrown... Exception is thrown...47 45\nException is thrown... 49\n43\n\n\n 48nil nil \nnil nil nil nil Exception is thrown...nil nil 41nil nil \nnil Exception 41 is not accepted! user/eval9941/fn--9942 (NO_SOURCE_FILE:337)\nnil nil nil nil nil nil\n;; We can see above, that several exceptions are thrown, but only the one for i=41\n;; arrives to the REPL.\n", :author {:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"}, :created-at 1538951205102, :updated-at 1539004143896, :_id "5bba8825e4b00ac801ed9eac"}], :notes nil, :arglists ["n" "n coll"], :doc "Returns a lazy sequence of the first n items in coll, or all items if\n there are fewer than n. Returns a stateful transducer when\n no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/take"} {:added "1.0", :ns "clojure.core", :name "vector?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1414508335557, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "set?", :library-url "https://github.com/clojure/clojure"}, :_id "544faf2fe4b03d20a1024280"} {:created-at 1414508362039, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "vec", :library-url "https://github.com/clojure/clojure"}, :_id "544faf4ae4b03d20a1024281"} {:created-at 1414508375671, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "map?", :library-url "https://github.com/clojure/clojure"}, :_id "544faf57e4b03d20a1024282"} {:created-at 1414508715616, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "list?", :library-url "https://github.com/clojure/clojure"}, :_id "544fb0abe4b03d20a1024285"} {:created-at 1420231002263, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=3"}, :to-var {:ns "clojure.core", :name "sequential?", :library-url "https://github.com/clojure/clojure"}, :_id "54a7015ae4b09260f767ca84"}], :line 174, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body ";; this is the idiomatic vector \n(vector? [1 2 3])\n;;=> true\n\n;; a list is not a vector\n(vector? '(1 2 3))\n;;=> false\n\n;; a list may be converted into a vector\n(vector? (vec '(1 2 3)))\n;;=> true\n\n;; a map is not a vector\n(vector? {:a 1 :b 2 :c 3})\n;;=> false\n\n;; a set is not a vector\n(vector? #{:a :b :c})\n;;=> false\n\n(first {:a 1 :b 2 :c 3})\n;;=> [:c 3]\n(vector? (first {:a 1 :b 2 :c 3}))\n;;=> true", :created-at 1279075424000, :updated-at 1423523910620, :_id "542692c9c026201cdc326af5"} {:updated-at 1518959452052, :created-at 1518959452052, :author {:login "humorless", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/3061798?v=4"}, :body ";; an quoted vector is still a vector\n(vector? '[])\n;;=> true", :_id "5a897b5ce4b0316c0f44f8cb"} {:updated-at 1660931660559, :created-at 1660931660559, :author {:login "KGOH", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/11963737?v=4"}, :body ";; Be careful while traversing data:\n;; map entries are vectors!\n\nuser=> (vector? (first {:a 1}))\ntrue\n\nuser=> (vector? (clojure.lang.MapEntry. :a 1))\ntrue\n\nuser=> (clojure.walk/postwalk\n #(cond-> % (vector? %) set)\n {:a [1 1 2 3]})\n; Unhandled java.lang.ClassCastException\n; class clojure.lang.PersistentHashSet cannot be cast to class\n; java.util.Map$Entry (clojure.lang.PersistentHashSet is in unnamed module of\n; loader 'app'; java.util.Map$Entry is in module java.base of loader\n; 'bootstrap')\n\nuser=> (clojure.walk/postwalk\n #(cond-> %\n (and (vector? %)\n (not (map-entry? %)))\n set)\n {:a [1 1 2 3]})\n{:a #{1 3 2}}", :_id "62ffce4ce4b0b1e3652d7640"}], :notes nil, :arglists ["x"], :doc "Return true if x implements IPersistentVector", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/vector_q"} {:added "1.2", :ns "clojure.core", :name "thread-bound?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1350609443000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bound-fn", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ec5"} {:created-at 1350609447000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bound-fn*", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ec6"}], :line 5520, :examples [{:body "user=> (thread-bound? #'map)\nfalse\n\nuser=> (thread-bound? #'*warn-on-reflection*)\ntrue", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423279051775, :updated-at 1423279051775, :_id "54d583cbe4b081e022073c6d"}], :notes nil, :arglists ["& vars"], :doc "Returns true if all of the vars provided as arguments have thread-local bindings.\n Implies that set!'ing the provided vars will succeed. Returns true if no vars are provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/thread-bound_q"} {:added "1.5", :ns "clojure.core", :name "send-via", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1553627520247, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "send", :ns "clojure.core"}, :_id "5c9a7980e4b0ca44402ef6d1"} {:created-at 1553627525447, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "send-off", :ns "clojure.core"}, :_id "5c9a7985e4b0ca44402ef6d2"}], :line 2101, :examples [{:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; \"send\" (FixedThreadPool) or \"send-off\" (CachedThreadPool) \n;; covers most of the thread pooling strategies.\n;; But in case you want a different one, use \"send-via\" to pass\n;; a different pool, for example ForkJoin.\n\n(import '[java.util.concurrent Executors])\n(def fj-pool (Executors/newWorkStealingPool))\n\n(defn send-fj [^clojure.lang.Agent a f & args]\n (apply send-via fj-pool a f args))\n\n(def a (agent 1))\n(send-fj a inc)\n(await a)\n@a\n;; 2", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1553627490834, :updated-at 1553627508594, :_id "5c9a7962e4b0ca44402ef6cf"}], :notes nil, :arglists ["executor a f & args"], :doc "Dispatch an action to an agent. Returns the agent immediately.\n Subsequently, in a thread supplied by executor, the state of the agent\n will be set to the value of:\n\n (apply action-fn state-of-agent args)", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/send-via"} {:added "1.0", :ns "clojure.core", :name "boolean", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1525123909893, :author {:login "zk", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/7194?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "boolean?", :ns "clojure.core"}, :_id "5ae78b45e4b045c27b7fac5a"}], :line 1605, :examples [{:updated-at 1445064419614, :created-at 1279063882000, :body ";; Everything except `false' and `nil' is true in boolean context.\nuser=> (into {} (map #(vector % (boolean %)) [true false nil [] {} '() #{} \"\"]))\n{true true, false false, nil false, [] true, {} true, #{} true, \"\" true}\n\nuser=> (clojure.pprint/pp)\n{true true,\n false false,\n nil false,\n [] true,\n {} true,\n #{} true,\n \"\" true}\nnil\n\n;; Unrelated to `boolean`, but notice that the `'()` entry is missing. This\n;; due to Clojure treating `[]` and `'()` as equal. When combined into the map \n;; the `'() => true` key-value pair is overwritten by the `[] => true` key-value\n;; pair. See https://github.com/zk/clojuredocs/issues/114#issuecomment-132153637\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692c9c026201cdc326ad4"} {:body ";; Beware that boolean returns true for numbers 0 and 1\nuser=> (boolean 0)\ntrue\nuser=> (boolean 1)\ntrue", :author {:login "nickzam", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/89377?v=3"}, :created-at 1425054691862, :updated-at 1425054691862, :_id "54f09be3e4b0b716de7a652d"} {:editors [{:login "Jarzka", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5528061?v=3"}], :body ";; Simply defined: Everything except false and nil is logically true in Clojure.", :author {:avatar-url "https://avatars.githubusercontent.com/u/5528061?v=3", :account-source "github", :login "Jarzka"}, :created-at 1475227100143, :updated-at 1475227191121, :_id "57ee2ddce4b0709b524f0510"} {:updated-at 1496248789165, :created-at 1496248789165, :author {:login "dottedmag", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/16120?v=3"}, :body ";; Corrected definition:\n;; returns `false' for `false', `nil' and `(Boolean. false)`.\n;; returns `true' for everything else.\n", :_id "592ef1d5e4b06e730307db16"}], :notes nil, :arglists ["x"], :doc "Coerce to boolean", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/boolean"} {:added "1.0", :ns "clojure.core", :name "bit-shift-left", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1405720522000, :author {:login "phreed", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a0c739cf289be18be932dc3022e6fd3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bit-shift-left", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d80"} {:created-at 1412094597343, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=2"}, :to-var {:ns "clojure.core", :name "unsigned-bit-shift-right", :library-url "https://github.com/clojure/clojure"}, :_id "542ada85e4b0df9bb778a5a1"} {:created-at 1412094642694, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=2"}, :to-var {:ns "clojure.core", :name "bit-shift-right", :library-url "https://github.com/clojure/clojure"}, :_id "542adab2e4b0df9bb778a5a2"}], :line 1356, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "tomas", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c0c2f195479ae4a71cb6484679f6f49?r=PG&default=identicon"} {:login "tomas", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c0c2f195479ae4a71cb6484679f6f49?r=PG&default=identicon"}], :body "
user=> (bit-shift-left 1 10)\n1024\n
\n\n
user=> (bit-shift-left 2r1101 2) ; fill rightmost bits with 0s\n52 \n;; 52 = 2r110100\n
\n", :created-at 1280339401000, :updated-at 1408597384000, :_id "542692ccc026201cdc326cc2"} {:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [{:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}], :body ";;a bogus bit-array implementation\n\n(def ba (atom (long 0)))\n\n(defn set-ba \n\"sets bit n in long atom ba\"\n [n]\n (let [number-set (bit-shift-left 1 n)\n\t_ (println \"number to set: \" number-set)\n\tnew-array (bit-or @ba number-set)]\n (reset! ba new-array)))\n\n(defn get-ba \n\"gets bit n in long atom ba\"\n[n]\n (not (zero? (bit-and (bit-shift-left 1 n) @ba))))\n\n(comment\n (set-ba 0) ;; 0 [....0001]\n (set-ba 3) ;; 2^3 = 8 [....1001]\n (get-ba 0) ;; (bit-and ba 2^0) = 1\n (get-ba 1) ;; (bit-and ba 2^1) = 0\n (get-ba 3) ;; (bit-and ba 2^3) = 1\n ;;but:\n (set-ba 65) ;; [....1011]\n ;;number to set: 2\n ;;modulo because long has only 64 bit\n ;;also note that long always is two-complemented (signed) in java implementation\n )", :created-at 1334315926000, :updated-at 1334316062000, :_id "542692d2c026201cdc326f59"}], :notes nil, :arglists ["x n"], :doc "Bitwise shift left", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bit-shift-left"} {:added "1.9", :ns "clojure.core", :name "any?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1505768957277, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "constantly", :ns "clojure.core"}, :_id "59c035fde4b09f63b945ac78"} {:created-at 1509371215117, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "some?", :ns "clojure.core"}, :_id "59f72d4fe4b0a08026c48c8b"}], :line 538, :examples [{:updated-at 1525874416827, :created-at 1525874416827, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body ";; All known practical uses are in the context of core.spec\n;; Specifically indicates that any type is allowed.\n\n;; https://clojure.org/guides/spec#_macros\n(s/fdef clojure.core/declare\n :args (s/cat :names (s/* simple-symbol?))\n :ret any?)\n", :_id "5af2fef0e4b045c27b7fac5e"} {:updated-at 1598160436994, :created-at 1598160436994, :author {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}, :body ";; any? never returns false\n\nuser=> (any? {})\n;; true\nuser=> (any? [])\n;; true\nuser=> (any? nil)\n;; true\nuser=> (any? true)\n;; true\nuser=> (any? false)\n;; true", :_id "5f41fe34e4b0b1e3652d739b"} {:updated-at 1667213535374, :created-at 1667213535374, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; Combined with `halt-when` to make a \"first\" transducer\n(transduce (comp (filter even?) (halt-when any?)) identity nil [1 3 5 6 7 8 9])\n;; => 6\n", :_id "635fa8dfe4b0b1e3652d767e"}], :notes [{:author {:login "kofrasa", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/941969?v=4"}, :updated-at 1537520319116, :created-at 1537520319116, :body "The current implementation of [any?](https://github.com/clojure/clojure/blob/clojure-1.9.0/src/clj/clojure/core.clj#L538-L542) is incorrect and must be fixed IMO.\nThere was a [PR](https://github.com/clojure/clojure/pull/49) (copied below) submitted in 2014 to add a correct implementation which is consistent with behaviour in other languages. \n\n```\n(def\n ^{:tag Boolean\n :doc \"Returns true if (pred x) is logical true for any x in coll,\n else false.\"\n :arglists '([pred coll])\n :added \"1.7\"}\n any? (comp boolean some))\n```", :_id "5ba4b2bfe4b00ac801ed9ea2"} {:author {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}, :updated-at 1598160591335, :created-at 1598160591335, :body "any? never returns false. Is this a bug?", :_id "5f41fecfe4b0b1e3652d739c"} {:author {:login "KyleErhabor", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/40676441?v=4"}, :updated-at 1635468134571, :created-at 1635468134571, :body "You can think of this function as a non-variadic `(constantly true)`.", :_id "617b4366e4b0b1e3652d7561"} {:body "[Explanation by Alex Miller:](https://ask.clojure.org/index.php/11260/does-the-any-function-have-the-correct-behavior?show=11261#a11261)\n\n> \n`any?` is a predicate that is intended to always return true, so yes it is the correct behavior. `any?` was added as a predicate to use with spec in the case where any value is valid. It is not a complement to `not-any?`, despite that obvious assumption. There are, in the end, only so many words and despite a lot of care in this regard, there are times when these confusions exist.\n\n> ...this is similar to `and` (for N args) but that does have limits as a macro, or `every?` (for a coll), or the higher-order function `every-pred` for creating a composite pred. Depending on your case, one of those probably makes sense.", :created-at 1636499571628, :updated-at 1636499796804, :author {:avatar-url "https://avatars.githubusercontent.com/u/77174844?v=4", :account-source "github", :login "wildwestrom"}, :_id "618b0073e4b0b1e3652d7569"}], :tag "java.lang.Boolean", :arglists ["x"], :doc "Returns true given any argument.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/any_q"} {:added "1.0", :ns "clojure.core", :name "find-var", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 2015, :examples [{:author {:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user=> (find-var 'clojure.core/map)\n#'clojure.core/map\nuser=> (find-var 'clojure.core/qwerty)\nnil\nuser=> (find-var 'map)\nIllegalArgumentException Symbol must be namespace-qualified clojure.lang.Var.find (Var.java:150)\n", :created-at 1353813768000, :updated-at 1422932885283, :_id "542692d3c026201cdc326fa5"}], :notes [{:author {:login "kumarshantanu", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/109792?v=4"}, :updated-at 1520862872705, :created-at 1520862872705, :body "For namespaces other than those in Clojure, you must do `(require 'the-ns)` first, followed by `(find-var 'the-ns/the-name)`. Failing to do this leads to `IllegalArgumentException` thrown complaining about no such namespace.", :_id "5aa68698e4b0316c0f44f921"}], :arglists ["sym"], :doc "Returns the global var named by the namespace-qualified symbol, or\n nil if no var with that name.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/find-var"} {:added "1.0", :ns "clojure.core", :name "rand-int", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1311342554000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rand", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b5a"} {:created-at 1343068893000, :author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "int", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b5b"}], :line 4919, :examples [{:author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"} {:login "green-coder", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4"}], :body "user=> (rand-int 30)\n10\n\nuser=> (rand-int 30)\n7\n\n; is equivalent to\nuser=> (int (rand 30))\n", :created-at 1280776684000, :updated-at 1527060379971, :_id "542692cac026201cdc326b17"} {:body "(require '[clojure.set :as set])\n\n; random generation of unique series of random numbers from 0 to n-1 \n\n(defn unique-random-numbers [n]\n (let [a-set (set (take n (repeatedly #(rand-int n))))]\n (concat a-set (set/difference (set (take n (range)))\n a-set))))\n\nuser=> (unique-random-numbers 20)\n(0 1 3 6 7 8 9 12 14 16 17 19 2 4 5 10 11 13 15 18)\n\n", :author {:login "rsachdeva", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/232903?v=2"}, :created-at 1412614831110, :updated-at 1412617449373, :editors [{:login "rsachdeva", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/232903?v=2"}], :_id "5432caafe4b0edc37b198867"}], :notes nil, :arglists ["n"], :doc "Returns a random integer between 0 (inclusive) and n (exclusive).", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/rand-int"} {:added "1.0", :ns "clojure.core", :name "aclone", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1359687987000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "aget", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d98"} {:created-at 1454082909781, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "int-array", :ns "clojure.core"}, :_id "56ab8b5de4b0ceed88ce8d1d"}], :line 3905, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body ";; create an Java integer array, then clone it\n;; note that when you modify b, a remains the same\n;; showing that b is not just a reference to a\nuser=> (def a (int-array [1 2 3 4]))\n#'user/a\n\nuser=> (def b (aclone a))\n#'user/b\n\nuser=> (aset b 0 23)\n23\n\nuser=> (vec b)\n[23 2 3 4]\n\nuser=> (vec a)\n[1 2 3 4]", :created-at 1313834307000, :updated-at 1422928355436, :_id "542692cec026201cdc326db4"}], :notes nil, :arglists ["array"], :doc "Returns a clone of the Java array. Works on arrays of known\n types.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/aclone"} {:added "1.10", :ns "clojure.core", :name "PrintWriter-on", :file "clojure/core_print.clj", :type "function", :column 1, :see-alsos nil, :line 559, :examples [{:updated-at 1589185851017, :created-at 1589185851017, :author {:login "pwojnowski", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/433664?v=4"}, :body "(with-open [writer (PrintWriter-on\n (fn [s] (printf \"Flushing: '%s'%n\" s))\n (fn [] (printf \"Closing.%n\")))]\n (.write writer \"Hello\")\n (.flush writer)\n (.write writer \"World!\")\n (println \"About to finish...\"))\n;; Flushing: 'Hello'\n;; About to finish...\n;; Flushing: 'World!'\n;; Closing.\n;; nil\n", :_id "5eb90d3be4b087629b5a190a"}], :notes nil, :tag "java.io.PrintWriter", :arglists ["flush-fn close-fn"], :doc "implements java.io.PrintWriter given flush-fn, which will be called\n when .flush() is called, with a string built up since the last call to .flush().\n if not nil, close-fn will be called with no arguments when .close is called", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/PrintWriter-on"} {:added "1.7", :ns "clojure.core", :name "vreset!", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1469617409269, :author {:login "kumarshantanu", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109792?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "volatile!", :ns "clojure.core"}, :_id "57989501e4b0bafd3e2a04c0"}], :line 2532, :examples [{:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; A lightweight (but low level) syncrhonization solution with volatile!\n;; Prefer promise/deliver for this (unless you know what you're doing).\n;; vars/atoms is also possible but they're heavier\n;; (locking and CAS respectively).\n\n(def ready (volatile! false))\n(def result (volatile! nil))\n\n(defn start-consumer []\n (future\n (while (not @ready) ; consumer starts spinning\n (Thread/yield)) ; release control for other threads\n (println \"Consumer getting result:\" @result)))\n\n(defn start-producer []\n (future\n (vreset! result :done) ; change the 1st volatile, no reordering (guaranteed).\n (vreset! ready true))) ; change the ready state. \n\n(start-consumer)\n(start-producer)\n;; Consumer getting result: :done", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1554052433589, :updated-at 1554114281037, :_id "5ca0f551e4b0ca44402ef6f3"}], :notes nil, :arglists ["vol newval"], :doc "Sets the value of volatile to newval without regard for the\n current value. Returns newval.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/vreset!"} {:ns "clojure.core", :name "chunk", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1443935937870, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-buffer", :ns "clojure.core"}, :_id "5610b6c1e4b0686557fcbd48"} {:created-at 1443935945637, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-cons", :ns "clojure.core"}, :_id "5610b6c9e4b08e404b6c1c9a"} {:created-at 1443935949789, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-first", :ns "clojure.core"}, :_id "5610b6cde4b0686557fcbd49"} {:created-at 1443935953838, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-rest", :ns "clojure.core"}, :_id "5610b6d1e4b0686557fcbd4a"} {:created-at 1443935959010, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunked-seq?", :ns "clojure.core"}, :_id "5610b6d7e4b0686557fcbd4b"}], :line 698, :examples [{:updated-at 1443936068915, :created-at 1443936068915, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :body "(chunk-rest\n (chunk-cons (chunk (chunk-buffer 32))\n (seq (range 42))))\n\n;; => (32 33 34 35 36 37 38 39 40 41)\n\n;; Or if you'd prefer to read it threaded:\n(-> (chunk-buffer 32)\n (chunk)\n (chunk-cons (seq (range 42)))\n (chunk-rest))\n\n;; => (32 33 34 35 36 37 38 39 40 41)", :_id "5610b744e4b0686557fcbd4c"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; re-chunk takes a sequence (already chunked or not)\n;; and produces another sequence with different chunking size.\n\n(defn re-chunk [n xs]\n (lazy-seq\n (when-let [s (seq (take n xs))]\n (let [cb (chunk-buffer n)]\n (doseq [x s] (chunk-append cb x))\n (chunk-cons (chunk cb) (re-chunk n (drop n xs)))))))\n\n(def s (pmap f (re-chunk 1000 (range 1000)))) ; a 1000+ concurrent threads pmap\n\n(def s (map #(println %) (re-chunk 3 (range 50)))) ; chunk-size = 3\n\n(first s) ; moves ahead 3 on first access\n;; 0\n;; 1\n;; 2\n\n(second s) ; already cached\nnil\n\n(first (drop 3 s)) ; 3 more\n;; 3\n;; 4\n;; 5\n", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1553787843289, :updated-at 1553805164827, :_id "5c9cebc3e4b0ca44402ef6ec"}], :notes nil, :tag "clojure.lang.IChunk", :arglists ["b"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/chunk"} {:added "1.2", :ns "clojure.core", :name "dec", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1318548547000, :author {:login "arkh", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1c6ed9b963d758914c2744befd4974ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "dec'", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b3e"} {:created-at 1415177846727, :author {:login "rvlieshout", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/139665?v=2"}, :to-var {:ns "clojure.core", :name "inc", :library-url "https://github.com/clojure/clojure"}, :_id "5459e676e4b03d20a102429e"} {:created-at 1423522396091, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "unchecked-dec", :library-url "https://github.com/clojure/clojure"}, :_id "54d93a5ce4b0e2ac61831d30"}], :line 1142, :examples [{:author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (dec 2)\n1\n\nuser=> (dec 2.0)\n1.0\n\nuser=> (dec 1)\n0\n\nuser=> (dec -1)\n-2", :created-at 1279992356000, :updated-at 1411919526590, :_id "542692cec026201cdc326d98"}], :notes nil, :arglists ["x"], :doc "Returns a number one less than num. Does not auto-promote\n longs, will throw on overflow. See also: dec'", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/dec"} {:added "1.1", :ns "clojure.core", :name "future-call", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1300437112000, :author {:login "ninjudd", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7ced25585a7556e9b9b975c1f9e136e3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "future", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f43"}], :line 6963, :examples [{:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; future-call is used to implement 'future'. See examples for 'future'\n;; for discussion of an undesirable 1-minute wait that can occur before\n;; your standalone Clojure program exits if you do not use shutdown-agents.", :created-at 1336538018000, :updated-at 1336538018000, :_id "542692d3c026201cdc326fb2"}], :notes [{:author {:login "guyboltonking", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/98294?v=4"}, :updated-at 1524654131544, :created-at 1524654131544, :body "`future-call` will also preserve the calling thread's dynamic bindings in the thread that executes f.", :_id "5ae06033e4b045c27b7fac52"}], :arglists ["f"], :doc "Takes a function of no args and yields a future object that will\n invoke the function in another thread, and will cache the result and\n return it on all subsequent calls to deref/@. If the computation has\n not yet finished, calls to deref/@ will block, unless the variant\n of deref with timeout is used. See also - realized?.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/future-call"} {:added "1.0", :ns "clojure.core", :name "resultset-seq", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 5702, :examples [{:updated-at 1519728015058, :created-at 1519728015058, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; To run this you need [mysql/mysql-connector-java \"5.1.x\"] dependency \n;; in the classpath and a running MySql instance. The statement is set\n;; to enable streaming and go fully lazy with restultset-seq.\n;; \"f\" is expected to produce the required results *before* exiting \n;; the try-finally block that closes the connection.\n\n(import '[java.sql DriverManager ResultSet])\n\n(defn with-mysql-query [url query f]\n (Class/forName \"com.mysql.jdbc.Driver\")\n (let [db url\n conn (DriverManager/getConnection db)\n stmt (doto\n (.createStatement conn\n ResultSet/TYPE_FORWARD_ONLY\n ResultSet/CONCUR_READ_ONLY)\n (.setFetchSize Integer/MIN_VALUE))\n rs (.executeQuery stmt query)]\n (try\n (f (resultset-seq rs))\n (finally\n (.close stmt)\n (.close conn)))))\n\n(with-mysql-query\n \"jdbc:mysql://localhost/mysql?user=root&password=\"\n \"SELECT * FROM user\"\n (comp count keys first))\n\n;; 45\n", :_id "5a95358fe4b0316c0f44f900"}], :notes nil, :arglists ["rs"], :doc "Creates and returns a lazy sequence of structmaps corresponding to\n the rows in the java.sql.ResultSet rs", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/resultset-seq"} {:added "1.0", :ns "clojure.core", :name "struct", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1293674730000, :author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defstruct", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bb5"} {:created-at 1605645636792, :author {:login "metasoarous", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/88556?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "create-struct", :ns "clojure.core"}, :_id "5fb43544e4b0b1e3652d7407"}], :line 4062, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [], :body "user> (defstruct mystruct :foo :bar)\n#'user/mystruct\n\nuser> (struct mystruct \"eggplant\" \"pizza\")\n{:foo \"eggplant\", :bar \"pizza\"}", :created-at 1293674725000, :updated-at 1293674725000, :_id "542692cec026201cdc326d8b"} {:updated-at 1605645959161, :created-at 1605645773188, :author {:login "metasoarous", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/88556?v=4"}, :body ";; You can use an \"anonymous\" struct like so\n\n(let [structure (create-struct :foo :bar)]\n (struct structure \"pop\" \"fizz\"))\n\n;; This can be useful if you want to dynamically create/use structs, and don't\n;; know the field names at compile time (e.g. when reading CSV files)", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/88556?v=4", :account-source "github", :login "metasoarous"}], :_id "5fb435cde4b0b1e3652d7408"}], :notes [{:body "Structs are becoming obsolete. Use records instead. See `defrecord`.", :created-at 1423277999196, :updated-at 1423277999196, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :_id "54d57fafe4b0e2ac61831d27"} {:body "In _general_, records should be preferred over structs. However, structs aren't _entirely_ obsolete.\n\nThey can still be useful when you need/want to create record-like objects dynamically; That is, when you don't know the field names at compile time. A typical example of this might be loading rows from a CSV (as [semantic-csv](https://github.com/metasoarous/semantic-csv) does). The advantage in this case over using regular maps is significantly improved performance creating and using these objects.", :created-at 1605646073997, :updated-at 1605646085033, :author {:avatar-url "https://avatars3.githubusercontent.com/u/88556?v=4", :account-source "github", :login "metasoarous"}, :_id "5fb436f9e4b0b1e3652d740b"}], :arglists ["s & vals"], :doc "Returns a new structmap instance with the keys of the\n structure-basis. vals must be supplied for basis keys in order -\n where values are not supplied they will default to nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/struct"} {:added "1.0", :ns "clojure.core", :name "map", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1318598944000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "map-indexed", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b92"} {:created-at 1346930884000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pmap", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b93"} {:created-at 1346930913000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "amap", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b94"} {:created-at 1371842453000, :author {:login "adereth", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5ad11b4e208a6cdb3bd45fe01dea59b7?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "mapcat", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b95"} {:created-at 1399907437000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "keep", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b96"} {:created-at 1407836917000, :author {:login "Thomas Stephens", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/40024617164314f70f7584ac09b96c1d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "juxt", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b97"} {:created-at 1413326075136, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "mapv", :library-url "https://github.com/clojure/clojure"}, :_id "543da4fbe4b02688d208b1b9"} {:created-at 1449762409201, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reduce", :ns "clojure.core"}, :_id "56699e69e4b09a2675a0ba73"} {:created-at 1516403401772, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "run!", :ns "clojure.core"}, :_id "5a627ac9e4b0a08026c48d07"} {:created-at 1655305687140, :author {:login "zackteo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7510179?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "filter", :ns "clojure.core"}, :_id "62a9f5d7e4b0b1e3652d7601"}], :line 2727, :examples [{:author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "tomas", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c0c2f195479ae4a71cb6484679f6f49?r=PG&default=identicon"} {:login "tomas", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c0c2f195479ae4a71cb6484679f6f49?r=PG&default=identicon"} {:login "tomas", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c0c2f195479ae4a71cb6484679f6f49?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/35314270?v=4", :account-source "github", :login "ricardodalarme"}], :body "(map inc [1 2 3 4 5])\n;;=> (2 3 4 5 6)\n\n\n;; map can be used with multiple collections. Collections will be consumed\n;; and passed to the mapping function in parallel:\n(map + [1 2 3] [4 5 6])\n;;=> (5 7 9)\n\n\n;; When map is passed more than one collection, the mapping function will\n;; be applied until one of the collections runs out:\n(map + [1 2 3] (iterate inc 1))\n;;=> (2 4 6)\n\n\n\n;; map is often used in conjunction with the # reader macro:\n(map #(str \"Hello \" % \"!\" ) [\"Ford\" \"Arthur\" \"Tricia\"])\n;;=> (\"Hello Ford!\" \"Hello Arthur!\" \"Hello Tricia!\")\n\n;; A useful idiom to pull \"columns\" out of a collection of collections. \n;; Note, it is equivalent to:\n;; user=> (map vector [:a :b :c] [:d :e :f] [:g :h :i])\n\n(apply map vector [[:a :b :c]\n [:d :e :f]\n [:g :h :i]])\n\n;;=> ([:a :d :g] [:b :e :h] [:c :f :i])\n\n;; From http://clojure-examples.appspot.com/clojure.core/map\n", :created-at 1278720977000, :updated-at 1665566175477, :_id "542692cac026201cdc326b01"} {:updated-at 1515774677373, :created-at 1279062371000, :body ";; map sends key-value pairs from a hash-map\n(map #(vector (first %) (* 2 (second %)))\n {:a 1 :b 2 :c 3})\n;;=> ([:a 2] [:b 4] [:c 6])\n\n;; or the same thing using destructuring\n(map (fn [[key value]] [key (* 2 value)])\n {:a 1 :b 2 :c 3})\n;;=> ([:a 2] [:b 4] [:c 6])\n\n(into {} *1)\n;;=> {:a 2, :b 4, :c 6}\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692cac026201cdc326b09"} {:updated-at 1636744366940, :created-at 1310850029000, :body ";; Use a hash-map as a function to translate values in a collection from the \n;; given key to the associated value\n\nuser=> (map {2 \"two\" 3 \"three\"} [5 3 2])\n(nil \"three\" \"two\")\n\n;; then use (filter identity... to remove the nils\nuser=> (filter identity (map {2 \"two\" 3 \"three\"} [5 3 2]))\n(\"three\" \"two\")\n\n;; an alternative to the above map+filter steps is keep.\n(keep {2 \"two\" 3 \"three\"} [5 3 2])\n;;=> (\"three\" \"two\")", :editors [{:login "wdhowe", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4631165?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon", :account-source "clojuredocs", :login "shockbob"}, :_id "542692cac026201cdc326b0b"} {:updated-at 1471132085931, :created-at 1320357817000, :body ";; mapping over a hash-map applies (into) first. \n;; need to use functions that deal with arrays (fn [[key val]] ...)\n(map pprint {:key :val :key1 :val1})\n([:key :val]\n[:key1 :val1]\nnil nil)\n\n;;above, the pprint output appears to be part of the return value but it's not:\n(hash-set (map pprint {:key :val :key1 :val1}))\n[:key :val]\n[:key1 :val1]\n#{(nil nil)}\n\n(map second {:key :val :key1 :val1})\n;;=>(:val :val1)\n\n(map last {:x 1 :y 2 :z 3})\n;;=> (1 2 3)", :editors [{:avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon", :account-source "clojuredocs", :login "boxie"} {:avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon", :account-source "clojuredocs", :login "boxie"} {:avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon", :account-source "clojuredocs", :login "AtKaaZ"} {:avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon", :account-source "clojuredocs", :login "AtKaaZ"} {:login "sleyzerzon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/528932?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon", :account-source "clojuredocs", :login "boxie"}, :_id "542692d4c026201cdc326ffb"} {:author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :editors [{:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"} {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"} {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}], :body "(map fn [a 4 x]\n [b 5 y]\n [c 6]) \n; ^ ^\n; applies fn to a b c as (fn a b c)\n; applies fn to 4 5 6 as (fn 4 5 6)\n; ignores (x y)\n; returns a list of results\n; equivalent to (list (fn a b c) (fn 4 5 6))\n\n;example\n(map list [1 2 3]\n '(a b c)\n '(4 5))\n\nuser=> (map list [1 2 3] '(a b c) '(4 5))\n((1 a 4) (2 b 5))\n;same as\nuser=> (list (list 1 'a 4) (list 2 'b 5))\n((1 a 4) (2 b 5))", :created-at 1345087524000, :updated-at 1345087844000, :_id "542692d4c026201cdc327000"} {:author {:login "octopusgrabbus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :body "; map passed two collection arguments. From 4Clojure Problem #157\n\n(def d1 [:a :b :c])\n(#(map list % (range)) d1)\n;;=> ((:a 0) (:b 1) (:c 2))", :created-at 1371168552000, :updated-at 1413325797212, :_id "542692d4c026201cdc327004"} {:updated-at 1435879364197, :created-at 1435879364197, :author {:login "bsvingen", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1647562?v=3"}, :body ";; Used without a collection, map will create a transducer:\n(def xf (map inc))\n\n;; We can now apply this transducer to a sequence:\n(transduce xf conj (range 5))\n;; => [1 2 3 4 5]\n", :_id "5595c7c4e4b020189d740546"} {:updated-at 1450108764352, :created-at 1450108764352, :author {:login "ha0ck", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3716736?v=3"}, :body ";; Extract keyword from a collection of obj\n(map :a '({:a 1 :b 0} {:a 2 :b 0} {:a 3 :b 1} {:a 3 :b 0}))\n;; =>(1 2 3 3)", :_id "566ee75ce4b09a2675a0ba77"} {:updated-at 1471132864529, :created-at 1471132864529, :author {:login "sleyzerzon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/528932?v=3"}, :body ";;get the keys from a map with entries of certain values\n(let [m {:x 1 :y 2 :z 3}\n vset #{2 3}]\n (map first (filter (comp vset last) m)))\n;;=> (:y :z)\n\n(filter (comp #{2 3} last) {:x 1 :y 2 :z 3})\n;;=> ([:y 2] [:z 3])\n\n", :_id "57afb4c0e4b02d8da95c26ff"} {:updated-at 1515775349661, :created-at 1515775349661, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body ";; deeper destructuring\n(def ds [ {:a 1 :b 2 :c [:foo :bar]}\n {:a 9 :b 8 :c [:baz :zoo]}\n {:a 1 :b 2 :c [:dog :cat]} ])\n\n(->> ds \n (map (fn [{a :a, b :b, [lhs rhs] :c}] \n [(str \"a:\" a \" c2:\" rhs)])))\n;;=> ([\"a:1 c2::bar\"] [\"a:9 c2::zoo\"] [\"a:1 c2::cat\"])", :_id "5a58e575e4b0a08026c48cf2"} {:updated-at 1516657644067, :created-at 1516657644067, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;map taking a collection of functions as an argument\n\n(def sum #(reduce + %))\n\n(def average #(/ (sum %) (count %)))\n\n;;apply a function to a collection\n(defn results [coll]\n (map #(% coll) [sum average count]))\n\n(results [10 20 30 40 50])\n;;[150 30 5]", :_id "5a665bece4b09621d9f53a74"} {:updated-at 1517039150366, :created-at 1517039150366, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body "(def my-coll [\n {:m 1, :val 12}\n {:m 2, :val 3}\n {:m 3, :val 32}])\n\n(map #(:val %) my-coll)\n;;(12 3 32)\n\n;;get total:\n(reduce + (map #(:val %) my-coll))\n;;47", :_id "5a6c2e2ee4b076dac5a728a8"} {:updated-at 1517738681040, :created-at 1517738681040, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;map practical example\n\n(def months [\"jan\" \"feb\" \"mar\"])\n\n(def temps [5 7 12])\n\n(defn unify\n [month temp]\n {:month month\n :temp temp})\n\n(map unify months temps)\n\n;;({:month \"jan\", :temp 5}\n;; {:month \"feb\", :temp 7}\n;; {:month \"mar\", :temp 12})\n", :_id "5a76dab9e4b0e2d9c35f7417"} {:updated-at 1518710042333, :created-at 1518710042333, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;map Function collection1 collection2\n\n(map vector '(1 2 3 4) [:a :b :c :d])\n\n;;([1 :a] [2 :b] [3 :c] [4 :d])", :_id "5a85ad1ae4b0316c0f44f8c0"} {:updated-at 1560011503684, :created-at 1560011503684, :author {:login "sodesu99", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/31072774?v=4"}, :body " ;multiplication of rows and columns\n(def matrix\n [\n [1 2 3 4 5];=>120\n [1 2 3 4 5];=>120\n [1 2 3 4 5];=>120\n [1 2 3 4 5]]);120 \n ;(1 16 81 256 625)\n\n;;columns multiplication\n(apply map * matrix)\n;;(1 16 81 256 625)\n\n;;rows multiplication\n(map #(reduce * %) matrix)\n;;(120 120 120 120)", :_id "5cfbe2efe4b0ca44402ef753"} {:updated-at 1631296227373, :created-at 1631296227373, :author {:login "cloudbuck3t", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/90472507?v=4"}, :body ";; Notice how the args of each collection are processed in parallel by the\n;; function provided to `map` -- in this case, an #(anonymous function) \n;;that takes %1 = the first coll elements and %2 the second coll elements.\n;; map will process the collections in parallel and will terminate when it reaches \n;; the end of the shortest collection. In this case, they are equal length.\n\n (map #(str \"Hello \" %1 %2) [\"Tennessee \" \"James \" \"John \"] [\"Ernie Ford\" \"Bond\" \"Smith\"])\n\noutput> (\"Hello Tennessee Ernie Ford\" \"Hello James Bond\" \"Hello John Smith\")", :_id "613b9ae3e4b0b1e3652d753a"} {:editors [{:login "aQuaYi", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6028869?v=4"}], :body ";; running several functions on the same argument\n\n(map #(% 0) (list inc dec zero?))\n;=> (1 -1 true)\n\n(map #(% 0) [inc dec zero?])\n;=> (1 -1 true)\n\n;; but not\n\n(map #(% 0) `(inc dec zero?))\n;=> (nil nil nil)\n\n(map #(% 0) '(inc dec zero?))\n;=> (nil nil nil)\n\n;; https://stackoverflow.com/questions/69925317/why-map-fn-f-f-0-inc-returns-nil-in-clojure", :author {:avatar-url "https://avatars.githubusercontent.com/u/6028869?v=4", :account-source "github", :login "aQuaYi"}, :created-at 1636796097196, :updated-at 1636954237105, :_id "618f86c1e4b0b1e3652d7574"} {:updated-at 1650196591875, :created-at 1650196591875, :author {:login "holtzermann17", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/179958?v=4"}, :body ";; Be careful with `map`, closures, and anonymous functions\n\n(defn typical-closure []\n (let [names (atom [])]\n (fn [arg] (swap! names conj arg) @names)))\n\n;; This works as expected: one function gets created and mapped\n\n(defmacro list-maker [fun args & body]\n `(defn ~fun ~args\n (map (typical-closure) '~body)))\n\n(list-maker foo [x] 1 2 3 4 5)\n(foo 100) ; ([1] [1 2] [1 2 3] [1 2 3 4] [1 2 3 4 5])\n\n;; This version recomputes the function for each mappand!\n\n(defmacro list-maker-oops [fun args & body]\n `(defn ~fun ~args\n (map #((typical-closure) %) '~body)))\n\n;; facepalm\n(list-maker-oops foo [x] 1 2 3 4 5)\n(foo 100) ; ([1] [2] [3] [4] [5])", :_id "625c006fe4b0b1e3652d75d4"}], :notes [{:updated-at 1361257529000, :body "To create a *hashmap*, use the [`hash-map`](hash-map) function, or the `{...}` sugar:\r\n\r\n (= {:a 1 :b 2 :c 3} (hash-map :a 1 :b 2 :c 3))", :created-at 1361257529000, :author {:login "Howard Abrams", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/eef504f83cde9913a37eefa515de56a8?r=PG&default=identicon"}, :_id "542692edf6e94c6970521ffd"}], :arglists ["f" "f coll" "f c1 c2" "f c1 c2 c3" "f c1 c2 c3 & colls"], :doc "Returns a lazy sequence consisting of the result of applying f to\n the set of first items of each coll, followed by applying f to the\n set of second items in each coll, until any one of the colls is\n exhausted. Any remaining items in other colls are ignored. Function\n f should accept number-of-colls arguments. Returns a transducer when\n no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/map"} {:added "1.1", :ns "clojure.core", :name "juxt", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1297561266000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "partial", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f05"} {:created-at 1297561270000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "comp", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f06"} {:created-at 1647648153954, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "every-pred", :ns "clojure.core"}, :_id "62351d99e4b0b1e3652d75bf"}], :line 2576, :examples [{:author {:login "kotarak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; Extract values from a map, treating keywords as functions.\n((juxt :a :b) {:a 1 :b 2 :c 3 :d 4})\n;;=> [1 2]\n", :created-at 1279213578000, :updated-at 1420743412507, :_id "542692cfc026201cdc326e0a"} {:updated-at 1469518181621, :created-at 1279213673000, :body ";; \"Explode\" a value.\n\n((juxt identity name) :keyword)\n;;=> [:keyword \"keyword\"]\n\n(juxt identity name)\n...is the same as:\n(fn [x] [(identity x) (name x)])\n\n;; eg. to create a map:\n\n(into {} (map (juxt identity name) [:a :b :c :d]))\n;;=> {:a \"a\" :b \"b\" :c \"c\" :d \"d\"}\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon", :account-source "clojuredocs", :login "kotarak"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "tengstrand", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/631272?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon", :account-source "clojuredocs", :login "kotarak"}, :_id "542692cfc026201cdc326e0c"} {:author {:login "adie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/26a4d75105ed437cdba82981ff7c78f6?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; Get the first character and length of string\n\n((juxt first count) \"Clojure Rocks\")\n;;=> [\\C 13]\n", :created-at 1280240324000, :updated-at 1420743526351, :_id "542692cfc026201cdc326e0f"} {:updated-at 1450881233579, :created-at 1342498131000, :body ";; sort list of maps by multiple values\n(sort-by (juxt :a :b) [{:a 1 :b 3} {:a 1 :b 2} {:a 2 :b 1}])\n;;=> [{:a 1 :b 2} {:a 1 :b 3} {:a 2 :b 1}]", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "liango2", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5696817?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/47018db2b156f6c7f606950e19cf6134?r=PG&default=identicon", :account-source "clojuredocs", :login "ordnungswidrig"}, :_id "542692d3c026201cdc326fdd"} {:author {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; Create lookup maps via a specific key\n\n(defn index-by [coll key-fn]\n (into {} (map (juxt key-fn identity) coll)))\n;; #'user/index-by\n\n(index-by [{:id 1 :name \"foo\"} \n {:id 2 :name \"bar\"} \n {:id 3 :name \"baz\"}] :id)\n;;=> {1 {:name \"foo\", :id 1}, \n;; 2 {:name \"bar\", :id 2}, \n;; 3 {:name \"baz\", :id 3}}\n\n(index-by [{:id 1 :name \"foo\"} \n {:id 2 :name \"bar\"} \n {:id 3 :name \"baz\"}] :name)\n;;=> {\"foo\" {:name \"foo\", :id 1}, \n;; \"bar\" {:name \"bar\", :id 2}, \n;; \"baz\" {:name \"baz\", :id 3}}\n", :created-at 1392423622000, :updated-at 1420743620071, :_id "542692cfc026201cdc326e12"} {:body "((juxt + * min max) 3 4 6)\n;;=> [13 72 3 6]", :author {:login "d9k", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7331988?v=3"}, :created-at 1428349759385, :updated-at 1428349759385, :_id "5522e33fe4b033f34014b765"} {:updated-at 1443524546728, :created-at 1443524546728, :author {:login "frolovv", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2934915?v=3"}, :body ";; split a sequence into two parts\n\nuser=> ((juxt take drop) 3 [1 2 3 4 5 6])\n;; => [(1 2 3) (4 5 6)]", :_id "560a6fc2e4b08e404b6c1c8b"} {:updated-at 1463687667792, :created-at 1463687667792, :author {:login "clojurianix", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19415437?v=3"}, :body ";; Segregate even and odd numbers in collection.\n\n((juxt (partial filter even?) (partial filter odd?)) (range 0 9))\n;;=> [(0 2 4 6 8) (1 3 5 7)]", :_id "573e19f3e4b0227798e72da1"} {:updated-at 1465311839158, :created-at 1465311839158, :author {:login "sleyzerzon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/528932?v=3"}, :body ";;keywords serve as getter functions to produce an ordered vector\n\n((juxt :lname :fname) {:fname \"Bill\" :lname \"Gates\"})\n=> [\"Gates\" \"Bill\"]", :_id "5756e25fe4b0bafd3e2a047f"} {:updated-at 1477172912305, :created-at 1477172912305, :author {:login "lmccombes", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2421085?v=3"}, :body ";; sort by two values\n\n(sort-by (juxt :a :b) [{:a 2 :b 4} {:a 1 :b 2} {:a 2 :b 1}])\n=> ({:a 1, :b 2} {:a 2, :b 1} {:a 2, :b 4})", :_id "580bdeb0e4b001179b66bdda"} {:editors [{:login "abyala", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1930104?v=4"}], :body ";; something similar to group-by\n\n(def split-by (juxt filter remove))\n\n(split-by pos? [-1 -2 4 5 3 -9])\n=> [(4 5 3) (-1 -2 -9)]\n", :author {:avatar-url "https://avatars2.githubusercontent.com/u/380618?v=4", :account-source "github", :login "smnplk"}, :created-at 1539468521882, :updated-at 1609110202738, :_id "5bc26ce9e4b00ac801ed9eda"} {:updated-at 1652253340151, :created-at 1652253340151, :author {:login "AbhishekJaiswal123", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10753944?v=4"}, :body ";; Extract nested value from the map\n\n((juxt :a #(get-in % [:c :d])) {:a 1 :b 2 :c {:d 2}})\n=> [1 2]", :_id "627b629ce4b0b1e3652d75ee"}], :notes [{:updated-at 1291541271000, :body "I kinda love this fn =)", :created-at 1291541271000, :author {:login "Nevena", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fa0e495ccb6ed2997e14f687817e9299?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fa8"} {:updated-at 1359899617000, :body "\"reduce1\" -> \"reduce\"\r\n\r\ncore sources from 33 line to 37 line", :created-at 1359899617000, :author {:login "lispro06", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/20c3faad6f66a434dae42b5ed8ad305?r=PG&default=identicon"}, :_id "542692edf6e94c6970521ffc"}], :arglists ["f" "f g" "f g h" "f g h & fs"], :doc "Takes a set of functions and returns a fn that is the juxtaposition\n of those fns. The returned fn takes a variable number of args, and\n returns a vector containing the result of applying each fn to the\n args (left-to-right).\n ((juxt a b c) x) => [(a x) (b x) (c x)]", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/juxt"} {:added "1.0", :ns "clojure.core", :name "ns-publics", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1288055164000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "ns-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d13"} {:created-at 1298556634000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "ns-interns", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d14"} {:created-at 1303419098000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "resolve", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d15"}], :line 4189, :examples [{:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; create the namespace and switch to it\nuser=> (in-ns 'demo.ns)\n#\n\n;; Make sure all of the good stuff in clojure.core is usable here, too.\ndemo.ns=> (clojure.core/use 'clojure.core)\nnil\n\n;; define some public functions\ndemo.ns=> (defn public-fn1 [x y] (+ x y))\n#'demo.ns/public-fn1\ndemo.ns=> (defn public-fn2 [t] (* t t t))\n#'demo.ns/public-fn2\n\n;; define a private function with defn-\ndemo.ns=> (defn- private-fn [s] (/ s 5))\n#'demo.ns/private-fn\n\n;; Switch back to the user namespace\ndemo.ns=> (in-ns 'user)\n#\n\n;; Get a map of all intern mappings for namespace demo.ns\nuser=> (ns-interns 'demo.ns)\n{public-fn1 #'demo.ns/public-fn1, private-fn #'demo.ns/private-fn, public-fn2 #'demo.ns/public-fn2}\n\n;; Now get a map of only the public mappings. No private-fn here.\nuser=> (ns-publics 'demo.ns)\n{public-fn1 #'demo.ns/public-fn1, public-fn2 #'demo.ns/public-fn2}\n", :created-at 1298556164000, :updated-at 1298556944000, :_id "542692c7c026201cdc326989"} {:author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :editors [], :body ";; See also http://clojure.org/namespaces for information on namespaces in Clojure and how to inspect and manipulate them", :created-at 1348479386000, :updated-at 1348479386000, :_id "542692d4c026201cdc32701d"}], :notes nil, :arglists ["ns"], :doc "Returns a map of the public intern mappings for the namespace.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ns-publics"} {:added "1.0", :ns "clojure.core", :name "<", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1291975111000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "=", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ef6"} {:created-at 1291975116000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "not=", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ef7"} {:created-at 1291975125000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name ">", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ef8"} {:created-at 1391516309000, :author {:login "rob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/89cc77a97a299e2e6295b2d7be194b2b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "<=", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ef9"} {:created-at 1391516316000, :author {:login "rob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/89cc77a97a299e2e6295b2d7be194b2b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name ">=", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521efa"}], :line 900, :examples [{:updated-at 1598154611072, :created-at 1280321780000, :body "user=> (< 1 2)\ntrue\nuser=> (< 2 1)\nfalse\nuser=> (< 1.5 2)\ntrue\nuser=> (< 2 3 4 5 6)\ntrue\nuser=> (< 1 1/2)\nfalse", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/ee24aacb65359196b0a1bad050f9a62f?r=PG&default=identicon", :account-source "clojuredocs", :login "mattdw"}, :_id "542692cbc026201cdc326c25"}], :notes [{:updated-at 1391516536000, :body "I think the docstring for < should say \"strictly increasing\" instead of \"monotonically increasing.\" In contrast, I think <= is the function that tests for \"monotonically increasing.\"\r\n\r\nHere's a quote from wikitionary...\r\n\r\nmonotonic increasing: (mathematics, of a function) always increasing or remaining constant, and never decreasing; contrast this with strictly increasing\r\n", :created-at 1391516536000, :author {:login "rob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/89cc77a97a299e2e6295b2d7be194b2b?r=PG&default=identicon"}, :_id "542692edf6e94c697052201b"}], :arglists ["x" "x y" "x y & more"], :doc "Returns non-nil if nums are in monotonically increasing order,\n otherwise false.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/<"} {:ns "clojure.core", :name "*source-path*", :type "var", :see-alsos nil, :examples [{:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}], :body ";; Contains the name (not the full path, for that see \n;; https://clojuredocs.org/clojure.core/*file*) \n;; of the compilation unit that is currently being compiled.\n;; Given a file named \"examples/example.clj\" is available in the \"examples\" \n;; folder starting at \".\":\n\n(ns examples.example)\n(when *compile-files* \n (println \"Compiling:\" *source-path*))\n\n;; If we start a REPL adding \".\" as part of the classpath,\n;; we can see the following:\n\n(binding [*compile-path* \".\"]\n (compile 'examples.example))\n;; Compiling: example.clj\n;; examples.example\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1615736593501, :updated-at 1615737031070, :_id "604e2f11e4b0b1e3652d7491"}], :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*source-path*"} {:ns "clojure.core", :name "with-loading-context", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos nil, :line 5755, :examples nil, :macro true, :notes nil, :arglists ["& body"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/with-loading-context"} {:added "1.0", :ns "clojure.core", :name "test", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1289286348000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "var", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521beb"} {:created-at 1289286374000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "meta", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bec"} {:created-at 1289286382000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "assert", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bed"} {:created-at 1289287269000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.test", :name "with-test", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bee"}], :line 4829, :examples [{:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [{:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}], :body "(defn my-function\n \"this function adds two numbers\"\n {:test #(do\n (assert (= (my-function 2 3) 5))\n (assert (= (my-function 4 4) 8)))}\n ([x y] (+ x y)))\n\n(test #'my-function) ;equal to (test (var my-function))\n=> :ok\n\n-----------------------------------------------------------------------\n\n(defn my-function\n \"this function adds two numbers\"\n {:test #(do\n (assert (= (my-function 2 3) 5))\n (assert (= (my-function 99 4) 8)))}\n ([x y] (+ x y)))\n\n(test #'my-function)\n=> java.lang.AssertionError: Assert failed: (= (my-function 99 4) 8) (NO_SOURCE_FILE:0\n\n---------------------------------------------------------------------------\n\n(defn my-function\n \"this function adds two numbers\"\n ([x y] (+ x y)))\n\n(test #'my-function)\n=> :no-test", :created-at 1289286249000, :updated-at 1289286329000, :_id "542692cac026201cdc326b8a"}], :notes nil, :arglists ["v"], :doc "test [v] finds fn at key :test in var metadata and calls it,\n presuming failure will throw exception", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/test"} {:added "1.0", :ns "clojure.core", :name "rest", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1300352361000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "next", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b01"} {:created-at 1302912314000, :author {:login "hoornet", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5834f829a9def19620d4014c46642172?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "first", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b02"} {:created-at 1328341652000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "drop", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b03"} {:created-at 1399433624000, :author {:login "Yun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f18708f979ad613ab134cb5002558965?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pop", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b04"} {:created-at 1505013526855, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nthrest", :ns "clojure.core"}, :_id "59b4af16e4b09f63b945ac6a"} {:created-at 1505013535788, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nthnext", :ns "clojure.core"}, :_id "59b4af1fe4b09f63b945ac6b"}], :line 66, :examples [{:updated-at 1422037239311, :created-at 1279416340000, :body "(rest [1 2 3 4 5]) ;;=> (2 3 4 5)\n(rest [\"a\" \"b\" \"c\" \"d\" \"e\"]) ;;=> (\"b\" \"c\" \"d\" \"e\")", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/1488134?v=2", :account-source "github", :login "douglarek"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"}, :_id "542692cec026201cdc326d69"} {:author {:login "hoornet", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5834f829a9def19620d4014c46642172?r=PG&default=identicon"}, :editors [{:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; For the most part rest must take a collection as its argument.\n;; It always returns a seq.\n(rest '())\n;;=> ()", :created-at 1302100429000, :updated-at 1422037351252, :_id "542692cec026201cdc326d6a"} {:author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :editors [{:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; There is one case where the input is not required to be a collection.\n;; But, 'rest' still returns a list.\n(rest nil)\n;;=> ()", :created-at 1306983166000, :updated-at 1422037405420, :_id "542692cec026201cdc326d6c"} {:author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :editors [{:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; A simple (re-)implementation of 'map' using 'rest' for recursing over a collection. \n;; Note that (seq coll) is used as the test.\n(defn my-map [func coll]\n (when-let [s (seq coll)]\n (cons (func (first s))\n (my-map func (rest s)))))\n\n(my-map #(* % %) [2 3 5 7 11 13])\n;;=> (4 9 25 49 121 169)", :created-at 1306983565000, :updated-at 1422038005534, :_id "542692cec026201cdc326d6e"} {:author {:login "TravisHeeter", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fe491d07493e45af083b89b767342c6?r=PG&default=identicon"}, :editors [{:login "douglarek", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1488134?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; Any collection can be used\n(rest '(1 2 3 4 5)) ;;=> (2 3 4 5)\n(rest [1 2 3 4 5]) ;;=> (2 3 4 5)\n(rest #{1 2 3 4 5}) ;;=> (2 3 4 5)\n\n(rest {1 nil 2 nil 3 nil 4 nil 5 nil}) ;;=> ([2 nil] [3 nil] [4 nil] [5 nil])", :created-at 1385175807000, :updated-at 1422037689911, :_id "542692d5c026201cdc327075"} {:body ";; Difference between next and rest:\n(rest [:a])\n;; => ()\n(next [:a])\n;; => nil\n\n(rest [])\n;; => ()\n(next [])\n;; => nil\n\n(rest nil)\n;; => ()\n(next nil)\n;; => nil", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423016919214, :updated-at 1423094910932, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :_id "54d183d7e4b0e2ac61831d06"}], :notes [{:updated-at 1306987831000, :body "rest is generally preferred over [next](../clojure.core/next). See the Clojure.org documentation on writing [lazy](http://clojure.org/lazy) functions.\r\n\r\nAlso, the topic is covered on StackOverflow.com: [rest vs. next](http://stackoverflow.com/questions/4288476/clojure-rest-vs-next).\r\n", :created-at 1306985238000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fc1"}], :tag "clojure.lang.ISeq", :arglists ["coll"], :doc "Returns a possibly empty seq of the items after the first. Calls seq on its\n argument.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/rest"} {:added "1.4", :ns "clojure.core", :name "ex-data", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1424029639635, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=3"}, :to-var {:ns "clojure.core", :name "ex-info", :library-url "https://github.com/clojure/clojure"}, :_id "54e0f7c7e4b01ed96c93c87c"} {:created-at 1517506162614, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "try", :ns "clojure.core"}, :_id "5a734e72e4b0c974fee49d18"} {:created-at 1517620509698, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "throw", :ns "clojure.core"}, :_id "5a750d1de4b0e2d9c35f7409"} {:created-at 1517620517637, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "catch", :ns "clojure.core"}, :_id "5a750d25e4b0e2d9c35f740a"} {:created-at 1517620899901, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "finally", :ns "clojure.core"}, :_id "5a750ea3e4b0e2d9c35f740e"} {:created-at 1602605116458, :author {:login "m0smith", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/398808?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ex-message", :ns "clojure.core"}, :_id "5f85d03ce4b0b1e3652d73dd"} {:created-at 1636597659206, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ex-cause", :ns "clojure.core"}, :_id "618c7f9be4b0b1e3652d756b"}], :line 4792, :examples [{:editors [{:login "Luckvery", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1178168?v=3"}], :body "(try\n (let [response (http/post\n \"http://localhost:8080/v1/leads\"\n {:form-params {:foo \"somethingBad\"}})]\n (prn \"This is the response\" response))\n (catch Exception e\n (prn \"This is the error\" (ex-data e))))\n\n-------\n\n> \"This is the error\" {:status 500, :headers {\"Content-Type\" \"application/json; \ncharset=utf-8\", \"Content-Length\" \"73\", \"Server\" \"http-kit\", \"Date\" \"Mon, 10 Oct 2016\n 16:53:12 GMT\"}, :body \"{\\\"type\\\":\\\"unknown-\nexception\\\",\\\"class\\\":\\\"java.lang.IllegalArgumentException\\\"}\", :request-time 7,\n :trace-redirects [\"http://localhost:8080/v1/leads\"], :orig-content-encoding nil}", :author {:avatar-url "https://avatars.githubusercontent.com/u/1178168?v=3", :account-source "github", :login "Luckvery"}, :created-at 1476118193302, :updated-at 1476118224718, :_id "57fbc6b1e4b0709b524f052b"} {:updated-at 1538989157962, :created-at 1538989157962, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :body ";; See also: Throwable->map", :_id "5bbb1c65e4b00ac801ed9eb8"}], :notes nil, :arglists ["ex"], :doc "Returns exception data (a map) if ex is an IExceptionInfo.\n Otherwise returns nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ex-data"} {:added "1.0", :ns "clojure.core", :name "compile", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 6128, :examples [{:author {:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "KyleErhabor", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/40676441?v=4"}], :body "user=> (compile (symbol \"clojure.java.io\"))\nclojure.java.io\n\nuser=> (compile (symbol \"nonexistent.namespace\"))\nFileNotFoundException Could not locate unexistent/namespace__init.class or unexistent/namespace.clj on classpath: clojure.lang.RT.load (RT.java:432)", :created-at 1406012047000, :updated-at 1635093299873, :_id "542692d2c026201cdc326f65"} {:updated-at 1599838419576, :created-at 1599838419576, :author {:login "souenzzo", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/3241703?v=4"}, :body ";; Using compile with deps.edn:\n{,,,\n :aliases {:aot {:main-opts [\"-e\" \"(compile,(symbol,:demo-app.main)\"]}\n :demo-app {:extra-paths [\"classes\"]\n :main-opts [\"-m\" \"demo-app.main\"]}}}\n;; :aot profile use commas and `(symbol :kw)` to avoid spliting\n\n;; Then in your build process (Dockerfile for example):\n;RUN mkdir -p classes && clojure -A:aot\n;CMD [\"clojure\", \"-A:demo-app\"]\n", :_id "5f5b98d3e4b0b1e3652d73bc"}], :notes nil, :arglists ["lib"], :doc "Compiles the namespace named by the symbol lib into a set of\n classfiles. The source for the lib must be in a proper\n classpath-relative directory. The output files will go into the\n directory specified by *compile-path*, and that directory too must\n be in the classpath.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/compile"} {:added "1.0", :ns "clojure.core", :name "isa?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1302036060000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "derive", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e89"} {:created-at 1327820991000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "instance?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e8a"} {:created-at 1341101444000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "underive", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e8b"} {:created-at 1341101451000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ancestors", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e8c"} {:created-at 1341101454000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "parents", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e8d"} {:created-at 1341101462000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "descendants", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e8e"} {:created-at 1341101476000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "make-hierarchy", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e8f"}], :line 5564, :examples [{:author {:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"}, :editors [{:login "Magomimmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/dafac6cd52df3a895b8375ed6b4fe8ee?r=PG&default=identicon"}], :body "user=> (import 'java.util.PriorityQueue)\njava.util.PriorityQueue\n\nuser=> (bases PriorityQueue)\n(java.util.AbstractQueue java.io.Serializable)\n\nuser=> (import 'java.util.AbstractQueue)\njava.util.AbstractQueue\n\nuser=> (isa? PriorityQueue AbstractQueue)\ntrue\n\nuser=> (bases AbstractQueue)\n(java.util.AbstractCollection java.util.Queue)\n\nuser=> (isa? PriorityQueue java.util.AbstractCollection)\ntrue\n\nuser=> (isa? PriorityQueue java.util.Queue)\ntrue\n\nuser=> (isa? java.util.PriorityQueue java.util.TreeMap)\nfalse", :created-at 1312394065000, :updated-at 1342891952000, :_id "542692c9c026201cdc326ae2"} {:author {:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"}, :editors [{:login "Magomimmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/dafac6cd52df3a895b8375ed6b4fe8ee?r=PG&default=identicon"}], :body "user=> (derive ::Feline ::Animal)\nnil\nuser=> (derive ::Cat ::Feline)\nnil\n\nuser=> (derive ::Lion ::Feline)\nnil\n\nuser=> (isa? ::Lion ::Feline)\ntrue\n\nuser=> (isa? ::Lion ::Animal)\ntrue\n\nuser=> (isa? ::Tuna ::Feline)\nfalse", :created-at 1313009767000, :updated-at 1342892300000, :_id "542692c9c026201cdc326ae4"} {:updated-at 1529960051700, :created-at 1529960051700, :author {:login "jbswetnam", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/17225739?v=4"}, :body ";; you can use vectors to test multiple child/parent pairs\n\nuser=> (derive ::child-1 ::parent-1)\nnil\n\nuser=> (derive ::child-2 ::parent-2)\nnil\n\nuser=> (isa? [::child-1 ::child-2] [::parent-1 ::parent-2])\ntrue", :_id "5b315673e4b00ac801ed9e1f"}], :notes nil, :arglists ["child parent" "h child parent"], :doc "Returns true if (= child parent), or child is directly or indirectly derived from\n parent, either via a Java type inheritance relationship or a\n relationship established via derive. h must be a hierarchy obtained\n from make-hierarchy, if not supplied defaults to the global\n hierarchy", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/isa_q"} {:added "1.9", :ns "clojure.core", :name "boolean?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1498919413826, :author {:login "vspinu", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1363467?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "true?", :ns "clojure.core"}, :_id "5957b1f5e4b06e730307db4c"}], :line 519, :examples [{:editors [{:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}], :body "(boolean? true)\n;;=> true\n(boolean? false)\n;;=> true\n(boolean? (new Boolean \"true\"))\n;;=> true\n(boolean? (new Boolean \"false\"))\n;;=> true\n\n(boolean? nil)\n;;=> false", :author {:avatar-url "https://avatars0.githubusercontent.com/u/5004262?v=3", :account-source "github", :login "bowbahdoe"}, :created-at 1491242456017, :updated-at 1496000159055, :_id "58e28dd8e4b01f4add58fe82"}], :notes nil, :arglists ["x"], :doc "Return true if x is a Boolean", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/boolean_q"} {:added "1.0", :ns "clojure.core", :name "..", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1509596350797, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/601540?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "->", :ns "clojure.core"}, :_id "59fa9cbee4b0a08026c48c93"} {:created-at 1528234653568, :author {:login "manawardhana", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1821789?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "doto", :ns "clojure.core"}, :_id "5b17029de4b00ac801ed9e0d"}], :line 1659, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [{:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"}], :body "user> (.. \"fooBAR\" (toLowerCase) (contains \"ooba\"))\ntrue\n\n;; use macroexpand to see how the form above will appear\nuser> (macroexpand '(.. \"fooBAR\" (toLowerCase) (contains \"ooba\")))\n(. (. \"fooBAR\" (toLowerCase)) (contains \"ooba\"))", :created-at 1286507932000, :updated-at 1313788944000, :_id "542692c8c026201cdc326a65"} {:updated-at 1471000821870, :created-at 1471000821870, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body "user=> (.. \"abc\" toUpperCase (equals \"ABC\"))\n;;=> true", :_id "57adb0f5e4b0bafd3e2a04ea"} {:updated-at 1509596480853, :created-at 1509596480853, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/601540?v=4"}, :body ";; With .. you do not need to add a . to your method.\n(.. \"fooBAR\" (toLowerCase) (contains \"ooba\"))\n\n;; Which you do if using -> instead.\n(-> \"fooBAR\" (.toLowerCase) (.contains \"ooba\"))", :_id "59fa9d40e4b0a08026c48c94"}], :macro true, :notes nil, :arglists ["x form" "x form & more"], :doc "form => fieldName-symbol or (instanceMethodName-symbol args*)\n\n Expands into a member access (.) of the first member on the first\n argument, followed by the next member on the result, etc. For\n instance:\n\n (.. System (getProperties) (get \"os.name\"))\n\n expands to:\n\n (. (. System (getProperties)) (get \"os.name\"))\n\n but is easier to write, read, and understand.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/_.."} {:ns "clojure.core", :name "munge", :file "clojure/core_deftype.clj", :type "function", :column 1, :see-alsos [{:created-at 1559571481129, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "demunge", :ns "clojure.repl"}, :_id "5cf52c19e4b0ca44402ef73e"} {:created-at 1683030268272, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "namespace-munge", :ns "clojure.core"}, :_id "645100fce4b08cf8563f4ba6"}], :line 129, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [], :body "user> (defn foo [] (println \"foo\"))\n#'user/foo\n\nuser> foo\n#\n\nuser> (munge foo)\n\"user_DOLLARSIGN_foo_CIRCA_a0dc71\"", :created-at 1293673710000, :updated-at 1293673710000, :_id "542692c8c026201cdc3269ef"} {:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :updated-at 1683030821820, :created-at 1423016370373, :author {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"}, :body "(doseq [c (remove #(Character/isLetterOrDigit ^char %) (map char (range 32 127)))]\n (println c \"->\" (munge c)))\n;; Prints:\n ->\n! -> _BANG_\n\" -> _DOUBLEQUOTE_\n# -> _SHARP_\n$ -> $\n% -> _PERCENT_\n& -> _AMPERSAND_\n' -> _SINGLEQUOTE_\n( -> (\n) -> )\n* -> _STAR_\n+ -> _PLUS_\n, -> ,\n- -> _\n. -> .\n/ -> _SLASH_\n: -> _COLON_\n; -> ;\n< -> _LT_\n= -> _EQ_\n> -> _GT_\n? -> _QMARK_\n@ -> _CIRCA_\n[ -> _LBRACK_\n\\ -> _BSLASH_\n] -> _RBRACK_\n^ -> _CARET_\n_ -> _\n` -> `\n{ -> _LBRACE_\n| -> _BAR_\n} -> _RBRACE_\n~ -> _TILDE_", :_id "54d181b2e4b081e022073c4f"}], :notes nil, :arglists ["s"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/munge"} {:added "1.0", :ns "clojure.core", :name "delay", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1342465174000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "force", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b78"} {:created-at 1350107212000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "realized?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b79"} {:created-at 1358780682000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "memoize", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b7a"} {:created-at 1291441377000, :author {:login "pauldoo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5cb916d3c8abc9f45a093209e72489fb?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "future", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d7e"} {:created-at 1291473063000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "delay?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d7f"}], :line 746, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; In this example you can see that the first time the delay is forced\n;; the println is executed however the second dereference shows just the\n;; precomputed value.\n\nuser=> (def my-delay (delay (println \"did some work\") 100))\n#'user/my-delay\n\nuser=> @my-delay\ndid some work\n100\n\nuser=> @my-delay\n100\n", :created-at 1280737965000, :updated-at 1285495988000, :_id "542692cdc026201cdc326d44"} {:body ";; Note that the implementation of deref for delays makes it impossible for the\n;; body of the delay to be executed more than once, even if the derefs occur\n;; from multiple threads near the same time, because it is a synchronized method\n;; in Java.", :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=2"}, :created-at 1415462290966, :updated-at 1415669412668, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :_id "545e3d92e4b0dc573b892fc0"} {:editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=3"}], :body ";; test example", :author {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=3", :account-source "github", :login "zk"}, :created-at 1470667496739, :updated-at 1470667534222, :_id "57a89ae8e4b0bafd3e2a04ce"} {:updated-at 1606796544954, :created-at 1606796544954, :author {:login "humorless", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/3061798?v=4"}, :body ";; If you are coming from OOP background, think about a OOP pattern - singleton.\n;; delay and singleton can serve the same purpose. ", :_id "5fc5c500e4b0b1e3652d7414"}], :macro true, :notes nil, :arglists ["& body"], :doc "Takes a body of expressions and yields a Delay object that will\n invoke the body only the first time it is forced (with force or deref/@), and\n will cache the result and return it on all subsequent force\n calls. See also - realized?", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/delay"} {:added "1.2", :ns "clojure.core", :name "set-error-mode!", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1553641061009, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "error-handler", :ns "clojure.core"}, :_id "5c9aae65e4b0ca44402ef6de"} {:created-at 1553641085825, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "error-mode", :ns "clojure.core"}, :_id "5c9aae7de4b0ca44402ef6df"}], :line 2212, :examples [{:updated-at 1553641014153, :created-at 1553641014153, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; The agent `:continue` processing even in case of errors. \n;; Errors are ignored and the internal state remains the same.\n;; Use when it's acceptable to miss a few messages.\n\n(def a (agent 2))\n(set-error-mode! a :continue)\n(send-off a #(/ % 0))\n@a\n;; 2\n", :_id "5c9aae36e4b0ca44402ef6dd"}], :notes nil, :arglists ["a mode-keyword"], :doc "Sets the error-mode of agent a to mode-keyword, which must be\n either :fail or :continue. If an action being run by the agent\n throws an exception or doesn't pass the validator fn, an\n error-handler may be called (see set-error-handler!), after which,\n if the mode is :continue, the agent will continue as if neither the\n action that caused the error nor the error itself ever happened.\n \n If the mode is :fail, the agent will become failed and will stop\n accepting new 'send' and 'send-off' actions, and any previously\n queued actions will be held until a 'restart-agent'. Deref will\n still work, returning the state of the agent before the error.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/set-error-mode!"} {:added "1.0", :ns "clojure.core", :name "re-seq", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1289192565000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "re-find", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eb9"} {:created-at 1289192579000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "re-groups", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eba"} {:created-at 1289192595000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "re-pattern", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ebb"} {:created-at 1289192599000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "re-matcher", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ebc"} {:created-at 1289192606000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "re-matches", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ebd"} {:created-at 1309320690000, :author {:login "pauldoo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5cb916d3c8abc9f45a093209e72489fb?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "split", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ebe"} {:created-at 1379040134000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "subs", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ebf"}], :line 4874, :examples [{:updated-at 1285501878000, :created-at 1279050384000, :body "user=> (re-seq #\"\\d\" \"clojure 1.1.0\")\n(\"1\" \"1\" \"0\")\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692cac026201cdc326b6a"} {:updated-at 1285501890000, :created-at 1279060112000, :body ";; Get a sequence of words out of a string.\nuser=> (re-seq #\"\\w+\" \"mary had a little lamb\")\n(\"mary\" \"had\" \"a\" \"little\" \"lamb\")\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/1453?v=4", :account-source "github", :login "ghoseb"}, :_id "542692cac026201cdc326b6c"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; Parenthesized groups in the regex cause each returned match to be a\n;; vector of matched strings. See re-find for more examples.\nuser=> (def line \" RX pkts:18 err:5 drop:48\")\n#'user/line\n\nuser=> (re-seq #\"(\\S+):(\\d+)\" line)\n([\"pkts:18\" \"pkts\" \"18\"] [\"err:5\" \"err\" \"5\"] [\"drop:48\" \"drop\" \"48\"])\n", :created-at 1324028413000, :updated-at 1324028413000, :_id "542692d4c026201cdc327054"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; Note: See clojure.core/subs for discussion of behavior of substrings\n;; holding onto references of the original strings, which can\n;; significantly affect your memory usage in some cases.", :created-at 1379040138000, :updated-at 1379040138000, :_id "542692d4c026201cdc327055"} {:editors [{:login "manishkumarmdb", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/9373950?v=3"}], :body ";; separate with Camel case words and digits and\n;; join with single white-space character\n\nuser=> (clojure.string/join \" \" (re-seq #\"[A-Z][a-z]+|[0-9]+\" \"ManishKumar12332\"))\n\"Manish Kumar 12332\"", :author {:avatar-url "https://avatars.githubusercontent.com/u/9373950?v=3", :account-source "github", :login "manishkumarmdb"}, :created-at 1470894996348, :updated-at 1470895041360, :_id "57ac1394e4b0bafd3e2a04df"} {:updated-at 1519395370457, :created-at 1519395370457, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; re-seq requires the string to be in memory. What if the string is in a file\n;; many GB in size? You can roll a \"line-seq of re-seq each line\" or use:\n\n(defn restream-seq\n[^java.util.regex.Pattern re ^java.io.InputStream is]\n (let [s (java.util.Scanner. is)]\n ((fn step []\n (if-let [token (.findInLine s re)]\n (cons token (lazy-seq (step)))\n (when (.hasNextLine s) (.nextLine s) (step)))))))\n\n;; first 10 digits of Pi out of the book (1M available)\n(let [pi-book \"http://www.gutenberg.org/files/50/50.txt\"]\n (with-open [is (.openStream (java.net.URL. pi-book))]\n (doall\n (sequence\n (comp cat (map str) (take 10))\n (restream-seq #\"\\d{10}\" is)))))\n; (\"1\" \"4\" \"1\" \"5\" \"9\" \"2\" \"6\" \"5\" \"3\" \"5\")", :_id "5a90222ae4b0316c0f44f8ed"}], :notes nil, :arglists ["re s"], :doc "Returns a lazy sequence of successive matches of pattern in string,\n using java.util.regex.Matcher.find(), each such match processed with\n re-groups.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/re-seq"} {:added "1.0", :ns "clojure.core", :name "char?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1321310793000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "char", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b4e"}], :line 153, :examples [{:author {:login "mattdw", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ee24aacb65359196b0a1bad050f9a62f?r=PG&default=identicon"}, :editors [{:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}], :body "user=> (char? \\a)\ntrue\n\nuser=> (char? 22)\nfalse\n\nuser=> (char? \"a\")\nfalse\n\nuser=> (char? (first \"abc\"))\ntrue", :created-at 1280322160000, :updated-at 1317219140000, :_id "542692c9c026201cdc326a8d"}], :notes nil, :arglists ["x"], :doc "Return true if x is a Character", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/char_q"} {:added "1.0", :ns "clojure.core", :name "make-hierarchy", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1324008864000, :author {:login "stand", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d7f9ed2753f8b3517f1539f6129f0a17?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "isa?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b84"} {:created-at 1332885418000, :author {:login "luskwater", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f3b2650c3d4aa47c9e22bf9ba5596a9f?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "derive", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b85"} {:created-at 1341101551000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "underive", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b86"} {:created-at 1341101555000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "parents", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b87"} {:created-at 1341101559000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "descendants", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b88"} {:created-at 1341101563000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ancestors", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b89"}], :line 5528, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; use make-hierarchy to build your own local hierarchy for derive, isa?, etc. \n;; instead of using the global hierarchy\n;; note that the first ancestors call returns a nil since that type does not \n;; exist in the global hierarchy\n\nuser=> (def h (make-hierarchy))\n#'user/h\nuser=> (def h (derive h ::rect ::shape))\n#'user/h\nuser=> (def h (derive h ::square ::rect))\n#'user/h\nuser=> h\n{:parents {:user/square #{:user/rect}, :user/rect #{:user/shape}}, :ancestors {:\nuser/square #{:user/shape :user/rect}, :user/rect #{:user/shape}}, :descendants\n{:user/rect #{:user/square}, :user/shape #{:user/square :user/rect}}}\nuser=> (ancestors ::square)\nnil\nuser=> (ancestors h ::square)\n#{:user/shape :user/rect}\nuser=>", :created-at 1313896274000, :updated-at 1313896274000, :_id "542692c8c026201cdc326a17"} {:editors [{:avatar-url "https://avatars.githubusercontent.com/u/889685?v=3", :account-source "github", :login "huahaiy"} {:avatar-url "https://avatars.githubusercontent.com/u/331939?v=3", :account-source "github", :login "arr-ee"} {:login "cloojure", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/7083783?v=4"}], :updated-at 1604524760718, :created-at 1418345729815, :author {:avatar-url "https://avatars.githubusercontent.com/u/889685?v=3", :account-source "github", :login "huahaiy"}, :body "; the above hierarchy can be built together with a thread macro:\n\n(ns demo.core\n (:require [clojure.pprint :refer [pprint]]))\n\n(defn shapes-hierarchy []\n (-> (make-hierarchy)\n (derive ::rect ::shape)\n (derive ::square ::rect)))\n\n(defn -main [& args]\n (pprint (shapes-hierarchy)))\n\n;-------------------------------------------------------\n; result (Clojure 1.10.2-alpha1 + Java 15)\n\n {:parents #:demo.core{:rect #{:demo.core/shape},\n :square #{:demo.core/rect}},\n :ancestors #:demo.core{:rect #{:demo.core/shape},\n :square #{:demo.core/rect :demo.core/shape}},\n :descendants #:demo.core{:shape #{:demo.core/rect :demo.core/square},\n :rect #{:demo.core/square}}}\n", :_id "548a3d01e4b04e93c519ffa5"} {:updated-at 1516316641016, :created-at 1516315086236, :author {:login "fmnoise", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/4033391?v=4"}, :body ";; hierarchy can be stored in atom for more flexibility\n(def service-types (atom (make-hierarchy)))\n\n(defn add-local! [service-type]\n (swap! service-types derive service-type ::local)\n\n(defn add-remote! [service-type]\n (swap! service-types derive service-type ::remote)\n\n(defmulti connect :service-type :hierarchy service-types)\n(defmethod connect ::remote [service] \"Connecting to remote service\")\n(defmethod connect ::local [service] \"Connecting to local service\")\n \n(add-remote! ::rest)\n(add-local! ::com+)\n\n(connect {:service-type ::rest}) \n;; => \"Connecting to remote service\"\n\n(connect {:service-type ::com+}) \n;; => \"Connecting to local service\"", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/4033391?v=4", :account-source "github", :login "fmnoise"}], :_id "5a6121cee4b0a08026c48d00"}], :notes nil, :arglists [""], :doc "Creates a hierarchy object for use with derive, isa? etc.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/make-hierarchy"} {:added "1.5", :ns "clojure.core", :name "set-agent-send-executor!", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1553631443978, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "set-agent-send-off-executor!", :ns "clojure.core"}, :_id "5c9a88d3e4b0ca44402ef6d6"} {:created-at 1553631454256, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "send-via", :ns "clojure.core"}, :_id "5c9a88dee4b0ca44402ef6d7"} {:created-at 1559240484735, :author {:login "pdbrown", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1607096?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "shutdown-agents", :ns "clojure.core"}, :_id "5cf01f24e4b0ca44402ef739"}], :line 2089, :examples [{:updated-at 1553631431158, :created-at 1553631366167, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; This permanently change the thread pool used\n;; by agents receiving tasks with \"send\"\n(import '[java.util.concurrent Executors])\n(def fj-pool (Executors/newWorkStealingPool 20))\n(set-agent-send-executor! fj-pool)", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5c9a8886e4b0ca44402ef6d3"}], :notes nil, :arglists ["executor"], :doc "Sets the ExecutorService to be used by send", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/set-agent-send-executor!"} {:added "1.9", :ns "clojure.core", :name "swap-vals!", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1527705116275, :author {:login "agarman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/138454?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "swap!", :ns "clojure.core"}, :_id "5b0eee1ce4b045c27b7fac80"} {:created-at 1527705122171, :author {:login "agarman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/138454?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reset!", :ns "clojure.core"}, :_id "5b0eee22e4b045c27b7fac81"} {:created-at 1527705131382, :author {:login "agarman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/138454?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "compare-and-set!", :ns "clojure.core"}, :_id "5b0eee2be4b045c27b7fac82"} {:created-at 1527705150896, :author {:login "agarman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/138454?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "atom", :ns "clojure.core"}, :_id "5b0eee3ee4b045c27b7fac83"}], :line 2357, :examples [{:updated-at 1519158674293, :created-at 1519158674293, :author {:login "dane-johnson", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/10768827?v=4"}, :body ";; You can use `swap-vals` to perform an atomic `deref`\n;; and `swap!` without a race condition.\n\n(def queue (atom '(1 2 3)))\n(let [head (ffirst (swap-vals! queue pop))]\n (println head) ;; 1\n (println @queue)) ;; (2 3)", :_id "5a8c8592e4b0316c0f44f8d7"}], :notes nil, :arglists ["atom f" "atom f x" "atom f x y" "atom f x y & args"], :doc "Atomically swaps the value of atom to be:\n (apply f current-value-of-atom args). Note that f may be called\n multiple times, and thus should be free of side effects.\n Returns [old new], the value of the atom before and after the swap.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/swap-vals!"} {:added "1.2", :ns "clojure.core", :name "keep", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1337189081000, :author {:login "SoniaH", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/56a007a4b2c47b141bd39790278f88a7?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "keep-indexed", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c71"} {:created-at 1399907394000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "map", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c72"} {:created-at 1399907399000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "filter", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c73"} {:created-at 1549573085436, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "remove", :ns "clojure.core"}, :_id "5c5c9bdde4b0ca44402ef663"}], :line 7313, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "miner", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25400?v=3"}], :body "(keep even? (range 1 10))\n;;=> (false true false true false true false true false)\n", :created-at 1279071510000, :updated-at 1419105723874, :_id "542692cfc026201cdc326e7f"} {:updated-at 1473381934632, :created-at 1306319295000, :body ";; comparisons among keep, filter, map and for.\n\n(keep #(if (odd? %) %) (range 10))\n;;=> (1 3 5 7 9)\n\n(map #(if (odd? %) %) (range 10))\n;;=> (nil 1 nil 3 nil 5 nil 7 nil 9)\n\n(for [ x (range 10) :when (odd? x)] x)\n;;=> (1 3 5 7 9)\n\n(filter odd? (range 10))\n;;=> (1 3 5 7 9)", :editors [{:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"} {:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"} {:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"} {:avatar-url "https://avatars.githubusercontent.com/u/25400?v=3", :account-source "github", :login "miner"} {:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"}, :_id "542692cfc026201cdc326e82"} {:author {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}, :editors [{:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "miner", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25400?v=3"}], :body ";; Sieve of Eratosthenes by using 'keep'.\n\n(defn keep-mcdr [f coll]\n (lazy-seq\n (when-let [x (first coll)]\n (cons x (keep-mcdr f (f x (rest coll)))))))\n\n(defn prime-number [n]\n (cons 1\n\t(keep-mcdr\n\t (fn[x xs] (if (not-empty xs)\n\t\t (keep #(if-not (zero? (rem % x)) %)\n\t\t\t xs)))\n\t (range 2 n))))\n\n(prime-number 100)\n;;=> (1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97)\n", :created-at 1306319303000, :updated-at 1419105742633, :_id "542692cfc026201cdc326e86"} {:body "(keep seq [() [] '(1 2 3) [:a :b] nil])\n;;=> ((1 2 3) (:a :b))", :author {:login "miner", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25400?v=3"}, :created-at 1419105688396, :updated-at 1419105688396, :_id "5495d598e4b09260f767ca7b"} {:editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=3"}], :updated-at 1445895401925, :created-at 1428277632781, :author {:avatar-url "https://avatars.githubusercontent.com/u/466333?v=3", :account-source "github", :login "num1"}, :body ";; `keep` is useful with maps:\n\n(keep {:a 1, :b 2, :c 3} [:a :b :d])\n;;=> (1 2)\n", :_id "5521c980e4b0b96203a0d59d"} {:body ";; A set will work as a predicate for another set.\n(keep #{0 1 2 3} #{2 3 4 5})\n;;=> (3 2)", :author {:login "dkinzer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/444215?v=3"}, :created-at 1434506225681, :updated-at 1434506225681, :_id "5580d3f1e4b01ad59b65f4ff"} {:updated-at 1473382005602, :created-at 1473382005602, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=3"}, :body ";; keep returns the results of predicates, \n;; filter returns the original values of collection\n\n(keep (fn [[k _]] (#{:a :b} k)) {:a 1 :b 2 :c 3})\n;;=> (:a :b)\n\n(filter (fn [[k _]] (#{:a :b} k)) {:a 1 :b 2 :c 3})\n;;=> ([:a 1] [:b 2])", :_id "57d20675e4b0709b524f04f0"} {:updated-at 1590766979030, :created-at 1590766721487, :author {:login "blue0513", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/8979468?v=4"}, :body ";; keep rejects nil from results\n\n(keep #(when (number? %) %) [1 \"a\" 2 \"c\"])\n;; => (1 2)\n\n(map #(when (number? %) %) [1 \"a\" 2 \"c\"])\n;; => (1 nil 2 nil)\n\n(remove nil? (map #(when (number? %) %) [1 \"a\" 2 \"c\"]))\n;; => (1 2)", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/8979468?v=4", :account-source "github", :login "blue0513"}], :_id "5ed12c81e4b087629b5a191d"}], :notes [{:body "Note the difference between `filter` and `keep`. `filter` returns the original items in a collection that satisfy the predicate. `keep` returns the non-nil *results* of the given function.", :created-at 1419105930894, :updated-at 1419105930894, :author {:login "miner", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25400?v=3"}, :_id "5495d68ae4b09260f767ca7c"} {:body "`keep` is like a `map` that filters out `nil` values produced by `f` and could be defined as:\n
\n(def my-keep (comp (partial remove nil?) map))\n
\nor, perhaps more traditionally:\n
\n\n(defn my-keep [& args]\n  (remove nil? (apply map args)))\n
\n", :created-at 1422938659514, :updated-at 1422939155762, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :_id "54d05223e4b0e2ac61831cfa"} {:author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :updated-at 1530020021260, :created-at 1530020021260, :body "Note that, unlike `map`, `keep` doesn’t accept multiple collections:\n\n```clojure\n(filter identity (map get [{:a 1} {:b 2} {:d 3}] [:a :b :c]))\n; => (1 2)\n\n(keep get [{:a 1} {:b 2} {:d 3}] [:a :b :c])\n; => ArityException Wrong number of args (3) passed to: core/keep\n```", :_id "5b3240b5e4b00ac801ed9e20"} {:author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :updated-at 1582729216279, :created-at 1582729216279, :body "It's useful to consider `filter` and `remove` as a pair of complementary/similar functions that both return the original items, whereas `keep` is rather specialized/different.", :_id "5e568800e4b087629b5a18a9"}], :arglists ["f" "f coll"], :doc "Returns a lazy sequence of the non-nil results of (f item). Note,\n this means false return values will be included. f must be free of\n side-effects. Returns a transducer when no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/keep"} {:added "1.1", :ns "clojure.core", :name "char", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1321310785000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "char?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b80"} {:created-at 1333595214000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "int", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b81"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "chars", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917303000, :_id "542692eaf6e94c6970521b82"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "char-array", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917307000, :_id "542692eaf6e94c6970521b83"}], :line 3510, :examples [{:author {:login "mattdw", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ee24aacb65359196b0a1bad050f9a62f?r=PG&default=identicon"}, :editors [{:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}], :body ";; can coerce an int (or similar)\nuser=> (char 97)\n\\a\n\n;; a byte can be coerced to a char\nuser=> (let [bytes-array (.getBytes \"abc\")]\n (char (first bytes-array)))\n\\a\n\n;; char is just a function\nuser=> (map char [65 66 67 68])\n(\\A \\B \\C \\D)", :created-at 1280322589000, :updated-at 1317219055000, :_id "542692cdc026201cdc326d01"} {:updated-at 1444162460695, :created-at 1444162460695, :author {:login "teymuri", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/13352033?v=3"}, :body "(->> [67 108 111 106 117 114 101]\n (map char)\n (apply str))\n\n\"Clojure\"", :_id "56142b9ce4b084e61c76ecbd"} {:updated-at 1562515072023, :created-at 1562515072023, :author {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/24317401?v=4"}, :body ";; backslash\nuser=> (char 92)\n\\\\\n\n;; String madness:\nuser=> (map str [\\n \\newline \\\\])\n[\"n\" \"\\n\" \"\\\\\"]\n\n;; convert back to int:\nuser=> (int \\\\)\n92\n\n;; whoops! this will expect additional input because it char's the bracket\nuser=> (char \\)\n #=> \n\n;; don't you dare this!\nuser=> (char \\ )\n\\space\n\n;; make it readable\nuser=> (char \\space)\n\\space\n\n;; it gets uglier! Mark the text to see the difference\nuser=> \\\n #=>\n\nuser=> \\ \n\\space\n\n;; MaDnEsS!1!\nuser=> \\\\\\\\\\\\\\\\\n\\\\\n\\\\\n\\\\\n\\\\", :_id "5d221680e4b0ca44402ef77e"} {:updated-at 1575989957857, :created-at 1575989957857, :author {:login "vladkotu", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/389119?v=4"}, :body ";; string to code round trip\n;; input string\n(def in-string \"鬼\")\n;; single char from string\n(def in-char (.charAt in-string 0)) ;;=> \\鬼\n;; code from char\n(def code (int in-char)) ;;=> 39740\n;; char from code\n(def out-char (char code)) ;;=> \\鬼\n;; back to input string\n(def out-string (str out-char)) ;;=> \"鬼\"\n", :_id "5defb2c5e4b0ca44402ef7f5"} {:updated-at 1674282378834, :created-at 1674282378834, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}, :body "(defn u-sub-char\n \"If n is a single-digit integer in [0, ..., 9], returns the\n Unicode supscript character for n. Returns nil for other numbers.\"\n [n]\n (if (and (>= n 0) (<= n 9))\n (char (+ 0x2080 n))\n nil))", :_id "63cb858ae4b08cf8563f4b68"}], :notes nil, :arglists ["x"], :doc "Coerce to char", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/char"} {:added "1.0", :ns "clojure.core", :name "mapcat", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1294988622000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cb4"} {:created-at 1294988628000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "concat", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cb5"} {:created-at 1580338264619, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "flatten", :ns "clojure.core"}, :_id "5e320c58e4b0ca44402ef827"}], :line 2783, :examples [{:updated-at 1285501773000, :created-at 1279063141000, :body "user=> (mapcat reverse [[3 2 1 0] [6 5 4] [9 8 7]])\n(0 1 2 3 4 5 6 7 8 9)\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692cac026201cdc326b36"} {:updated-at 1337333286000, :created-at 1337333286000, :body "user=> (mapcat (fn [[k v]] \n (for [[k2 v2] v] \n (concat [k k2] v2)))\n '{:a {:x (1 2) :y (3 4)}\n :b {:x (1 2) :z (5 6)}})\n\n((:a :x 1 2) (:a :y 3 4) (:b :x 1 2) (:b :z 5 6))", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692d4c026201cdc327006"} {:author {:login "uvtc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/34f159f89cbd1d9beac0276f5a7af552?r=PG&default=identicon"}, :editors [{:login "uvtc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/34f159f89cbd1d9beac0276f5a7af552?r=PG&default=identicon"}], :body "user=> (require '[clojure.string :as cs])\nnil\n\n;; Suppose you have a fn in a `map` that itself returns\n;; multiple values.\nuser=> (map #(cs/split % #\"\\d\") [\"aa1bb\" \"cc2dd\" \"ee3ff\"])\n([\"aa\" \"bb\"] [\"cc\" \"dd\"] [\"ee\" \"ff\"])\n\n;; Now, if you want to concat them all together, you *could*\n;; do this:\nuser=> (apply concat (map #(cs/split % #\"\\d\") [\"aa1bb\" \"cc2dd\" \"ee3ff\"]))\n(\"aa\" \"bb\" \"cc\" \"dd\" \"ee\" \"ff\")\n\n;; But `mapcat` can save you a step:\nuser=> (mapcat #(cs/split % #\"\\d\") [\"aa1bb\" \"cc2dd\" \"ee3ff\"])\n(\"aa\" \"bb\" \"cc\" \"dd\" \"ee\" \"ff\")\n", :created-at 1340097786000, :updated-at 1340099694000, :_id "542692d4c026201cdc327007"} {:author {:login "uvtc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/34f159f89cbd1d9beac0276f5a7af552?r=PG&default=identicon"}, :editors [], :body ";; Suppose you've got a function that takes a value\n;; and returns a list of things from it, for example:\n(defn f1\n [n]\n [(- n 1) n (+ n 1)])\n\n(f1 1)\n;=> [0 1 2]\n\n;; Perhaps you'd like to map it onto each item in a collection:\n(map f1 [1 2 3])\n;=> ([0 1 2] [1 2 3] [2 3 4])\n\n;; But suppose you wanted them all concatenated? You could do this:\n(apply concat (map f1 [1 2 3]))\n;=> (0 1 2 1 2 3 2 3 4)\n\n;; Or you could get the same thing with `mapcat`:\n(mapcat f1 [1 2 3])\n;=> (0 1 2 1 2 3 2 3 4)\n", :created-at 1343650918000, :updated-at 1343650918000, :_id "542692d4c026201cdc327009"} {:author {:login "devth", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/70c7535cbb9fea0353250a4edda155be?r=PG&default=identicon"}, :editors [], :body "; Flatten a map, consing keys on to each nested vector \n(mapcat (fn [[k vs]] (map (partial cons k) vs)) {:foo [[1 2] [3 2]] :bar [[3 1]]})\n;=> ((:foo 1 2) (:foo 3 2) (:bar 3 1))\n", :created-at 1357801138000, :updated-at 1357801138000, :_id "542692d4c026201cdc32700a"} {:body ";; A very useful feature of mapcat is that it allows function f to produce no result\n;; by returning nil or an empty collection:\n(mapcat #(remove even? %) [[1 2] [2 2] [2 3]])\n;; => (1 3)\n\n;; note that applying (remove even?) to [2 2] produced () which was \"eaten\"\n;; and ignored by mapcat.", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423014103873, :updated-at 1423014118164, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :_id "54d178d7e4b081e022073c4d"} {:updated-at 1505377247866, :created-at 1505377247866, :author {:login "buzzdan", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/18007791?v=4"}, :body ";; map vs. mapcat -\n;; For duplicating each item in a sequence\n\n;; Using map:\n(map #(repeat 2 %) [1 2])\n;; => ((1 1) (2 2))\n\n;; Using mapcat:\n(mapcat #(repeat 2 %) [1 2])\n;; => (1 1 2 2)\n", :_id "59ba3bdfe4b09f63b945ac75"} {:updated-at 1557893179267, :created-at 1557893179267, :author {:login "humorless", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/3061798?v=4"}, :body ";; I think it is cool to use juxt together with mapcat\n;; mapcat requires element to be collection and the result of juxt will be collection. \n\n(mapcat (juxt inc dec) [1 2 3 4])\n;; => (2 0 3 1 4 2 5 3)", :_id "5cdb903be4b0ca44402ef724"} {:updated-at 1559995255249, :created-at 1559995255249, :author {:login "sodesu99", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/31072774?v=4"}, :body ";;(mapcat f & colls)\n(mapcat list [:a :b :c] [1 2 3])\n;;=> (:a 1 :b 2 :c 3)", :_id "5cfba377e4b0ca44402ef750"}], :notes [{:body "
\n;; mapcat always evaluates the first 4 arguments.\n(def a (mapcat range (map #(do (print \".\") %) (into () (range 10)))))\n;; ....\n\n;; it can be solved avoiding 'apply' to handle varargs\n(defn mapcat* [f & colls]\n  (letfn [(step [colls]\n            (lazy-seq\n              (when-first [c colls]\n                (concat c (step (rest colls))))))]\n    (step (apply map f colls))))\n\n(def a (mapcat* range (map #(do (print \".\") %) (into () (range 10)))))\n;; nothing prints\n
", :created-at 1521801795650, :updated-at 1521801813945, :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :_id "5ab4da43e4b045c27b7fac1f"}], :arglists ["f" "f & colls"], :doc "Returns the result of applying concat to the result of applying map\n to f and colls. Thus function f should return a collection. Returns\n a transducer when no collections are provided", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/mapcat"} {:added "1.3", :ns "clojure.core", :name "unchecked-long", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1496088171964, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "long", :ns "clojure.core"}, :_id "592c7e6be4b093ada4d4d79b"}], :line 3540, :examples [{:updated-at 1496088165852, :created-at 1496088165852, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body "(unchecked-long 1)\n;;=> 1\n(unchecked-long 1N)\n;;=> 1\n(unchecked-long 1.1)\n;;=> 1\n(unchecked-long 1.9)\n;;=> 1\n(unchecked-long 5/3)\n;;=> 1\n\n(unchecked-long -1)\n;;=> -1\n(unchecked-long -1N)\n;;=> -1\n(unchecked-long -1.1)\n;;=> -1\n(unchecked-long -1.9)\n;;=> -1\n(unchecked-long -5/3)\n;;=> -1\n\n;;;; Note that (unchecked-long) does not range check its argument\n;;;; so integer overflow or rounding may occur. \n;;;; Use (long) if you want to throw an exception in such cases.\n\n(unchecked-long 9223372036854775808N)\n;;=> -9223372036854775808\n(unchecked-long -9223372036854775809N)\n;;=> 9223372036854775807\n\n(long 9223372036854775808N)\n;;=> IllegalArgumentException Value out of range for long: 922337203685477580\n(long -9223372036854775809N)\n;;=> IllegalArgumentException Value out of range for long: -9223372036854775809\n\n(unchecked-long 1.0E18)\n;;=> 1000000000000000000\n(unchecked-long 1.0E19)\n;;=> 9223372036854775807\n(unchecked-long 1.0E20)\n;;=> 9223372036854775807\n\n(long 1.0E18)\n;;=> 1000000000000000000\n(long 1.0E19)\n;;=> IllegalArgumentException Value out of range for long: 1.0E19\n(long 1.0E20)\n;;=> IllegalArgumentException Value out of range for long: 1.0E20", :_id "592c7e65e4b093ada4d4d79a"}], :notes nil, :arglists ["x"], :doc "Coerce to long. Subject to rounding or truncation.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-long"} {:added "1.0", :ns "clojure.core", :name "aset-long", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 3951, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; create an array of 10 longs and set one of the values to 31415\n\nuser=> (def ls (long-array 10))\n#'user/ls\nuser=> (vec ls)\n[0 0 0 0 0 0 0 0 0 0]\nuser=> (aset-long ls 3 31415)\n31415\nuser=> (vec ls)\n[0 0 0 31415 0 0 0 0 0 0]\nuser=>", :created-at 1313915173000, :updated-at 1313915173000, :_id "542692cec026201cdc326d8a"}], :notes [{:body "See [aset](http://clojuredocs.org/clojure.core/aset) for illustrations of multi-dimensional syntax.", :created-at 1432829151791, :updated-at 1432829151791, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :_id "55673cdfe4b01ad59b65f4df"}], :arglists ["array idx val" "array idx idx2 & idxv"], :doc "Sets the value at the index/indices. Works on arrays of long. Returns val.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/aset-long"} {:added "1.6", :ns "clojure.core", :name "some?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1431460708707, :author {:login "mmavko", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1064539?v=3"}, :to-var {:ns "clojure.core", :name "nil?", :library-url "https://github.com/clojure/clojure"}, :_id "55525b64e4b03e2132e7d160"} {:created-at 1434787747213, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:ns "clojure.core", :name "some", :library-url "https://github.com/clojure/clojure"}, :_id "55851fa3e4b05f167dcf233f"}], :line 531, :examples [{:editors [{:login "klimenko-serj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2082879?v=3"}], :body "user> (some? nil)\n;; => false\n\nuser> (some? 42)\n;; => true\nuser> (some? false)\n;; => true\nuser> (some? [])\n;; => true\nuser> (some? {})\n;; => true\nuser> (some? '())\n;; => true", :author {:avatar-url "https://avatars.githubusercontent.com/u/2082879?v=3", :account-source "github", :login "klimenko-serj"}, :created-at 1438944110688, :updated-at 1438944205513, :_id "55c48b6ee4b0080a1b79cdb7"} {:updated-at 1514328933133, :created-at 1514328933133, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body ";; equivalent to implementing not-nil?\n(some? :kw)\n;; => true\n(not (nil? :kw))\n;; => true\n\n(some? nil)\n;; => false\n(not (nil? nil))\n;; => false", :_id "5a42d365e4b0a08026c48cda"}], :notes nil, :tag "java.lang.Boolean", :arglists ["x"], :doc "Returns true if x is not nil, false otherwise.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/some_q"} {:added "1.0", :ns "clojure.core", :name "unchecked-negate", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1289217312000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-add", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c21"} {:created-at 1289217314000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-dec", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c22"} {:created-at 1289217316000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-inc", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c23"} {:created-at 1289217318000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-negate", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c24"} {:created-at 1289217321000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-divide", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c25"} {:created-at 1289217324000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-subtract", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c26"} {:created-at 1289217326000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-multiply", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c27"} {:created-at 1289217329000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-remainder", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c28"} {:created-at 1423522476536, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "-", :library-url "https://github.com/clojure/clojure"}, :_id "54d93aace4b0e2ac61831d32"}], :line 1184, :examples [{:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=3"}], :body ";; *Almost* always the same as \"-\"\nuser=> (= (- 2) (unchecked-negate 2))\ntrue\nuser=> (= (- (Long/MAX_VALUE)) (unchecked-negate (Long/MAX_VALUE)))\ntrue\n\n;; Except when it's not, because (- (Long/MIN_VALUE)) overflows:\nuser=> (= (- (Long/MIN_VALUE)) (unchecked-negate (Long/MIN_VALUE)))\nArithmeticException integer overflow clojure.lang.Numbers.throwIntOverflow (Numbers.java:1501)\n\n;; Indeed:\nuser=> (unchecked-negate (Long/MIN_VALUE))\n-9223372036854775808\n\n;; Careful!\nuser=> (= (Long/MIN_VALUE) (unchecked-negate (Long/MIN_VALUE)))\ntrue", :author {:avatar-url "https://avatars.githubusercontent.com/u/20086?v=3", :account-source "github", :login "reborg"}, :created-at 1458063308020, :updated-at 1458063919478, :_id "56e847cce4b0b41f39d96ce4"}], :notes nil, :arglists ["x"], :doc "Returns the negation of x, a long.\n Note - uses a primitive operator subject to overflow.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-negate"} {:added "1.10", :ns "clojure.core", :name "remove-tap", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1590688377580, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "tap>", :ns "clojure.core"}, :_id "5ecffa79e4b087629b5a191a"} {:created-at 1590688383018, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "add-tap", :ns "clojure.core"}, :_id "5ecffa7fe4b087629b5a191b"}], :line 7879, :examples nil, :notes nil, :arglists ["f"], :doc "Remove f from the tap set.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/remove-tap"} {:added "1.0", :ns "clojure.core", :name "gen-interface", :file "clojure/genclass.clj", :type "macro", :column 1, :see-alsos [{:created-at 1360270679000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "proxy", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dbf"} {:created-at 1360270682000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "gen-class", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dc0"}], :line 688, :examples [{:updated-at 1542284408999, :created-at 1542284408999, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; gen-interface defines the class in memory, but does not spit it to disk\n;; (unless AOT-ing). Note: this is different from gen-class (that actually does\n;; nothing unless it's AOT compiling).\n\n(gen-interface :name \"user.IFoo\" :extends [clojure.lang.IPersistentMap])\n;; user.IFoo\n\n(reify user.IFoo (seq [_]) (empty [_]))\n;; {}", :_id "5bed6478e4b00ac801ed9efa"}], :macro true, :notes nil, :arglists ["& options"], :doc "When compiling, generates compiled bytecode for an interface with\n the given package-qualified :name (which, as all names in these\n parameters, can be a string or symbol), and writes the .class file\n to the *compile-path* directory. When not compiling, does nothing.\n \n In all subsequent sections taking types, the primitive types can be\n referred to by their Java names (int, float etc), and classes in the\n java.lang package can be used without a package qualifier. All other\n classes must be fully qualified.\n \n Options should be a set of key/value pairs, all except for :name are\n optional:\n\n :name aname\n\n The package-qualified name of the class to be generated\n\n :extends [interface ...]\n\n One or more interfaces, which will be extended by this interface.\n\n :methods [ [name [param-types] return-type], ...]\n\n This parameter is used to specify the signatures of the methods of\n the generated interface. Do not repeat superinterface signatures\n here.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/gen-interface"} {:added "1.0", :ns "clojure.core", :name "*command-line-args*", :type "var", :see-alsos nil, :examples [{:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; If you save this program as showargs.clj on a Unix-like system, then the\n;; following command will produce the output shown.\n\n;; % java -classpath clojure-1.2.0.jar clojure.main showargs.clj arg1 2 \"whitespace in most command shells if you quote\"\n;; arg='arg1'\n;; arg='2'\n;; arg='whitespace in most command shells if you quote'\n;; \n;; \n;; Second arg is string 2, not number 2.\n\n(ns com.demo.showargs)\n\n(doseq [arg *command-line-args*]\n (printf \"arg='%s'\\n\" arg))\n\n(if (= \"2\" (second *command-line-args*))\n (println \"\\n\\nSecond arg is string 2, not number 2.\"))\n", :created-at 1298557801000, :updated-at 1298557801000, :_id "542692c8c026201cdc326a6a"}], :notes [{:body "To see which JVM command line parameters were used to start Clojure, execute:\n```\n(into [] (.getInputArguments\n (java.lang.management.ManagementFactory/getRuntimeMXBean)))\n```", :created-at 1647721826905, :updated-at 1647721856269, :author {:avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4", :account-source "github", :login "mars0i"}, :_id "62363d62e4b0b1e3652d75c0"}], :arglists [], :doc "A sequence of the supplied command line arguments, or nil if\n none were supplied", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*command-line-args*"} {:added "1.0", :ns "clojure.core", :name "reverse", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1293103264000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rseq", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521de3"}], :line 947, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (reverse '(1 2 3))\n(3 2 1)\n", :created-at 1280321963000, :updated-at 1285496763000, :_id "542692cbc026201cdc326bf7"} {:updated-at 1568496474720, :created-at 1568496474720, :author {:login "rosineygp", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/5224519?v=4"}, :body "(reverse \"clojure\")\n; (\\e \\r \\u \\j \\o \\l \\c)\n\n(apply str (reverse \"clojure\"))\n; \"erujolc\"", :_id "5d7d5b5ae4b0ca44402ef7b4"} {:updated-at 1613699240347, :created-at 1613699240347, :author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :body ";; Comparison between `reverse` and `rseq` for a vector.\n\n(def nums (vec (range 1000000)))\n(time (reverse nums))\n;; \"Elapsed time: 30.1222 msecs\"\n(time (rseq nums))\n;; \"Elapsed time: 0.0664 msecs\"", :_id "602f18a8e4b0b1e3652d745b"}], :notes [{:updated-at 1293103337000, :body "If you've got a vector rseq is a good option instead of reverse.", :created-at 1293103337000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fb0"} {:body "For vectors, `rseq` is to `reverse` what `peek` is to `last`. `rseq` reverses in constant time (!) where `reverse` is in linear time, as it appears to pull everything into a new seq, one at a time instead of ... reversing the keys? I don't know the implementation details, but I do know that `rseq` is magnitudes faster than `reverse` for vectors and sorted maps. ", :created-at 1613699495793, :updated-at 1613699637662, :author {:avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4", :account-source "github", :login "Crowbrammer"}, :_id "602f19a7e4b0b1e3652d745d"}], :arglists ["coll"], :doc "Returns a seq of the items in coll in reverse order. Not lazy.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/reverse"} {:added "1.9", :ns "clojure.core", :name "inst?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495635485203, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "inst-ms", :ns "clojure.core"}, :_id "5925961de4b093ada4d4d720"}], :line 6793, :examples [{:updated-at 1495635467250, :created-at 1495635467250, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body "(inst? (java.util.Date.))\n;;=> true\n(inst? (java.util.Calendar/getInstance))\n;;=> false\n\n(inst? (java.sql.Timestamp. 0))\n;;=> true\n(inst? (java.sql.Date. 0))\n;;=> true\n\n(inst? (java.time.Instant/now))\n;;=> true\n(inst? (java.time.LocalDateTime/now))\n;;=> false", :_id "5925960be4b093ada4d4d71f"}], :notes nil, :arglists ["x"], :doc "Return true if x satisfies Inst", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/inst_q"} {:added "1.0", :ns "clojure.core", :name "range", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1611082428123, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "take", :ns "clojure.core"}, :_id "60072abce4b0b1e3652d743a"} {:created-at 1611082519863, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "iterate", :ns "clojure.core"}, :_id "60072b17e4b0b1e3652d743b"}], :line 3019, :examples [{:author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"} {:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"} {:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"} {:avatar-url "https://avatars1.githubusercontent.com/u/22159831?v=4", :account-source "github", :login "yuxuan813"}], :body ";; default value of 'end' is infinity\nuser=> (range)\n(0 1 2 3 4 5 6 7 8 9 10 ... 12770 12771 12772 12773 ... n)\n\n;; Since clojure 1.2:\nuser=> (take 10 (range))\n(0 1 2 3 4 5 6 7 8 9)\n\nuser=> (range 10)\n(0 1 2 3 4 5 6 7 8 9)\n\nuser=> (range -5 5)\n(-5 -4 -3 -2 -1 0 1 2 3 4)\n\nuser=> (range -100 100 10)\n(-100 -90 -80 -70 -60 -50 -40 -30 -20 -10 0 10 20 30 40 50 60 70 80 90)\n\nuser=> (range 0 4 2)\n(0 2)\n\nuser=> (range 0 5 2)\n(0 2 4)\n\nuser=> (range 0 6 2)\n(0 2 4)\n\nuser=> (range 0 7 2)\n(0 2 4 6)\n\nuser=> (range 100 0 -10)\n(100 90 80 70 60 50 40 30 20 10)\n\nuser=> (range 10 -10 -1)\n(10 9 8 7 6 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 -7 -8 -9)\n \n\n", :created-at 1279160563000, :updated-at 1523435961458, :_id "542692ccc026201cdc326c77"} {:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Since clojure 1.2:\n\nuser=> (take 10 (range))\n(0 1 2 3 4 5 6 7 8 9)\n", :created-at 1282319317000, :updated-at 1285494502000, :_id "542692ccc026201cdc326c80"} {:author {:login "rebcabin", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/880b0bb3a4be9237326dd69565444dee?r=PG&default=identicon"}, :editors [], :body ";; finite range over java Integers\nuser=> (take 5 (range 42 (java.lang.Integer/MAX_VALUE)))\n(42 43 44 45 46)\n\n;; infinite range starting at a certain point\nuser=> (take 5 (drop 42 (range)))\n(42 43 44 45 46)\n", :created-at 1374181746000, :updated-at 1374181746000, :_id "542692d4c026201cdc327048"} {:editors [{:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}], :body ";; Using a double as the value of step can produce an unexpected extra value.\n;; In the second example below, there's an extra final value that's almost = 0.8.\n\n(range 0 0.8 1/10)\n(0 1/10 1/5 3/10 2/5 1/2 3/5 7/10)\n\nuser=> (range 0 0.8 0.1)\n(0 0.1 0.2 0.30000000000000004 0.4 0.5 0.6 0.7 0.7999999999999999)\n\n;; It's difficult to guess when this behavior will occur, unless you know\n;; whether the double representation of step plus what \"should\" be the\n;; last number is in fact less than end. From the second example above, you \n;; can see that the extra value won't be included if you replace 0.8 by a \n;; number in 0.1, ..., 0.7 (e.g. since 0.7 is not less than 0.7) but you \n;; wouldn't necessarily know that you will get the extra value for end = 0.9,\n;; 1.0, 1.1, but not for end = 1.2.\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3", :account-source "github", :login "mars0i"}, :created-at 1438100731938, :updated-at 1438101658841, :_id "55b7acfbe4b0080a1b79cdaf"} {:updated-at 1494572384501, :created-at 1494572384501, :author {:login "st-keller", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/476463?v=3"}, :body "user=> (range 0 0)\n()\n\nuser=> (range 0 1)\n(0)", :_id "59155d60e4b01920063ee059"}], :notes nil, :arglists ["" "end" "start end" "start end step"], :doc "Returns a lazy seq of nums from start (inclusive) to end\n (exclusive), by step, where start defaults to 0, step to 1, and end to\n infinity. When step is equal to 0, returns an infinite sequence of\n start. When start is equal to end, returns empty list.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/range"} {:added "1.0", :ns "clojure.core", :name "sort", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1285265346000, :author {:login "morphling", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/90ffa70a579c3e0c398b7523ecdc6a87?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sort-by", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e7c"} {:created-at 1548624421040, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "compare", :ns "clojure.core"}, :_id "5c4e2225e4b0ca44402ef654"}], :line 3102, :examples [{:updated-at 1624481253798, :created-at 1281550866000, :body "user=> (sort [3 1 2 4])\n(1 2 3 4)\n\nuser=> (sort > (vals {:foo 5, :bar 2, :baz 10}))\n(10 5 2)\n\n;; do not do this, use sort-by instead because it handles calling the fn (e.g last) and compare for you.\nuser=> (sort #(compare (last %1) (last %2)) {:b 1 :c 3 :a 2})\n([:b 1] [:a 2] [:c 3])\n\n;; like this:\nuser=> (sort-by last {:b 1 :c 3 :a 2})\n([:b 1] [:a 2] [:c 3])", :editors [{:avatar-url "https://www.gravatar.com/avatar/90ffa70a579c3e0c398b7523ecdc6a87?r=PG&default=identicon", :account-source "clojuredocs", :login "morphling"} {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "drewverlee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1130688?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon", :account-source "clojuredocs", :login "zmila"}, :_id "542692cfc026201cdc326e5b"} {:updated-at 1602514013062, :created-at 1306322169000, :body ";; make a struct 'goods'. it assumes that every goods has\n;; its id number and price.\n(defstruct goods :id :price)\n\n;; generate data.\n(def data (map #(struct goods %1 %2)\n\t (shuffle (range 0 10)) (shuffle\n\t\t\t\t (into (range 100 500 100)\n\t\t\t\t\t (range 100 500 100)))))\n\n(defn comp-goods-price\n \"a compare function by :price of the struct 'goods.' the sort order \n is superior to the lower price and if the price is same, it is \n superior to the lower id.\"\n [el1 el2]\n (or (< (:price el1) (:price el2))\n (and (= (:price el1) (:price el2))(< (:id el1) (:id el2)))))\n\nuser=> data\n({:id 1, :price 300} {:id 6, :price 100} {:id 3, :price 100} {:id 4, :price 400} {:id 0, :price 300} {:id 2, :price 200} {:id 5, :price 200} {:id 8, :price 400})\nuser=> (sort comp-goods-price data)\n({:id 3, :price 100} {:id 6, :price 100} {:id 2, :price 200} {:id 5, :price 200} {:id 0, :price 300} {:id 1, :price 300} {:id 4, :price 400} {:id 8, :price 400})\nuser=> (sort-by :price < data) ; compare this with the above.\n({:id 6, :price 100} {:id 3, :price 100} {:id 2, :price 200} {:id 5, :price 200} {:id 1, :price 300} {:id 0, :price 300} {:id 4, :price 400} {:id 8, :price 400})\n\n\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"} {:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"} {:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"} {:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"} {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"}, :_id "542692cfc026201cdc326e5e"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; Warning: You can sort a Java array and get back a sorted immutable Clojure\n;; data structure, but it will also change the input Java array, by sorting it.\n;; Copy the array before sorting if you want to avoid this.\n\nuser=> (def x (to-array [32 11]))\n#'user/x\n\nuser=> (seq x)\n(32 11)\n\nuser=> (def y (sort x))\n#'user/y\n\n;; Return sorted sequence\nuser=> y\n(11 32)\n\nuser=> (class y)\nclojure.lang.ArraySeq\n\n;; but also modifies x, because it used the array to do the sorting.\nuser=> (seq x)\n(11 32)\n\n;; One way to avoid this is copying the array before sorting:\nuser=> (def y (sort (aclone x)))\n#'user/y", :created-at 1331771749000, :updated-at 1332833601000, :_id "542692d5c026201cdc32708e"} {:editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}], :body ";; Sorting with > only works for numbers, whereas sort\n;; also works for other types such as vectors.\n;; To sort any data in reverse (descending) order,\n;; use a negated comparator:\n\nuser=> (sort (comp - compare) [[1 0] [0 0] [0 3] [2 1]])\n([2 1] [1 0] [0 3] [0 0])\n\n;; There are subtle cases where negating a comparator can give the wrong sort order.\n;; See this article for details, and a more robust suggestion of reversing the\n;; order of arguments given to the comparator:\n;; https://clojure.org/guides/comparators\n\nuser=> (sort #(compare %2 %1) [[1 0] [0 0] [0 3] [2 1]])\n([2 1] [1 0] [0 3] [0 0])", :author {:avatar-url "https://avatars.githubusercontent.com/u/23474334?v=3", :account-source "github", :login "ferdinand-beyer"}, :created-at 1479202684434, :updated-at 1548624336544, :_id "582ad77ce4b0782b632278c1"} {:updated-at 1483387364837, :created-at 1483387364837, :author {:login "Invertisment", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1641263?v=3"}, :body ";; Reverse the collection\n\nuser=> (sort #(compare %2 %1) '(:a :b :c :d))\n(:d :c :b :a)", :_id "586ab1e4e4b0fd5fb1cc9651"} {:editors [{:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/8271291?v=3"}], :body "(def data [{:v 12, :a 10} {:v 21, :a 113} {:v 1, :a 2} {:v 12, :a 223} {:v 100, :a 23} {:v 1, :a 113}])\n\n(defn multi-comp\n ([fns a b]\n (multi-comp fns < a b))\n ([[f & others :as fns] order a b]\n (if (seq fns)\n (let [result (compare (f a) (f b))\n f-result (if (= order >) (* -1 result) result)]\n (if (= 0 f-result)\n (recur others order a b)\n f-result))\n 0)))\n\n(sort #(multi-comp [:a :v] > %1 %2) data)\n;;=> ({:v 12, :a 223} {:v 21, :a 113} {:v 1, :a 113} {:v 100, :a 23} {:v 12, :a 10} {:v 1, :a 2}) \n\n(sort #(multi-comp [:a :v] < %1 %2) data)\n;;=> ({:v 1, :a 2} {:v 12, :a 10} {:v 100, :a 23} {:v 1, :a 113} {:v 21, :a 113} {:v 12, :a 223})", :author {:avatar-url "https://avatars2.githubusercontent.com/u/8271291?v=3", :account-source "github", :login "ertugrulcetin"}, :created-at 1491607217680, :updated-at 1491607544907, :_id "58e81eb1e4b01f4add58fe88"} {:editors [{:login "malloryerik", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10395849?v=4"}], :body ";; Sort strings into ordered character lists\n\nuser=> (sort \"alphabet!321\") \n(\\! \\1 \\2 \\3 \\a \\a \\b \\e \\h \\l \\p \\t)\n\nuser=> (sort \"안녕하세요\") \n(\\녕 \\세 \\안 \\요 \\하)\n\nuser=> (sort \"花间一壶酒,独酌无相亲。\") \n(\\。 \\一 \\亲 \\壶 \\无 \\独 \\相 \\花 \\酌 \\酒 \\间 \\,)", :author {:avatar-url "https://avatars3.githubusercontent.com/u/10395849?v=4", :account-source "github", :login "malloryerik"}, :created-at 1566135485015, :updated-at 1566176013086, :_id "5d5954bde4b0ca44402ef7a4"}], :notes nil, :arglists ["coll" "comp coll"], :doc "Returns a sorted sequence of the items in coll. If no comparator is\n supplied, uses compare. comparator must implement\n java.util.Comparator. Guaranteed to be stable: equal elements will\n not be reordered. If coll is a Java array, it will be modified. To\n avoid this, sort a copy of the array.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/sort"} {:ns "clojure.core", :name "-cache-protocol-fn", :file "clojure/core_deftype.clj", :type "function", :column 1, :see-alsos nil, :line 575, :examples nil, :notes nil, :arglists ["pf x c interf"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/-cache-protocol-fn"} {:added "1.0", :ns "clojure.core", :name "unchecked-inc-int", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1678034683900, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unchecked-dec-int", :ns "clojure.core"}, :_id "6404c6fbe4b08cf8563f4b79"}], :line 1149, :examples [{:updated-at 1658482040938, :created-at 1658482040938, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body "(unchecked-inc-int 42);; => 43\n(unchecked-inc-int 42.8);; => 43\n(unchecked-inc-int Integer/MAX_VALUE);; => -2147483648", :_id "62da6d78e4b0b1e3652d762d"}], :notes nil, :arglists ["x"], :doc "Returns a number one greater than x, an int.\n Note - uses a primitive operator subject to overflow.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-inc-int"} {:added "1.2", :ns "clojure.core", :name "map-indexed", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1290495691000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e3e"} {:created-at 1324314182000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "keep-indexed", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e3f"}], :line 7283, :examples [{:updated-at 1596522358724, :created-at 1280778877000, :body "user=> (map-indexed (fn [idx itm] [idx itm]) \"foobar\")\n([0 \\f] [1 \\o] [2 \\o] [3 \\b] [4 \\a] [5 \\r])\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/4c1869a83a1bf9c5090b07b0db6fb450?r=PG&default=identicon", :account-source "clojuredocs", :login "kredaxx"} {:avatar-url "https://www.gravatar.com/avatar/4c1869a83a1bf9c5090b07b0db6fb450?r=PG&default=identicon", :account-source "clojuredocs", :login "kredaxx"} {:avatar-url "https://www.gravatar.com/avatar/4c1869a83a1bf9c5090b07b0db6fb450?r=PG&default=identicon", :account-source "clojuredocs", :login "kredaxx"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:login "zackteo", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/7510179?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/4c1869a83a1bf9c5090b07b0db6fb450?r=PG&default=identicon", :account-source "clojuredocs", :login "kredaxx"}, :_id "542692cdc026201cdc326d25"} {:author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :editors [], :body ";; or simply\nuser=> (map-indexed vector \"foobar\")\n([0 \\f] [1 \\o] [2 \\o] [3 \\b] [4 \\a] [5 \\r])", :created-at 1324306400000, :updated-at 1324306400000, :_id "542692d4c026201cdc327005"} {:editors [{:login "zackteo", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/7510179?v=4"}], :body "(map-indexed hash-map \"foobar\")\n;;=> ({0 \\f} {1 \\o} {2 \\o} {3 \\b} {4 \\a} {5 \\r})", :author {:avatar-url "https://avatars2.githubusercontent.com/u/2665931?v=4", :account-source "github", :login "freetonik"}, :created-at 1540845475652, :updated-at 1596521745408, :_id "5bd76fa3e4b00ac801ed9eea"} {:editors [{:login "gluer", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/22495106?v=4"}], :body ";; a simple example\n(map-indexed #(when (< % 2) (str % %2)) [:a :b :c])\n;;=> (\"0:a\" \"1:b\" nil)\n\n(keep-indexed #(when (< % 2) (str % %2)) [:a :b :c])\n;;=> (\"0:a\" \"1:b\")", :author {:avatar-url "https://avatars3.githubusercontent.com/u/22495106?v=4", :account-source "github", :login "gluer"}, :created-at 1542944994140, :updated-at 1545622964814, :_id "5bf778e2e4b0ca44402ef5ca"} {:updated-at 1596521989649, :created-at 1596521989649, :author {:login "zackteo", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/7510179?v=4"}, :body ";; Join the index and elements with list\n(map-indexed list [:a :b :c])\n;;=> ((0 :a) (1 :b) (2 :c))", :_id "5f28fe05e4b0b1e3652d734c"} {:updated-at 1616528771927, :created-at 1616528756028, :author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :body "(= (map-indexed #(when (= 2 %2) [%1 \"Hi\"]) [1 1 2 2]) \n '(nil nil [2 \"Hi\"] [3 \"Hi\"])) ;;=>true", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4", :account-source "github", :login "Crowbrammer"}], :_id "605a4574e4b0b1e3652d74a8"}], :notes nil, :arglists ["f" "f coll"], :doc "Returns a lazy sequence consisting of the result of applying f to 0\n and the first item of coll, followed by applying f to 1 and the second\n item in coll, etc, until coll is exhausted. Thus function f should\n accept 2 arguments, index and item. Returns a stateful transducer when\n no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/map-indexed"} {:added "1.1", :ns "clojure.core", :name "with-bindings", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1365637665000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-bindings*", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ade"} {:created-at 1374310477000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-local-vars", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521adf"} {:created-at 1374313569000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "binding", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ae0"} {:created-at 1375792510000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-redefs", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ae1"}], :line 1986, :examples [{:body "(def ^:dynamic x 1)\n;;=> #'user/x\n\nx\n;;=> 1\n\n(with-bindings {#'x 2}\n x)\n;;=> 2", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423525132511, :updated-at 1423525132511, :_id "54d9450ce4b0e2ac61831d40"}], :macro true, :notes nil, :arglists ["binding-map & body"], :doc "Takes a map of Var/value pairs. Installs for the given Vars the associated\n values as thread-local bindings. Then executes body. Pops the installed\n bindings after body was evaluated. Returns the value of body.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/with-bindings"} {:added "1.2", :ns "clojure.core", :name "rand-nth", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1292321208000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rand", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f63"} {:created-at 1434034859003, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:ns "clojure.core", :name "shuffle", :library-url "https://github.com/clojure/clojure"}, :_id "5579a2abe4b01ad59b65f4f1"} {:created-at 1586185491703, :author {:login "green-coder", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nth", :ns "clojure.core"}, :_id "5e8b4513e4b087629b5a18cc"}], :line 7231, :examples [{:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "XPherior", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/656a48d6bef2a9f034af0e8b2b4d588d?r=PG&default=identicon"}], :body "user=> (def food [:ice-cream :steak :apple])\n#'user/food\n\nuser=> (rand-nth food)\n:apple\nuser=> (rand-nth food)\n:ice-cream\n", :created-at 1282319178000, :updated-at 1352188362000, :_id "542692cec026201cdc326dfe"} {:updated-at 1507688537707, :created-at 1507688537707, :author {:login "parkeristyping", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/9487556?v=4"}, :body "user=> (def food [:ice-cream :steak :apple])\n#'user/food\n\nuser=> (rand-nth food)\n:ice-cream\nuser=> (rand-nth food)\n:ice-cream", :_id "59dd8059e4b03026fe14ea5f"} {:editors [{:login "jnriver", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/2074698?v=4"}], :body "user=> (rand-nth [])\nIndexOutOfBoundsException clojure.lang.PersistentVector.arrayFor (PersistentVector.java:158)\n\nuser=>\n(let [xs []]\n (when (not (empty? xs))\n (rand-nth xs)))\nnil\n", :author {:avatar-url "https://avatars2.githubusercontent.com/u/2074698?v=4", :account-source "github", :login "jnriver"}, :created-at 1527215870505, :updated-at 1527216042499, :_id "5b0776fee4b045c27b7fac79"}], :notes nil, :arglists ["coll"], :doc "Return a random element of the (sequential) collection. Will have\n the same performance characteristics as nth for the given\n collection.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/rand-nth"} {:added "1.0", :ns "clojure.core", :name "comp", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1358904701000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "partial", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ec3"} {:created-at 1358904763000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "juxt", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ec4"} {:created-at 1427713283146, :author {:login "peter-courcoux", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1872022?v=3"}, :to-var {:ns "clojure.core", :name "every-pred", :library-url "https://github.com/clojure/clojure"}, :_id "55192d03e4b056ca16cfecfc"}], :line 2557, :examples [{:author {:login "citizen428", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3881a28fe402dd2d1de44717486cae8?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(def negative-quotient (comp - /))\n;; #'user/negative-quotient\n\n(negative-quotient 8 3) ;;=> -8/3\n\n(def concat-and-reverse (comp (partial apply str) reverse str)) \n;; #'user/concat-and-reverse\n\n(concat-and-reverse \"hello\" \"clojuredocs\")\n;;=> \"scoderujolcolleh\"\n", :created-at 1280554862000, :updated-at 1420648866563, :_id "542692cbc026201cdc326c04"} {:updated-at 1486787503828, :created-at 1292499977000, :body "((comp str +) 8 8 8) \n;;=> \"24\"\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "bsifou", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8908139?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/e8a89e26df41f3dd921ff1de2afa4db7?r=PG&default=identicon", :account-source "clojuredocs", :login "zpinter"}, :_id "542692cbc026201cdc326c06"} {:author {:login "semperos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/edeae8e7534b3d554e4ec2c35ffc68d?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(map\n (comp - (partial + 3) (partial * 2))\n [1 2 3 4])\n;;=> (-5 -7 -9 -11)", :created-at 1296193214000, :updated-at 1420649045506, :_id "542692cbc026201cdc326c07"} {:updated-at 1420649083250, :created-at 1305843170000, :body "(filter (comp not zero?) [0 1 0 2 0 3 0 4])\n;;=> (1 2 3 4)", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"}, :_id "542692cbc026201cdc326c08"} {:author {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}, :editors [{:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; make a struct 'goods'. it assumes that every goods has\n;; its id number and price.\n(defstruct goods :id :price)\n\n;; generate data.\n(def data (map #(struct goods %1 %2)\n\t (shuffle (range 0 10)) \n (shuffle\n\t (into (range 100 500 100)\n\t\t\t(range 100 500 100)))))\n\n(defn comp-goods-price\n \"a compare function by :price of the struct 'goods.' the sort order \n is that the lower price is superior to the higher one and if the \n price is same, the lower id is superior to the higher one.\"\n [el1 el2]\n (if (or (< (:price el1) (:price el2))\n (and (= (:price el1) (:price el2)) (< (:id el1) (:id el2))))\n true\n false))\n\n;; The shuffle will cause your results to differ.\ndata \n;;=> ({:id 1, :price 300} {:id 6, :price 100} \n;; {:id 3, :price 100} {:id 4, :price 400}\n;; {:id 0, :price 300} {:id 2, :price 200} \n;; {:id 5, :price 200} {:id 8, :price 400})\n\n(sort (comp comp-goods-price) data)\n;;=> ({:id 3, :price 100} {:id 6, :price 100} \n;; {:id 2, :price 200} {:id 5, :price 200} \n;; {:id 0, :price 300} {:id 1, :price 300}\n;; {:id 4, :price 400} {:id 8, :price 400})\n\n(sort-by :price < data) ; compare this with the above.\n;;=> ({:id 6, :price 100} {:id 3, :price 100} \n;; {:id 2, :price 200} {:id 5, :price 200} \n;; {:id 1, :price 300} {:id 0, :price 300} \n;; {:id 4, :price 400} {:id 8, :price 400})\n\n;; Yet another example of 'comp' by PriorityBlockingQueue.\n\n(import [java.util.concurrent PriorityBlockingQueue])\n;; java.util.concurrent.PriorityBlockingQueue\n\n(def pqdata (new PriorityBlockingQueue 8\n\t\t (comp comp-goods-price)))\n;; #'user/pqdata\n\n(doseq [x data] (.add pqdata x))\n;;=> nil\n\n(dotimes [_ 8] (println (.poll pqdata)))\n;; {:id 3, :price 100}\n;; {:id 6, :price 100}\n;; {:id 2, :price 200}\n;; {:id 5, :price 200}\n;; {:id 0, :price 300}\n;; {:id 1, :price 300}\n;; {:id 4, :price 400}\n;; {:id 8, :price 400}\n;;=> nil\n", :created-at 1306322829000, :updated-at 1420650298514, :_id "542692cbc026201cdc326c09"} {:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(def countif (comp count filter))\n#'user/countif\n\n(countif even? [2 3 1 5 4])\n;;=> 2", :created-at 1313975540000, :updated-at 1420649227225, :_id "542692cbc026201cdc326c0f"} {:author {:login "Will", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a449004e52cfddd142e63a1d317b191d?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "; Get 2nd to last element from a list\n( (comp second reverse) '(\"a\" 2 7 \"b\")) \n;;=> 7", :created-at 1344506218000, :updated-at 1420649237526, :_id "542692d2c026201cdc326f64"} {:updated-at 1449761968315, :created-at 1449761968315, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :body "; We need an example that composes more than just two functions.\n; The following example is an overly complicated reimplementation of 'nth'\n; but it does show the composition of an arbitrary number of functions (rest).\n( #((apply comp first (repeat %2 rest)) %1) [1 2 3 4 5 6] 3 ) \n;;=> 4", :_id "56699cb0e4b09a2675a0ba72"} {:updated-at 1536867551060, :created-at 1486454398076, :author {:login "purukaushik", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5105099?v=3"}, :body "; `comp`-ing maps, filters with a little help from our friend `partial`\n; the following function filters numbers in a `coll` if it is divisible by 3\n; then on that filtered `coll`, multiplies all by 2\n\n; a little helper to find if a number is div by 3 \n; also comp-ed\n\n(def mod3nz? (comp not zero? #(mod % 3)))\n\n; now for that elusive function that muls by 2 after filter those not div by 3\n(def mul-2-nd-3\n \"Takes a seq of numbers, filters those not divisible by 3 and muls them by 2\"\n (comp (partial map #(* % 2))\n (partial filter mod3nz?)))\n\n(mul-2-nd-3 [16 15 30 43]) ;; => (32 86)\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/5105099?v=3", :account-source "github", :login "purukaushik"} {:login "Jjunior130", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/7597818?v=4"}], :_id "58997e7ee4b01f4add58fe3d"} {:updated-at 1486787324018, :created-at 1486787324018, :author {:login "bsifou", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8908139?v=3"}, :body "; Split a number into sequence of it's digits\n((comp (partial map (comp read-string str)) str) 33)\n;;=> (3 3)", :_id "589e92fce4b01f4add58fe46"} {:updated-at 1497863678341, :created-at 1497863678341, :author {:login "merliecat", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/27359194?v=3"}, :body ";; Keywords are used as functions to access data in maps.\n\n(:foo {:foo \"bar\"})\n;;=> \"bar\"\n\n;; With a nested data structure, it is common to use\n;; several keywords in sequence to navigate the hierarchy.\n\n(def my-data {:this {:that {:the-other \"val\"}}})\n;;=> #'user/my-data\n\n(-> my-data :this :that :the-other)\n;;=> \"val\"\n\n;; Since keywords are functions,\n;; they can be 'comp'ed just like any other function.\n\n(def those (comp :the-other :that :this)) ; Note: reverse order\n;;=> #'user/those\n\n(those my-data)\n;;=> \"val\"\n\n;; The composed keyword-sequence can be used with other keywords: -\n\n(def my-data-2\n {:this {:that {:the-other {:a \"apple\" :b \"banana\"}}}})\n;;=> #'user/my-data-2\n\n(let [a (-> my-data-2 those :a)\n b (-> my-data-2 those :b)]\n (str \"These: \" a \", \" b))\n;;=> \"These: apple, banana\"", :_id "594795fee4b06e730307db3a"} {:updated-at 1508821937862, :created-at 1508821937862, :author {:login "elect000", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/18697629?v=4"}, :body ";; ((comp func1 func2) data) mean ...\n;; (-> data func2 func1)\n;; so,\n((comp (partial * 3) inc) 1)\n;; means\n(* 3 (inc 1))\n\n;; advanced ...\n\n((comp seq re-seq) #\"(\\w+)=(\\S+)\" \"foo=bar\")\n;; ([\"foo=bar\" \"foo\" \"bar\"])\n(seq (re-seq #\"(\\w+)=(\\S+)\" \"foo=bar\"))\n\n;; * \"#(\\w+)...\" and \"foo=...\" are arguments for #re-seq", :_id "59eecbb1e4b0a08026c48c73"} {:updated-at 1510097526774, :created-at 1510097526774, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body ";; comp is the transducer equivalent to thrush \n\n;; An example of using the \"thread-last\" macro to get\n;; the sum of the first 10 even squares.\n(->> (range)\n (map #(* % %))\n (filter even?)\n (take 10)\n (reduce +))\n;;=> 1140\n\n;; Many the seq functions now produce transducers.\n;; `reduce` does not but has been replaced with `transduce`.\n(transduce \n (comp\n (map #(* % %))\n (filter even?)\n (take 10))\n + 0 (range) )\n;;=> 1140", :_id "5a024276e4b0a08026c48c9b"} {:updated-at 1517927616519, :created-at 1517927616519, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;trim will remove the white spaces and return a new string which will be passed ;;to the second function capitalize which will return a new string\n\n((comp clojure.string/capitalize clojure.string/trim) \" london \")\n;;\"London\"\n", :_id "5a79bcc0e4b0e2d9c35f7419"} {:updated-at 1517928532967, :created-at 1517928532967, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body "(def my-car\n {:name \"audi\"\n :data {:cc 2990\n :bhp 350}})\n\n((comp :bhp :data) my-car)\n;;350\n\n;;which is the equivalent of\n\n(:bhp (:data my-car))\n;;350", :_id "5a79c054e4b0e2d9c35f741a"} {:editors [{:login "Jjunior130", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/7597818?v=4"}], :body "(require '[reagent.core :as r])\n\n(def float-parsable? (comp not js/isNaN js/parseFloat))\n(def find-parsable-or-nil \n (comp first \n (partial re-find \n #\"(\\-?\\d+\\.)?\\d+([eE][-+]?\\d+)?\")))\n\n(defn number-input\n \"HTML input element for number only input\"\n [value]\n [:input\n {:value @value\n :type \"text\"\n :on-change (comp\n #(when-let [new-value %]\n (reset! value new-value))\n (fn [new-value]\n (cond\n (empty? new-value) \"\"\n (float-parsable? new-value) new-value\n :otherwise (find-parsable-or-nil new-value)))\n (fn [target]\n (.-value target))\n (fn [event]\n (.-target event)))}])\n\n(def value (r/atom \"\"))\n\n(defn demo []\n [:div\n ; Displays NaN when value is \"\", displays a number otherwise.\n (-> @value js/parseFloat str) [:br]\n [number-input value]])", :author {:avatar-url "https://avatars1.githubusercontent.com/u/7597818?v=4", :account-source "github", :login "Jjunior130"}, :created-at 1536856092993, :updated-at 1536879826363, :_id "5b9a901ce4b00ac801ed9e9c"} {:editors [{:login "luontola", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/42678?v=4"}], :body "; Demonstrating the order of parameters vs. normal function application.\n\n(def x {:bar {:foo 42}})\n\n(:foo (:bar x))\n;;=> 42\n\n((comp :foo :bar) x)\n;;=> 42", :author {:avatar-url "https://avatars0.githubusercontent.com/u/42678?v=4", :account-source "github", :login "luontola"}, :created-at 1552650253291, :updated-at 1552650469262, :_id "5c8b900de4b0ca44402ef6b6"} {:updated-at 1615715410336, :created-at 1615715410336, :author {:login "nbardiuk", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/381992?v=4"}, :body "; Without arguments returns identity function\n\n(identical? (comp) identity)\n;;=> true\n\n((comp) :arg)\n;;=> :arg", :_id "604ddc52e4b0b1e3652d748f"}], :notes nil, :arglists ["" "f" "f g" "f g & fs"], :doc "Takes a set of functions and returns a fn that is the composition\n of those fns. The returned fn takes a variable number of args,\n applies the rightmost of fns to the args, the next\n fn (right-to-left) to the result, etc.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/comp"} {:added "1.0", :ns "clojure.core", :name "await", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1298860359000, :author {:login "ninjudd", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7ced25585a7556e9b9b975c1f9e136e3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "await-for", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a8a"}], :line 3274, :examples [{:updated-at 1435096085344, :created-at 1283693589000, :body ";; construct a simple agent\n(def *agnt* (agent {}))\n\n(send-off *agnt* (fn [state] \n (Thread/sleep 10000)\n (assoc state :done true)))\n;;=> \n\n;; blocks till the agent action is finished\n(await *agnt*) \n;;=> nil", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/1453?v=4", :account-source "github", :login "ghoseb"}, :_id "542692cdc026201cdc326cdb"} {:body "(import '(java.io BufferedWriter FileWriter))\n\n;; Generally the agent can be sent messages asynchronously, send and forget.\n;; In some cases a rendezvous is needed, e.g. in the case of an output file.\n\n(def write-out \n (agent {:handle (clojure.java.io/writer \"results.txt\" )\n :last-msg [\"init\"]}\n :validator (fn [state] \n (and (contains? state :handle) (contains? state :last-msg))) \n :error-handler (fn [result] \n (println \"invalid result\") )))\n\n(defn write-a-line [state msg nap] \n (.write (:handle state) (str msg \" line \" \"\\n\")) \n (let [new-state (update-in state [:last-msg] into [msg])]\n (println \"message : \" msg \" : \" new-state)\n (Thread/sleep nap)\n new-state))\n\n\n\n;; these all have the same return value\n(send-off write-out write-a-line \"first\" 2000)\n(send-off write-out write-a-line \"second\" 1000)\n(send-off write-out write-a-line \"third\" 5000)\n(send-off write-out write-a-line \"fourth\" 1000)\n@write-out\n;;=> {:handle #, :last-msg [\"init\"]}\n\n(time (await write-out))\n;; 9000.307 msecs\n\n;; here we can see that the await causes the thread to block\n;; until the agent's queue is empty.\n@write-out\n;;=> {:handle #, \n;; :last-msg [\"init\" \"first\" \"second\" \"third\" \"fourth\"]}\n\n;; But wait the \"result.txt\" file is empty!\n;; We need to close the file handle.\n;; And now that we know the agent's queue is empty we\n;; are free to close it.\n;; This could do this in the current thread with the dereferenced\n;; agents :handle '(.close (:handle @write-out))' \n;; but it is probably better to be formal and let the agent do it.\n(defn close-the-agent [state] \n (.close (:handle state)) \n state)\n\n(send-off write-out close-the-agent)\n\n;; And the contents of \"result.txt\" are: (less the leading '; ')\n; first line\n; second line\n; third line\n; fourth line", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1435098875036, :updated-at 1435102514521, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :_id "5589defbe4b05f167dcf2341"}], :notes [{:author {:login "andrewni420", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/77020120?v=4"}, :updated-at 1690255271897, :created-at 1690255271897, :body " ;;It is not actually allowed to await on an action dispatched from an agent to an agent\n\n (def m (agent 0))\n (def n (agent 0))\n\n (defn step \n [agent1 agent2]\n (try (await (send agent2 inc))\n (catch Exception e (println e)))\n agent1)\n\n ;;Evaluating this throws an error saying \"Can't await in agent action\"\n (send m #(step % n))\n ", :_id "64bf3fa7e4b08cf8563f4bd6"}], :arglists ["& agents"], :doc "Blocks the current thread (indefinitely!) until all actions\n dispatched thus far, from this thread or agent, to the agent(s) have\n occurred. Will block on failed agents. Will never return if\n a failed agent is restarted with :clear-actions true or shutdown-agents was called.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/await"} {:added "1.2", :ns "clojure.core", :name "spit", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1330170569000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "slurp", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e97"} {:created-at 1330170573000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "writer", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e98"} {:created-at 1350073135000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "load-file", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e99"} {:created-at 1515622120441, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "make-parents", :ns "clojure.java.io"}, :_id "5a568ee8e4b0a08026c48cec"}], :line 6954, :examples [{:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}], :body "user=> (spit \"flubber.txt\" \"test\")\nnil\nuser=> (slurp \"flubber.txt\")\n\"test\"", :created-at 1280458792000, :updated-at 1366325983000, :_id "542692c7c026201cdc326972"} {:author {:login "megapatch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9a9b25017146e62801acc97861d74c4e?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (spit \"event.log\" \"test 1\\n\" :append true)\nnil\n\nuser=> (spit \"event.log\" \"test 2\\n\" :append true)\nnil\n\nuser=> (println (slurp \"event.log\"))\ntest 1\ntest 2\n\nnil\n", :created-at 1283972766000, :updated-at 1285487376000, :_id "542692c7c026201cdc326975"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "Juxtaspiral", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1b0546af898df8046160d0ed80e13165?r=PG&default=identicon"}], :body "(defn append-to-file\n \"Uses spit to append to a file specified with its name as a string, or\n anything else that writer can take as an argument. s is the string to\n append.\" \n [file-name s]\n (spit file-name s :append true))", :created-at 1334796093000, :updated-at 1348351258000, :_id "542692d5c026201cdc32709b"} {:updated-at 1510413046445, :created-at 1510413046445, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;Create a record and save a log message to a log file\n;;Constructor with side effects\n\n;;define a Person record\n(defrecord Person [fname lname])\n\n;;define a function to save a log message into the log.txt using spit and :append\n(defn log-entry [msg] (spit \"log.txt\" (apply str msg \"\\n\") :append true))\n\n;;build the constructor which: 1) log the message; 2)create a Person\n(defn make-person [fname lname]\n (log-entry (apply str \"[log] New Person created : \" lname \",\" fname))\n (->Person fname lname))\n\n;;create a person\n(def person (make-person \"John\" \"Smith\"))\n\n;;print the content of the log.txt to the console\n(println (slurp \"log.txt\"))", :_id "5a0712f6e4b0a08026c48cb0"} {:updated-at 1543709529631, :created-at 1543709529631, :author {:login "messinm", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1719572?v=4"}, :body "; ClojureCLR doesn't use :append, use this instead\n(spit \"hi.txt\" \"Test 1\\n\" :file-mode System.IO.FileMode/Append)\n", :_id "5c032359e4b0ca44402ef5d5"}], :notes [{:author {:login "flyboarder", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147004?v=3"}, :updated-at 1469398101037, :created-at 1469398101037, :body "The only valid options for `spit` are `:append` and `:encoding`.", :_id "57953c55e4b0bafd3e2a04b6"} {:author {:login "didibus", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/601540?v=4"}, :updated-at 1585180895729, :created-at 1585180895729, :body "Valid options include:\n\n :append true to open stream in append mode\n :encoding string name of encoding to use, e.g. \\\"UTF-8\\\".", :_id "5e7bf0dfe4b087629b5a18c2"}], :arglists ["f content & options"], :doc "Opposite of slurp. Opens f with writer, writes content, then\n closes f. Options passed to clojure.java.io/writer.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/spit"} {:added "1.1", :ns "clojure.core", :name "future-done?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1297120552000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "future", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521df0"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "future-cancel", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1339251476000, :_id "542692ebf6e94c6970521df1"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "future?", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1339252213000, :_id "542692ebf6e94c6970521df2"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "future-cancelled?", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1339252225000, :_id "542692ebf6e94c6970521df3"}], :line 6536, :examples [{:updated-at 1339251719000, :created-at 1339251719000, :body "user=> (def f (future (Thread/sleep 5000) (inc 0)))\n\nuser=> (future-done? f) \nfalse\n\nuser=> (Thread/sleep 5000)\nnil\n\nuser=> (future-done? f)\ntrue\n\n", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :_id "542692d3c026201cdc326fb7"} {:updated-at 1339252193000, :created-at 1339252193000, :body ";; beware of cancellation !!!\n\nuser=> (def f (future (Thread/sleep 5000) (inc 0)))\n#'user/f\n\nuser=> (future-cancel f) \ntrue\n\nuser=> (future-cancelled? f) \ntrue\n\nuser=> (future-done? f) \ntrue\n\nuser=> @f \njava.util.concurrent.CancellationException (NO_SOURCE_FILE:0)", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :_id "542692d3c026201cdc326fb8"} {:updated-at 1669054840067, :created-at 1668769697257, :author {:login "sundaramss", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1131710?v=4"}, :body ";; removed unhelpful example", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/1131710?v=4", :account-source "github", :login "sundaramss"} {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :_id "637767a1e4b0b1e3652d7686"}], :notes [{:updated-at 1300164452000, :body "Future \"done\" returns true even for abnormal termination like being cancelled or throwing an exception.\r\n\r\nhttp://download.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html#isDone()", :created-at 1300164452000, :author {:login "pauldoo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5cb916d3c8abc9f45a093209e72489fb?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fb8"}], :arglists ["f"], :doc "Returns true if future f is done", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/future-done_q"} {:added "1.0", :ns "clojure.core", :name "*read-eval*", :type "var", :see-alsos [{:created-at 1352963695000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "read", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d50"} {:created-at 1352963701000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "read-string", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d51"} {:created-at 1352963704000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "load", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d52"}], :examples [{:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [{:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}], :body ";;just from the doc\n\n(binding [*read-eval* false] (read-string \"#=(eval (def x 3))\"))\n=> EvalReader not allowed when *read-eval* is false.\n [Thrown class java.lang.RuntimeException]\n\n;;remove the anonymous function:\n\n(binding [*read-eval* false] (read-string \"(def x 3)\"))\n=> (def x 3)\n\n;;which is evaluable\n\n(eval (binding [*read-eval* false] (read-string \"(def x 3)\")))\n=> #'user/x\n\nx\n=>3", :created-at 1327090750000, :updated-at 1327090760000, :_id "542692d1c026201cdc326f3a"}], :notes [{:body "This dynamic Var defines if `read` and `read-string` will be allowed to evaluate code using the eval reader `#=`. That said, the way that the eval reader will evaluate things within the context of reading is very strange, here are the rules (credit to p-himik from Slack):\n\nEvaluation done by `read` and `read-string` using the eval reader is very limited and supports only the following cases:\n\n1. The form is a symbol naming a Java class, `(read-string \"#=java.lang.String\")`\n2. The form is a list and the first symbol is a symbol\n 2. that is var and the next one is a fully qualified symbol, `(def x) (read-string \"#=(var user/x)\")`\n 2. that denotes a constructor calling, `(read-string \"#=(java.lang.String. \\\"x\\\")\")`\n 2. that denotes a static member calling, `(read-string \"#=(java.lang.Integer/parseInt \\\"1\\\")\")`\n 2. that names something in the current NS, and the rest are quoted entities, `(read-string \"#=(inc 1)\")`\n\nAs you can see, everything after the first symbol is left untouched. This makes the eval reader extremely limited by itself in comparison to normal eval, but you can use eval there to circumvent that: `(def x 1) (read-string \"#=(eval x)\")`\n\nTo be more clear, in the given example:\n\n```\n(read-string \"#=(+ 1 (+ 2 3))\")\n```\n\nEverything after the first `+` are read as if quoted, so the above is equivalent to:\n\n```\n(+ '1 '(+ 2 3))\n```\n\nWhich will throw an exception:\n\n> PersistentList cannot be cast to class java.lang.Number\n\nThat's why the trick if you want to use the eval reader to evaluate arbitrary code is to use `eval` inside it like so:\n\n```\n(read-string \"#=(eval (+ 1 (+ 2 3)))\")\n```\n\nWhich will even let you reference a value in the current context:\n\n```\n(def x 1)\n#=(eval (+ 1 x))\n;;=> 2\n```", :created-at 1627197824169, :updated-at 1627198605717, :author {:avatar-url "https://avatars.githubusercontent.com/u/601540?v=4", :account-source "github", :login "didibus"}, :_id "60fd1180e4b0b1e3652d751d"}], :arglists [], :doc "Defaults to true (or value specified by system property, see below)\n ***This setting implies that the full power of the reader is in play,\n including syntax that can cause code to execute. It should never be\n used with untrusted sources. See also: clojure.edn/read.***\n\n When set to logical false in the thread-local binding,\n the eval reader (#=) and record/type literal syntax are disabled in read/load.\n Example (will fail): (binding [*read-eval* false] (read-string \"#=(* 2 21)\"))\n\n The default binding can be controlled by the system property\n 'clojure.read.eval' System properties can be set on the command line\n like this:\n\n java -Dclojure.read.eval=false ...\n\n The system property can also be set to 'unknown' via\n -Dclojure.read.eval=unknown, in which case the default binding\n is :unknown and all reads will fail in contexts where *read-eval*\n has not been explicitly bound to either true or false. This setting\n can be a useful diagnostic tool to ensure that all of your reads\n occur in considered contexts. You can also accomplish this in a\n particular scope by binding *read-eval* to :unknown\n ", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*read-eval*"} {:added "1.0", :ns "clojure.core", :name "dorun", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1296708499000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "doall", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d8c"} {:created-at 1520117044268, :author {:login "finalfantasia", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/2316604?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "doseq", :ns "clojure.core"}, :_id "5a9b2534e4b0316c0f44f908"} {:created-at 1520117066852, :author {:login "finalfantasia", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/2316604?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "run!", :ns "clojure.core"}, :_id "5a9b254ae4b0316c0f44f909"}], :line 3133, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "fyquah95", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6006469?v=3"}], :body "user=> (dorun 5 (repeatedly #(println \"hi\")))\nhi\nhi\nhi\nhi\nhi\nhi\nnil", :created-at 1281092803000, :updated-at 1434450783133, :_id "542692c6c026201cdc326907"} {:updated-at 1335431834000, :created-at 1335431834000, :body "user=> (let [x (atom 0)]\n (dorun (take 10 (repeatedly #(swap! x inc))))\n @x)\n10", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692d2c026201cdc326f8e"} {:author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :editors [{:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"} {:login "orivej", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cab90c7de5efde92a29f1eacb603ba9a?r=PG&default=identicon"} {:login "orivej", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cab90c7de5efde92a29f1eacb603ba9a?r=PG&default=identicon"}], :body "user=> (dorun (map #(println \"hi\" %) [\"mum\" \"dad\" \"sister\"]))\nhi mum\nhi dad\nhi sister\nnil", :created-at 1343166324000, :updated-at 1362554649000, :_id "542692d2c026201cdc326f8f"} {:updated-at 1436247797064, :created-at 1436247797064, :author {:login "gdeer81", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1340575?v=3"}, :body ";;map a function which makes database calls over a vector of values \nuser=> (map #(db/insert :person {:name %}) [\"Fred\" \"Ethel\" \"Lucy\" \"Ricardo\"])\nJdbcSQLException The object is already closed [90007-170] org.h2.message.DbE\nxception.getJdbcSQLException (DbException.java:329)\n\n;;database connection was closed before we got a chance to do our transactions\n;;lets wrap it in dorun\nuser=> (dorun (map #(db/insert :person {:name %}) [\"Fred\" \"Ethel\" \"Lucy\" \"Ricardo\"]))\nDEBUG :db insert into person values name = 'Fred'\nDEBUG :db insert into person values name = 'Ethel'\nDEBUG :db insert into person values name = 'Lucy'\nDEBUG :db insert into person values name = 'Ricardo'\nnil", :_id "559b66f5e4b00f9508fd66f6"}], :notes [{:author {:login "finalfantasia", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/2316604?v=4"}, :updated-at 1520197531487, :created-at 1520115866563, :body "`clojure.core/run!` can take the place of `(dorun (map ...))`.", :_id "5a9b209ae4b0316c0f44f907"}], :arglists ["coll" "n coll"], :doc "When lazy sequences are produced via functions that have side\n effects, any effects other than those needed to produce the first\n element in the seq do not occur until the seq is consumed. dorun can\n be used to force any effects. Walks through the successive nexts of\n the seq, does not retain the head and returns nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/dorun"} {:added "1.9", :ns "clojure.core", :name "simple-symbol?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495715090890, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "symbol?", :ns "clojure.core"}, :_id "5926cd12e4b093ada4d4d75d"} {:created-at 1495715101981, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "qualified-symbol?", :ns "clojure.core"}, :_id "5926cd1de4b093ada4d4d75e"}], :line 1627, :examples [{:updated-at 1495723255240, :created-at 1495723255240, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body "(simple-symbol? 'symbol)\n;;=> true\n\n(simple-symbol? 'clojure.core/symbol)\n;;=> false\n\n(simple-symbol? \"string\")\n;;=> false\n(simple-symbol? 42)\n;;=> false\n(simple-symbol? nil)\n;;=> false", :_id "5926ecf7e4b093ada4d4d76a"}], :notes nil, :arglists ["x"], :doc "Return true if x is a symbol without a namespace", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/simple-symbol_q"} {:added "1.0", :ns "clojure.core", :name "disj", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1351063996000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "dissoc", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e31"} {:created-at 1351064021000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "disj!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e32"} {:created-at 1405367718000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "difference", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e33"} {:created-at 1561679596230, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "conj", :ns "clojure.core"}, :_id "5d1556ece4b0ca44402ef777"}], :line 1518, :examples [{:updated-at 1462050216483, :created-at 1280340321000, :body "user=> (disj #{1 2 3}) ; disjoin nothing \n#{1 2 3} \n\nuser=> (disj #{1 2 3} 2) ; disjoin 2\n#{1 3} \n\nuser=> (disj #{1 2 3} 4) ; disjoin non-existent item\n#{1 2 3} \n\nuser=> (disj #{1 2 3} 1 3) ; disjoin several items at once\n#{2}", :editors [{:avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon", :account-source "clojuredocs", :login "zmila"} {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "bkovitz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon", :account-source "clojuredocs", :login "zmila"}, :_id "542692cec026201cdc326dc6"} {:editors [{:login "Hamido-san", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/27916344?v=4"}], :body "user=> (apply disj #{1 2 3} [1 3]) ; disjoin keys in a coll\n#{2}", :author {:avatar-url "https://avatars2.githubusercontent.com/u/5283430?v=4", :account-source "github", :login "randomizedthinking"}, :created-at 1602141980639, :updated-at 1620639101734, :_id "5f7ebf1ce4b0b1e3652d73ce"}], :notes nil, :arglists ["set" "set key" "set key & ks"], :doc "disj[oin]. Returns a new set of the same (hashed/sorted) type, that\n does not contain key(s).", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/disj"} {:added "1.0", :ns "clojure.core", :name "*2", :file "clojure/core.clj", :type "var", :column 1, :see-alsos [{:created-at 1303109714000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "*1", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ad4"} {:created-at 1303109726000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "*3", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ad5"}], :dynamic true, :line 6284, :examples [{:updated-at 1285502123000, :created-at 1279048024000, :body "user=> \"Hello!\"\n\"Hello!\"\n\nuser=> \"Hello World!\"\n\"Hello World!\"\n\nuser=> [*1 *2]\n[\"Hello World!\" \"Hello!\"]\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692c7c026201cdc326960"}], :notes nil, :arglists [], :doc "bound in a repl thread to the second most recent value printed", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*2"} {:added "1.0", :ns "clojure.core", :name "eval", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1318930260000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "read-string", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ea3"}], :line 3210, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (def *foo* \"(println [1 2 3])\")\n#'user/*foo*\n\nuser=> *foo*\n\"(println [1 2 3])\"\n\nuser=> (eval *foo*) ; Notice eval'ing a string does not work.\n\"(println [1 2 3])\"\n\nuser=> (eval (read-string *foo*))\n[1 2 3]\nnil", :created-at 1280547525000, :updated-at 1332949962000, :_id "542692cec026201cdc326daf"} {:author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :editors [], :body "user=> (eval '(let [a 10] (+ 3 4 a)))\n17\n", :created-at 1308973342000, :updated-at 1308973342000, :_id "542692cec026201cdc326db1"} {:updated-at 1458054160560, :created-at 1458054160560, :author {:login "APOS80", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6387252?v=3"}, :body "(def x '(+ 2 3))\n(println x) \n=> (+ 2 3)\n(println (eval x))\n=> 5", :_id "56e82410e4b0507458dcf5a7"}], :notes [{:updated-at 1308973573000, :body "In normal code, `eval` is rarely used.", :created-at 1308973573000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fc2"} {:author {:login "eengebruiker", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/31795546?v=4"}, :updated-at 1521045003085, :created-at 1521045003085, :body "Once you get used to eval you will use it more often. You can make nifty things with it.", :_id "5aa94e0be4b0316c0f44f924"}], :arglists ["form"], :doc "Evaluates the form data structure (not text!) and returns the result.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/eval"} {:added "1.0", :ns "clojure.core", :name "cons", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1297212928000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "conj", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d54"} {:created-at 1617817312569, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "seq", :ns "clojure.core"}, :_id "606deee0e4b0b1e3652d74b4"}], :line 22, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"} {:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; prepend 1 to a list\n(cons 1 '(2 3 4 5 6))\n;;=> (1 2 3 4 5 6)\n\n;; notice that the first item is not expanded\n(cons [1 2] [4 5 6])\n;;=> ([1 2] 4 5 6)", :created-at 1279071078000, :updated-at 1420651535055, :_id "542692ccc026201cdc326c5b"} {:body ";; may return results of different types but always a seq\n(map (juxt identity type seq? list?)\n [(cons 1 nil)\n (cons 1 '())])\n;; => ([(1) clojure.lang.PersistentList true true] \n;; [(1) clojure.lang.Cons true false])\n", :author {:login "phalphalak", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/438136?v=3"}, :created-at 1425547438764, :updated-at 1425547666700, :editors [{:login "phalphalak", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/438136?v=3"}], :_id "54f820aee4b0b716de7a6530"} {:editors [{:login "TheCodingGent", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1191123?v=3"}], :body ";; Cons new-element into nested structures \"cons-in\"\n\n(def db {:users [{:name \"Eduardo\"}]})\n(def new-element {:name \"Eva\"})\n\n(assoc db :users (cons new-element (:users db)))\n;; => {:users ({:name \"Eva\"} {:name \"Eduardo\"})}", :author {:avatar-url "https://avatars.githubusercontent.com/u/782909?v=3", :account-source "github", :login "edcaceres"}, :created-at 1479822182560, :updated-at 1483975426262, :_id "58344b66e4b0782b632278c4"} {:updated-at 1486154226776, :created-at 1486154226776, :author {:login "belun", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/282287?v=3"}, :body "(defn zeros [] \n (lazy-seq (cons 0 (zeros))))\n;; \"cons\" does not realize second parameter, \n;; opening the world for recursive functions that create lazy sequences\n\n(first (zeroes))\n0\n\n(first (rest (zeroes)))\n0\n\n(first (rest (rest (zeroes))))\n0\n\n;; example stolen from youtuber : \n;; https://youtu.be/iaph8m63HQw?list=PLAC43CFB134E85266", :_id "5894e9f2e4b01f4add58fe3b"} {:editors [{:login "earthfail", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/21296448?v=4"}], :body ";; this example might not work\n;; conj behave differently with \"set\" like structures.\n\n(def a-set #{1 2 3})\n\n(conj a-set 3) ;; will add 3 to the set\n;; => #{1 3 2}\n\n(conj a-set 4)\n;; => #{1 4 3 2}\n\n(first (conj a-set 4))\n;; => 1", :author {:avatar-url "https://avatars2.githubusercontent.com/u/3019924?v=4", :account-source "github", :login "didiercrunch"}, :created-at 1527347046020, :updated-at 1621162590490, :_id "5b097766e4b045c27b7fac7b"}], :notes [{:body "useful for creating lazy sequences, because it does not need to realize the param \"seq\" (it just appends the whole thing to param \"x\"\n\nhttp://stackoverflow.com/questions/12389303/clojure-cons-vs-conj-with-lazy-seq", :created-at 1486153640658, :updated-at 1486153936827, :author {:avatar-url "https://avatars.githubusercontent.com/u/282287?v=3", :account-source "github", :login "belun"}, :_id "5894e7a8e4b01f4add58fe3a"}], :arglists ["x seq"], :doc "Returns a new seq where x is the first element and seq is\n the rest.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/cons"} {:added "1.0", :ns "clojure.core", :name "refer", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1327515389000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "refer-clojure", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f2c"} {:created-at 1351990184000, :author {:login "Mark Addleman", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/768de71b6c873394290733acf422b4d5?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ns", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f2d"}], :line 4217, :examples [{:author {:login "teyc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd6e62afb4881ab0f617611b8b65d003?r=PG&default=identicon"}, :editors [{:login "teyc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd6e62afb4881ab0f617611b8b65d003?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}], :body "user=> (refer 'clojure.string :only '[capitalize trim])\nnil\n\nuser=> (capitalize (trim \" hOnduRAS \"))\n\"Honduras\"", :created-at 1283925242000, :updated-at 1321967031000, :_id "542692cdc026201cdc326d0b"} {:author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :editors [{:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}], :body "user=> (refer 'clojure.string\n :rename '{capitalize cap, trim trm})\nWARNING: replace already refers to: #'clojure.core/replace in namespace: user, being replaced by: #'clojure.string/replace\nWARNING: reverse already refers to: #'clojure.core/reverse in namespace: user, being replaced by: #'clojure.string/reverse\nnil\n\nuser=> (cap (trm \" hOnduRAS \"))\n\"Honduras\"\n\nuser=> (join \\, [1 2 3])\n\"1,2,3\"", :created-at 1399370253000, :updated-at 1399636313000, :_id "542692d5c026201cdc32706a"} {:author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :editors [{:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"} {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}], :body ";;; `:only' accepts only original names.\n;; wrong\nuser=> (refer 'clojure.string\n :rename '{capitalize cap, trim trm}\n :only '[cap trm])\nIllegalAccessError cap does not exist clojure.core/refer (core.clj:3849)\n\n;; right\nuser=> (refer 'clojure.string\n :rename '{capitalize cap, trim trm}\n :only '[capitalize trim])\nnil\n\n;; work well\nuser=> (cap (trm \" hOnduRAS \"))\n\"Honduras\"\n\n;; and also, cannot use either of them.\nuser=> (join \\, [1 2 3])\nCompilerException java.lang.RuntimeException: Unable to resolve symbol: join in this context, compiling:(NO_SOURCE_PATH:1:1)", :created-at 1399370354000, :updated-at 1399662756000, :_id "542692d5c026201cdc32706c"}], :notes [{:author {:login "KingMob", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/946421?v=4"}, :updated-at 1671686270847, :created-at 1671686270847, :body "Warning: the referral of a var isn't transitive. \n\n`refer` only works with a var's original namespace.\n\nIf you refer `A/foo` from `B`, you can't then refer `B/foo` from `C`.\n\n`foo` it will appear in `B`'s `ns-map`, but not `ns-publics` or `ns-interns`, unintuitively.", :_id "63a3e87ee4b08cf8563f4b54"}], :arglists ["ns-sym & filters"], :doc "refers to all public vars of ns, subject to filters.\n filters can include at most one each of:\n\n :exclude list-of-symbols\n :only list-of-symbols\n :rename map-of-fromsymbol-tosymbol\n\n For each public interned var in the namespace named by the symbol,\n adds a mapping from the name of the var to the var to the current\n namespace. Throws an exception if name is already mapped to\n something else in the current namespace. Filters can be used to\n select a subset, via inclusion or exclusion, or to provide a mapping\n to a symbol different from the var's name, in order to prevent\n clashes. Use :use in the ns macro in preference to calling this directly.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/refer"} {:ns "clojure.core", :name "print-dup", :file "clojure/core.clj", :type "var", :column 1, :see-alsos [{:created-at 1300959285000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "print-ctor", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e2a"} {:created-at 1332539534000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "print-method", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e2b"}], :line 3666, :examples [{:author {:login "cdorrat", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5dedcb7069d39421760f6d255def10c3?r=PG&default=identicon"}, :editors [{:login "cdorrat", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5dedcb7069d39421760f6d255def10c3?r=PG&default=identicon"}], :body ";; print-dup can be used for basic serialization\n;; the following methods write/read clojure forms to/from a file\n\n(defn to-file\n \"Save a clojure form to a file\"\n [#^java.io.File file form]\n (with-open [w (java.io.FileWriter. file)]\n (print-dup form w)))\n \n(defn from-file\n \"Load a clojure form from file.\"\n [#^java.io.File file]\n (with-open [r (java.io.PushbackReader. (java.io.FileReader. file))]\n (read r)))", :created-at 1300104716000, :updated-at 1300104999000, :_id "542692cac026201cdc326b8c"} {:author {:login "cdorrat", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5dedcb7069d39421760f6d255def10c3?r=PG&default=identicon"}, :editors [], :body ";; print-dup is a multimethod, you can extend it to support new types.\n;; The following statement adds print-dup support to \n;; the java.util.Date class\n(defmethod print-dup java.util.Date [o w]\n (print-ctor o (fn [o w] (print-dup (.getTime o) w)) w)) ", :created-at 1300104973000, :updated-at 1300104973000, :_id "542692cac026201cdc326b8e"}], :notes [{:updated-at 1300480179000, :body "This is a multimethod that can be implemented to define the printing of various values when \\*print-dup\\* is bound to true.", :created-at 1299414938000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fb7"}], :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/print-dup"} {:ns "clojure.core", :name "-reset-methods", :file "clojure/core_deftype.clj", :type "function", :column 1, :see-alsos nil, :line 628, :examples nil, :notes nil, :arglists ["protocol"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/-reset-methods"} {:added "1.0", :ns "clojure.core", :name "floats", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1658139428172, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "float-array", :ns "clojure.core"}, :_id "62d53324e4b0b1e3652d7624"}], :line 5368, :examples [{:updated-at 1658139411698, :created-at 1658139411698, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; float-array will convert where possible\n(float-array [1 2 3]);; => [1.0, 2.0, 3.0]\n\n;; floats will not\n(try (floats [1 2 3])\n (catch ClassCastException e (ex-message e)))\n;; => \"clojure.lang.PersistentVector cannot be cast to [F\"", :_id "62d53313e4b0b1e3652d7623"} {:updated-at 1682271661910, :created-at 1682271661910, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; Casting avoids expensive reflection, so to see the benefit, enable warning:\n(set! *warn-on-reflection* true)\n\n;; We'll def a float-array but won't type-hint the var:\n(def my-array (float-array [10.0 20.0 30.0 40.0 50.0 60.0]))\n\n;; and try to amap over it without using `floats` or type hinting:\n(amap my-array i _ (unchecked-float (unchecked-inc (aget my-array i))))\n;; Reflection warning… call to static method alength on clojure.lang.RT can't be resolved (argument types: unknown).\n;; Reflection warning… call to static method aclone on clojure.lang.RT can't be resolved (argument types: unknown).\n;; Reflection warning… call to static method aget on clojure.lang.RT can't be resolved (argument types: unknown, int).\n;; Reflection warning… call to static method aset on clojure.lang.RT can't be resolved (argument types: unknown, int, float).\n;; => [11.0, 21.0, 31.0, 41.0, 51.0, 61.0]\n\n;; We can use `floats` to avoid reflection:\n(amap (floats my-array) i _ (unchecked-float (unchecked-inc (aget (floats my-array) i))))\n;; => [11.0, 21.0, 31.0, 41.0, 51.0, 61.0]\n\n;; Just as we can type hint in place:\n(amap ^floats my-array i _ (unchecked-float (unchecked-inc (aget ^floats my-array i))))\n;; => [11.0, 21.0, 31.0, 41.0, 51.0, 61.0]\n\n;; Or type hint the var:\n(def ^\"[F\" my-array (float-array [10 20 30 40 50 60]))\n(amap my-array i _ (unchecked-float (unchecked-inc (aget my-array i))))\n;; => [11.0, 21.0, 31.0, 41.0, 51.0, 61.0]\n", :_id "64456dade4b08cf8563f4b93"}], :notes nil, :arglists ["xs"], :doc "Casts to float[]", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/floats"} {:added "1.0", :ns "clojure.core", :name "pos?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1345518606000, :author {:login "cbare", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b394e97f24f3576861239e2b839703a4?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "neg?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e09"} {:created-at 1400618875000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "zero?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e0a"} {:created-at 1587669222475, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nat-int?", :ns "clojure.core"}, :_id "5ea1e8e6e4b087629b5a18e1"} {:created-at 1609194007084, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pos-int?", :ns "clojure.core"}, :_id "5fea5a17e4b0b1e3652d7424"}], :line 1247, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/7412474?v=3", :account-source "github", :login "Lacty"}], :body "user=> (pos? 1)\ntrue\nuser=> (pos? 0)\nfalse\nuser=> (pos? -1)\nfalse", :created-at 1279074734000, :updated-at 1471000907146, :_id "542692cdc026201cdc326cff"} {:updated-at 1471000959608, :created-at 1471000959608, :author {:login "Lacty", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7412474?v=3"}, :body "user=> (pos? 0.1)\ntrue\nuser=> (pos? -0.1)\nfalse", :_id "57adb17fe4b0bafd3e2a04ec"} {:updated-at 1598394302046, :created-at 1598394302046, :author {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}, :body "user=> (pos? 1/2)\n;; true\n\nuser=> (pos? -1/2)\n;; false\n\nuser=> (pos? {})\n;; Execution error (ClassCastException) at user/eval3795 (REPL:1).\n;; clojure.lang.PersistentArrayMap cannot be cast to java.lang.Number", :_id "5f458fbee4b0b1e3652d73ab"}], :notes nil, :arglists ["num"], :doc "Returns true if num is greater than zero, else false", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/pos_q"} {:added "1.2", :ns "clojure.core", :name "fnil", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1548717313952, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "partial", :ns "clojure.core"}, :_id "5c4f8d01e4b0ca44402ef656"} {:created-at 1548717329309, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "comp", :ns "clojure.core"}, :_id "5c4f8d11e4b0ca44402ef657"} {:created-at 1548717337353, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "juxt", :ns "clojure.core"}, :_id "5c4f8d19e4b0ca44402ef658"} {:created-at 1608656139520, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "or", :ns "clojure.core"}, :_id "5fe2250be4b0b1e3652d741a"} {:created-at 1609357960896, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "some-fn", :ns "clojure.core"}, :_id "5fecda88e4b0b1e3652d7426"}], :line 6556, :examples [{:author {:login "looselytyped", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9bfc2e772db334c8b8516c86b9da7a0c?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :body ";; a function that expects a non-nil value\n(defn say-hello [name] (str \"Hello \" name))\n;;=> #'user/say-hello\n\n;; fnil lets you create another function with a default\n;; arg in case it is passed a nil\n(def say-hello-with-defaults (fnil say-hello \"World\"))\n;;=> #'user/say-hello-with-defaults\n\n;; the happy path works as you would expect\n(say-hello-with-defaults \"Sir\")\n;;=> \"Hello Sir\"\n\n;; but in the case that the function is passed a nil it will use the \n;; default supplied to fnil\n(say-hello-with-defaults nil)\n;;=> \"Hello World\"\n\n;; this works with different arities too\n(defn say-hello [first other] (str \"Hello \" first \" and \" other))\n;;=> #'user/say-hello\n\n;; lets create it with defaults\n(def say-hello-with-defaults (fnil say-hello \"World\" \"People\"))\n;;=> #'user/say-hello-with-defaults\n\n;; call the function with all nil args - notice it uses the defaults\n;; supplied to fnil\n(say-hello-with-defaults nil nil)\n;;=> \"Hello World and People\"\n\n;; any of the args can be nil - the function will supply \n;; the default supplied with fnil\n(say-hello-with-defaults \"Sir\" nil)\n;;=> \"Hello Sir and People\"\n\n;; and again - notice that \"World\" is the default here\n(say-hello-with-defaults nil \"Ma'am\")\n;;=> \"Hello World and Ma'am\"\n\n;; or pass all args \n(say-hello-with-defaults \"Sir\" \"Ma'am\")\n;;=> \"Hello Sir and Ma'am\"\n", :created-at 1284845008000, :updated-at 1412880276286, :_id "542692cdc026201cdc326ce4"} {:body ";; Treat nil as 0 for the purposes of incrementing\n((fnil inc 0) nil)\n;;=> 1\n;; While the following would not work:\n(inc nil)\n;;=> NullPointerException clojure.lang.Numbers.ops (Numbers.java:961)\n\n;; fnil is very useful for specifying default values when updating maps\n;; For a map containing counters of keys:\n(update-in {:a 1} [:a] inc)\n;;=> {:a 2}\n\n;; Oops, our map does not have a key :b and update-in passes nil to inc\n(update-in {:a 1} [:b] inc)\n;;=> NullPointerException clojure.lang.Numbers.ops (Numbers.java:961)\n\n;; But if we use fnil it works:\n(update-in {:a 1} [:b] (fnil inc 0))\n;;=> {:b 1, :a 1}\n\n;; Another example is when map values are collections and we don't want\n;; default behavior of conj with nil that produces a list\n(conj nil 1)\n;;=> (1)\n;; I.e.\n(update-in {} [:a] conj 1)\n;;=> {:a (1)}\n\n;; But say we want map values to be vectors instead:\n(update-in {} [:a] (fnil conj []) 1)\n;;=> {:a [1]}", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1422935102507, :updated-at 1422935102507, :_id "54d0443ee4b0e2ac61831cf7"} {:editors [{:login "KyleErhabor", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/40676441?v=4"}], :body ";;; Note that `fnil` still requires the appropriate number of arguments for an\n;;; arity (i.e. no \"implicit\" default)\n\n(def tempids {-1 1\n -2 2\n -3 3})\n\n(def id (fnil get nil -1))\n\n;; You may expect `fnil` to implicitly add -1 as the last argument, but that's\n;; not true.\n(id tempids)\n;;=> ArityException: Wrong number of args (1) passed to: clojure.core/fnil/fn--...\n\n;; But it will here, since the argument is there (as `nil`).\n(id tempids nil)\n;;=> 1\n\n;; Of course, you can supply it explicitly.\n(id tempids -1)\n;;=> 1", :author {:avatar-url "https://avatars.githubusercontent.com/u/40676441?v=4", :account-source "github", :login "KyleErhabor"}, :created-at 1642980269186, :updated-at 1642980293301, :_id "61ede3ade4b0b1e3652d75a1"}], :notes nil, :arglists ["f x" "f x y" "f x y z"], :doc "Takes a function f, and returns a function that calls f, replacing\n a nil first argument to f with the supplied value x. Higher arity\n versions can replace arguments in the second and third\n positions (y, z). Note that the function f can take any number of\n arguments, not just the one(s) being nil-patched.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/fnil"} {:added "1.0", :ns "clojure.core", :name "merge-with", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1294676734000, :author {:login "Nebulus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/61aa4140c24b0cded6b20d88200e7f16?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "merge", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e16"}], :line 3051, :examples [{:author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :editors [{:login "nipra", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/142529?v=3"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/39192?v=3", :account-source "github", :login "mlanza"}], :body "(merge-with into\n\t {\"Lisp\" [\"Common Lisp\" \"Clojure\"]\n\t \"ML\" [\"Caml\" \"Objective Caml\"]}\n\t {\"Lisp\" [\"Scheme\"]\n\t \"ML\" [\"Standard ML\"]})\n;;=> {\"Lisp\" [\"Common Lisp\" \"Clojure\" \"Scheme\"], \"ML\" [\"Caml\" \"Objective Caml\" \"Standard ML\"]}", :created-at 1279052705000, :updated-at 1495768299408, :_id "542692cec026201cdc326dce"} {:author {:login "fogus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5aa24eee4238e1e964210ed447e8dc91?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; merge two maps using the addition function\n\n(merge-with + \n {:a 1 :b 2}\n {:a 9 :b 98 :c 0}) \n;;=> {:c 0, :a 10, :b 100}", :created-at 1279058935000, :updated-at 1422375185880, :_id "542692cec026201cdc326dd1"} {:updated-at 1422375228363, :created-at 1279059124000, :body ";; 'merge-with' works with an arbitrary number of maps:\n\n(merge-with + \n {:a 1 :b 2}\n {:a 9 :b 98 :c 0}\n {:a 10 :b 100 :c 10}\n {:a 5}\n {:c 5 :d 42})\n \n;;=> {:d 42, :c 15, :a 25, :b 200}", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"} {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"} {:avatar-url "https://www.gravatar.com/avatar/5aa24eee4238e1e964210ed447e8dc91?r=PG&default=identicon", :account-source "clojuredocs", :login "fogus"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :author {:avatar-url "https://www.gravatar.com/avatar/5aa24eee4238e1e964210ed447e8dc91?r=PG&default=identicon", :account-source "clojuredocs", :login "fogus"}, :_id "542692cec026201cdc326dd3"} {:author {:login "jaley", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d8dc27aff613e5972bb6af8521a07891?r=PG&default=identicon"}, :editors [{:login "Iceland_jack", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c889e0a95a3bb07f90ab28ad442f1127?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; Use union to merge sets of elements\n(use 'clojure.set)\n(merge-with union\n {:a #{1 2 3}, :b #{4 5 6}}\n {:a #{2 3 7 8}, :c #{1 2 3}})\n\n;;=> {:c #{1 2 3}, :a #{1 2 3 7 8}, :b #{4 5 6}}", :created-at 1325882151000, :updated-at 1422375252797, :_id "542692d4c026201cdc32700f"} {:body ";; Demonstrating difference between merge and merge-with\n\n;; For merge the value from the right-most map wins:\n(merge {:a 1} {:a 2} {:a 3})\n;;=> {:a 3}\n\n;; while for merge-with values are merged (with function + in this example):\n(merge-with + {:a 1} {:a 2} {:a 3})\n;;=> {:a 6}", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1422935798019, :updated-at 1423014440333, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :_id "54d046f6e4b0e2ac61831cf8"} {:body ";; Use merge-with and merge to merge values that are one level deep maps.\n\n(merge-with merge {:x {:y 1}} {:x {:z 2}})\n;;=> {:x {:z 2, :y 1}}\n\n;; Deeper maps are not merged:\n(merge-with merge {:x {:y {:a 1}}} {:x {:y {:b 2}}})\n;;=>{:x {:y {:b 2}}}", :author {:login "dmos62", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2715476?v=3"}, :created-at 1427644396920, :updated-at 1427644529515, :editors [{:login "dmos62", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2715476?v=3"}], :_id "55181fece4b08eb9aa0a8d3c"} {:updated-at 1448314167339, :created-at 1448313757814, :author {:login "mlanza", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/39192?v=3"}, :body ";;Use into to avoid losing the shape (i.e. a vector) of the original data:\n(merge-with into\n\t {\"Lisp\" [\"Common Lisp\" \"Clojure\"]\n\t \"ML\" [\"Caml\" \"Objective Caml\"]}\n\t {\"Lisp\" [\"Scheme\"]\n\t \"ML\" [\"Standard ML\"]})\n;;=> {\"Lisp\" [\"Common Lisp\" \"Clojure\" \"Scheme\"], \"ML\" [\"Caml\" \"Objective Caml\" \"Standard ML\"]}\n\n;;No need to use type-specific verbs such as union:\n(merge-with into\n {:a #{1 2 3}, :b #{4 5 6}}\n {:a #{2 3 7 8}, :c #{1 2 3}})\n;;=> {:c #{1 2 3}, :a #{1 2 3 7 8}, :b #{4 5 6}}", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/39192?v=3", :account-source "github", :login "mlanza"}], :_id "5653839de4b0be225c0c4799"} {:editors [{:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}], :body ";; Note that merge-with is fundamentally additive, which can have unintuitive\n;; consequences if you are using a subtractive operation.\n(require '[clojure.set :as set])\n\n;; Subtract members of one set from another with the same keys:\n\n(merge-with set/difference {:a #{1 2 3}} {:a #{1}})\n;;=> {:a #{3 2}}\n\n(merge-with set/difference {:a #{1 2 3} :b #{2}} {:a #{1} :b #{4}})\n;;=> {:a #{3 2}, :b #{2}}\n\n;; If a key in the second map doesn't occur in the first, (merge-with) will \n;; simply copy it as in (merge), and the passed-in function will not be called:\n\n(merge-with set/difference {:a #{1 2 3}} {:a #{1} :z #{4}})\n;;=> {:a #{3 2}, :z #{4}}\n\n;; The solution in this case is to ensure that both maps have the same keys:\n\n(merge-with set/difference {:a #{1 2 3} :z #{}} {:a #{1} :z #{4}})\n;;=> {:a #{3 2}, :z #{}}", :author {:avatar-url "https://avatars.githubusercontent.com/u/94482?v=3", :account-source "github", :login "timgilbert"}, :created-at 1488321014610, :updated-at 1488321184789, :_id "58b5f9f6e4b01f4add58fe67"} {:updated-at 1535151143457, :created-at 1535149114035, :author {:login "dijonkitchen", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4"}, :body "(defn deep-merge-with\n \"Like merge-with, but merges maps recursively, applying the given fn\n only when there's a non-map at a particular level.\n (deep-merge-with + {:a {:b {:c 1 :d {:x 1 :y 2}} :e 3} :f 4}\n {:a {:b {:c 2 :d {:z 9} :z 3} :e 100}})\n -> {:a {:b {:z 3, :c 3, :d {:z 9, :x 1, :y 2}}, :e 103}, :f 4}\"\n [f & maps]\n (apply\n (fn m [& maps]\n (if (every? map? maps)\n (apply merge-with m maps)\n (apply f maps)))\nmaps))\n\n(deep-merge-with + {:a {:b {:c 1 :d {:x 1 :y 2}} :e 3} :f 4}\n {:a {:b {:c 2 :d {:z 9} :z 3} :e 100}})\n;; {:a {:b {:z 3, :c 3, :d {:z 9, :x 1, :y 2}}, :e 103}, :f 4}\n\n(deep-merge-with + {:foo {:bar {:baz 1}}}\n {:foo {:bar {:baz 6 :qux 42}}})\n;; {:foo {:bar {:baz 7, :qux 42}}}\n\n;; Source: https://clojure.github.io/clojure-contrib/map-utils-api.html#clojure.contrib.map-utils/deep-merge-with", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4", :account-source "github", :login "dijonkitchen"}], :_id "5b80843ae4b00ac801ed9e74"} {:updated-at 1590172835865, :created-at 1590172728020, :author {:login "themustafabasit", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/24441401?v=4"}, :body "\n;; I will be explaining it From java perspective\n\n;; merge-with is like conflict resolver function that \n;; we have in java - map.merge(key, val, (v1, v2)-> ...... )\n\n;; resolve conflict by discarding second value\n(defn conflict-resolver\n [v1 v2]\n (println \"conflict is between these values: \" v1 v2 ) \n v1)\n\n(merge-with conflict-resolver\n {:a 2 :b 4 :c 5}\n {:a 1}\n {:a 9 :b 3 :c 10 :d 3})\n;; => conflict is between these values: 2 1 - a,a\n;; conflict is between these values: 2 9 - new a, a\n;; conflict is between these values: 4 3 - b,b\n;; conflict is between these values: 5 10 - c,c\n;; {:a 2, :b 4, :c 5, :d 3}\n\n\n;; example - 2\n\n;; resolve conflict by adding both values\n(defn conflict-resolver\n [v1 v2]\n (println \"conflict is between these values: \" v1 v2)\n (+ v1 v2))\n\n(merge-with conflict-resolver\n {:a 2 :b 4 :c 5}\n {:a 1}\n {:a 9 :b 3 :c 10 :d 3})\n;; => conflict is between these values: 2 1 - a,a\n;; conflict is between these values: 3 9 - new a, a\n;; conflict is between these values: 4 3 - b,b\n;; conflict is between these values: 5 10 - c,c\n;; {:a 12, :b 7, :c 15, :d 3}\n\n", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/24441401?v=4", :account-source "github", :login "themustafabasit"}], :_id "5ec81c38e4b087629b5a1912"} {:updated-at 1637867197307, :created-at 1637867197307, :author {:login "joshuamzm", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10285345?v=4"}, :body ";; deep-merge version of clojure.core/merge\n\n(defn deep-merge [& maps]\n (letfn [(reconcile-keys [val-in-result val-in-latter]\n (if (and (map? val-in-result)\n (map? val-in-latter))\n (merge-with reconcile-keys val-in-result val-in-latter)\n val-in-latter))\n (reconcile-maps [result latter]\n (merge-with reconcile-keys result latter))]\n (reduce reconcile-maps maps)))\n\n(deep-merge\n {:a 1 :b {:c {:g 99} :d 3}}\n {:a 10 :b {:c {:g 98} :e 4}}\n {:a 100 :b {:c {:g 97} :e 40 :f 5}})\n\n;; => {:a 100, :b {:c {:g 97}, :d 3, :e 40, :f 5}}\n\n;; Take into account processing latter maps with non-maps values \"override\"\n;; previously seen map values.\n\n(deep-merge\n {:deep {:deeep {:a 1}}}\n {:deep {:deeep {:b 2}}}\n {:a 34 :deep 8 :v 3})\n\n;; => {:deep 8, :a 34, :v 3}\n\n;; We decided to define reconcile-maps, which is the then-branch expression\n;; of the if within reconcile-keys. This way, using reduce will throw errors\n;; as when using merge-with with non-map arguments.\n\n(deep-merge 1 {:a 1})\n\n;; IllegalArgumentException contains? not supported on type: java.lang.Long ...\n\n(deep-merge {:a 1} 2)\n\n;; IllegalArgumentException Don't know how to create ISeq from: java.lang.Long ...\n\n\n\n;; Reviewed and help received from github.com/datz", :_id "619fdebde4b0b1e3652d757a"}], :notes nil, :arglists ["f & maps"], :doc "Returns a map that consists of the rest of the maps conj-ed onto\n the first. If a key occurs in more than one map, the mapping(s)\n from the latter (left-to-right) will be combined with the mapping in\n the result by calling (f val-in-result val-in-latter).", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/merge-with"} {:added "1.3", :ns "clojure.core", :name "nthrest", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1356088808000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "drop", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ddb"} {:created-at 1356088885000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "nthnext", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ddc"} {:created-at 1356088888000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "nth", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ddd"} {:created-at 1505013505146, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "rest", :ns "clojure.core"}, :_id "59b4af01e4b09f63b945ac68"} {:created-at 1505013511258, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "next", :ns "clojure.core"}, :_id "59b4af07e4b09f63b945ac69"}], :line 3174, :examples [{:author {:login "jmglov", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/67e9a6f766dc4b30bd5e9ff3e77c1777?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(nthrest (range 10) 5)\n;;=> (5 6 7 8 9)\n\n;; in many cases gives the same result as nthnext\n(nthnext (range 10) 5)\n;;=> (5 6 7 8 9)\n\n;; here is a case where the results differ\n(nthrest [] 3) ;;=> []\n(nthnext [] 3) ;;=> nil\n\n(nthrest [1 2 3 4 5 6 7] 4)\n;;=> (5 6 7)", :created-at 1338817014000, :updated-at 1420737060810, :_id "542692d4c026201cdc327021"} {:body ";; drop is also similar, but lazy \n(nthrest (range 10) 5) ;;=> (5 6 7 8 9)\n(drop 5 (range 10)) ;;=> (5 6 7 8 9)\n\n;; here is a case where the results differ\n(nthrest [] 3) ;;=> []\n(drop 3 []) ;;=> () ; returning a lazy sequence", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1420737465554, :updated-at 1420737465554, :_id "54aebbb9e4b0e2ac61831c98"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; nthrest eagerly evaluates the dropped items:\n\n(def a (nthrest (map #(do (print \".\") %) (iterate inc 0)) 10))\n;; ..........#'user/a (note: processing already started)\n\n(def b (drop 10 (map #(do (print \".\") %) (iterate inc 0))))\n;; #'user/b (note: no evaluation)\n\n;; Possible use: always produce side effects (if any) independently \n;; from evaluation of kept items.", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1521467358474, :updated-at 1521467381232, :_id "5aafbfdee4b0316c0f44f92d"} {:updated-at 1661527937101, :created-at 1661527937101, :author {:login "jimka2001", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6414129?v=4"}, :body ";; nthrest returns a suffix of the given sequence", :_id "6308e781e4b0b1e3652d7652"}], :notes [{:updated-at 1356088840000, :body "This differs from clojure.core/drop in that it immediately drops the head of the seq, instead of doing so on the first call to first or seq.", :created-at 1356088381000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :_id "542692edf6e94c6970521ff9"}], :arglists ["coll n"], :doc "Returns the nth rest of coll, coll when n is 0.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/nthrest"} {:added "1.0", :ns "clojure.core", :name "load", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1286271399000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "load-file", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c29"} {:created-at 1352963712000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "*read-eval*", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c2a"} {:created-at 1519290672082, :author {:login "witek", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/209520?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "load-string", :ns "clojure.core"}, :_id "5a8e8930e4b0316c0f44f8ea"}], :line 6109, :examples [{:updated-at 1546453955894, :created-at 1307936370000, :body ";; file located at src/address_book/core.clj and current namespace\n;; located at root of the classpath, such as \"user\".\n\n(load \"address_book/core\")", :editors [{:avatar-url "https://www.gravatar.com/avatar/1c0c20072f52de3a6335cae183b865f6?r=PG&default=identicon", :account-source "clojuredocs", :login "lambder"} {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/1c0c20072f52de3a6335cae183b865f6?r=PG&default=identicon", :account-source "clojuredocs", :login "lambder"}, :_id "542692cbc026201cdc326c1b"} {:updated-at 1546454215490, :created-at 1546454215490, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Loading from root of the classpath, such as user namespace\n\n(ns user)\n(load \"/clojure/set\")\n;; nil\n\n;; Loading \"clojure/xml.clj\" from a relative location in the classpath \n;; does not want the \"/\"\n\n(ns clojure.set)\n(load \"xml\")\n;; nil", :_id "5c2d04c7e4b0ca44402ef60b"}], :notes nil, :arglists ["& paths"], :doc "Loads Clojure code from resources in classpath. A path is interpreted as\n classpath-relative if it begins with a slash or relative to the root\n directory for the current namespace otherwise.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/load"} {:added "1.0", :ns "clojure.core", :name "if-not", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1334293416000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "if", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e44"} {:created-at 1374149749000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "when-not", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e45"}], :line 767, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (defn has-neg [coll] \n (if-not (empty? coll) ;; = (if (not (empty? coll)) ...\n (or (neg? (first coll)) (recur (rest coll)))))\n#'user/has-neg\n\nuser=> (has-neg [])\nnil \n\nuser=> (has-neg [1 2 -3 4])\ntrue", :created-at 1280505406000, :updated-at 1332951095000, :_id "542692c6c026201cdc32692d"} {:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (if-not (zero? 0) :then :else)\n:else", :created-at 1280506136000, :updated-at 1332951114000, :_id "542692c6c026201cdc32692f"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; See examples for \"if\" explaining Clojure's idea of logical true\n;; and logical false.", :created-at 1334293411000, :updated-at 1334293411000, :_id "542692d3c026201cdc326fcd"}], :macro true, :notes nil, :arglists ["test then" "test then else"], :doc "Evaluates test. If logical false, evaluates and returns then expr, \n otherwise else expr, if supplied, else nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/if-not"} {:ns "clojure.core", :name "*verbose-defrecords*", :file "clojure/core_print.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 39, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*verbose-defrecords*"} {:added "1.0", :ns "clojure.core", :name "sequential?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1304804232000, :author {:login "0x89", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/56bc4acd59315ed4dc1cb99c3be71102?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "seq?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d22"} {:created-at 1304804263000, :author {:login "0x89", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/56bc4acd59315ed4dc1cb99c3be71102?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "coll?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d23"} {:created-at 1521067928760, :author {:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "seqable?", :ns "clojure.core"}, :_id "5aa9a798e4b0316c0f44f925"}], :line 6250, :examples [{:updated-at 1437503203443, :created-at 1284875508000, :body "user=> (sequential? '(1 2 3))\ntrue\n\nuser=> (sequential? [1 2 3])\ntrue\n\nuser=> (sequential? (range 1 5))\ntrue\n\nuser=> (sequential? '())\ntrue\n\nuser=> (sequential? [])\ntrue\n\nuser=> (sequential? nil)\nfalse\n\nuser=> (sequential? 1)\nfalse\n\nuser=> (sequential? \"abc\")\nfalse\n\nuser=> (sequential? {:a 2 :b 1})\nfalse\n\nuser=> (sequential? #{1 2 3})\nfalse", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"} {:avatar-url "https://www.gravatar.com/avatar/65f765955a0a25d112d33528ae6f811b?r=PG&default=identicon", :account-source "clojuredocs", :login "pmbauer"} {:login "lijunle", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1296500?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/e2051c4ebaaa8c22fa9c0bb2f32f64fd?r=PG&default=identicon", :account-source "clojuredocs", :login "rustem.suniev"}, :_id "542692c6c026201cdc3268f4"} {:updated-at 1660931114232, :created-at 1660931114232, :author {:login "KGOH", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/11963737?v=4"}, :body ";; Be careful while traversing data:\n;; map entries are vectors and thus sequential!\n\nuser=> (sequential? (first {:a 1}))\ntrue\n\nuser=> (sequential? (clojure.lang.MapEntry. :a 1))\ntrue\n\nuser=> (vector? (first {:a 1}))\ntrue\n\nuser=> (vector? (clojure.lang.MapEntry. :a 1))\ntrue\n\nuser=> (clojure.walk/postwalk\n #(cond-> % (sequential? %) set)\n {:a [1 1 2 3]})\n; Unhandled java.lang.ClassCastException\n; class clojure.lang.PersistentHashSet cannot be cast to class\n; java.util.Map$Entry (clojure.lang.PersistentHashSet is in unnamed module of\n; loader 'app'; java.util.Map$Entry is in module java.base of loader\n; 'bootstrap')\n\nuser=> (clojure.walk/postwalk\n #(cond-> %\n (and (sequential? %)\n (not (map-entry? %)))\n set)\n {:a [1 1 2 3]})\n{:a #{1 3 2}}\n", :_id "62ffcc2ae4b0b1e3652d763f"}], :notes [{:author {:login "zackteo", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/7510179?v=4"}, :updated-at 1603928204513, :created-at 1603927987239, :body "Of the four key collection types, vectors and lists are ordered (aka sequential). Sets and maps are not.", :_id "5f99ffb3e4b0b1e3652d73f9"}], :arglists ["coll"], :doc "Returns true if coll implements Sequential", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/sequential_q"} {:added "1.0", :ns "clojure.core", :name "*print-level*", :file "clojure/core_print.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 27, :examples [{:body "user=> *print-level*\nnil\nuser=> [1 [2 [3]]]\n[1 [2 [3]]]\n\nuser=> (set! *print-level* 2)\n2\nuser=> [1 [2 [3]]]\n[1 [2 #]]", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423526085099, :updated-at 1423526085099, :_id "54d948c5e4b081e022073c7f"}], :notes nil, :arglists [], :doc "*print-level* controls how many levels deep the printer will\n print nested objects. If it is bound to logical false, there is no\n limit. Otherwise, it must be bound to an integer indicating the maximum\n level to print. Each argument to print is at level 0; if an argument is a\n collection, its items are at level 1; and so on. If an object is a\n collection and is at a level greater than or equal to the value bound to\n *print-level*, the printer prints '#' to represent it. The root binding\n is nil indicating no limit.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*print-level*"} {:added "1.2", :ns "clojure.core", :name "shuffle", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1434034887985, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:ns "clojure.core", :name "rand-nth", :library-url "https://github.com/clojure/clojure"}, :_id "5579a2c7e4b03e2132e7d18b"} {:created-at 1554235245442, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "random-sample", :ns "clojure.core"}, :_id "5ca3bf6de4b0ca44402ef6fa"}], :line 7274, :examples [{:updated-at 1578337855496, :created-at 1282319846000, :body ";; Make five permutations of the [1 2 3] vector.\n;; Always returns a vector.\n(repeatedly 5 (partial shuffle [1 2 3]))\n;;=> ([2 3 1] [2 1 3] [2 3 1] [3 2 1] [3 1 2])\n\n(shuffle (list 1 2 3))\n;;=> [2 1 3]", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"} {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon", :account-source "clojuredocs", :login "pkolloch"}, :_id "542692cac026201cdc326b48"}], :notes nil, :arglists ["coll"], :doc "Return a random permutation of coll", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/shuffle"} {:added "1.1", :ns "clojure.core", :name "boolean-array", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 5285, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}], :body ";; create an array of Java boolean's using boolean-array\n;; and demonstrate that it can be used for input into the standard\n;; Java Arrays.fill function\n\nuser=> (def bs (boolean-array (map even? (range 3 10))))\n#'user/bs\nuser=> (type bs)\n[Z\nuser=> (vec bs)\n[false true false true false true false]\nuser=> (java.util.Arrays/fill bs 3 7 false)\nnil\nuser=> (vec bs)\n[false true false false false false false]\nuser=>", :created-at 1313908154000, :updated-at 1313963403000, :_id "542692c7c026201cdc326947"}], :notes nil, :arglists ["size-or-seq" "size init-val-or-seq"], :doc "Creates an array of booleans", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/boolean-array"} {:added "1.0", :ns "clojure.core", :name "find", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1360286923000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "get", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e77"} {:created-at 1360286926000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "get-in", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e78"} {:created-at 1527108492940, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "contains?", :ns "clojure.core"}, :_id "5b05d38ce4b045c27b7fac76"} {:created-at 1548452405616, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "select-keys", :ns "clojure.core"}, :_id "5c4b8235e4b0ca44402ef62d"}], :line 1534, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "alexander-yakushev", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/468477?v=2"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"}], :body "(find {:a 1 :b 2 :c 3} :a)\n;;=> [:a 1]\n\n(find {:a nil} :a)\n;;=> [:a nil]\n\n(find {:a 1 :b 2 :c 3} :d)\n;;=> nil \n", :created-at 1280345792000, :updated-at 1548452497936, :_id "542692cfc026201cdc326e3e"} {:author {:login "Nevena", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fa0e495ccb6ed2997e14f687817e9299?r=PG&default=identicon"}, :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"} {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :body ";; Note for these examples: as the authoritative documentation speaks only about\n;; map (as first parameter), passing anything else (e.g. a vector, like below)\n;; uses an undocumented behavior, which can change anytime and so is unreliable and\n;; should be avoided.\n\nuser=> (find [:a :b :c :d] 2)\n[2 :c]\n\nuser=> (find [:a :b :c :d] 5)\nnil\n\nuser=> (find [1 2 3] 4294967296)\n[4294967296 1]", :created-at 1305594606000, :updated-at 1582483198869, :_id "542692cfc026201cdc326e3f"}], :notes nil, :arglists ["map key"], :doc "Returns the map entry for key, or nil if key not present.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/find"} {:added "1.0", :ns "clojure.core", :name "alength", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1512468544768, :author {:login "tentamen", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/58513?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "into-array", :ns "clojure.core"}, :_id "5a267040e4b0a08026c48ccc"}], :line 3898, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [], :body "user=> (def my-array (into-array Integer/TYPE [1 2 3]))\n#'user/my-array\n\nuser=> (alength my-array)\n3", :created-at 1286508271000, :updated-at 1286508271000, :_id "542692cfc026201cdc326e13"} {:editors [{:login "zezhenyan", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8064559?v=3"}], :body "2D simple array example\nuser=> (def a (to-array-2d [[1 2] [3 4 5] [1]]))\n#'user/a\nuser=> (alength a)\n3\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/8064559?v=3", :account-source "github", :login "zezhenyan"}, :created-at 1486712507911, :updated-at 1486712552508, :_id "589d6ebbe4b01f4add58fe42"}], :notes nil, :arglists ["array"], :doc "Returns the length of the Java array. Works on arrays of all\n types.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/alength"} {:added "1.0", :ns "clojure.core", :name "bit-xor", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1414514653495, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "bit-and", :library-url "https://github.com/clojure/clojure"}, :_id "544fc7dde4b03d20a1024293"} {:created-at 1414514668964, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "bit-or", :library-url "https://github.com/clojure/clojure"}, :_id "544fc7ece4b03d20a1024294"}], :line 1311, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; set bits to 1 where bits of the arguments are different\nuser=> (bit-xor 2r1100 2r1001) \n5 \n;; 5 = 2r0101\n\n", :created-at 1280338778000, :updated-at 1285496577000, :_id "542692c7c026201cdc3269b3"} {:body ";; here is the truth table for XOR \n(Integer/toBinaryString (bit-xor 2r1100 2r1010) )\n;;=> \"110\"\n;; or 2r0110", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1414514637281, :updated-at 1414514637281, :_id "544fc7cde4b03d20a1024292"}], :notes nil, :arglists ["x y" "x y & more"], :doc "Bitwise exclusive or", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bit-xor"} {:added "1.1", :ns "clojure.core", :name "deliver", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1324962689000, :author {:login "neotyk", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/366ff985977b3aab09510bc335cd44a4?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "promise", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bba"}], :line 7127, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (def x (promise))\n#'user/x\n;; Trying to deref at this point will make your repl wait forever\n\n\nuser=> (deliver x 100)\n#<core$promise$reify__5534@4369a50b: 100>\n\n;; the promise has been delivered, deref x will return immediately\nuser=> @x\n100\n", :created-at 1280748782000, :updated-at 1285495947000, :_id "542692c8c026201cdc326a04"} {:author {:login "neotyk", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/366ff985977b3aab09510bc335cd44a4?r=PG&default=identicon"}, :editors [], :body ";; Create a promise\nuser> (def p (promise))\n#'user/p ; p is our promise\n\n;; Check if was delivered/realized\nuser> (realized? p)\nfalse ; No yet\n\n;; Delivering the promise\nuser> (deliver p 42)\n#\n\n;; Check again if it was delivered\nuser> (realized? p)\ntrue ; Yes!\n\n;; Deref to see what has been delivered\nuser> @p\n42\n\n;; Note that @ is shorthand for deref\nuser> (deref p)\n42", :created-at 1324962699000, :updated-at 1324962699000, :_id "542692d2c026201cdc326f8c"} {:editors [{:login "JoshAaronJones", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19951591?v=3"}], :body ";; Illustrates how threads can work together via promises\n;; First, an example to show a future that delivers\n\nuser=> (def p (promise))\n#'user/p\n\n;; future that will deliver the promise from another thread after 10 sec delay\nuser=> (future\n (Thread/sleep 10000)\n (deliver p 123))\n#future[{:status :pending, :val nil} 0x9a51df1]\n\n;; within 10 seconds dereference p, and wait for delivery of the value\nuser=> @p\n123\n\n\n;; Now, an example to show a future that blocks while waiting for a promise\n;; to be delivered -- this is used to achieve callback-style functionality\n\n;; redefine p\nuser=> (def p (promise))\n#'user/p\n\n;; create a new 'callback' thread that will wait for a promise to be delivered\nuser=> (future\n (println \"About to block while waiting for 'p'\")\n (println \"Now I can do some work with the value \" @p))\nAbout to block while waiting for 'p'\n#future[{:status :pending, :val nil} 0x1737df29]\n\n;; deliver the promise, triggering the blocking callback thread\nuser=> (deliver p 123)\nNow I can do some work with the value 123\n#promise[{:status :ready, :val 123} 0x674a4c4a]", :author {:avatar-url "https://avatars.githubusercontent.com/u/19951591?v=3", :account-source "github", :login "JoshAaronJones"}, :created-at 1474382307145, :updated-at 1474387055629, :_id "57e149e3e4b0709b524f0503"} {:updated-at 1618026011033, :created-at 1618026011033, :author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :body ";; `deliver` returns the promise and can be dereffed directly.\n\n(def my-prom (promise)) \nmy-prom ;;=> #promise[{:status :pending, :val nil} 0x2570a72d]\n@(deliver my-prom \"Huzzah!\") ;;=> \"Huzzah!\"\nmy-prom ;;=> #promise[{:status :ready, :val nil} 0x2570a72d]\n@my-prom ;;=> \"Huzzah!\"", :_id "60711e1be4b0b1e3652d74bf"}], :notes [{:updated-at 1385511406000, :body "As of Clojure 1.3 `deliver` does not throw an exception when it is called multiple times on the same promise. See [CLJ-1038](http://dev.clojure.org/jira/browse/CLJ-1038).", :created-at 1385511406000, :author {:login "gyim", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/14df9ffd78d1e7062ac317d8bcfcde9f?r=PG&default=identicon"}, :_id "542692edf6e94c6970522012"}], :arglists ["promise val"], :doc "Delivers the supplied value to the promise, releasing any pending\n derefs. A subsequent call to deliver on a promise will have no effect.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/deliver"} {:added "1.0", :ns "clojure.core", :name "doseq", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1296708559000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "doall", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d9a"} {:created-at 1296708565000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "dorun", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d9b"} {:created-at 1318959035000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "for", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d9c"} {:created-at 1340037689000, :author {:login "Parijat Mishra", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e3aba44539a78ea92373418456f090e3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "dotimes", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d9d"} {:created-at 1502125400318, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "run!", :ns "clojure.core"}, :_id "59889d58e4b0d19c2ce9d70c"}], :line 3216, :examples [{:updated-at 1639218963535, :created-at 1279807621000, :body ";; Multiplies every x by every y.\n\n(doseq [x [-1 0 1]\n y [1 2 3]] \n (prn (* x y)))\n-1 ; x -1 y 1\n-2 ; x -1 y 2\n-3 ; x -1 y 3\n0 ; x 0 y 1\n0 ; x 0 y 2\n0 ; x 0 y 3\n1 ; x 1 y 1\n2 ; x 1 y 2\n3 ; x 1 y 3\nnil\n\n;; Notice that y is iterated over for every x. x could be seen as the 'outer' loop", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/164033?v=3", :account-source "github", :login "justgage"} {:login "bkovitz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3"} {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon", :account-source "clojuredocs", :login "devijvers"}, :_id "542692c6c026201cdc326919"} {:author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :editors [{:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (doseq [[x y] (map list [1 2 3] [1 2 3])] \n (prn (* x y)))\n1\n4\n9\nnil\n\n;; where\nuser=> (map list [1 2 3] [1 2 3])\n((1 1) (2 2) (3 3))", :created-at 1279807704000, :updated-at 1285651402000, :_id "542692c6c026201cdc32691b"} {:author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :editors [{:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "edbond", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/671af8c4a2d223c7d2e2ede3a0154975?r=PG&default=identicon"} {:login "edbond", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/671af8c4a2d223c7d2e2ede3a0154975?r=PG&default=identicon"} {:login "JavierJF", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2714593?v=3"}], :body "user=> (doseq [[[a b] [c d]] (map list (sorted-map :1 1 :2 2) (sorted-map :3 3 :4 4))]\n (prn (* b d)))\n3\n8\nnil\n\n;; where\nuser=> (map list (sorted-map :1 1 :2 2) (sorted-map :3 3 :4 4))\n(([:1 1] [:3 3]) ([:2 2] [:4 4]))", :created-at 1279808561000, :updated-at 1427017735128, :_id "542692c6c026201cdc32691e"} {:author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :editors [{:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Parijat Mishra", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e3aba44539a78ea92373418456f090e3?r=PG&default=identicon"}], :body "user=> (doseq [[k v] (map identity {:1 1 :2 2 :3 3})] \n (prn k v))\n:1 1\n:2 2\n:3 3\nnil\n\n;; where\nuser=> (map identity {:1 1 :2 2 :3 3})\n([:1 1] [:2 2] [:3 3])\n\n;; or simply\nuser=> (doseq [[k v] {:1 1 :2 2 :3 3}]\n (prn k v))\n:1 1\n:3 3\n:2 2\nnil", :created-at 1279817912000, :updated-at 1340037554000, :_id "542692c6c026201cdc326924"} {:author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :editors [{:login "justgage", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/164033?v=3"}], :body ";; Multiple sequences results in a Cartesian cross of their values.\nuser=> (doseq [a [1 2]\n b [3 4]]\n (println a b))\n1 3\n1 4\n2 3\n2 4\nnil", :created-at 1297827822000, :updated-at 1430494032223, :_id "542692c6c026201cdc326928"} {:author {:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"}, :editors [{:login "justgage", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/164033?v=3"}], :body ";; Keywords :let, :when, and :while are supported, the same as \"for\"\nuser=> (doseq [x (range 6)\n :when (odd? x)\n :let [y (* x x)] ]\n (println [x y]) )\n[1 1]\n[3 9]\n[5 25]\nnil\n\nuser=> (doseq [x (range 99)\n :let [y (* x x)] \n :while (< y 30)\n ]\n (println [x y]) )\n[0 0]\n[1 1]\n[2 4]\n[3 9]\n[4 16]\n[5 25]\nnil\nuser=> \n", :created-at 1403073333000, :updated-at 1430494049365, :_id "542692d2c026201cdc326f93"} {:editors [{:avatar-url "https://avatars.githubusercontent.com/u/164033?v=3", :account-source "github", :login "justgage"} {:login "bkovitz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3"}], :updated-at 1463546941294, :created-at 1427932426392, :author {:avatar-url "https://avatars.githubusercontent.com/u/11763041?v=3", :account-source "github", :login "rezomegrelidze"}, :body ";; ClojureCLR example\n;; Prints names of running processes\n\nuser=> (doseq [x (System.Diagnostics.Process/GetProcesses)] \n (println (.get_ProcessName x)))\navgnt\nSearchIndexer\nsvchost\nchrome\naudiodg\nsvchost\nmbamscheduler\nspoolsv\nnvxdsync\navwebg7\nGoogleCrashHandler64\nsvchost\nCCleaner64\nViakaraokeSrv\n...", :_id "551c850ae4b08eb9aa0a8d3d"} {:body ";; simplest use\n\nuser=> (doseq [x [1 2 3 4 5]] (prn x))\n1\n2\n3\n4\n5\nnil", :author {:login "justgage", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/164033?v=3"}, :created-at 1430431275365, :updated-at 1430494090363, :editors [{:login "justgage", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/164033?v=3"}], :_id "5542a62be4b01bb732af0a8e"} {:updated-at 1510587865249, :created-at 1510587865249, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;looping over a collection \n\n;;define CarMaker record\n(defrecord CarMaker [cm-name])\n\n;;define CarModel record\n(defrecord CarModel [model-name cmaker doors color])\n\n;;create a car-makes\n(def car-maker {\"cm1\" (->CarMaker \"Renault\")})\n\n;;createa models and add an CarMaker identifier to which model\n(def models {\n \"m1\" (->CarModel \"Megane\" \"cm1\" 3 \"Black\")\n \"m2\" (->CarModel \"Zoe\" \"cm1\" 5 \"White\")\n })\n;;println all model-name in the collection\n(doseq [[k v] models] (println (:model-name (get models k))))", :_id "5a09bdd9e4b0a08026c48cb6"} {:editors [{:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}], :body ";;doseq on vector\n(def my-vector [1 2 3 \"a\" \"b\" \"c\" :a :b :c])\n(doseq [v my-vector] (println v))\n\n;;doseq on hash-map\n(def my-map {:a \"A\" :b \"B\" :c \"C\" :d 1 :e 2 :f 3})\n(doseq [[k v] my-map] (println k \"->\" v))", :author {:avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4", :account-source "github", :login "ibercode"}, :created-at 1510917150459, :updated-at 1511258586059, :_id "5a0ec41ee4b0a08026c48cbc"} {:editors [{:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=4"}], :body "user=> (doseq [y (range 10)] \n (dotimes [z y] (print (inc z)))\n (newline))\n\n1\n12\n123\n1234\n12345\n123456\n1234567\n12345678\n123456789\nnil", :author {:avatar-url "https://avatars3.githubusercontent.com/u/46395055?v=4", :account-source "github", :login "akhuramazda"}, :created-at 1546681885708, :updated-at 1613255160130, :_id "5c307e1de4b0ca44402ef613"}], :macro true, :notes nil, :arglists ["seq-exprs & body"], :doc "Repeatedly executes body (presumably for side-effects) with\n bindings and filtering as provided by \"for\". Does not retain\n the head of the sequence. Returns nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/doseq"} {:added "1.6", :ns "clojure.core", :name "unsigned-bit-shift-right", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1412094407161, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=2"}, :to-var {:ns "clojure.core", :name "bit-shift-right", :library-url "https://github.com/clojure/clojure"}, :_id "542ad9c7e4b0df9bb778a59f"}], :line 1368, :examples [{:body "user=> (format \"%016x\" -1)\n\"ffffffffffffffff\"\n\n;; bit-shift-right sign extends most significant bit while right shifting.\nuser=> (format \"%016x\" (bit-shift-right -1 10))\n\"ffffffffffffffff\"\n\n;; unsigned-bit-shift-right fills most significant bits of result with 0.\n;; No sign extension.\nuser=> (format \"%016x\" (unsigned-bit-shift-right -1 10))\n\"003fffffffffffff\"\n", :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=2"}, :created-at 1412094902885, :updated-at 1412094902885, :_id "542adbb6e4b0df9bb778a5a5"} {:updated-at 1460044954951, :created-at 1460044954951, :author {:login "fasiha", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/37649?v=3"}, :body ";; Warning: unsigned-bit-shift-right, like bit-shift-right, treats inputs as\n;; type Long. Smaller types like byte, short, and int will not behave as such.\n(format \"0x%x\" (byte -128))\n; => \"0x80\"\n(format \"0x%x\" (unsigned-bit-shift-right (byte -128) 1))\n; => \"0x7fffffffffffffc0\"\n(format \"0x%x\" (bit-shift-right (byte -128) 1))\n; => \"0xffffffffffffffc0\"\n\n; If you expected 0x40, you need to upcast your byte yourself, via bit-and,\n; and only then shift:\n(format \"0x%x\" (bit-shift-right (bit-and 0xff (byte -128)) 1))\n; => \"0x40\"", :_id "5706849ae4b0fc95a97eab31"} {:editors [{:login "Sophia-Gold", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19278114?v=3"}], :body ";; Stein's Algorithm (Binary GCD)\n;; https://en.wikipedia.org/wiki/Binary_GCD_algorithm\n\n\n(defn gcd [a b]\n (cond\n (zero? a) b\n (zero? b) a\n (neg? a) (- a)\n (neg? b) (- b)\n (and (even? a) (even? b)) (* 2\n (gcd (unsigned-bit-shift-right a 1)\n (unsigned-bit-shift-right b 1)))\n (and (even? a) (odd? b)) (recur (unsigned-bit-shift-right a 1) b)\n (and (odd? a) (even? b)) (recur a (unsigned-bit-shift-right b 1))\n (and (odd? a) (odd? b)) (recur (unsigned-bit-shift-right\n (Math/abs (long (- a b))) ;; coerce to avoid reflection\n 1) (min a b))))\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/19278114?v=3", :account-source "github", :login "Sophia-Gold"}, :created-at 1482925072354, :updated-at 1505598794504, :_id "5863a410e4b0fd5fb1cc9646"}], :notes nil, :arglists ["x n"], :doc "Bitwise shift right, without sign-extension.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unsigned-bit-shift-right"} {:added "1.0", :ns "clojure.core", :name "neg?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1345518618000, :author {:login "cbare", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b394e97f24f3576861239e2b839703a4?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pos?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dd6"} {:created-at 1400618884000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "zero?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dd7"}], :line 1254, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "replore", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e7869fe1a48cb1814c657eaca6bea3eb?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/7412474?v=3", :account-source "github", :login "Lacty"}], :body "user=> (neg? -1)\ntrue\nuser=> (neg? 0)\nfalse\nuser=> (neg? 1)\nfalse", :created-at 1279074335000, :updated-at 1471000975948, :_id "542692c9c026201cdc326add"} {:updated-at 1471001005614, :created-at 1471001005614, :author {:login "Lacty", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7412474?v=3"}, :body "user=> (neg? -0.1)\ntrue\nuser=> (neg? 0.1)\nfalse", :_id "57adb1ade4b0bafd3e2a04ee"} {:updated-at 1598394369395, :created-at 1598394369395, :author {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}, :body "user=> (neg? 1/2)\n;; false\n\nuser=> (neg? -1/2)\n;; true\n\nuser=> (neg? {})\n;; Execution error (ClassCastException) at user/eval3801 (REPL:1).\n;; clojure.lang.PersistentArrayMap cannot be cast to java.lang.Number", :_id "5f459001e4b0b1e3652d73ac"}], :notes nil, :arglists ["num"], :doc "Returns true if num is less than zero, else false", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/neg_q"} {:added "1.0", :ns "clojure.core", :name "var-set", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1331249164000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "with-local-vars", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521df8"} {:created-at 1550004038668, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "var-get", :ns "clojure.core"}, :_id "5c632f46e4b0ca44402ef67d"}], :line 4333, :examples [{:editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=4"}], :updated-at 1638151161315, :created-at 1423523544753, :author {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"}, :body "(with-local-vars [x 1]\n (println @x)\n (var-set x 2)\n (println @x))\n;;=> 1\n;;=> 2\n", :_id "54d93ed8e4b0e2ac61831d3b"}], :notes nil, :arglists ["x val"], :doc "Sets the value in the var object to val. The var must be\n thread-locally bound.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/var-set"} {:added "1.3", :ns "clojure.core", :name "unchecked-float", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1496072900762, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "float", :ns "clojure.core"}, :_id "592c42c4e4b093ada4d4d793"}], :line 3546, :examples [{:editors [{:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}], :body "(unchecked-float 1)\n;;=> 1.0\n(unchecked-float 1.11)\n;;=> 1.11\n(unchecked-float 1.111111111111111111111111111M)\n;;=> 1.1111112\n\n;;;; Note that (unchecked-float) doesn't range check its argument.\n;;;; Use (float) instead if you want an exception to be thrown in such a case.\n\n(unchecked-float Double/MAX_VALUE)\n;;=> Infinity\n(float Double/MAX_VALUE)\n;;=> IllegalArgumentException Value out of range for float: 1.7976931348623157E308", :author {:avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3", :account-source "github", :login "svenschoenung"}, :created-at 1496072892226, :updated-at 1496073090370, :_id "592c42bce4b093ada4d4d792"}], :notes nil, :arglists ["x"], :doc "Coerce to float. Subject to rounding.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-float"} {:added "1.0", :ns "clojure.core", :name "pmap", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1281948332000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e0d"} {:created-at 1336536733000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "future", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e0e"} {:created-at 1518042635832, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pcalls", :ns "clojure.core"}, :_id "5a7b7e0be4b0316c0f44f8a8"} {:created-at 1518042700360, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pvalues", :ns "clojure.core"}, :_id "5a7b7e4ce4b0316c0f44f8a9"} {:created-at 1518042942025, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "partition", :ns "clojure.core"}, :_id "5a7b7f3ee4b0316c0f44f8af"}], :line 7012, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; This function operates just like map. See\n;; clojure.core/map for more details.\nuser=> (pmap inc [1 2 3 4 5])\n(2 3 4 5 6)", :created-at 1281948454000, :updated-at 1332952345000, :_id "542692cdc026201cdc326cf2"} {:updated-at 1462726187473, :created-at 1313254319000, :body ";; A function that simulates a long-running process by calling Thread/sleep:\n(defn long-running-job [n]\n (Thread/sleep 3000) ; wait for 3 seconds\n (+ n 10))\n\n;; Use `doall` to eagerly evaluate `map`, which evaluates lazily by default.\n\n;; With `map`, the total elapsed time is just under 4 * 3 seconds:\nuser=> (time (doall (map long-running-job (range 4))))\n\"Elapsed time: 11999.235098 msecs\"\n(10 11 12 13)\n\n;; With `pmap`, the total elapsed time is just over 3 seconds:\nuser=> (time (doall (pmap long-running-job (range 4))))\n\"Elapsed time: 3200.001117 msecs\"\n(10 11 12 13)", :editors [{:login "bkovitz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon", :account-source "clojuredocs", :login "OnesimusUnbound"}, :_id "542692cdc026201cdc326cf4"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; pmap is implemented using Clojure futures. See examples for 'future'\n;; for discussion of an undesirable 1-minute wait that can occur before\n;; your standalone Clojure program exits if you do not use shutdown-agents.", :created-at 1336536727000, :updated-at 1336536842000, :_id "542692d4c026201cdc327030"} {:updated-at 1539009726653, :created-at 1538954059979, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :body ";; Parallel application (of 'f') does NOT mean that the result collection would\n;; be sorted according to calculation time. The result collection is sorted\n;; in the same way as for map, i.e. it \"preserves\" the items' order in the 'coll'\n;; (or 'colls') parameter(s) of pmap. In other words: calculation is done parallel,\n;; but the result is delivered in the order the input came (in 'coll'/'colls').\n\n;; So, e.g. if the first item of 'coll' takes 1 hour to be processed (by 'f'), and\n;; the rest requires 1 sec, nothing is delivered by pmap during the 1st hour:\n;; the 1st item \"blocks\" the appearence of the others in the result of pmap,\n;; even if the others are already calculated. E.g. (take 5 (pmap ...) will not \n;; return in 5 secs (but in 1 hour), even if we calculated 5 items in 5 secs\n;; -- we wait for the calculations of the first five in 'coll'.\n\n;; In contrast, side effects of 'f' (if any) are coming in \"random\" order (due to\n;; parallelism): in the example above, we might see the side effects (e.g. swap!-s)\n;; of many appliactions of 'f' to different elements of 'coll', long before we \n;; get the result of (take 1 (pmap ...)).\n\n;; To illustrate the statements above, run this:\n(defn proc\n [i]\n (println \"processing: \" i \"(\" (System/currentTimeMillis) \")\")\n (Thread/sleep\n (if (= i 0)\n 5000\n 10)))\n\n(take 1 (pmap proc (range 5)))\n;; output:\n(processing: processing: processing: processing: processing: 3 42 ( ((1 \n 1539007947561( 1539007947561 ) )1539007947561 0 )\n\n1539007947561( ) 1539007947561 )\n\nnil)\n;; We can see that 5 threads are started at the same time, immediately, in parallel.\n;; 4 of them must be finished in 10 msecs, but we get back the REPL prompt\n;; only after 5 secs, because we wait for the result of the i=0 item.", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"}], :_id "5bba934be4b00ac801ed9eb3"} {:updated-at 1539007541878, :created-at 1539007541878, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :body ";; pmap is implemented using Clojure futures. Futures run in threads. \n;; These threads of a pmap's evaluation run independently from each other.\n;; This means that even if one of these threads already determined the result\n;; of the whole pmap*, all the other, already started threads keep running\n;; until they finish their own calculations. (Although these calcualtions might\n;; already be absolutely unnecessary.)\n;; This can be especially important, when these threads have side effects:\n;; these side effects (e.g. swap!-s) might happen later, when they are not\n;; expected anymore.\n;; Moreover, these \"cowboy\" threads keep occuping the resources (CPU, memory...)\n;; they need.\n;; *: this is the case e.g. when one of the threads throws an exception.", :_id "5bbb6435e4b00ac801ed9ec9"}], :notes [{:updated-at 1288191025000, :body "for insight into how pmap does stuff see this presentation: \"From Concurrency to Parallelism\", by David Edgar Liebke @ http://incanter.org/downloads/fjclj.pdf", :created-at 1288191025000, :author {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f9f"} {:author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :updated-at 1553851026351, :created-at 1553789805408, :body "The following can be used to understand how many threads `pmap` runs at once (assuming tasks are roughly the same computational cost). The min level correspond to the situation where the consumer is slower than the producer, while the max level is when the consumer is faster than the producer:\n\n* When the sequence is not chunked (for example subvec) the min parallelism is 1 and the max parallelism is `(+ 2 N-cores)`. Example: with 12 cores, `(doall (pmap #(Thread/sleep %) (subvec (into [] (range 1000)) 0 999)))` keeps 12+2 threads busy.\n* In case of chunked sequences (vast majority are size 32), the min parallelism is `(min chunk-size (+ 2 n-cores))`, while the max amount is equal to `(+ chunk-size 2 N-cores)`. Example: with 12 cores, `(doall (pmap #(Thread/sleep %) (range 1000)))` keeps 12+2+32 threads busy.", :_id "5c9cf36de4b0ca44402ef6ed"}], :arglists ["f coll" "f coll & colls"], :doc "Like map, except f is applied in parallel. Semi-lazy in that the\n parallel computation stays ahead of the consumption, but doesn't\n realize the entire result unless required. Only useful for\n computationally intensive functions where the time of f dominates\n the coordination overhead.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/pmap"} {:added "1.2", :ns "clojure.core", :name "error-mode", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1658139699593, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "set-error-mode!", :ns "clojure.core"}, :_id "62d53433e4b0b1e3652d7625"}], :line 2229, :examples [{:updated-at 1658139926101, :created-at 1658139926101, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body "(def a (agent 42))\n(error-mode a);; => :fail\n\n(set-error-mode! a :continue)\n(error-mode a);; => :continue", :_id "62d53516e4b0b1e3652d7626"}], :notes nil, :arglists ["a"], :doc "Returns the error-mode of agent a. See set-error-mode!", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/error-mode"} {:added "1.0", :ns "clojure.core", :name "num", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "number?", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917500000, :_id "542692ebf6e94c6970521da3"}], :line 3473, :examples [{:author {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}], :body "user=> (num 2048)\n2048\n\n\n;; Calling a Number http://download.oracle.com/javase/6/docs/api/ method:\n\nuser=> (def x (num 2048))\n#'user/x\n\nuser=> (.floatValue x)\n2048.0\n", :created-at 1283819688000, :updated-at 1287791370000, :_id "542692cec026201cdc326dc3"}], :notes [{:author {:login "didibus", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/601540?v=4"}, :updated-at 1560228092431, :created-at 1560228092431, :body "`num` is used to coerce a primitive Java number type such as int, float, long, double, etc., into its boxed version such as Float, Long, Double, etc. If given an existing boxed Number type, as opposed to a primitive number type, it will just return it as is.", :_id "5cff30fce4b0ca44402ef754"} {:body "If you are trying to parse a String into a Number, this is not the function you are looking for. `num` only coerces from other primitive or boxed number types. For coercing from a String, you want to use Java interop such as:\n\n```\n(Long/parseLong \"333\")\n(Float/parseFloat \"333.33\")\n(Double/parseDouble \"333.3333333333332\")\n(Integer/parseInt \"-333\")\n(Integer/parseUnsignedInt \"333\")\n(BigInteger. \"3333333333333333333333333332\")\n(BigDecimal. \"3.3333333333333333333333333332\")\n(Short/parseShort \"400\")\n(Byte/parseByte \"120\")\n```\n\nYou can also alternatively, if you want to parse the String into a Number the same way that the Clojure reader does so, use the edn reader.\n\n```\n(require '[clojure.edn :as edn])\n(edn/read-string \"333\")\n```", :created-at 1560228951511, :updated-at 1560229176287, :author {:avatar-url "https://avatars3.githubusercontent.com/u/601540?v=4", :account-source "github", :login "didibus"}, :_id "5cff3457e4b0ca44402ef756"}], :tag "java.lang.Number", :arglists ["x"], :doc "Coerce to Number", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/num"} {:added "1.5", :ns "clojure.core", :name "reduced?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1416151592590, :author {:login "ljos", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/585174?v=2"}, :to-var {:ns "clojure.core", :name "reduced", :library-url "https://github.com/clojure/clojure"}, :_id "5468c228e4b0dc573b892fd5"} {:created-at 1416151598149, :author {:login "ljos", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/585174?v=2"}, :to-var {:ns "clojure.core", :name "reduce", :library-url "https://github.com/clojure/clojure"}, :_id "5468c22ee4b0dc573b892fd6"} {:created-at 1456683959806, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unreduced", :ns "clojure.core"}, :_id "56d33bb7e4b02a6769b5a4bb"} {:created-at 1464286428199, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ensure-reduced", :ns "clojure.core"}, :_id "57473cdce4b0af2c9436d1f2"}], :line 2842, :examples [{:updated-at 1456683476601, :created-at 1456683476601, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :body "(reduced? :foo)\n;;=> false\n\n(reduced? (reduced :foo))\n;;=> true\n\n(reduced? (clojure.lang.Reduced. :foo))\n;;=> true", :_id "56d339d4e4b0b41f39d96cd7"}], :notes nil, :arglists ["x"], :doc "Returns true if x is the result of a call to reduced", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/reduced_q"} {:added "1.1", :ns "clojure.core", :name "disj!", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1329970249000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "assoc!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e49"} {:created-at 1329970254000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "dissoc!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e4a"} {:created-at 1533850473558, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "disj", :ns "clojure.core"}, :_id "5b6cb369e4b00ac801ed9e4f"} {:created-at 1577916225137, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "conj!", :ns "clojure.core"}, :_id "5e0d1741e4b0ca44402ef80c"}], :line 3400, :examples [{:updated-at 1577916108217, :created-at 1307739693000, :body ";; Note how we always use the return value of disj! and conj! in these examples\n;; for all future modifications, rather than (incorrectly) ignoring the return\n;; value and continuing to modify the original transient set. See examples for\n;; assoc! and dissoc! for more discussion and examples of this.\n;; Also see one example for conj! that contains a detailed example\n;; of a wrong result that can occur if you do not use its return value.\n\nuser=> (def foo (transient #{'pore-pore 'slow 'yukkuri}))\n#'user/foo\nuser=> (count foo)\n3\nuser=> (def foo (disj! foo 'yukkuri))\n#'user/foo\nuser=> foo\n#\nuser=> (count foo)\n2\nuser=> (def foo (conj! foo 'yukkuri))\n#'user/foo\nuser=> foo\n#\nuser=> (count foo)\n3\nuser=> (def foo (persistent! foo))\n#'user/foo\nuser=> foo\n#{yukkuri slow pore-pore}\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}], :author {:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"}, :_id "542692cfc026201cdc326e8c"} {:updated-at 1533850455152, :created-at 1533850455152, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; A faster implementation of disj for a large number of keys to disjoin:\n\n(defn disj* [s & ks]\n (persistent!\n (reduce disj! (transient s) ks)))\n\n(let [s (set (range 1000))\n xs (range 400 600)]\n (count (apply disj* s xs)))\n;; 800", :_id "5b6cb357e4b00ac801ed9e4e"}], :notes nil, :arglists ["set" "set key" "set key & ks"], :doc "disj[oin]. Returns a transient set of the same (hashed/sorted) type, that\n does not contain key(s).", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/disj!"} {:added "1.0", :ns "clojure.core", :name "float?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1496006168817, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "double?", :ns "clojure.core"}, :_id "592b3e18e4b093ada4d4d78e"} {:created-at 1496006177347, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "bigdec?", :ns "clojure.core"}, :_id "592b3e21e4b093ada4d4d78f"} {:created-at 1496006182111, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "decimal?", :ns "clojure.core"}, :_id "592b3e26e4b093ada4d4d790"}], :line 3604, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (float? 0)\nfalse\nuser=> (float? 0.0)\ntrue", :created-at 1279073915000, :updated-at 1332951058000, :_id "542692cbc026201cdc326bc6"} {:updated-at 1462076465809, :created-at 1454839923274, :author {:login "guruma", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/534540?v=3"}, :body ";; float? returns true for both float and double.\nuser=> (map (juxt type float?) [(float 1) (double 1)])\n([java.lang.Float true] [java.lang.Double true])\n\n;; Call instance? to check if the value is specifically float or double.\nuser=> (map (juxt type #(instance? Float %)) [(float 1) (double 1)])\n([java.lang.Float true] [java.lang.Double false])", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/534540?v=3", :account-source "github", :login "guruma"} {:login "bkovitz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3"}], :_id "56b71873e4b0e8f8f33875d4"} {:updated-at 1592827825230, :created-at 1592827825230, :author {:login "zoren", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/84688?v=4"}, :body ";; BigDecimal is not float\nuser=> (float? 0.0M)\nfalse", :_id "5ef09fb1e4b0b1e3652d730a"}], :notes nil, :arglists ["n"], :doc "Returns true if n is a floating point number", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/float_q"} {:added "1.0", :ns "clojure.core", :name "aset-float", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1627064336075, :author {:login "rosejn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/36590?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "aget", :ns "clojure.core"}, :_id "60fb0810e4b0b1e3652d751c"}], :line 3961, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; create an array of 10 floats and set one of the values to 3.1415\n\nuser=> (def fs (float-array 10))\n#'user/fs\nuser=> (vec fs)\n[0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0]\nuser=> (aset-float fs 3 3.1415)\n3.1415\nuser=> (vec fs)\n[0.0 0.0 0.0 3.1415 0.0 0.0 0.0 0.0 0.0 0.0]\nuser=>", :created-at 1313914809000, :updated-at 1313914809000, :_id "542692c7c026201cdc3269d2"}], :notes [{:body "See [aset](http://clojuredocs.org/clojure.core/aset) for illustrations of multi-dimensional syntax.", :created-at 1432829158905, :updated-at 1432829158905, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :_id "55673ce6e4b01ad59b65f4e0"}], :arglists ["array idx val" "array idx idx2 & idxv"], :doc "Sets the value at the index/indices. Works on arrays of float. Returns val.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/aset-float"} {:added "1.2", :ns "clojure.core", :name "deftype", :file "clojure/core_deftype.clj", :type "macro", :column 1, :see-alsos [{:created-at 1361948459000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "definterface", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e0b"} {:created-at 1361948592000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defprotocol", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e0c"} {:created-at 1446587002611, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defrecord", :ns "clojure.core"}, :_id "56392a7ae4b04b157a6648e2"}], :line 422, :examples [{:author {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"}, :editors [{:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (import (java.awt.datatransfer Transferable DataFlavor)\n javax.swing.ImageIcon)\n\n;; create a Transferable Image from an array of bytes\nuser=> (deftype ImageSelection [data]\n Transferable\n (getTransferDataFlavors\n [this]\n (into-array DataFlavor [DataFlavor/imageFlavor]))\n \n (isDataFlavorSupported\n [this flavor]\n (= DataFlavor/imageFlavor flavor))\n\n (getTransferData\n [this flavor]\n (when (= DataFlavor/imageFlavor flavor)\n (.getImage (ImageIcon. data)))))\n\n;; create a new image selection:\nuser=> (def *selection* (ImageSelection. somedata))", :created-at 1285784862000, :updated-at 1285841395000, :_id "542692ccc026201cdc326cc9"} {:updated-at 1613242656022, :created-at 1462490574656, :author {:login "elsaturnino", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/571496?v=3"}, :body ";; define a couple of shape types\n(deftype Circle [radius])\n(deftype Square [length width])\n\n;; multimethod to calculate the area of a shape\n(defmulti area class)\n(defmethod area Circle [c]\n (* Math/PI (.radius c) (.radius c)))\n(defmethod area Square [s]\n (* (.length s) (.width s)))\n\n;; create a couple shapes and get their area\n(def myCircle (Circle. 10))\n(def mySquare (Square. 5 11))\n\n(area myCircle)\n(area mySquare)", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/5796449?v=3", :account-source "github", :login "freezhan"} {:login "stoat1", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2543524?v=4"}], :_id "572bd5cee4b050526f331422"} {:updated-at 1462539789757, :created-at 1462539789757, :author {:login "jzwolak", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/285725?v=3"}, :body "(deftype Person [first-name last-name])\n\n;; use the factory function instead of the constructor, \"Person.\",\n;; to create a Person\n(->Person \"John\" \"Smith\")", :_id "572c960de4b050526f331423"} {:updated-at 1539060553178, :created-at 1539060553178, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; How :load-ns works.\n;; deftype can be used for AOT generation of classes (with gen-class that would be\n;; the only option). For example:\n\n(spit \"foo.clj\"\n \"(ns foo)\n (defn bar [] :bar)\n (defprotocol P (foo [p]))\n (deftype Foo [] :load-ns true P\n (foo [this] (bar)))\")\n\n(binding [*compile-path* \".\"] (compile 'foo))\n\n;; Now close and re-open the REPL to import the newly created class. Note that the\n;; call to (.foo p) doesn't throw exception here because we used \":load-ns true\"\n;; option in deftype. This makes sure that the namespace 'foo is also loaded \n;; forcing the evaluation of the \"bar\" function. This makes especially sense\n;; if Foo is used from a Java application:\n\n(import 'foo.Foo)\n(def p (Foo.))\n(.foo p)\n;; \"bar\"", :_id "5bbc3349e4b00ac801ed9ecb"} {:updated-at 1552943737414, :created-at 1552943737414, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :body ";; To refer to a deftype in another namespace, the deftype needs to be imported \n;; because deftype generate a class.\n;; Using the Foo type defined above:\n(ns bar \n (:import [foo Foo]))\n\n(defn foo? [x]\n (instance? Foo x))", :_id "5c900a79e4b0ca44402ef6b8"} {:editors [{:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=4"}], :body ";; deftype allow mutable fields, and their values can be changed with set!.\n;; This works:\n(deftype Test [^:unsynchronized-mutable x]\n ITestProtocol\n (act [this o] (set! x o)))\n\n;; Note that these mutable fields are private, so they are not accessible outside,\n;; and they are not even accessible inside nested functions within the type.\n;; This does not compile, throws error about assigning to non-mutable field x:\n(deftype Test [^:unsynchronized-mutable x]\n ITestProtocol\n (act [this] (fn [o] (set! x o))))\n\n;; Need to define a set function in a protocol and implement it in the type \n(defprotocol ISetX (set-x [this o]))\n\n(deftype Test [^:unsynchronized-mutable x]\n ISetX\n (set-x [this o] (set! x o))\n \n ITestProtocol\n (act [this] (fn [o] (set-x o))))\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/889685?v=4", :account-source "github", :login "huahaiy"}, :created-at 1611856836020, :updated-at 1611856923228, :_id "6012fbc4e4b0b1e3652d743f"} {:updated-at 1658251111297, :created-at 1658251111297, :author {:login "quoll", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/358875?v=4"}, :body ";; unlike defrecord, deftype does not include extra method definitions\n;; the following will not compile:\n(defrecord Nr [n]\n Object\n (toString [_] (str \"#\" n)) ;; This does work\n (hashCode [_] (+ 10 n))) ;; defrecord already generates this function\n\n;; Syntax error (ClassFormatError) compiling deftype* at (REPL:1:1).\n;; Duplicate method name \"hashCode\" with signature \"()I\" in class file user/Nr\n\n\n;; deftype does not implement methods like hashCode, so it can be overridden\n(deftype Nr [n]\n Object\n (toString [_] (str \"#\" n))\n (hashCode [_] (+ 10 n)))\n\n(def v (->Nr 5))\n\n(str \"The number is: \" v)\n;; \"The number is #5\"\n\n(hash v)\n;; 15", :_id "62d6e767e4b0b1e3652d7629"}], :macro true, :notes [{:updated-at 1330691996000, :body "There's also some undocumented support for annotations:\r\n\r\n", :created-at 1330691996000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fda"} {:author {:login "eoliphan", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1065736?v=4"}, :updated-at 1665156668525, :created-at 1665156668525, :body "Annotation docs now available in the reference: https://clojure.org/reference/datatypes#_java_annotation_support", :_id "6340463ce4b0b1e3652d7671"}], :arglists ["name [& fields] & opts+specs"], :doc "(deftype name [fields*] options* specs*)\n\n Options are expressed as sequential keywords and arguments (in any order).\n\n Supported options:\n :load-ns - if true, importing the type class will cause the\n namespace in which the type was defined to be loaded.\n Defaults to false.\n\n Each spec consists of a protocol or interface name followed by zero\n or more method bodies:\n\n protocol-or-interface-or-Object\n (methodName [args*] body)*\n\n Dynamically generates compiled bytecode for class with the given\n name, in a package with the same name as the current namespace, the\n given fields, and, optionally, methods for protocols and/or\n interfaces. \n\n The class will have the (by default, immutable) fields named by\n fields, which can have type hints. Protocols/interfaces and methods\n are optional. The only methods that can be supplied are those\n declared in the protocols/interfaces. Note that method bodies are\n not closures, the local environment includes only the named fields,\n and those fields can be accessed directly. Fields can be qualified\n with the metadata :volatile-mutable true or :unsynchronized-mutable\n true, at which point (set! afield aval) will be supported in method\n bodies. Note well that mutable fields are extremely difficult to use\n correctly, and are present only to facilitate the building of higher\n level constructs, such as Clojure's reference types, in Clojure\n itself. They are for experts only - if the semantics and\n implications of :volatile-mutable or :unsynchronized-mutable are not\n immediately apparent to you, you should not be using them.\n\n Method definitions take the form:\n\n (methodname [args*] body)\n\n The argument and return types can be hinted on the arg and\n methodname symbols. If not supplied, they will be inferred, so type\n hints should be reserved for disambiguation.\n\n Methods should be supplied for all methods of the desired\n protocol(s) and interface(s). You can also define overrides for\n methods of Object. Note that a parameter must be supplied to\n correspond to the target object ('this' in Java parlance). Thus\n methods for interfaces will take one more argument than do the\n interface declarations. Note also that recur calls to the method\n head should *not* pass the target object, it will be supplied\n automatically and can not be substituted.\n\n In the method bodies, the (unqualified) name can be used to name the\n class (for calls to new, instance? etc).\n\n When AOT compiling, generates compiled bytecode for a class with the\n given name (a symbol), prepends the current ns as the package, and\n writes the .class file to the *compile-path* directory.\n\n One constructor will be defined, taking the designated fields. Note\n that the field names __meta, __extmap, __hash and __hasheq are currently\n reserved and should not be used when defining your own types.\n\n Given (deftype TypeName ...), a factory function called ->TypeName\n will be defined, taking positional parameters for the fields", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/deftype"} {:added "1.0", :ns "clojure.core", :name "bean", :file "clojure/core_proxy.clj", :type "function", :column 1, :see-alsos nil, :line 398, :examples [{:author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:avatar-url "https://avatars.githubusercontent.com/u/227520?v=3", :account-source "github", :login "ode79"}], :body "user=> (import java.util.Date)\njava.util.Date\n\nuser=> (def ^:dynamic *now* (Date.))\n#'user/*now*\n\nuser=> (bean *now*)\n{:seconds 57, :date 13, :class java.util.Date, :minutes 55, :hours 17, :year 110, :timezoneOffset -330, :month 6, :day 2, :time 1279023957492}\n", :created-at 1279049231000, :updated-at 1437867852483, :_id "542692ccc026201cdc326c70"} {:updated-at 1477395581762, :created-at 1348995044000, :body ";; although not reference-able in Clojuredocs, \n;; org.clojure/java.data provides a useful, alternative 'from-java' function \n;; that works similarly to bean, but more customizable.\n;; See https://github.com/clojure/java.data for more info.", :editors [{:login "G1enY0ung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/15034155?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon", :account-source "clojuredocs", :login "klauern"}, :_id "542692d2c026201cdc326f4e"}], :notes nil, :arglists ["x"], :doc "Takes a Java object and returns a read-only implementation of the\n map abstraction based upon its JavaBean properties.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bean"} {:added "1.1", :ns "clojure.core", :name "booleans", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "boolean-array", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1358052913000, :_id "542692eaf6e94c6970521c0a"}], :line 5348, :examples [{:author {:login "leifp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d2f37720f063404ef83b987d2824353d?r=PG&default=identicon"}, :editors [], :body ";; for fast interop\nuser=> (set! *warn-on-reflection* true)\ntrue\nuser=> (defn get-a-bool [bs] (aget bs 1))\nReflection warning, NO_SOURCE_PATH:1 - call to aget can't be resolved.\n#'user/get-a-bool\nuser=> (defn get-a-bool [bs] (let [bs (booleans bs)] (aget bs 1)))\n#'user/get-a-bool\n", :created-at 1342528439000, :updated-at 1342528439000, :_id "542692d2c026201cdc326f5b"} {:body ";; can also be used as type hint to avoid reflection:\nuser=> (set! *warn-on-reflection* true)\ntrue\nuser=> (defn get-a-bool [^booleans bs] (aget bs 1))\n#'user/get-a-bool", :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :created-at 1432832819657, :updated-at 1432832851114, :editors [{:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}], :_id "55674b33e4b01ad59b65f4e2"}], :notes nil, :arglists ["xs"], :doc "Casts to boolean[]", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/booleans"} {:added "1.0", :ns "clojure.core", :name "ns-unalias", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1390616196000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "alias", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ea7"} {:created-at 1390616206000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "ns-aliases", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ea8"} {:created-at 1512578712943, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ns-unmap", :ns "clojure.core"}, :_id "5a281e98e4b0a08026c48cd2"}], :line 4281, :examples [{:author {:login "daviddurand", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1316941?v=2"}, :editors [], :body ";; You are having a problem loading a redefined namespace:\nuser=> (load \"src/clj/com/tizra/layout_expander.clj\")\n#\n\n;; ns-unalias to the rescue!\nuser=> (ns-unalias (find-ns 'com.tizra.layout-expander) 'xml)\nnil\n\nuser=> (load \"src/clj/com/tizra/layout_expander.clj\")\n#'com.tizra.layout-expander/junk\n", :created-at 1326025800000, :updated-at 1326025800000, :_id "542692d4c026201cdc327020"} {:body "user=> (ns-aliases *ns*)\n{}\nuser=> (alias 'string 'clojure.string)\nnil\nuser=> (ns-aliases *ns*)\n{string #}\nuser=> (ns-unalias *ns* 'string)\nnil\nuser=> (ns-aliases *ns*)\n{}", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423017698483, :updated-at 1423017698483, :_id "54d186e2e4b081e022073c52"} {:updated-at 1512578611261, :created-at 1512471675948, :author {:login "ivarref", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/74075?v=4"}, :body ";; To wipe aliases of current namespace:\n*my-ns*=> (map (partial ns-unalias *ns*) (keys (ns-aliases *ns*)))", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/74075?v=4", :account-source "github", :login "ivarref"} {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}], :_id "5a267c7be4b0a08026c48ccd"}], :notes nil, :arglists ["ns sym"], :doc "Removes the alias for the symbol from the namespace.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ns-unalias"} {:added "1.0", :ns "clojure.core", :name "when-let", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1293436133000, :author {:login "0x89", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/56bc4acd59315ed4dc1cb99c3be71102?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "if-let", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e2c"} {:created-at 1315004448000, :author {:login "srid", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd3a68d670372cd09876c26270a4299a?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "when", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e2d"} {:created-at 1323280128000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "when-not", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e2e"} {:created-at 1334293387000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "if", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e2f"} {:created-at 1405367841000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "when-first", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e30"} {:created-at 1440455896228, :author {:login "brunchboy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2228869?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "when-some", :ns "clojure.core"}, :_id "55db9cd8e4b072d7f27980f1"} {:created-at 1602614484757, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "let", :ns "clojure.core"}, :_id "5f85f4d4e4b0b1e3652d73df"}], :line 1861, :examples [{:author {:login "kotarak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Confusion", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ca054e9c7aecbfac1d99af1fd0a6d72c?r=PG&default=identicon"}], :body ";; Very useful when working with sequences. Capturing the return value \n;; of `seq` brings a performance gain in subsequent `first`/`rest`/`next`\n;; calls. Also the block is guarded by `nil` punning.\n\n(defn drop-one\n [coll]\n (when-let [s (seq coll)]\n (rest s)))\n\nuser=> (drop-one [1 2 3])\n(2 3)\nuser=> (drop-one [])\nnil\n", :created-at 1281553976000, :updated-at 1342493536000, :_id "542692cbc026201cdc326c01"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; See examples for \"if\" explaining Clojure's idea of logical true\n;; and logical false.", :created-at 1334293395000, :updated-at 1334293395000, :_id "542692d6c026201cdc3270b6"} {:editors [{:login "mkorvas", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2321069?v=3"}], :updated-at 1438294296617, :created-at 1428550770303, :author {:avatar-url "https://avatars.githubusercontent.com/u/367789?v=3", :account-source "github", :login "mattvvhat"}, :body ";; Works well with collections\n\n(def x {:whatever 1})\n\n(when-let [value (:whatever x)]\n (println \"x+1 = \" (inc value)))\n\n;; Prints: \"x+1 = 2\"", :_id "5525f472e4b01bb732af0a7b"} {:updated-at 1469577527836, :created-at 1469577480181, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body ";; when-let multiple bindings version\n\n(defmacro when-let*\n ([bindings & body]\n (if (seq bindings)\n `(when-let [~(first bindings) ~(second bindings)]\n (when-let* ~(drop 2 bindings) ~@body))\n `(do ~@body))))\n\n(when-let* [a 1 \n b 2 \n c (+ a b)]\n (println \"yeah!\")\n c)\n;;=>yeah!\n;;=>3\n\n(when-let* [a 1 \n b nil \n c 3]\n (println \"damn! b is nil\")\n a)\n;;=>nil\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3", :account-source "github", :login "ertugrulcetin"}], :_id "5797f908e4b0bafd3e2a04bb"} {:updated-at 1505500848933, :created-at 1505500848933, :author {:login "bfabry", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/29587?v=4"}, :body ";; test is evaluated before values are bound to binding, so destructuring works\n(when-let [[a] nil] [a])\n=> nil\n(when-let [[a] [:a]] [a])\n=> [:a]\n(when-let [[a] []] [a])\n=> [nil]", :_id "59bc1eb0e4b09f63b945ac76"} {:updated-at 1629082196288, :created-at 1536030316104, :author {:login "arlicle", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/153773?v=4"}, :body ";; when-let multiple bindings version\n;; all bindings are evaluated before checking for falsyness\n\n(defmacro when-let*\n [bindings & body]\n `(let ~bindings\n (if (and ~@(take-nth 2 bindings))\n (do ~@body)\n )))\n\n(when-let* [a 1 \n b 2 \n c (+ a b)]\n (println \"yeah!\")\n c)\n;;yeah!\n;;=> 3\n\n(when-let* [a 1 \n b nil \n c 3]\n (println \"damn! b is nil\")\n a)\n;;=> nil", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/8340498?v=4", :account-source "github", :login "justintaft"}], :_id "5b8df66ce4b00ac801ed9e85"} {:editors [{:login "Jjunior130", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/7597818?v=4"}], :body "(require '[reagent.core :as r])\n\n(def float-parsable? (comp not js/isNaN js/parseFloat))\n(def find-parsable-or-nil \n (comp first \n (partial re-find \n #\"(\\-?\\d+\\.)?\\d+([eE][-+]?\\d+)?\")))\n\n(defn number-input\n \"HTML input element for number only input\"\n [value]\n [:input\n {:value @value\n :type \"text\"\n :on-change (comp\n #(when-let [new-value %]\n (reset! value new-value))\n (fn [value]\n (cond\n (empty? value) \"\"\n (float-parsable? value) value\n :otherwise (find-parsable-or-nil value)))\n (fn [target]\n (.-value target))\n (fn [event]\n (.-target event)))}])\n\n(def value (r/atom \"\"))\n\n(defn demo []\n [:div\n ; Displays NaN when value is \"\", displays a number otherwise.\n (-> @value js/parseFloat str) [:br]\n [number-input value]])", :author {:avatar-url "https://avatars1.githubusercontent.com/u/7597818?v=4", :account-source "github", :login "Jjunior130"}, :created-at 1536532957930, :updated-at 1536815925378, :_id "5b95a1dde4b00ac801ed9e93"}], :macro true, :notes [{:updated-at 1299054268000, :body "The difference between when-let and if-let is that when-let doesn't have an else clause and and also accepts multiple forms so you don't need to use a (do...).", :created-at 1299054268000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fb4"} {:updated-at 1393879475000, :body "The word \"bindings\" seems not to be correct here. In fact `when-let` only accepts **one** binding and not multiple ones.\r\nSo \"bindings\" might be confusing, at least it was for me.", :created-at 1393879360000, :author {:login "n2o", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/73a59429cbc559fd77e9ec50fd99006b?r=PG&default=identicon"}, :_id "542692edf6e94c697052201f"} {:updated-at 1405477326000, :body "Agreed. It ought to be \"binding\" for clarity.", :created-at 1405477326000, :author {:login "Dave Y.", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10d4977e847588cb4b461de4eb9d1646?r=PG&default=identicon"}, :_id "542692edf6e94c697052202c"} {:author {:login "HomoEfficio", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/17228983?v=3"}, :updated-at 1486864109909, :created-at 1486864109909, :body "```clojure\n(when-let [name test]\n (do-something-with-name))\n```\n\nIn the example above, `test` does not have to be a predicate.\n`test` can be any value which is like `(seq coll)` or `3`, `[1 2]`, or so.\n\nIf `test` is neither `false` nor `nil`, `test` is bound to `name`.\n", :_id "589fbeede4b01f4add58fe4c"}], :arglists ["bindings & body"], :doc "bindings => binding-form test\n\n When test is true, evaluates body with binding-form bound to the value of test", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/when-let"} {:added "1.0", :ns "clojure.core", :name "int-array", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "ints", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917413000, :_id "542692ebf6e94c6970521d57"} {:created-at 1349125778000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "aget", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d58"} {:created-at 1349125782000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "aset", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d59"} {:created-at 1349125888000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "aset-int", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d5a"}], :line 5332, :examples [{:updated-at 1454083049116, :created-at 1284747822000, :body ";; if you have a sequence, perhaps lazy, int-array will figure out the size\n(aget (int-array [1 2 3]) 0)\n;;=> 1\n(int-array [1 2 3])\n;;=> \n\n;; if you need a certain size, with a constant initial value\n(aget (int-array 5 1) 4)\n;;=> 1\n(alength (int-array 5))\n;;=> 5\n\n;; finally, you can specify a size + a sequence, which will initialize the array \n;; by taking size from the sequence\n(alength (int-array 5 (range 10)))\n;;=> 5\n;; which is equivalent to\n(alength (int-array (take 5 (range 10)))\n;;=> 5\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/d543a7491b7b47ec7c3e8f259a75d2dd?r=PG&default=identicon", :account-source "clojuredocs", :login "apgwoz"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/d543a7491b7b47ec7c3e8f259a75d2dd?r=PG&default=identicon", :account-source "clojuredocs", :login "apgwoz"}, :_id "542692c9c026201cdc326afa"}], :notes nil, :arglists ["size-or-seq" "size init-val-or-seq"], :doc "Creates an array of ints", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/int-array"} {:added "1.0", :ns "clojure.core", :name "set?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1293674593000, :author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "set", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d8f"} {:created-at 1414508276593, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "map?", :library-url "https://github.com/clojure/clojure"}, :_id "544faef4e4b0dc573b892faa"} {:created-at 1414508317723, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "vector?", :library-url "https://github.com/clojure/clojure"}, :_id "544faf1de4b03d20a102427f"}], :line 4099, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user> (set? #{1 2 3})\ntrue\n\nuser> (set? (hash-set 1 2 3))\ntrue\n\nuser> (set? (sorted-set 1 2 3))\ntrue\n\nuser> (set? [1 2 3])\nfalse\n\nuser> (set? {:a 1 :b 2})\nfalse", :created-at 1293674587000, :updated-at 1423276284407, :_id "542692cec026201cdc326dfa"}], :notes nil, :arglists ["x"], :doc "Returns true if x implements IPersistentSet", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/set_q"} {:added "1.0", :ns "clojure.core", :name "inc'", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1444304838174, :author {:login "andreloureiro", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2106717?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "inc", :ns "clojure.core"}, :_id "561657c6e4b0b41dac04c955"} {:created-at 1495706268555, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "dec'", :ns "clojure.core"}, :_id "5926aa9ce4b093ada4d4d754"}], :line 915, :examples [{:updated-at 1444305445453, :created-at 1444305445453, :author {:login "andreloureiro", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2106717?v=3"}, :body "> (inc' 1)\n2\n\n> (inc' 3.14)\n4.140000000000001\n\n> (inc' 4/5)\n9/5\n\n> (inc' -1)\n0\n\n> (inc' -3/2)\n-1/2\n\n> (inc' -0.2)\n0.8", :_id "56165a25e4b0b41dac04c956"} {:updated-at 1495706130653, :created-at 1495706130653, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body ";;;; (inc') auto-promotes on integer overflow:\n\n(inc' (Long/MAX_VALUE))\n;;=> 9223372036854775808N\n\n;;;; Unlike (inc) which does not:\n\n(inc (Long/MAX_VALUE))\n;;=> ArithmeticException integer overflow", :_id "5926aa12e4b093ada4d4d752"}], :notes nil, :arglists ["x"], :doc "Returns a number one greater than num. Supports arbitrary precision.\n See also: inc", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/inc'"} {:added "1.7", :ns "clojure.core", :name "cat", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1462880190642, :author {:login "achesnais", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6626105?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "cat", :ns "clojure.core.reducers"}, :_id "5731c7bee4b012fa59bdb2ef"} {:created-at 1462880208677, :author {:login "achesnais", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6626105?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "foldcat", :ns "clojure.core.reducers"}, :_id "5731c7d0e4b012fa59bdb2f0"} {:created-at 1679512700855, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "into", :ns "clojure.core"}, :_id "641b547ce4b08cf8563f4b84"} {:created-at 1685378198294, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "concat", :ns "clojure.core"}, :_id "6474d496e4b08cf8563f4bc1"}], :line 7619, :examples [{:updated-at 1462880149225, :created-at 1462880149225, :author {:login "achesnais", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6626105?v=3"}, :body ";; cat is handy for untangling nested collections when using transducers\n\n(into [] (comp cat cat (map inc)) [[[1] [2]] [[3] [4]]])\n;; => [2 3 4 5]", :_id "5731c795e4b012fa59bdb2ee"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; Remove the need of (mapcat identity coll) idiom:\n(def rota (sequence cat (repeat [\"tom\" \"nick\" \"jane\"])))\n(nth rota 7) ; who's up next week?\n;; nick", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1510050037744, :updated-at 1510051755220, :_id "5a0188f5e4b0a08026c48c95"} {:editors [{:login "stanislas", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/240862?v=4"}], :body ";; combining map-indexed with cat for a \"mapcat-indexed\"\n(into []\n (comp\n (map-indexed (fn [index val]\n (repeat index val)))\n cat)\n (range 5))\n;; => [1 2 2 3 3 3 4 4 4 4]", :author {:avatar-url "https://avatars.githubusercontent.com/u/240862?v=4", :account-source "github", :login "stanislas"}, :created-at 1629989634908, :updated-at 1629989697016, :_id "6127ab02e4b0b1e3652d7535"} {:updated-at 1659698277633, :created-at 1659698047207, :author {:login "ghoseb", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1453?v=4"}, :body ";;; a concise and performant way to concat into a vector\n\n(into [] cat [[1 2 3] [4] [5 6 7]])\n;; => [1 2 3 4 5 6 7]\n\n(defn concatv\n \"Concatenate `xs` and return the result as a vector.\"\n [& xs]\n (into [] cat xs))\n\n(concatv '(1 2) [3] [4 5])\n;; => [1 2 3 4 5]\n\n;;; this xducer form is equivalent to the `(vec (concat...` pattern\n(let [x [1 2 3]\n y 4\n z [5 6 7]]\n (= \n (into [] cat [x [y] z])\n (vec (concat x [y] z))))\n\n;; => true", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/1453?v=4", :account-source "github", :login "ghoseb"}], :_id "62ecfb7fe4b0b1e3652d7638"}], :notes nil, :arglists ["rf"], :doc "A transducer which concatenates the contents of each input, which must be a\n collection, into the reduction.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/cat"} {:added "1.9", :ns "clojure.core", :name "StackTraceElement->vec", :file "clojure/core_print.clj", :type "function", :column 1, :see-alsos nil, :line 465, :examples [{:editors [{:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}], :body ";;;; StackTraceElements look like vectors when printed, but they\n;;;; are actually a completely different type. \n;;;; (StackTraceElement->vec) turns them into normal Clojure vectors.\n\n(try \n (/ 1 0)\n (catch Exception e \n (let [cause (->> e .getStackTrace seq first)]\n (pprint cause)\n (class cause))))\n;;=> [clojure.lang.Numbers divide \"Numbers.java\" 158]\n;;=> java.lang.StackTraceElement\n\n(try \n (/ 1 0)\n (catch Exception e \n (let [cause (->> e .getStackTrace seq first StackTraceElement->vec)]\n (pprint cause)\n (class cause))))\n;;=> [clojure.lang.Numbers divide \"Numbers.java\" 158]\n;;=> clojure.lang.PersistentVector\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3", :account-source "github", :login "svenschoenung"}, :created-at 1495970721085, :updated-at 1495970798753, :_id "592ab3a1e4b093ada4d4d77e"}], :notes nil, :arglists ["o"], :doc "Constructs a data representation for a StackTraceElement: [class method file line]", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/StackTraceElement->vec"} {:ns "clojure.core", :name "*suppress-read*", :type "var", :see-alsos nil, :examples nil, :notes [{:body "Not meant for public consumption, implementation detail of reader-conditional feature to skip unreadable forms. See https://clojure.atlassian.net/browse/CLJ-1424", :created-at 1618077877511, :updated-at 1618078788123, :author {:avatar-url "https://avatars.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :_id "6071e8b5e4b0b1e3652d74c0"}], :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*suppress-read*"} {:added "1.0", :ns "clojure.core", :name "flush", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 3705, :examples [{:updated-at 1556307726395, :created-at 1556307726395, :author {:login "pauloaug", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/804447?v=4"}, :body ";; iteratively prints the value of x (after a pause of 100ms) \n(doseq [x (range 20)]\n (Thread/sleep 100)\n (pr x)\n (flush))\n\n;; without a `flush` at each iteration,\n;; we'll get all the output stream at once flushed and printed only at the end \n;; of `doseq` evaluation. \n(doseq [x (range 20)]\n (Thread/sleep 100)\n (pr x))", :_id "5cc35f0ee4b0ca44402ef711"}], :notes nil, :arglists [""], :doc "Flushes the output stream that is the current value of\n *out*", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/flush"} {:added "1.0", :ns "clojure.core", :name "take-while", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1301365974000, :author {:login "pauldoo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5cb916d3c8abc9f45a093209e72489fb?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "drop-while", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c3f"} {:created-at 1347077874000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "split-with", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c40"} {:created-at 1473454417291, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "some", :ns "clojure.core"}, :_id "57d32151e4b0709b524f04f2"} {:created-at 1538951674784, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "take", :ns "clojure.core"}, :_id "5bba89fae4b00ac801ed9ead"}], :line 2888, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"} {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Airwoz", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/47391748e84575258520e85e3725d144?r=PG&default=identicon"}], :body ";; Calculate the sum of all numbers under 1000:\nuser=> (reduce + (take-while (partial > 1000) (iterate inc 0)))\n499500", :created-at 1279591693000, :updated-at 1385275768000, :_id "542692cdc026201cdc326d03"} {:author {:login "patazj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d790f5851d80da498e475ece4487e92?r=PG&default=identicon"}, :editors [{:login "patazj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d790f5851d80da498e475ece4487e92?r=PG&default=identicon"} {:login "patazj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d790f5851d80da498e475ece4487e92?r=PG&default=identicon"} {:login "Matt", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/af7cad0e010feb68f651cb61c54424b4?r=PG&default=identicon"} {:login "Kejia", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1039073?v=3"}], :body "user=> (take-while neg? [-2 -1 0 1 2 3])\n(-2 -1)\n\nuser=> (take-while neg? [-2 -1 0 -1 -2 3]) ; note: `take-while' stops traversing the collection when the predicate is false, as is different from `filter'.\n(-2 -1)\n\nuser=> (take-while neg? [ 0 1 2 3])\n()\n\nuser=> (take-while neg? [])\n()\n\nuser=> (take-while neg? nil)\n()", :created-at 1321607184000, :updated-at 1434723642888, :_id "542692d5c026201cdc3270a2"} {:editors [{:login "henghuang", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5959826?v=3"}], :body ";;take the item while it's included in the set \nuser=> (take-while #{[1 2][3 4]} #{[1 2]})\n([1 2])\nuser=> (take-while #{[1 2][3 4]} #{[3 4]})\n([3 4])\nuser=> (take-while #{[1 2][3 4]} #{[4 5]})\n()\nuser=>(take-while #{[1 2][3 4]} #{[5 6] [1 2]}); return nil while any item is not included in the set\n()", :author {:avatar-url "https://avatars.githubusercontent.com/u/5959826?v=3", :account-source "github", :login "henghuang"}, :created-at 1458044677653, :updated-at 1458044982206, :_id "56e7ff05e4b0507458dcf5a6"} {:updated-at 1517038741181, :created-at 1517038741181, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;take-while practical example\n\n(def entries [{:month 1 :val 12}\n {:month 2 :val 3}\n {:month 3 :val 32}\n {:month 4 :val 18}\n {:month 5 :val 32}\n {:month 6 :val 62}\n {:month 7 :val 12}\n {:month 8 :val 142}\n {:month 9 :val 52}\n {:month 10 :val 18}\n {:month 11 :val 23}\n {:month 12 :val 56}])\n\n(defn get-result\n [coll m]\n (take-while\n #(<= (:month %) m) coll))\n\n(get-result entries 3)\n;;({:m 1, :val 12} {:m 2, :val 3} {:m 3, :val 32})\n", :_id "5a6c2c95e4b076dac5a728a7"} {:editors [{:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}], :body ";; Note that usually more items are realized than needed.\n;; In the example below the first 32 items are calculated,\n;; though the first 2 would be enough.\n;; This can be especially important when this extra realization\n;; leads to an exception (see example at 'take') or requires a lot of\n;; resources (CPU, time, memory, etc.) and at the end not needed at all.\n\nuser=> (let [x (map (fn [i]\n (println i)\n (Thread/sleep 100)\n i)\n (range 50))]\n (take-while #(< % 1) x))\n0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n(0)", :author {:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"}, :created-at 1538951863286, :updated-at 1538953447395, :_id "5bba8ab7e4b00ac801ed9eae"}], :notes nil, :arglists ["pred" "pred coll"], :doc "Returns a lazy sequence of successive items from coll while\n (pred item) returns logical true. pred must be free of side-effects.\n Returns a transducer when no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/take-while"} {:added "1.0", :ns "clojure.core", :name "vary-meta", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1301486152000, :author {:login "ninjudd", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7ced25585a7556e9b9b975c1f9e136e3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-meta", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d19"} {:created-at 1375213046000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "alter-meta!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d1a"}], :line 675, :examples [{:updated-at 1285495771000, :created-at 1280776393000, :body "user=> (meta (vary-meta 'foo assoc :a 1))\n{:a 1}\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692c8c026201cdc326a68"} {:author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :editors [], :body ";; continuing from the previous with-meta example\nuser=> (def wm (with-meta [1 2 3] {:my \"meta\"}))\n#'user/wm\n\nuser=> wm\n[1 2 3]\n\nuser=> (meta wm)\n{:my \"meta\"}\n\nuser=> (def new-wm (vary-meta wm assoc :your \"new meta\"))\n#'user/new-wm\n\nuser=> new-wm\n[1 2 3]\n\nuser=> (meta new-wm)\n{:my \"meta\", :your \"new meta\"}\n\n", :created-at 1359718168000, :updated-at 1359718168000, :_id "542692d5c026201cdc3270b3"}], :notes nil, :arglists ["obj f & args"], :doc "Returns an object of the same type and value as obj, with\n (apply f (meta obj) args) as its metadata.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/vary-meta"} {:added "1.0", :ns "clojure.core", :name "<=", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1451249730987, :author {:login "justCxx", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6506296?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name ">=", :ns "clojure.core"}, :_id "56805042e4b0e0706e05bd90"} {:created-at 1588958577321, :author {:login "alexandreaquiles", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/258331?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "<", :ns "clojure.core"}, :_id "5eb59571e4b087629b5a1907"} {:created-at 1588958583491, :author {:login "alexandreaquiles", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/258331?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "=", :ns "clojure.core"}, :_id "5eb59577e4b087629b5a1908"}], :line 1055, :examples [{:author {:login "mattdw", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ee24aacb65359196b0a1bad050f9a62f?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (<= 1 2)\ntrue\nuser=> (<= 2 2)\ntrue\nuser=> (<= 3 2)\nfalse\nuser=> (<= 2 3 4 5 6)\ntrue", :created-at 1280321906000, :updated-at 1332950755000, :_id "542692cdc026201cdc326cd9"} {:editors [{:login "dijonkitchen", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4"}], :body "user=> (<= 1 2 3 2)\nfalse\n\nuser=> (<= 1 2 3 3)\ntrue", :author {:avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4", :account-source "github", :login "dijonkitchen"}, :created-at 1534460808910, :updated-at 1534460833681, :_id "5b760388e4b00ac801ed9e62"} {:editors [{:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}], :body "user=> (<= 1/4 1/3 1/2)\ntrue\n\nuser=> (<= 1/2 1/3 1/4)\nfalse\n\nuser=> (>= 1/2 0.5)\ntrue", :author {:avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4", :account-source "github", :login "berczeck"}, :created-at 1598154740865, :updated-at 1598156861827, :_id "5f41e7f4e4b0b1e3652d738c"}], :notes nil, :arglists ["x" "x y" "x y & more"], :doc "Returns non-nil if nums are in monotonically non-decreasing order,\n otherwise false.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/<="} {:added "1.0", :ns "clojure.core", :name "alter", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1326053288000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cb7"} {:created-at 1350716275000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "commute", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cb8"} {:created-at 1460613552329, :author {:login "fasiha", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/37649?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ref-set", :ns "clojure.core"}, :_id "570f31b0e4b075f5b2c864e8"}], :line 2443, :examples [{:author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; alter is a way to change the value of a reference.\n\n;; Here we're defining a ref named 'names' and setting its value to\n;; an empty vector.\n(def names (ref []))\n;;=> #'user/names\n\n;; A function to add a name to the vector (notice the meat's wrapped\n;; in a dosync\n(defn add-name [name]\n (dosync\n (alter names conj name)))\n;;=> #'user/add-name\n\n(add-name \"zack\")\n;;=> [\"zack\"]\n\n(add-name \"shelley\")\n;;=> [\"zack\" \"shelley\"]\n\n;; Notice that the var 'names' points to the reference that we created\n(println names)\n;; #\n\n;; To get the actual value of the ref, you use the '@' symbol, or deref\n(println @names)\n;; [zack shelley]\n\n(println (deref names))\n;; [zack shelley]", :created-at 1279456650000, :updated-at 1420669157673, :_id "542692c8c026201cdc326a3c"}], :notes [{:updated-at 1325053153000, :body "I was fooling around with how exactly ref works with maps. Since the example here uses a vector, I thought maybe some of you might want to see a short example using a map.\r\n\r\nIn an aggregator I'm working on, I want to keep a record of how many sources and how many articles I've aggregated. Instead of using an atom for each, I'll reference a map called \"counts.\" Here's a simple little function that increments and returns the new value of the counter stored in the map:\r\n\r\n
 (def counts (ref {:articles 0 :sources 0}))\r\n(defn inc-ref [ref type]\r\n\"increment a map value with key type stored in ref\"\r\n\t(dosync\r\n\t (alter ref assoc type (inc (type @ref)))\r\n\t (type @ref)))\r\nuser> (inc-ref counts :sources)\r\n=>1\r\nuser> counts\r\n=>{:articles 0, :sources 1}\r\n
\r\n\r\nand if you wanted to be able to add counters dynamically (one of the advantages of using a map in this context) you could redefine the function employ an optional argument, which if present instructs the function to create a new key-value pair using the name and initial value provided:\r\n\r\n
(defn inc-ref [ref type & [init-value]]\r\n  (if init-value\r\n    (dosync\r\n     (alter ref assoc type init-value)\r\n     (type @ref))\r\n    (dosync\r\n     (alter ref assoc type (inc (name @ref)))\r\n     (type @ref))))\r\n\r\nuser> (inc-ref counts :articles)\r\n=>1\r\nuser> (inc-ref counts :magazines 1)\r\n=>1\r\nuser> (:magazines @counts)\r\n=>1
", :created-at 1325048179000, :author {:login "borg", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/91d340132e883c02020ccd56946b2b91?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fd4"} {:updated-at 1349979324000, :body "In the previous example at row 07 has a reference to 'name @ref':\r\n
(alter ref assoc type (inc (name @ref)))
\r\nmaybe is incorrect and the correct mode is: \r\n
 (alter ref assoc type (inc (type @ref)))
", :created-at 1349979324000, :author {:login "grayzone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/261286ad984a83e1b0c5e0d7695d58fc?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fec"}], :arglists ["ref fun & args"], :doc "Must be called in a transaction. Sets the in-transaction-value of\n ref to:\n\n (apply fun in-transaction-value-of-ref args)\n\n and returns the in-transaction-value of ref.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/alter"} {:added "1.0", :ns "clojure.core", :name "-'", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1412882360420, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "-", :library-url "https://github.com/clojure/clojure"}, :_id "5436dfb8e4b0ae7956031578"} {:created-at 1423527625657, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "unchecked-subtract", :library-url "https://github.com/clojure/clojure"}, :_id "54d94ec9e4b081e022073c86"} {:created-at 1423527647730, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "unchecked-negate", :library-url "https://github.com/clojure/clojure"}, :_id "54d94edfe4b081e022073c87"}], :line 1031, :examples [{:body ";; unlike the * and + functions there is no 0 arity form\n(-')\n;; ArityException: wrong number of args (0)\n\n(-' 1)\n;;=> -1 \n\n(-' 6 3) \n;;=> 3\n\n(-' 10 3 2) \n;;=> 5\n\n(- 0 9000000000000000000 1000000000000000000)\n;; ArithmeticException: integer overflow\n\n(-' 0 9000000000000000000 1000000000000000000)\n;;=> 10000000000000000000N ", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1412882316521, :updated-at 1412882316521, :_id "5436df8ce4b06dbffbbb00c3"}], :notes nil, :arglists ["x" "x y" "x y & more"], :doc "If no ys are supplied, returns the negation of x, else subtracts\n the ys from x and returns the result. Supports arbitrary precision.\n See also: -", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/-'"} {:added "1.6", :ns "clojure.core", :name "if-some", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1417641557196, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:ns "clojure.core", :name "when-some", :library-url "https://github.com/clojure/clojure"}, :_id "547f7e55e4b03d20a10242bd"} {:created-at 1440455816295, :author {:login "brunchboy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2228869?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "if-let", :ns "clojure.core"}, :_id "55db9c88e4b072d7f27980ef"} {:created-at 1528840542254, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "some", :ns "clojure.core"}, :_id "5b20415ee4b00ac801ed9e12"}], :line 1876, :examples [{:body "(if-some [a 10] :true :false) ; => :true\n(if-some [a true] :true :false) ; => :true\n(if-some [a false] :true :false) ; => :true\n(if-some [a nil] :true :false) ; => :false\n\n;; for comparison\n(if-let [a 10] :true :false) ; => :true\n(if-let [a true] :true :false) ; => :true \n(if-let [a false] :true :false) ; => :false\n(if-let [a nil] :true :false) ; => :false\n", :author {:login "philoskim", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5637280?v=3"}, :created-at 1420603516061, :updated-at 1420603516061, :_id "54acb07ce4b09260f767ca8e"}], :macro true, :notes [{:body "See [this Jira ticket](http://dev.clojure.org/jira/browse/CLJ-1343) for some background on this.\n\n (if-some [var test] then else)\n\nis essentially equivalent to:\n\n (if-let [var (not (nil? test))] then else)\n", :created-at 1417641857996, :updated-at 1417641857996, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :_id "547f7f81e4b03d20a10242be"} {:author {:login "titogarcia", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/699549?v=4"}, :updated-at 1634126821797, :created-at 1634126821797, :body "> `(if-some [var test] then else)`\n>\n> is essentially equivalent to:\n>\n> `(if-let [var (not (nil? test))] then else)`\n\nThis is incorrect. Notice that `nil?` will return a boolean. This equivalency would only be true if `test` is a boolean value.", :_id "6166cbe5e4b0b1e3652d7559"}], :arglists ["bindings then" "bindings then else & oldform"], :doc "bindings => binding-form test\n\n If test is not nil, evaluates then with binding-form bound to the\n value of test, if not, yields else", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/if-some"} {:added "1.1", :ns "clojure.core", :name "conj!", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1286870227000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "transient", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d6f"} {:created-at 1329969779000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "assoc!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d70"} {:created-at 1329969851000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "dissoc!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d71"} {:created-at 1473091049902, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "conj", :ns "clojure.core"}, :_id "57cd95e9e4b0709b524f04e3"}], :line 3358, :examples [{:updated-at 1577915992503, :created-at 1286870264000, :body ";; As seen on http://clojure.org/transients\n;; array is initially made transient, modified then\n;; finally made persistent.\n\n;; Note: This example correctly always uses the return value of conj! for\n;; future modifications, not the original value of v. See assoc! examples,\n;; and another example for conj!, for some discussion of why this is important.\n\n(defn vrange2 [n]\n (loop [i 0 v (transient [])]\n (if (< i n)\n (recur (inc i) (conj! v i))\n (persistent! v))))\n\nuser=> (vrange2 10)\n[0 1 2 3 4 5 6 7 8 9]", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}], :author {:avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon", :account-source "clojuredocs", :login "gstamp"}, :_id "542692cac026201cdc326b43"} {:updated-at 1577915639084, :created-at 1577915639084, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :body ";; The next function below uses conj! incorrectly, ignoring its return\n;; value.\n\nuser=> (defn into-bad-example-bash-in-place [to-coll from-coll]\n (let [t (transient to-coll)]\n (loop [f (seq from-coll)]\n (if-let [s (seq f)]\n (do\n (conj! t (first s))\n (recur (next s)))\n (persistent! t)))))\n\n;; The first example call below returns the desired value.\n\nuser=> (into-bad-example-bash-in-place {:a 1, :b 2, :c 3} {:d 4, :e 5})\n{:a 1, :b 2, :c 3, :d 4, :e 5}\n\n;; However, it is by accident that it is correct. This effect can be\n;; subtle and surprising to many, because many experiments will return\n;; the desired values, as the example above does.\n\n;; The return value is correct for these inputs because all of these\n;; calls to conj! not only return the mutated object that we should be\n;; using, but they also happen to mutate the object in place that it\n;; is passed. Thus ignoring the return value happens not to lead to\n;; incorrect behavior here.\n\n;; However, conj! _can_ in some cases return a different object than\n;; the one it was passed, and _not_ mutate the object it is passed.\n;; Look at this return value.\n\nuser=> (into-bad-example-bash-in-place\n {:a 1, :b 2, :c 3, :d 4, :e 5, :f 6, :g 7, :h 8}\n {:i 9})\n{:a 1, :b 2, :c 3, :d 4, :e 5, :f 6, :g 7, :h 8}\n\n;; This result is not what we want, because key :i is not present in\n;; the result anywhere. conj! returned a different object than the\n;; one it was given, but the function above does not use the return\n;; value, instead discarding it.\n\n;; The function below uses conj! as it should be, always using its\n;; return value in future calls on the transient collection.\n\nuser=> (defn into-better-use-return-value [to-coll from-coll]\n (loop [t (transient to-coll)\n f (seq from-coll)]\n (if-let [s (seq f)]\n (recur (conj! t (first s))\n (next s))\n (persistent! t))))\n\nuser=> (into-better-use-return-value {:a 1, :b 2, :c 3} {:d 4, :e 5})\n{:a 1, :b 2, :c 3, :d 4, :e 5}\n\nuser=> (into-better-use-return-value\n {:a 1, :b 2, :c 3, :d 4, :e 5, :f 6, :g 7, :h 8}\n {:i 9})\n{:e 5, :g 7, :c 3, :h 8, :b 2, :d 4, :f 6, :i 9, :a 1}\n\n;; The keys are not in the same order, but recall that regular Clojure\n;; maps are not sorted in any predictable way, as opposed to\n;; sorted-map's. However, all 9 of the keys that we expect to be\n;; there, are there.", :_id "5e0d14f7e4b0ca44402ef804"}], :notes nil, :arglists ["" "coll" "coll x"], :doc "Adds x to the transient collection, and return coll. The 'addition'\n may happen at different 'places' depending on the concrete type.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/conj!"} {:added "1.0", :ns "clojure.core", :name "repeatedly", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1286264111000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "repeat", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c8e"} {:created-at 1289359620000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "iterate", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c8f"} {:created-at 1289359625000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "lazy-seq", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c90"} {:created-at 1295239829000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "dotimes", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c91"} {:created-at 1295239907000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "doall", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c92"} {:created-at 1343151093000, :author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rand-int", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c93"} {:created-at 1345605379000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "constantly", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c94"} {:created-at 1502829747775, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "while", :ns "clojure.core"}, :_id "59935cb3e4b0d19c2ce9d717"}], :line 5143, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "citizen428", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3881a28fe402dd2d1de44717486cae8?r=PG&default=identicon"} {:login "citizen428", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3881a28fe402dd2d1de44717486cae8?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"} {:login "nyashh", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2254461eab79d5d84a021414e8e36dba?r=PG&default=identicon"} {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"} {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"} {:login "tomas", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c0c2f195479ae4a71cb6484679f6f49?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; these two functions are equivalent \n\n(take 5 (repeatedly #(rand-int 11)))\n;;=> (6 6 3 9 8)\n\n;; this version only returns the first five elements\n(repeatedly 5 #(rand-int 11))\n;;=> (1 8 6 9 6)\n\n;; compare with repeat, which\n;; only calls the 'rand-int' function once,\n;; repeating the value five times.\n(repeat 5 (rand-int 100))\n(94 94 94 94 94)", :created-at 1279093287000, :updated-at 1421872565837, :_id "542692cfc026201cdc326e2f"} {:author {:login "Jeff Rose", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/567898c496278341be69087507d5ed24?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(defn counter [] \n (let [tick (atom 0)]\n #(swap! tick inc)))\n\n(def tick (counter))\n\n(take 10 (repeatedly tick))\n;;=> (1 2 3 4 5 6 7 8 9 10)\n\n;; or equivalently\n(repeatedly 10 (counter))\n;;=> (1 2 3 4 5 6 7 8 9 10)", :created-at 1283550417000, :updated-at 1421872865341, :_id "542692cfc026201cdc326e38"} {:editors [{:login "Jjunior130", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7597818?v=3"}], :body ";;;; If you want random values for each element in repeatedly\n;; don't call rand as an argument in partial\n(= true\n (every? true?\n [(apply = (flatten\n (repeatedly 2 (partial vector (rand)))))\n (apply = (flatten\n (repeatedly 2 (partial (partial vector (rand))))))]))\n\n;; but do call it within a #(...) or (fn [] ...)\n(= true\n (every? false?\n [(apply = (repeatedly 2 rand)) \n (apply = (repeatedly 2 #(rand))) \n (apply = (repeatedly 2 (partial rand))) ; passing the rand function works\n (apply = (flatten\n (repeatedly 2 (fn [] (vector (rand))))))\n (apply = (flatten\n (repeatedly 2 #((partial vector (rand))))))\n (apply = (flatten\n (repeatedly 2 #(vector (rand)))))]))", :author {:avatar-url "https://avatars.githubusercontent.com/u/7597818?v=3", :account-source "github", :login "Jjunior130"}, :created-at 1483821463432, :updated-at 1483821506915, :_id "58715197e4b09108c8545a50"} {:updated-at 1520597247645, :created-at 1520595747920, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; \"repeatedly\" used to build a infinite sequence of side-effecting futures.\n;; Futures are taken in batch of \"parallel\" concurrent threads. The queue\n;; can be fed while the loop is running. \"done?\" determines the exit condition.\n\n(import '[java.util.concurrent ConcurrentLinkedQueue])\n(def q (ConcurrentLinkedQueue. (range 100)))\n\n(let [parallel 5\n done? #(> (reduce + (remove nil? %)) 30)\n task #(do (println \"start\" %) (Thread/sleep 1000) (inc %))]\n (loop [workers (repeatedly\n #(let [out *out*]\n (future\n (binding [*out* out]\n (when-let [item (.poll q)]\n (task item))))))]\n (println \"-> starting\" parallel \"new workers\")\n (let [futures (doall (take parallel workers))\n results (mapv deref futures)]\n (cond\n (done? results) results\n (.isEmpty q) (println \"Empty.\")\n :else (recur (drop parallel workers))))))\n\n;; -> starting 5 new workers\n;; startstart 03\n;;\n;; startstart 1\n;; 2start 4\n;;\n;; -> starting 5 new workers\n;; start 5start\n;; start start7start\n;; 6\n;; 8\n;; 9\n[6 7 8 9 10]\n", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5aa27323e4b0316c0f44f914"} {:updated-at 1576431818434, :created-at 1576431818434, :author {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/24317401?v=4"}, :body ";; CLI app to return the type of a line\n\n(doseq [val (repeatedly read-line)]\n (prn\n (type\n (clojure.edn/read-string val))))\n\n;; $\nHello\nclojure.lang.Symbol\n15\njava.lang.Long\n:keyword\nclojure.lang.Keyword\n{}\nclojure.lang.PersistentArrayMap", :_id "5df670cae4b0ca44402ef7fb"}], :notes [{:updated-at 1289359893000, :body "if the function you want to repeat doesn't have side effects and has an argument, 'iterate' may be what you are looking for.", :created-at 1289359893000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fa1"}], :arglists ["f" "n f"], :doc "Takes a function of no args, presumably with side effects, and\n returns an infinite (or length n if supplied) lazy sequence of calls\n to it", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/repeatedly"} {:added "1.0", :ns "clojure.core", :name "zipmap", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1325197673000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "interleave", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e62"} {:created-at 1652060861458, :author {:login "KyleErhabor", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/40676441?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "into", :ns "clojure.core"}, :_id "627872bde4b0b1e3652d75ec"}], :line 3071, :examples [{:author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:avatar-url "https://avatars.githubusercontent.com/u/5696817?v=3", :account-source "github", :login "liango2"}], :body "user=> (zipmap [:a :b :c :d :e] [1 2 3 4 5])\n{:a 1, :b 2, :c 3, :d 4, :e 5}\n", :created-at 1279388151000, :updated-at 1451234587672, :_id "542692c7c026201cdc3269a8"} {:author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:login "liango2", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5696817?v=3"}], :body ";; 4 is not included in the result\nuser=> (zipmap [:a :b :c] [1 2 3 4])\n{:a 1, :b 2, :c 3}\n\n;; :c is not included in the result\nuser=> (zipmap [:a :b :c] [1 2])\n{:a 1, :b 2}", :created-at 1335331821000, :updated-at 1451234612952, :_id "542692d6c026201cdc3270cb"} {:editors [{:login "ys-achinta", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/10450478?v=4"}], :body "user=> (pprint \n (zipmap [:html :body :div] (repeat {:margin 0 :padding 0})))\n{:html {:margin 0, :padding 0},\n :body {:margin 0, :padding 0},\n :div {:margin 0, :padding 0}}", :author {:avatar-url "https://avatars.githubusercontent.com/u/4471727?v=3", :account-source "github", :login "edbedbe"}, :created-at 1439315700433, :updated-at 1566311402870, :_id "55ca36f4e4b0080a1b79cdb9"} {:editors [{:login "tecigo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/13831422?v=3"}], :body ";; transform a CSV file to an array of maps using the header line as keys\nuser=> (defn csv-map\n \"ZipMaps header as keys and values from lines.\"\n [head & lines]\n (map #(zipmap (map keyword head) %1) lines))\n\nuser=> (apply csv-map [[\"FirstName\", \"LastName\"], [\"John\", \"Doe\"], [\"Jill\", \"Doh\"]])\n({:FirstName \"John\", :LastName \"Doe\"}, {:FirstName \"Jill\", :LastName \"Doh\"})", :author {:avatar-url "https://avatars.githubusercontent.com/u/13831422?v=3", :account-source "github", :login "tecigo"}, :created-at 1459353469570, :updated-at 1459354350134, :_id "56fbf77de4b069b77203b858"} {:updated-at 1472949315282, :created-at 1472949315282, :author {:login "d-lord", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6218499?v=3"}, :body ";; initialize with 0 for all values\nuser=> (zipmap [:a :b :c] (repeat 0))\n{:a 0, :b 0, :c 0}", :_id "57cb6c43e4b0709b524f04e1"} {:updated-at 1488306683395, :created-at 1488306683395, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :body ";; Note that if the keys are not unique, you can potentially lose data:\nuser=> (zipmap [:a :b :c :a] [1 2 3 4])\n{:a 4, :b 2, :c 3}\n", :_id "58b5c1fbe4b01f4add58fe66"} {:editors [{:login "zyxmn-rvu", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/53867608?v=4"}], :body ";; Note the generated map is meant to be un-ordered and can be noticed only for sizes greater than 8\n\n;; Ordered as key coll argument\nuser=> (zipmap [:key1 :key2 :key3 :key4 :key5 :key6 :key7 :key8] [1 2 3 4 5 6 7 8])\n{:key1 1, :key2 2, :key3 3, :key4 4, :key5 5, :key6 6, :key7 7, :key8 8}\n\n;; Un-ordered\nuser=> (zipmap [:key1 :key2 :key3 :key4 :key5 :key6 :key7 :key8 :key9] [1 2 3 4 5 6 7 8 9])\n{:key3 3, :key2 2, :key8 8, :key6 6, :key9 9, :key7 7, :key4 4, :key1 1, :key5 5}\n", :author {:avatar-url "https://avatars1.githubusercontent.com/u/53867608?v=4", :account-source "github", :login "zyxmn-rvu"}, :created-at 1574963248718, :updated-at 1574963310117, :_id "5de00830e4b0ca44402ef7ed"} {:updated-at 1649862774454, :created-at 1649862774454, :author {:login "stindrago", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69054881?v=4"}, :body ";; Alternative logic for `cond` scenarios\n\n;; `zipmap` returns a map paring each value in the range (1-4) to a percentage (50%)\n(def rates\n (conj {0 0/100}\n (zipmap (range 1 5) (repeat 50/100))\n {5 90/100}))\n;; => {0 0, 1 1/2, 2 1/2, 3 1/2, 4 1/2, 5 9/10}\n\n(* 2.0 (rates 3))\n;; => 1.0", :_id "6256e876e4b0b1e3652d75d3"}], :notes [{:author {:login "seeeturtle", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/22187719?v=4"}, :updated-at 1553308608008, :created-at 1553308608008, :body "`zipmap` always leave last key & val if keys are duplicated\nlike the last example code.\n\nYou can know them from source code which `assoc` key & val to result map in left-to-right order.", :_id "5c959bc0e4b0ca44402ef6c0"}], :arglists ["keys vals"], :doc "Returns a map with the keys mapped to the corresponding vals.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/zipmap"} {:added "1.9", :ns "clojure.core", :name "reset-vals!", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 2383, :examples [{:updated-at 1539313237640, :created-at 1539312224752, :author {:login "WinfieldHill", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4356515?v=4"}, :body ";; An atom is defined\n(def open-sockets (atom []))\n;;=> #'user/open-sockets\n\n;; Conjoin a value or two onto the atom\n(swap! open-sockets conj socket)\n;;=> [<< stream: 1 >> << stream: 2 >>]\n\n;; Knock the first socket out of open-sockets\n(reset-vals! open-sockets (subvec @open-sockets 1))\n;;=> [[<< stream: 1 >> << stream: 2 >>][<< stream: 2 >>]]\n\n;; Knock the last socket out of open-sockets\n(reset-vals! open-sockets (pop @open-sockets))\n;;=> [[<< stream: 2 >>] []]", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/4356515?v=4", :account-source "github", :login "WinfieldHill"}], :_id "5bc00a60e4b00ac801ed9ed2"}], :notes nil, :arglists ["atom newval"], :doc "Sets the value of atom to newval. Returns [old new], the value of the\n atom before and after the reset.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/reset-vals!"} {:added "1.0", :ns "clojure.core", :name "alter-var-root", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1322088086000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-redefs", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f28"} {:created-at 1322088098000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-redefs-fn", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f29"} {:created-at 1360641932000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "intern", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f2a"} {:created-at 1374167327000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "var", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f2b"} {:created-at 1501312693026, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "set!", :ns "clojure.core"}, :_id "597c36b5e4b0d19c2ce9d702"}], :line 5505, :examples [{:updated-at 1607409758219, :created-at 1283913245000, :body "(defn sqr [n] \n \"Squares a number\"\n (* n n))\n\nuser=> (sqr 5)\n25\n\nuser=> (alter-var-root \n (var sqr) ; var to alter\n (fn [f] ; fn to apply to the var's value\n (fn [n] ; returns a new fn wrapping old fn\n (println \"Squaring\" n)\n (f n))))\n\nuser=> (sqr 5)\nSquaring 5\n25\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:login "liuchong", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/236058?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/5aa24eee4238e1e964210ed447e8dc91?r=PG&default=identicon", :account-source "clojuredocs", :login "fogus"}, :_id "542692cfc026201cdc326e70"} {:updated-at 1472301721034, :created-at 1472301721034, :author {:login "manishkumarmdb", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/9373950?v=3"}, :body ";;change the value of a var, instead of (def varName value)\nuser=> (def string \"abcd\")\n#'user/string\n\nuser=> string\n\"abcd\"\n\nuser=> (alter-var-root #'string (constantly \"wxyz\"))\n\"wxyz\"\n\nuser=> string\n\"wxyz\"", :_id "57c18a99e4b0709b524f04d6"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; alter-var-root does not play well with inlined vars\n\n(definline timespi [x] `(* ~x 3.14))\n(alter-var-root #'timespi (fn [_] (constantly 1)))\n(timespi 10)\n;; 31.400000000000002\n\n;; Remove the inlining to pass through the var indirection (credits @bronsa)\n(alter-meta! #'timespi dissoc :inline-arities :inline)\n(timespi 10)\n;; 1", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1546020626144, :updated-at 1546020907201, :_id "5c266712e4b0ca44402ef601"} {:updated-at 1648587095817, :created-at 1648587095817, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/159047?v=4"}, :body "(defn instrument-ns\n \"Add some basic instrumentation to each var in a given namespace `sut`.\n A poor man's profiler, this simply prints out the name of each\n fn (var) when run.\"\n [sut]\n (let [fs (vals (ns-interns sut))]\n (println \"Instrumenting fns to be printed as run for NS:\" sut)\n (doseq [curf fs]\n (when (some? (:arglists (meta curf))) ; ensure a fn\n (alter-var-root\n curf\n (fn [f]\n (fn [& args]\n ;; Just print out the name of the function evaluated\n (println (:name (meta curf)))\n ;; (System/currentTimeMillis) ; could add timing info before/after\n (apply f args))))))))\n", :_id "62437157e4b0b1e3652d75c4"} {:editors [{:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}], :body ";; `alter-var-root` uses the same signature as `swap!` and `update`. \n;; It has uncomfortable, persistent effects if you're not careful. \n\nuser=> (def x \"Hi\")\n#'user/x\nuser=> (alter-var-root #'x #(str % \", world!\"))\n\"Hi, world!\"\nuser=> (alter-var-root #'x #(str % \", world!\"))\n\"Hi, world!, world!\"\nuser=> (alter-var-root #'x #(str % \", world!\"))\n\"Hi, world!, world!, world!\"\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4", :account-source "github", :login "Crowbrammer"}, :created-at 1653498578027, :updated-at 1653498619629, :_id "628e62d2e4b0b1e3652d75f1"}], :notes nil, :arglists ["v f & args"], :doc "Atomically alters the root binding of var v by applying f to its\n current value plus any args", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/alter-var-root"} {:added "1.0", :ns "clojure.core", :name "biginteger", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1509577866305, :author {:login "chrm", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/448995?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "bigint", :ns "clojure.core"}, :_id "59fa548ae4b0a08026c48c92"}], :line 3633, :examples [{:author {:login "linxiangyu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2c7492645426ece4ae86fde83d61bd03?r=PG&default=identicon"}, :editors [], :body "user=> (def x (biginteger 19931029))\n#'user/x\nuser=> (class x)\njava.math.BigInteger\n\n\n\n", :created-at 1370558225000, :updated-at 1370558225000, :_id "542692d2c026201cdc326f53"} {:updated-at 1509577857859, :created-at 1509577857859, :author {:login "chrm", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/448995?v=4"}, :body ";; There is a difference between `BigInt` and `BigInteger`. The first is from\n;; Clojure and should be better for performace, because less unboxing is\n;; necessary. The second is from Java and has more functionality.\n;; https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html\n\n(type 123N)\n;; => clojure.lang.BigInt\n\n(type (bigint 123))\n;; => clojure.lang.BigInt\n\n(type (biginteger 123))\n;; => java.math.BigInteger\n\n(.modInverse (bigint 123) (bigint 4))\n;; IllegalArgumentException No matching method found: modInverse for class\n;; clojure.lang.BigInt\n\n(.modInverse (biginteger 123) (biginteger 4))\n;; => 3", :_id "59fa5481e4b0a08026c48c91"} {:editors [{:login "cloojure", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/7083783?v=4"}], :body "; It also works for strings\n(biginteger \"12345\") => 12345 ; java.math.BigInteger\n", :author {:avatar-url "https://avatars0.githubusercontent.com/u/7083783?v=4", :account-source "github", :login "cloojure"}, :created-at 1535909938405, :updated-at 1535910003220, :_id "5b8c2032e4b00ac801ed9e7f"} {:updated-at 1598221345110, :created-at 1598221345110, :author {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}, :body ";; Take care with ratios the decimal part is removed not rounded\nuser=> (biginteger 5/4) ; 1.25\n;; 1\n\nuser=> (biginteger 5/2) ; 2.5\n;; 2", :_id "5f42ec21e4b0b1e3652d73a8"}], :notes nil, :tag "java.math.BigInteger", :arglists ["x"], :doc "Coerce to BigInteger", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/biginteger"} {:added "1.0", :ns "clojure.core", :name "remove", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1282310768000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "filter", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cee"} {:created-at 1487135935513, :author {:login "chrismurrph", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10278575?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "group-by", :ns "clojure.core"}, :_id "58a3e4bfe4b01f4add58fe55"} {:created-at 1501184742340, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "keep", :ns "clojure.core"}, :_id "597a42e6e4b0d19c2ce9d701"}], :line 2826, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "sir-pinecone", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/40753?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(remove pos? [1 -2 2 -1 3 7 0])\n;;=> (-2 -1 0)\n\n(remove nil? [1 nil 2 nil 3 nil])\n;;=> (1 2 3)\n\n;; remove items that are evenly divisible by 3\n(remove #(zero? (mod % 3)) (range 1 21))\n;;=> (1 2 4 5 7 8 10 11 13 14 16 17 19 20)", :created-at 1281548721000, :updated-at 1420744145542, :_id "542692cfc026201cdc326e3c"} {:body ";; compare to filter\n\n(remove even? (range 10))\n;;=> (1 3 5 7 9)\n\n(remove (fn [x]\n (= (count x) 1))\n [\"a\" \"aa\" \"b\" \"n\" \"f\" \"lisp\" \"clojure\" \"q\" \"\"])\n;;=> (\"aa\" \"lisp\" \"clojure\" \"\")\n\n; When coll is a map, pred is called with key/value pairs.\n(remove #(> (second %) 100)\n {:a 1\n :b 2\n :c 101\n :d 102\n :e -1})\n;;=> ([:a 1] [:b 2] [:e -1])\n", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1420744060322, :updated-at 1420744060322, :_id "54aed57ce4b0e2ac61831ca0"} {:updated-at 1453292141320, :created-at 1453292141320, :author {:login "esumitra", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/98965?v=3"}, :body ";; remove items from a set/list\n\n(remove #{:a} #{:b :c :d :a :e})\n;;=> (:e :c :b :d)\n\n(remove #{:a} [:b :c :d :a :e :a :f])\n;;=> (:b :c :d :e :f)\n", :_id "569f7a6de4b060004fc217af"} {:updated-at 1516533045589, :created-at 1516533045589, :author {:login "vastus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/199064?v=4"}, :body ";; use map as a pred\n\n(remove {:a 42 :b 69} #{:a :b :c})\n;;=> (:c)", :_id "5a647535e4b0637c3b2baf4c"} {:updated-at 1594561061837, :created-at 1594561061837, :author {:login "kevinmungai", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/23656776?v=4"}, :body ";; remove all the hyphens in an ISBN Number\n\n(into [] (remove #{\\-}) \"3-598-21508-8\")\n;;=> [\\3 \\5 \\9 \\8 \\2 \\1 \\5 \\0 \\8 \\8]\n\n;; remove is used in the capacity of a transducer", :_id "5f0b1225e4b0b1e3652d7321"} {:updated-at 1601477483307, :created-at 1601477483307, :author {:login "E-A-Griffin", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/53583563?v=4"}, :body ";; remove unique elements from collection\n\n(def nums (concat (range 10) (range 5 15)))\n\n(keys (remove (fn [[k v]] (= v 1))\n (frequencies nums)))\n;;=> (7 6 9 5 8)\n\n;; remove unique elements from collection, preserving order\n(defn keep-duplicates [coll]\n (sort-by #((into {} (map-indexed vector coll)) %) \n (keys (remove (fn [[k v]] (= v 1))\n (frequencies coll)))))\n\n(keep-duplicates nums)\n;; => (5 6 7 8 9)\n\n(def rev-nums (reverse nums))\n\n(keep-duplicates rev-nums)\n;;=> (9 8 7 6 5)", :_id "5f749b6be4b0b1e3652d73c6"}], :notes nil, :arglists ["pred" "pred coll"], :doc "Returns a lazy sequence of the items in coll for which\n (pred item) returns logical false. pred must be free of side-effects.\n Returns a transducer when no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/remove"} {:added "1.2", :ns "clojure.core", :name "*", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1323065497000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "*'", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ca8"} {:created-at 1423527840855, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "unchecked-multiply", :library-url "https://github.com/clojure/clojure"}, :_id "54d94fa0e4b081e022073c88"}], :line 1008, :examples [{:author {:login "samaaron", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ee3512261f38df2541b9adca77f025cb?r=PG&default=identicon"}, :editors [{:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jmglov", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/67e9a6f766dc4b30bd5e9ff3e77c1777?r=PG&default=identicon"} {:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"} {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}], :body ";; there is an implicit 1\n(*)\n;;=> 1 \n\n;; the implicit 1 comes into play\n(* 6)\n;;=> 6\n\n(* 2 3)\n;;=> 6\n\n(* 2 3 4)\n;;=> 24\n\n(* 0.5 200)\n;;=> 100.0\n\n(* 8 1/2)\n;;=> 4N\n\n(* 1234567890 9876543210)\n;; ArithmeticException integer overflow", :created-at 1278738436000, :updated-at 1598154236190, :_id "542692c8c026201cdc326a45"}], :notes nil, :arglists ["" "x" "x y" "x y & more"], :doc "Returns the product of nums. (*) returns 1. Does not auto-promote\n longs, will throw on overflow. See also: *'", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*"} {:added "1.0", :ns "clojure.core", :name "re-pattern", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1289146513000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "re-find", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b2f"} {:created-at 1324450178000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.string", :name "replace", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b30"} {:created-at 1324450182000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.string", :name "replace-first", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b31"}], :line 4839, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "NielsK", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/11ab6518d419df03c4883af80b5697ee?r=PG&default=identicon"}], :body "user=> (re-pattern \"\\\\d+\")\n#\"\\d+\"\n\nuser=> (re-find (re-pattern \"\\\\d+\") \"abc123def\") \n\"123\"\n\n;; If you want to construct a regex pattern dynamically at run time,\n;; then you need to use re-pattern to convert a string to a pattern\n;; that can be used for matching. But if your pattern is one you\n;; write into the source code, it is more convenient to use the\n;; #\"pattern\" syntax. The previous example can be written as follows.\nuser=> (re-find #\"\\d+\" \"abc123def\") \n\"123\"\n\n;; Below are two examples that are equivalent in the patterns they\n;; use, but the #\"pattern\" syntax helps significantly, because it lets\n;; us avoid the requirement to escape every \\ character with another \\\n;; character. See the example with embedded comments below for more\n;; detail on what the pattern matches.\nuser=> (re-find #\"\\\\\\d+\\s+\\S+\" \"\\\\ it sh0uld match in \\\\5 here somewhere.\")\n\"\\\\5 here\"\n\nuser=> (re-find (re-pattern \"\\\\\\\\\\\\d+\\\\s+\\\\S+\")\n \"\\\\ it sh0uld match in \\\\5 here somewhere.\")\n\"\\\\5 here\"\n\n;; If you want to embed (ignored) whitespace and comments from #\n;; characters until end-of-line in your regex patterns, start the\n;; pattern with (?x)\nuser=> (re-find #\"(?x) # allow embedded whitespace and comments\n \\\\ # backslash\n \\d+ # one or more digits\n \\s+ # whitespace\n \\S+ # non-whitespace\"\n \"\\\\ it sh0uld match in \\\\5 here somewhere.\")\n\"\\\\5 here\"\n\n;; Other pattern flags like Java's DOTALL, MULTILINE and UNICODE_CASE\n;; pattern matching modes, can be set by combining these embedded flags\n\n;; (?d) Unix lines (only match \\newline)\n;; (?i) Case-insensitive\n;; (?u) Unicode-aware Case\n;; (?m) Multiline\n;; (?s) Dot matches all (including newline)\n;; (?x) Ignore Whitespace and comments\n\nuser=> (re-seq #\"(?ix) test #Case insensitive and comments allowed\"\n \"Testing,\\n testing,\\n 1 2 3\")\n(\"Test\" \"test\")\n", :created-at 1280547138000, :updated-at 1365007458000, :_id "542692c6c026201cdc3268c7"}], :notes [{:author {:login "nuggets510", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/5713182?v=4"}, :updated-at 1567898080855, :created-at 1567898080855, :body "You can access documentation for the regex pattern \"language\" using (javadoc java.util.regex.Pattern) at the repl prompt. it should take you here: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/regex/Pattern.html", :_id "5d7439e0e4b0ca44402ef7ae"}], :tag "java.util.regex.Pattern", :arglists ["s"], :doc "Returns an instance of java.util.regex.Pattern, for use, e.g. in\n re-matcher.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/re-pattern"} {:added "1.0", :ns "clojure.core", :name "min", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1371841114000, :author {:login "adereth", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5ad11b4e208a6cdb3bd45fe01dea59b7?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "max", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f10"} {:created-at 1371841126000, :author {:login "adereth", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5ad11b4e208a6cdb3bd45fe01dea59b7?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "min-key", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f11"}], :line 1125, :examples [{:updated-at 1332951489000, :created-at 1279417619000, :body "user=> (min 1 2 3 4 5) \n1\nuser=> (min 5 4 3 2 1)\n1\nuser=> (min 100)\n100", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}], :author {:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"}, :_id "542692cfc026201cdc326e7a"} {:author {:login "jmglov", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/67e9a6f766dc4b30bd5e9ff3e77c1777?r=PG&default=identicon"}, :editors [], :body ";; If elements are already in a sequence, use apply\nuser=> (apply min [1 2 3 4 3])\n1\nuser=> (apply min '(4 3 5 6 2))\n2", :created-at 1392661837000, :updated-at 1392661837000, :_id "542692d4c026201cdc327011"}], :notes nil, :arglists ["x" "x y" "x y & more"], :doc "Returns the least of the nums.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/min"} {:added "1.1", :ns "clojure.core", :name "pop!", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1329970267000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "assoc!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dcf"} {:created-at 1329970271000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "dissoc!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dd0"} {:created-at 1577916147025, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "conj!", :ns "clojure.core"}, :_id "5e0d16f3e4b0ca44402ef80a"}], :line 3392, :examples [{:updated-at 1577916129615, :created-at 1307739212000, :body ";; Note how we always use the return value of pop! in these examples\n;; for all future modifications, rather than (incorrectly) ignoring the return\n;; value and continuing to modify the original transient set. See examples for\n;; assoc! and dissoc! for more discussion and examples of this.\n;; Also see one example for conj! that contains a detailed example\n;; of a wrong result that can occur if you do not use its return value.\n\nuser=> (def foo (transient [1 2 3]))\n#'user/foo\nuser=> (count foo)\n3\nuser=> (def foo (pop! foo))\n#'user/foo\nuser=> foo\n#\nuser=> (count foo)\n2\nuser=> (def foo (pop! foo))\n#'user/foo\nuser=> (count foo)\n1\nuser=> (def foo (persistent! foo))\n#'user/foo\nuser=> (count foo)\n1\nuser=> foo\n[1]\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}], :author {:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"}, :_id "542692c7c026201cdc3269ce"}], :notes nil, :arglists ["coll"], :doc "Removes the last item from a transient vector. If\n the collection is empty, throws an exception. Returns coll", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/pop!"} {:ns "clojure.core", :name "chunk-append", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1443937484077, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-buffer", :ns "clojure.core"}, :_id "5610bccce4b0686557fcbd51"} {:created-at 1443937492439, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk", :ns "clojure.core"}, :_id "5610bcd4e4b08e404b6c1ca4"}], :line 695, :examples [{:updated-at 1443937472462, :created-at 1443937472462, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :body "(let [buf (chunk-buffer 16)]\n ;; Mutably append elements to the ChunkedBuffer\n (dotimes [n 10]\n (chunk-append buf n))\n\n ;; Demonstrate pulling elements out.\n ;; Note that the `capacity` we set above (16) for `buf`.\n (let [ch (chunk buf)]\n (for [n (range 0 17)]\n (try (.nth ch n)\n (catch ArrayIndexOutOfBoundsException e\n \"too far!\")))))\n\n;; => (0 1 2 3 4 5 6 7 8 9 nil nil nil nil nil nil \"too far!\")", :_id "5610bcc0e4b08e404b6c1ca3"}], :notes nil, :arglists ["b x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/chunk-append"} {:added "1.0", :ns "clojure.core", :name "prn-str", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1315392416000, :author {:login "srid", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd3a68d670372cd09876c26270a4299a?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "prn", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aca"} {:created-at 1412284928324, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.edn", :name "read-string", :library-url "https://github.com/clojure/clojure"}, :_id "542dc200e4b05f4d257a299a"}], :line 4745, :examples [{:updated-at 1495025858123, :created-at 1284257994000, :body "user=> (def x \"Hello!\\nMy name is George.\\n\")\n#'user/x\n\nuser=> (prn-str x)\n=> \"\\\"Hello!\\\\nMy name is George.\\\\n\\\"\\n\"\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/7c45f63f61e478233f0c2ad3006b178c?r=PG&default=identicon", :account-source "clojuredocs", :login "mdemare"} {:avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon", :account-source "clojuredocs", :login "Miles"} {:avatar-url "https://www.gravatar.com/avatar/890d46f8c0e24dd6fb8546095b1144e?r=PG&default=identicon", :account-source "clojuredocs", :login "haplo"} {:login "flyjwayur", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11784820?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon", :account-source "clojuredocs", :login "Miles"}, :_id "542692cac026201cdc326b1d"} {:updated-at 1522767399827, :created-at 1522767399827, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :body ";; Be aware that prn-str and friends are influenced by a couple global variables\n;; such as *print-length*:\n\n(set! *print-length* 10)\n(prn-str (range 15))\n;=> \"(0 1 2 3 4 5 6 7 8 9 ...)\\n\"\n\n(set! *print-length* -1)\n(prn-str (range 15))\n;=> \"(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14)\\n\"", :_id "5ac39627e4b045c27b7fac33"} {:updated-at 1664293623051, :created-at 1664293623051, :author {:login "jzwolak", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/285725?v=4"}, :body ";; Also, set! cannot change the root binding for *print-length*.\n;; Try the following instead.\n\n(def v [1 2 3 4 5 6 7 8 9 10])\n\n(binding [*print-length* 5] (prn-str v))\n;;=> \"[1 2 3 4 5 ...]\\n\"\n\n(binding [*print-length* -1] (prn-str v))\n;;=> \"[1 2 3 4 5 6 7 8 9 10]\\n\"", :_id "63331af7e4b0b1e3652d766a"}], :notes nil, :tag "java.lang.String", :arglists ["& xs"], :doc "prn to a string, returning it", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/prn-str"} {:added "1.0", :ns "clojure.core", :name "with-precision", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1635281422222, :author {:login "Chouser", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/36110?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "*math-context*", :ns "clojure.core"}, :_id "61786a0ee4b0b1e3652d755b"}], :line 5086, :examples [{:author {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"} {:login "wdkrnls", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/6d08a2f792f289b95fe1d982d4133d71?r=PG&default=identicon"}], :body ";; The \"M\" suffix denotes a BigDecimal instance\n;; http://download.oracle.com/javase/6/docs/api/java/math/BigDecimal.html\n\nuser=> (with-precision 10 (/ 1M 6))\n0.1666666667M\n\nuser=> (.floatValue 0.1666666667M)\n0.16666667\n", :created-at 1283812216000, :updated-at 1310865949000, :_id "542692cbc026201cdc326bb1"} {:editors [{:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}], :body ";; This may come in handy for example when you use JDBC to grab data\n;; from a database, and numbers comes in as BigDecimal. Notice the\n;; following ArithmeticException, and solution:\n\n(/ 2M 3M) ; => ArithmeticException\n(with-precision 2 (/ 2M 3M)) ; => 0.67M\n\n;; To make this error more searchable, here's what it is, exactly:\n;;\n;; Non-terminating decimal expansion; no exact representable decimal result. \n;; java.lang.ArithmeticException: Non-terminating decimal expansion; no exact\n;; representable decimal result.\n", :author {:avatar-url "https://avatars1.githubusercontent.com/u/8399149?v=3", :account-source "github", :login "freckletonj"}, :created-at 1490739966308, :updated-at 1524219715125, :_id "58dae2fee4b01f4add58fe7e"}], :macro true, :notes nil, :arglists ["precision & exprs"], :doc "Sets the precision and rounding mode to be used for BigDecimal operations.\n\n Usage: (with-precision 10 (/ 1M 3))\n or: (with-precision 10 :rounding HALF_DOWN (/ 1M 3))\n\n The rounding mode is one of CEILING, FLOOR, HALF_UP, HALF_DOWN,\n HALF_EVEN, UP, DOWN and UNNECESSARY; it defaults to HALF_UP.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/with-precision"} {:added "1.0", :ns "clojure.core", :name "format", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1330170781000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "printf", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dbc"} {:created-at 1330170789000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.pprint", :name "cl-format", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dbd"} {:created-at 1330170796000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.pprint", :name "print-table", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dbe"}], :line 5738, :examples [{:author {:login "Jacolyte", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon"}, :editors [{:login "Jacolyte", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}], :body ";; See http://download.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html\n;; for formatting options.\nuser=> (format \"Hello there, %s\" \"bob\")\n\"Hello there, bob\"\n", :created-at 1279854390000, :updated-at 1317218923000, :_id "542692c6c026201cdc3268ef"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "thethomaseffect", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b4330b8e3ed048b2aa3b50183c42e600?r=PG&default=identicon"}], :body "user=> (format \"%5d\" 3)\n\" 3\"\n\nuser=> (format \"Pad with leading zeros %07d\" 5432)\n\"Pad with leading zeros 0005432\"\n\nuser=> (format \"Left justified :%-7d:\" 5432)\n\"Left justified :5432 :\"\n\nuser=> (format \"Locale-specific group separators %,12d\" 1234567)\n\"Locale-specific group separators 1,234,567\"\n\nuser=> (format \"decimal %d octal %o hex %x upper-case hex %X\" 63 63 63 63)\n\"decimal 63 octal 77 hex 3f upper-case hex 3F\"\n\nuser=> (format \"%2$d %1$s\" \"Positional arguments\" 23)\n\"23 Positional arguments\"\n\n;; ====== Clojure format/printf and large integers =====\n\n;; This big number doesn't fit in a Long. It is a\n;; clojure.lang.BigInt, which format cannot handle directly.\nuser=> (format \"%5d\" 12345678901234567890)\nIllegalFormatConversionException d != clojure.lang.BigInt java.util.Formatter$FormatSpecifier.failConversion (Formatter.java:3999)\n\n;; You can convert it to a java.math.BigInteger, which format does handle.\nuser=> (format \"%5d\" (biginteger 12345678901234567890))\n\"12345678901234567890\"\n\n;; If you do this very often, you might want to use something like\n;; format-plus to avoid sprinkling your code with calls to biginteger.\n(defn coerce-unformattable-types [args]\n (map (fn [x]\n (cond (instance? clojure.lang.BigInt x) (biginteger x)\n (instance? clojure.lang.Ratio x) (double x)\n :else x))\n args))\n\n(defn format-plus [fmt & args]\n (apply format fmt (coerce-unformattable-types args)))\n\n;; Now this works:\nuser=> (format-plus \"%5d\" 12345678901234567890)\n\"12345678901234567890\"", :created-at 1331440228000, :updated-at 1389568458000, :_id "542692d3c026201cdc326fab"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; ==== Clojure format/printf and floating-point formats ====\nuser=> (format \"%.3f\" 2.0)\n\"2.000\"\n\n;; format doesn't handle integers or ratios with %e, %f, %g, or %a\nuser=> (format \"%.3f\" 2)\nIllegalFormatConversionException f != java.lang.Long java.util.Formatter$FormatSpecifier.failConversion (Formatter.java:3999)\n\n;; In general, if you want to use floating-point formats %e, %f, %g,\n;; or %a with format or printf, and you don't know whether the values\n;; you want to format are floats or doubles, you should convert them:\nuser=> (format \"%.3f\" (double 2))\n\"2.000\"\n\nuser=> (format \"%.3f\" (double (/ 5 2)))\n\"2.500\"\n\n;; One could make a function that parses the format string to look for\n;; %f and other floating-point formats and automatically coerces the\n;; corresponding arguments to doubles, but such a function probably\n;; wouldn't fit into a short example. You could also consider using\n;; cl-format which does handle these kinds of things for you. The main\n;; disadvantage to doing so is that you have to learn a different syntax\n;; for format specifiers.", :created-at 1331440712000, :updated-at 1332477536000, :_id "542692d3c026201cdc326fb0"} {:editors [{:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}], :body ";; format doesn't know what nil should look like:\nuser=> (format \"%s\" nil)\n\"null\"\n;; You can use cl-format in this situation:\nuser=> (clojure.pprint/cl-format nil \"~s\" nil)\n\"nil\"\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3", :account-source "github", :login "mars0i"}, :created-at 1437887089127, :updated-at 1437887151600, :_id "55b46a71e4b06a85937088b4"} {:updated-at 1647195081731, :created-at 1647195081731, :author {:login "andreasguther", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/9425214?v=4"}, :body ";; To use the percent sign % you need to escape it with %: %%\nuser=> (format \"%.2f %%\" 2.5)\n\"2.50 %\"", :_id "622e33c9e4b0b1e3652d75ba"} {:updated-at 1663142162249, :created-at 1663142162249, :author {:login "Kynde", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1169360?v=4"}, :body ";; Do notice that it uses the host locale for formatting.\n;; E.g. With Finnish locale it uses comma for separator.\nuser=> (format \"%.2f\" 1.23)\n\"1,23\"\n\n;; You can use the java.lang.String/format to force it.\nuser=> (java.lang.String/format java.util.Locale/US \"%.2f\" (to-array [1.23]))\n\"1.23\"\n\n;; You can override the default, but this affects other things, too.\nuser=> (java.util.Locale/setDefault java.util.Locale/US)\nnil\n\nuser=> (format \"%.2f\" 1.23)\n\"1.23\"\n\n\n", :_id "63218912e4b0b1e3652d7662"}], :notes [{:body "Note that `(format)` is [not currently supported](http://dev.clojure.org/jira/browse/CLJS-324) in ClojureScript, only in Clojure.", :created-at 1438119290177, :updated-at 1438119315501, :author {:avatar-url "https://avatars.githubusercontent.com/u/94482?v=3", :account-source "github", :login "timgilbert"}, :_id "55b7f57ae4b0080a1b79cdb4"} {:author {:login "PEZ", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/30010?v=4"}, :updated-at 1663758017937, :created-at 1663758017937, :body "For ClojureScript there is https://github.com/quoll/clormat. As of this writing it is new and because of that maybe not always fully compliant. Afaiu the goal is to make it fully compliant.", :_id "632aeec1e4b0b1e3652d7664"} {:author {:login "grav", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/119222?v=4"}, :updated-at 1691054508569, :created-at 1691054508569, :body "There's also [Google Closure's format](https://google.github.io/closure-library/api/goog.string.format.html) for ClojureScript. [Example usage](https://tech.toryanderson.com/2020/10/22/zero-padding-and-truncating-with-string-formats-in-clojurescript/).", :_id "64cb71ace4b08cf8563f4bd8"}], :arglists ["fmt & args"], :doc "Formats a string using java.lang.String.format, see java.util.Formatter for format\n string syntax", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/format"} {:added "1.0", :ns "clojure.core", :name "reversible?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 6268, :examples [{:author {:login "replore", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e7869fe1a48cb1814c657eaca6bea3eb?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user=> (reversible? [])\ntrue\nuser=> (reversible? (sorted-map))\ntrue\nuser=> (reversible? (sorted-set))\ntrue\nuser=> (reversible? '())\nfalse\nuser=> (reversible? {})\nfalse\nuser=> (reversible? #{})\nfalse", :created-at 1321359686000, :updated-at 1423095216846, :_id "542692d5c026201cdc327076"}], :notes nil, :arglists ["coll"], :doc "Returns true if coll implements Reversible", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/reversible_q"} {:added "1.0", :ns "clojure.core", :name "shutdown-agents", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1285923562000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "send", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ae5"} {:created-at 1285923568000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "send-off", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ae6"} {:created-at 1285923576000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "agent", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ae7"} {:created-at 1285923589000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "agent-error", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ae8"} {:created-at 1559240451680, :author {:login "pdbrown", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1607096?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "set-agent-send-executor!", :ns "clojure.core"}, :_id "5cf01f03e4b0ca44402ef737"} {:created-at 1559240460246, :author {:login "pdbrown", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1607096?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "set-agent-send-off-executor!", :ns "clojure.core"}, :_id "5cf01f0ce4b0ca44402ef738"}], :line 2254, :examples [{:author {:login "taylor.sando", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c127297f5548f7275ded1428aa5518bb?r=PG&default=identicon"}, :editors [], :body ";; Creating an agent\nuser> (def a (agent 1))\n#'user/a\n\n;; Create a function that can handle an agent\n\nuser> (defn agent-action [a]\n\t33)\n#'user/agent-action\n\n;; The agent will become 33\nuser> (send-off a agent-action)\n#\n\nuser> @a\n33\n;; Create another agent before shutdown\nuser> (def c (agent 3))\n#'user/c\n\n;; Shutdown agents is called\nuser> (shutdown-agents)\nnil\n\n;; Attempt to turn c into 33\nuser> (send c agent-action)\n#\n\n;; The result is that it is still the same value it was initialized with\nuser> @c\n3\n\n;; Agent created after shutdown\nuser> (def d (agent 4))\n#'user/d\n\n;; Try sending it\nuser> (send d agent-action)\n#\n\n;; Same thing, there are no threads to process the agents\nuser> @d\n4", :created-at 1349607696000, :updated-at 1349607696000, :_id "542692d5c026201cdc327084"} {:author {:login "taylor.sando", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c127297f5548f7275ded1428aa5518bb?r=PG&default=identicon"}, :editors [], :body ";; Create the agent that we will be using\nuser=> (def a (agent 0))\n#'user/a\n\n;; Dereference the agent to show the value is 0\nuser=> @a\n0\n\n;; Create a function that can increment the agent\n;; This will continually update the value of the agent\nuser=> (defn agent-inc [a]\n (send-off *agent* agent-inc)\n (inc a))\n#'user/agent-inc\n\n;; Send the agent to the agent-inc function\n;; The value is 188 because by the time the repl has sent off the\n;; agent to the function, the function has already been called recursively\nuser=> (send a agent-inc)\n#\n\n;; Dereference of the value a second or so later\nuser=> @a\n716889\n\n;; Another dereference in another couple of seconds\nuser=> @a\n1455264\n\n;; Shutdown the threads for the agents\nuser=> (shutdown-agents)\nnil\n\n;; Dereference the agent to see what value it is\nuser=> @a\n3522353\n\n;; Dereference the agent again in a few seconds\n;; It's the same value, because the agent pool of threads are no longer\n;; active\nuser=> @a\n3522353\n", :created-at 1349608162000, :updated-at 1349608162000, :_id "542692d5c026201cdc327085"}], :notes nil, :arglists [""], :doc "Initiates a shutdown of the thread pools that back the agent\n system. Running actions will complete, but no new actions will be\n accepted", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/shutdown-agents"} {:added "1.0", :ns "clojure.core", :name "conj", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1297212938000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "cons", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d76"} {:created-at 1398537407000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "into", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d77"} {:created-at 1400493822000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "peek", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d78"} {:created-at 1400493828000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pop", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d79"} {:created-at 1430745236745, :author {:login "jw-00000", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2936?v=3"}, :to-var {:ns "clojure.core", :name "concat", :library-url "https://github.com/clojure/clojure"}, :_id "55477094e4b01bb732af0a91"} {:created-at 1528231331314, :author {:login "miner", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/25400?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "conj!", :ns "clojure.core"}, :_id "5b16f5a3e4b00ac801ed9e0c"} {:created-at 1544351725441, :author {:login "l3nz", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1101849?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "assoc", :ns "clojure.core"}, :_id "5c0cefede4b0ca44402ef5e8"} {:created-at 1561679674033, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "disj", :ns "clojure.core"}, :_id "5d15573ae4b0ca44402ef778"}], :line 75, :examples [{:author {:login "MrHus", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Steve", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/454ce0be068cbbf25ee685af20dc7cd6?r=PG&default=identicon"} {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"} {:login "Wilfred", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1f86c0bc40235a9edf351a16b859aabd?r=PG&default=identicon"} {:login "ElieLabeca", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/724e1112a2be4d5af767c0cf152d087e?r=PG&default=identicon"} {:login "ElieLabeca", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/724e1112a2be4d5af767c0cf152d087e?r=PG&default=identicon"} {:login "s_prakash_joy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7704115a8be45640094d5d9fc6f4e22a?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:login "alidcastano", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/11031952?v=4"}], :body ";; notice that conjoining to a vector is done at the end\n(conj [1 2 3] 4)\n;;=> [1 2 3 4]\n\n;; notice conjoining to a list is done at the beginning\n(conj '(1 2 3) 4)\n;;=> (4 1 2 3)\n\n(conj [\"a\" \"b\" \"c\"] \"d\")\n;;=> [\"a\" \"b\" \"c\" \"d\"]\n\n;; conjoining multiple items is done in order\n(conj [1 2] 3 4) \n;;=> [1 2 3 4]\n\n(conj '(1 2) 3 4) \n;;=> (4 3 1 2)\n\n(conj [[1 2] [3 4]] [5 6]) \n;;=> [[1 2] [3 4] [5 6]]\n\n;; conjoining to maps only take items as vectors of length exactly 2\n(conj {1 2, 3 4} [5 6])\n;;=> {5 6, 1 2, 3 4}\n\n(conj {:firstname \"John\" :lastname \"Doe\"} {:age 25 :nationality \"Chinese\"})\n;;=> {:firstname \"John\", :lastname \"Doe\", :age 25, :nationality \"Chinese\"}\n\n;; conj on a set\n(conj #{1 3 4} 2)\n;;=> #{1 2 3 4}\n\n", :created-at 1279417029000, :updated-at 1582210748471, :_id "542692c9c026201cdc326abc"} {:author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :editors [{:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"} {:login "Thumbnail", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/db68e51797a2382e185b42ce6534b7a4?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; conjoin shows similar behaviour to cons\n;; The main difference being that conj works on collections\n;; but cons works with seqs. \n(conj [\"a\" \"b\" \"c\"] [\"a\" \"b\" \"c\"] )\n;;=> [\"a\" \"b\" \"c\" [\"a\" \"b\" \"c\"]]", :created-at 1342724544000, :updated-at 1420652159670, :_id "542692d2c026201cdc326f6d"} {:author {:login "jamesqiu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc1268deaa7f2e78fe2b5ea76e6481d8?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; conjoin nil with x or xs\n(conj nil 3)\n;;=> (3)\n\n(conj nil 3 4)\n;;=> (4 3)", :created-at 1349714643000, :updated-at 1420652257330, :_id "542692d2c026201cdc326f70"} {:author {:login "Alan Thompson", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5b677647e3c6fb2bc89fa2f481461b11?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; maps and sets are treated differently\n(conj {1 2} {3 4})\n;;=> {3 4, 1 2} ; the contents of {3 4} are added to {1 2}\n\n(conj #{1 2} #{3})\n;;=> #{1 2 #{3}} ; the whole set #{3} is added to #{1 2}\n\n(clojure.set/union #{1 2} #{3})\n;;=> #{1 2 3} ; must use (clojure.set/union) to merge sets, not conj\n", :created-at 1392346414000, :updated-at 1420652309845, :_id "542692d2c026201cdc326f71"} {:body ";; When conjoining into a map, vector pairs may be provided:\n(conj {:a 1} [:b 2] [:c 3])\n;;=> {:c 3, :b 2, :a 1}\n\n;; Or maps may be provided, with multiple pairings:\n(conj {:a 1} {:b 2 :c 3} {:d 4 :e 5 :f 6})\n;;=> {:f 6, :d 4, :e 5, :b 2, :c 3, :a 1}\n\n;; But multiple pairings cannot appear in vectors:\n(conj {:a 1} [:b 2 :c 3])\n;;=> IllegalArgumentException Vector arg to map conj must be a pair...\n\n;; And pairs may not be provided in lists:\n(conj {:a 1} '(:b 2))\n;;=> ClassCastException ...Keyword cannot be cast to ...Map$Entry...\n", :author {:login "fordsfords", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7671908?v=3"}, :created-at 1417527012413, :updated-at 1417527012413, :_id "547dbee4e4b03d20a10242bb"} {:updated-at 1453750686379, :created-at 1453750686379, :author {:login "bsima", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/200617?v=3"}, :body ";; Useful snippet: \"merge\" two or more vectors with `(comp vec flatten conj)`\n(let [a [{:a \"hi\"} {:b \"hey\"}]\n b [{:c \"yo\"} {:d \"hiya\"}]\n c [{:e \"bonjour\"}]]\n ((comp vec flatten conj) a b c))\n;;=> [{:a \"hi\"} {:b \"hey\"} {:c \"yo\"} {:d \"hiya\"} {:e \"bonjour\"}]", :_id "56a6799ee4b060004fc217b0"} {:updated-at 1456128447651, :created-at 1456128447651, :author {:login "yinwuzhe", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5061317?v=3"}, :body "(conj nil 1)\n;=>(1)\n(conj nil [1 2])\n;=>([1 2])\n", :_id "56cac1bfe4b060004fc217cb"} {:editors [{:login "edcaceres", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/782909?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/1191123?v=3", :account-source "github", :login "TheCodingGent"}], :body ";; Conj new-element into nested structures \"conj-in\"\n\n(def db {:users [{:name \"Eduardo\"}]})\n(def new-element {:name \"Eva\"})\n\n(assoc db :users (conj (:users db) new-element))\n;; => {:users [{:name \"Eduardo\"} {:name \"Eva\"}]}", :author {:avatar-url "https://avatars.githubusercontent.com/u/782909?v=3", :account-source "github", :login "edcaceres"}, :created-at 1479821999279, :updated-at 1483975466743, :_id "58344aafe4b0782b632278c2"} {:editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :body ";; implement stack semantics with conj, peek and pop.\n\n;; we start with a list\n(def stack '(2 1 0))\n\n(peek stack)\n;; => 2\n(pop stack)\n;; => (1 0)\n(type (pop stack))\n;; => cljs.core/List\n;; push = conj\n(conj stack 3)\n;; => (3 2 1 0)\n(type (conj stack 3))\n;; => cljs.core/List\n\n;; now let us try a vector\n(def stack [0 1 2])\n\n(peek stack)\n;; => 2\n(pop stack)\n;; => [0 1]\n(type (pop stack))\n;; => clojure.lang.PersistentVector\n;; push = conj\n(conj stack 3)\n;; => [0 1 2 3]\n(type (conj stack 3))\n;; => clojure.lang.PersistentVector\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}, :created-at 1510596733632, :updated-at 1510597245457, :_id "5a09e07de4b0a08026c48cb7"} {:editors [{:login "asifm", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3958387?v=4"}], :body ";; Based on examples from the great book CLOJURE for the BRAVE and TRUE\n;; https://www.braveclojure.com/core-functions-in-depth/\n\n(defn add-first-vec\n\t[target addition]\n\t(apply conj (if (vector? addition) addition [addition]) target))\n\n(add-first-vec [3 4 5 6] 1)\n;; [1 3 4 5 6]\n\n(add-first-vec [3 4 5 6] [1 2])\n;; [1 2 3 4 5 6]", :author {:avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4", :account-source "github", :login "berczeck"}, :created-at 1598229602892, :updated-at 1665916664510, :_id "5f430c62e4b0b1e3652d73aa"} {:updated-at 1678381486402, :created-at 1678381486402, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; conj also has other, undocumented arities:\n\n(conj)\n;; => []\n\n(conj [1 2 3])\n;; => [1 2 3]\n\n;; Which are particularly useful when transducing, as the nullary form can be\n;; used to produce init, and the unary form for completion", :_id "640a11aee4b08cf8563f4b7b"}], :notes [{:author {:login "me7", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10399270?v=3"}, :updated-at 1456199923502, :created-at 1456199923502, :body "list prepend\nvector append", :_id "56cbd8f3e4b02a6769b5a4b1"}], :arglists ["coll x" "coll x & xs"], :doc "conj[oin]. Returns a new collection with the xs\n 'added'. (conj nil item) returns (item). The 'addition' may\n happen at different 'places' depending on the concrete type.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/conj"} {:added "1.2", :ns "clojure.core", :name "bound?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1328397785000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "thread-bound?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521af8"}], :line 5512, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}], :body "user=> (def foobar)\n#'user/foobar\nuser=> (bound? #'foobar)\nfalse\nuser=> (def boing 10)\n#'user/boing\nuser=> (bound? #'boing)\ntrue\nuser=> (defn plus3 [n] (+ 3 n))\n#'user/plus3\nuser=> (bound? #'plus3)\ntrue\n", :created-at 1279073551000, :updated-at 1318467872000, :_id "542692cdc026201cdc326ce1"}], :notes nil, :arglists ["& vars"], :doc "Returns true if all of the vars provided as arguments have any bound value, root or thread-local.\n Implies that deref'ing the provided vars will succeed. Returns true if no vars are provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bound_q"} {:added "1.7", :ns "clojure.core", :name "transduce", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1459164080889, :author {:login "optevo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1281179?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "completing", :ns "clojure.core"}, :_id "56f913b0e4b09295d75dbf41"}], :line 6870, :examples [{:editors [{:login "bsvingen", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1647562?v=3"}], :body ";; First, define a transducer for producing the first ten odd numbers:\n(def xf (comp (filter odd?) (take 10)))\n\n;; We can then apply this transducer in different ways using transduce.\n\n;; Get the numbers as a sequence:\n\n(transduce xf conj (range))\n;;=> [1 3 5 7 9 11 13 15 17 19]\n\n;; Or sum them:\n\n(transduce xf + (range))\n;; => 100\n\n;; ... with an initializer:\n\n(transduce xf + 17 (range))\n;; => 117\n\n;; Or concatenate them to a string:\n\n(transduce xf str (range))\n;; => \"135791113151719\"\n\n;; .. with an initializer:\n\n(transduce xf str \"...\" (range))\n;; => \"...135791113151719\"\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/1647562?v=3", :account-source "github", :login "bsvingen"}, :created-at 1435874975857, :updated-at 1435878735757, :_id "5595b69fe4b00f9508fd66f1"} {:updated-at 1473877511741, :created-at 1473871425560, :author {:login "upgradingdave", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/939229?v=3"}, :body ";; When studying Korean, I had notes with mixture of Korean and\n;; English and I wanted to filter out any English. \n\n(def example (str \"I will write an autobiography(자서전) later\\n\"\n \"(저는) 나중에 자서전을 쓸 거에요\"))\n\n;; Here's a transducer to filter out english characters\n\n(defn filter-out-english \n \"filter out english characters in a string\"\n []\n (filter (fn [c] \n (let [i (int c)] \n (not (or (and (>= i 65) (<= i 90)) \n (and (>= i 97) (<= i 122))))))))\n\n;; Here's a transducer to help deal with extra spaces and newlines.\n;; Notice the mapcat ensures that the output will always be the same\n;; shape as the input\n\n(defn trim-chars [c n]\n \"Ensure exactly n characters c in a row. For example, squash\n multiple spaces into single space or expand newlines into 2\n newlines\"\n (comp (partition-by #{c})\n (mapcat #(if (= c (first %)) (repeat n c) %))))\n\n\n;; put it all together, we filter out english characters, replace\n;; multiple spaces with single space, and ensure each line is double\n;; spaced (two line breaks between each line)\n(def xf (comp (filter-out-english) \n (trim-chars \\space 1)\n (trim-chars \\newline 2)))\n\n(apply str (transduce xf conj example))\n;; => \" (자서전) \\n\\n(저는) 나중에 자서전을 쓸 거에요\"\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/939229?v=3", :account-source "github", :login "upgradingdave"}], :_id "57d97e41e4b0709b524f04f7"} {:updated-at 1483049703082, :created-at 1483049703082, :author {:login "jvanderhyde", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6516608?v=3"}, :body ";; transduce with the identity transform is equivalent to reduce,\n;; in the following way:\n(transduce identity f sample)\n(f (reduce f (f) sample))\n\n;; For example, we can define a reducing function and then use it:\n(defn conj-second\n ([]\n [])\n ([result]\n result)\n ([result [x y]]\n (conj result y)))\n\n(def sample [[1 :a] [2 :b] [3 :c]])\n\n(transduce identity conj-second sample)\n;;=>[:a :b :c]\n(conj-second (reduce conj-second (conj-second) sample))\n;;=>[:a :b :c]\n\n;; Let's prove the point with printing:\n(defn conj-second\n ([]\n (println \"0\") [])\n ([result]\n (println \"1\") result)\n ([result [x y]]\n (println \"2\") (conj result y)))\n\n;; Then the following both print 0 2 2 2 1\n(transduce identity conj-second sample)\n(conj-second (reduce conj-second (conj-second) sample))\n", :_id "58658ae7e4b0fd5fb1cc964d"} {:editors [{:login "vspinu", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1363467?v=3"}], :body ";;; BUILD A STATEFULL TRANSDUCER\n\n;; Make a transducer that accumulates a sequence when pred is truthy and\n;; returns individual values when pred is falsy.\n;;\n;; For example when pred is odd?, partition\n;;\n;; [1 1 1 2 2 3 3 3]\n;; \n;; into\n;; \n;; [[1 1 1] [2] [2] [3 3 3]]\n;;\n\n(defn accumulate-when [pred]\n ;; A transducer takes a reducer function and returns a reducer function.\n (fn [rf]\n ;; State (an accumulator) which is closed over by the reducer function.\n (let [acc (java.util.ArrayList.)]\n (fn\n ;; Arity 0 (state initializer). In this step we can initialize `acc`\n ;; based on the returned valued of (rf), but here, as it is usually the\n ;; case, this is not needed.\n ([] (rf))\n \n ;; Arity 1 (completer). Called after the reducing process has ended (if\n ;; ever). In this step local state must be cleaned and residual reducing\n ;; step may be performed. `result` is an unreduced value (see reduced\n ;; and unreduced).\n ([result]\n (let [result (if (.isEmpty acc)\n ;; No residual state. Simply return the result.\n result\n ;; Need to clear the residual state and perform one last\n ;; reducing step on the so far accumulated values.\n (let [v (vec (.toArray acc))]\n (.clear acc)\n ;; This step might return a completed value (i.g. on\n ;; which reduced? gives true). We need to deref it\n ;; with `unreduced` in order to supply it to rf.\n (unreduced (rf result v))))]\n ;; Nested rf call. Must happen once!\n (rf result)))\n \n ;; Arity 2 (reducer). This is where the main work happens.\n ([result input]\n (if (pred input)\n ;; When pred is truthy, accumulate and don't call the nested reducer.\n (do\n (.add acc input)\n result)\n ;; When pred is falsy, call nested reducer (possibly twice).\n (if (.isEmpty acc)\n ;; When accumulator is empty, reduce with a singleton.\n (rf result [input])\n (let [v (vec (.toArray acc))]\n (.clear acc)\n ;; First reduce on the accumulated sequence.\n (let [ret (rf result v)]\n (if (reduced? ret)\n ;; If sequence is completed, no more reductions\n ret\n ;; else, reduce once more with the current (falsy) input.\n (rf ret [input])))))))))))\n\n(def x [1 1 1 2 2 3 3 3])\n\n;; Step through with the debugger in order to gain a better understanding of the\n;; involved steps.\n\n(transduce (accumulate-when odd?) conj x)\n;; user> [[1 1 1] [2] [2] [3 3 3]]\n\n(transduce (comp (take 4) (accumulate-when odd?)) conj x)\n;; user> [[1 1 1] [2]]\n\n(transduce (comp (accumulate-when odd?) (take 3)) conj x)\n;; user> [[1 1 1] [2] [2]]\n\n(transduce (comp (accumulate-when odd?) (take 4)) conj x)\n;; user> [[1 1 1] [2] [2] [3 3 3]]\n\n;; Clojure core statefull transducers are partition-by, partition-all, take,\n;; drop, drop-while, take-nth, distinct, interpose, map-indexed and\n;; keep-indexed.\n", :author {:avatar-url "https://avatars0.githubusercontent.com/u/1363467?v=3", :account-source "github", :login "vspinu"}, :created-at 1498561912432, :updated-at 1498561969340, :_id "59523d78e4b06e730307db43"} {:updated-at 1586130966542, :created-at 1586130966542, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/601540?v=4"}, :body "(transduce\n (partition-by identity)\n (fn\n ;; init - returns initial value for accumulator, called when no init is given to transduce\n ([] [])\n ;; completion - returns the final result, take the final accumulated value, called once there are no more elements to process\n ([acc] acc)\n ;; step - do whatever you want on each element, returns accumulated state and takes accumulated state from before and new element\n ([acc e] (conj acc e)))\n '()\n [1 1 1 2 2 3 3 4 4 5 6 7 7])\n\n;; => ([7 7] [6] [5] [4 4] [3 3] [2 2] [1 1 1])", :_id "5e8a7016e4b087629b5a18cb"} {:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; These two forms are equivalent:\n\n(reduce ((map inc) conj) [] '(1 2 3 4 5))\n;; => [2 3 4 5 6]\n\n(transduce (map inc) conj [] '(1 2 3 4 5))\n;; => [2 3 4 5 6]\n\n;; Which shows how transduce works: it applies the transducer to the reducing\n;; function, and reduces the collection with that\n\n;; But n.b. this example masks the fact that transduce does call f an extra\n;; time for \"completion\", because arity-1 conj = identity.", :author {:avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4", :account-source "github", :login "tomdl89"}, :created-at 1678020807238, :updated-at 1678381890546, :_id "640490c7e4b08cf8563f4b78"}], :notes [{:author {:login "jvanderhyde", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6516608?v=3"}, :updated-at 1483050000710, :created-at 1483050000710, :body "Usually you use existing functions to create the transformation, using map, filter, paritition-all, etc. But you can also define your own transformations. A transformation (or transducer) is a function that takes a reducing function and returns a reducing function. See the source for [take](https://github.com/clojure/clojure/blob/clojure-1.8.0/src/clj/clojure/core.clj#L2752) and [filter](https://github.com/clojure/clojure/blob/clojure-1.8.0/src/clj/clojure/core.clj#L2684) for examples.", :_id "58658c10e4b0fd5fb1cc964e"}], :arglists ["xform f coll" "xform f init coll"], :doc "reduce with a transformation of f (xf). If init is not\n supplied, (f) will be called to produce it. f should be a reducing\n step function that accepts both 1 and 2 arguments, if it accepts\n only 2 you can add the arity-1 with 'completing'. Returns the result\n of applying (the transformed) xf to init and the first item in coll,\n then applying xf to that result and the 2nd item, etc. If coll\n contains no items, returns init and f is not called. Note that\n certain transforms may inject or skip items.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/transduce"} {:added "1.0", :ns "clojure.core", :name "lazy-seq", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1318395998000, :author {:login "haplo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/890d46f8c0e24dd6fb8546095b1144e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "lazy-cat", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ed7"} {:created-at 1322679999000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "realized?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ed8"} {:created-at 1322680082000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "doall", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ed9"} {:created-at 1370143899000, :author {:login "Mark Addleman", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/768de71b6c873394290733acf422b4d5?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "iterate", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eda"}], :line 683, :examples [{:updated-at 1448773249031, :created-at 1281346189000, :body ";; The following defines a lazy-seq of all positive numbers. Note that \n;; the lazy-seq allows us to make a recursive call in a safe way because\n;; the call does not happen immediately but instead creates a closure.\n\nuser=> (defn positive-numbers \n\t([] (positive-numbers 1))\n\t([n] (lazy-seq (cons n (positive-numbers (inc n))))))\n#'user/positive-numbers\n\nuser=> (take 5 (positive-numbers))\n(1 2 3 4 5)\n\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/299a3fab7a1a2d6644455dedae9fce0a?r=PG&default=identicon", :account-source "clojuredocs", :login "Stathis Sideris"} {:login "hgijeon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7885562?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon", :account-source "clojuredocs", :login "gstamp"}, :_id "542692cec026201cdc326ddd"} {:author {:login "jakubholynet", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/32b26dbbf1f84656393a57a292c73728?r=PG&default=identicon"}, :editors [{:login "jakubholynet", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/32b26dbbf1f84656393a57a292c73728?r=PG&default=identicon"} {:login "jakubholynet", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/32b26dbbf1f84656393a57a292c73728?r=PG&default=identicon"} {:login "redraiment", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/33087654dbc710e81f51fda5f8241f28?r=PG&default=identicon"} {:login "Stathis Sideris", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/299a3fab7a1a2d6644455dedae9fce0a?r=PG&default=identicon"} {:avatar-url "https://avatars.githubusercontent.com/u/7885562?v=3", :account-source "github", :login "hgijeon"} {:login "olfal1", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7503672?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/15624487?v=4", :account-source "github", :login "pluieciel"}], :body ";; A lazy-seq of Fibonacci numbers (fn = fn-1 + fn-2)\n;; The producer function takes exactly two parameters\n;; (because we need the last 2 elements to produce a new one)\nuser=> (defn fib \n ([]\n (fib 1 1))\n ([a b]\n (lazy-seq (cons a (fib b (+ a b))))))\n\nuser=> (take 5 (fib))\n(1 1 2 3 5)\n\n;; Another realization\n;; 1 2 3 5 8 ... Fibonacci numbers start from the 2nd position\n;; + 1 1 2 3 5 ... Fibonacci numbers start from the 1st position\n;; = 2 3 5 8 13 ... Fibonacci numbers start from the 3rd position\nuser=> (def fib\n (cons 1\n (lazy-seq (cons 1 (map + (rest fib) fib)))))\n\nuser=> (take 5 fib)\n(1 1 2 3 5)", :created-at 1322121310000, :updated-at 1661333181759, :_id "542692d3c026201cdc326feb"} {:author {:login "jakubholynet", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/32b26dbbf1f84656393a57a292c73728?r=PG&default=identicon"}, :editors [], :body ";; It might be easier to think about the producer function as a function\n;; that, given element n, produces element n+1 via a recursive call to \n;; itself, wrapped with lazy-seq to delay its execution\n;; We might also provide no-argument version of the function that calls \n;; itself for the first element(s) of the sequence being generated.\n;; => variant of fibonaci with a no-arg version and using cons first:\n(defn sum-last-2 \n ([] (sum-last-2 1 2)) \n ([n m] (cons n (lazy-seq (sum-last-2 m (+ n m))))))\n\nuser=> (take 6 (sum-last-2))\n(1 2 3 5 8 13)", :created-at 1330300424000, :updated-at 1330300424000, :_id "542692d3c026201cdc326ff0"} {:updated-at 1436122605747, :created-at 1354916731000, :body ";; An example combining lazy sequences with higher order functions\n;; Generate prime numbers using trial division.\n;; Note that the starting set of sieved numbers should be\n;; the set of integers starting with 2 i.e., (iterate inc 2) \n(defn sieve [s]\n (cons (first s)\n (lazy-seq (sieve (filter #(not= 0 (mod % (first s)))\n (rest s))))))\n\nuser=> (take 20 (sieve (iterate inc 2)))\n(2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71)\n\n\nSadly (nth (sieve (iterate inc 2)) 10000) results in StackOverflowError ;(", :editors [{:avatar-url "https://www.gravatar.com/avatar/b60d7f482b9f88cb3a673f370ea15c9c?r=PG&default=identicon", :account-source "clojuredocs", :login "emdeesee"} {:login "lambder", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/95941?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/d3df4ff6342ed6fba898021bf2d19a6d?r=PG&default=identicon", :account-source "clojuredocs", :login "esumitra"}, :_id "542692d3c026201cdc326ff1"} {:body ";; Other examples on this page are little too eager to produce the head of collection\n;; right away. lazy-seq was introduced to make it possible to postpone any computation\n;; until data is needed.\n;; While it is not relevant for these simple examples, it could be important\n;; for real apps where producing each element is expensive.\n\n;; Here is a demonstration.\n;; Let's define a function that prints mysqr when it's called\n(defn mysqr [n]\n (println \"mysqr\")\n (* n n))\n;; => #'user/mysqr\n\n;; Now function squares that is adopted from positive-numbers example above\n;; Note that lazy-seq is inside of cons\n(defn squares\n ([n] (cons (mysqr n) (lazy-seq (squares (inc n))))))\n;; => #'user/squares\n\n(def sqrs (squares 1))\n;; => mysqr <-- NOTE THAT mysqr WAS CALLED WHEN WE SIMPLY REQUESTED COLLECTION\n;; => #'user/sqrs\n\n(take 1 sqrs)\n;; => (1) <-- HERE WE ARE GETTING FIRST ELEMENT THAT WAS CALCULATED BEFORE\n\n;; Now let's redefine 'squares' by wrapping its entire body in lazy-seq:\n(defn squares\n ([n] (lazy-seq (cons (mysqr n) (squares (inc n))))))\n;; => #'user/squares\n\n;; And when we request the collection:\n(def sqrs (squares 1))\n;; => #'user/sqrs\n;; NOTE THAT mysqr WAS NOT CALLED HERE\n\n(take 1 sqrs)\n;; => mysqr <- AND HERE mysqr IS CALLED WHEN FIRST ELEMENT IS ACTUALLY REQUESTED\n;; => (1)", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423004375232, :updated-at 1423010785906, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :_id "54d152d7e4b0e2ac61831cfc"} {:updated-at 1542427316403, :created-at 1449368696760, :author {:login "esumitra", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/98965?v=3"}, :body ";; Compare recursive functions and lazy sequences\n;; generate (some) valid parenthesis combinations.\n;; (Side note: Everything this generates are valid combinations, but this\n;; doesn't generate all possible valid combinations.) \n;; valid paren combinations for 1 paren - ()\n;; valid paren combinations for 2 paren - ()(),(())\n;; valid paren combinations for 3 paren - ()()(),()(()),(())(),(()()),((()))\n\n;; given ith item, generate (i+1)th item\n(defn next-parens\n [xs]\n (set (mapcat (juxt\n #(str \"()\" %)\n #(str % \"()\")\n #(str \"(\" % \")\"))\n xs)))\n\n;; recursive function to get n paren combinations\n;; combinations are recursively calculated on the stack\n(defn parens-nth-item\n [n]\n (if (= 0 n)\n #{\"\"}\n (next-parens (parens-nth-item (dec n)))))\nuser=> (parens-nth-item 3)\n#{\"(()())\" \"((()))\" \"()()()\" \"()(())\" \"(())()\"}\n\n;; lazy function to get sequence of paren combinations\n;; combinations are lazily calculated on the heap\n(defn parens-sequence\n [xs]\n (lazy-seq (cons xs (parens-sequence (next-parens xs)))))\n\nuser=> (take 3 (parens-sequence #{\"\"}))\n(#{\"()\"} #{\"(())\" \"()()\"} #{\"(()())\" \"((()))\" \"()()()\" \"()(())\" \"(())()\"})", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/98965?v=3", :account-source "github", :login "esumitra"} {:login "peter-kehl", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/4270240?v=4"}], :_id "56639c78e4b0f47c7ec61144"} {:updated-at 1464067214072, :created-at 1464067214072, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :body "; Create a finite-length lazy seq\n(defn finite-lazy-builder [values]\n (lazy-seq\n ; We need the when-let so the lazy-seq will terminate\n (when-let [ss (seq values)]\n (cons (first values)\n (finite-lazy-builder (next values))))))\n\n(println (finite-lazy-builder [1 2 3 4 5] ))\n;=> (1 2 3 4 5)\n\n", :_id "5743e48ee4b0a1a06bdee49a"} {:updated-at 1661336397540, :created-at 1518199374837, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;generate a seq by multiplying the first n numbers starting from 1\n;;1*1\n;;1*2\n;;2*3\n;;6*4 .....\n\n(defn multiplen\n ([]\n (multiplen 1 1))\n ([total x]\n (let [new-total (* total x)]\n (lazy-seq\n (cons new-total (multiplen new-total (inc x)))))))\n\n;;take the first 5 elements \n(take 5 (multiplen))\n;;(1 2 6 24 120)\n\n;;Another realization of factorials\n(def factorials\n (lazy-seq\n (cons 1 (map * (iterate inc 2) factorials))))\n\n(take 5 factorials)\n;;(1 2 6 24 120)", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/15624487?v=4", :account-source "github", :login "pluieciel"}], :_id "5a7de24ee4b0316c0f44f8b2"} {:updated-at 1684792382708, :created-at 1684792382708, :author {:login "bdevel", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/65951?v=4"}, :body ";; From the \"Making Clojure Lazier\" docs,\n;; here's an example using a step function.\n\n(defn filter\n \"Returns a lazy sequence of the items in coll for which\n (pred item) returns true. pred must be free of side-effects.\"\n [pred coll]\n (let [step (fn [p c]\n (when-let [s (seq c)]\n (if (p (first s))\n (cons (first s) (filter p (rest s)))\n (recur p (rest s)))))]\n (lazy-seq (step pred coll))))\n", :_id "646be43ee4b08cf8563f4bbd"}], :macro true, :notes [{:body "I think every form of (cons a (lazy-seq (f b))) in examples should be changed to (lazy-seq (cons a (f b))) to be fully lazy.
\n\nThink about
\n(def one-over ((fn helper [n] (cons (/ 1 n) (lazy-seq (helper (inc n))))) 0))
\nand
\n(def one-over ((fn helper [n] (lazy-seq (cons (/ 1 n) (helper (inc n))))) 0))
\n\nFirst one throws an exception right after hitting enter key, while second code postpones the calculation(and that's the point of lazyness!).
\nTherefore, cons should be inside of lazy-seq.\n", :created-at 1448772755640, :updated-at 1448772839454, :author {:avatar-url "https://avatars.githubusercontent.com/u/7885562?v=3", :account-source "github", :login "hgijeon"}, :_id "565a8493e4b0be225c0c47a1"}], :arglists ["& body"], :doc "Takes a body of expressions that returns an ISeq or nil, and yields\n a Seqable object that will invoke the body only the first time seq\n is called, and will cache the result and return it on all subsequent\n seq calls. See also - realized?", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/lazy-seq"} {:added "1.0", :ns "clojure.core", :name "*print-length*", :file "clojure/core_print.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 16, :examples [{:author {:login "nipra", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/142529?v=3"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/19522656?v=4"}], :body ";; Oops! Don't do this!!!\nuser=> (iterate inc 0)\n;; Frantically doing C-c C-c :-P\n; Evaluation aborted.\n\nuser=> (set! *print-length* 10)\n10\n\n;; Now it's perfectly fine. Yay!\nuser=> (iterate inc 0)\n(0 1 2 3 4 5 6 7 8 9 ...)\n\n", :created-at 1279053974000, :updated-at 1610535308126, :_id "542692cac026201cdc326b12"}], :notes [{:body "```(set! *print-length* nil)``` to revert as it also affects pr-sr which breaks the edn output", :created-at 1641496128326, :updated-at 1641496156661, :author {:avatar-url "https://avatars.githubusercontent.com/u/132936?v=4", :account-source "github", :login "gzmask"}, :_id "61d73e40e4b0b1e3652d759c"}], :arglists [], :doc "*print-length* controls how many items of each collection the\n printer will print. If it is bound to logical false, there is no\n limit. Otherwise, it must be bound to an integer indicating the maximum\n number of items of each collection to print. If a collection contains\n more items, the printer will print items up to the limit followed by\n '...' to represent the remaining items. The root binding is nil\n indicating no limit.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*print-length*"} {:added "1.0", :ns "clojure.core", :name "*file*", :type "var", :see-alsos nil, :examples [{:updated-at 1615735028888, :created-at 1615735028888, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :body ";; Given a file named \"example.clj\" is available in the current folder\n;; with content:\n\n(ns example)\n(when *compile-files* (println \"Compiling:\" *file*))\n\n;; If we start a REPL adding \".\" as part of the classpath,\n;; then we can see the following:\n\n(binding [*compile-path* \".\"]\n (compile 'example))\n;; Compiling: example.clj\n;; example\n", :_id "604e28f4e4b0b1e3652d7490"}], :notes [{:updated-at 1324600617000, :body "Does this actually work? I couldn't get it to print anything but NO_SOURCE_PATH. (And no, this wasn't in the REPL.)", :created-at 1324600599000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fd3"} {:updated-at 1349216667000, :body "If you're having trouble getting this feature to work as advertised, check out [this StackOverflow Question](http://stackoverflow.com/questions/12692698/file-variable-not-working/12693068).", :created-at 1349216667000, :author {:login "Jeff Terrell", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/658b2643cf2a8192286b5bb1ecb62cf8?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fe8"}], :arglists [], :doc "The path of the file being evaluated, as a String.\n\n When there is no file, e.g. in the REPL, the value is not defined.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*file*"} {:added "1.0", :ns "clojure.core", :name "compare-and-set!", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1350642558000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "atom", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b1e"} {:created-at 1360265895000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "reset!", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b1f"} {:created-at 1360265902000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "swap!", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b20"} {:created-at 1527705104286, :author {:login "agarman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/138454?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "swap-vals!", :ns "clojure.core"}, :_id "5b0eee10e4b045c27b7fac7f"}], :line 2368, :examples [{:author {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}, :editors [{:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; first we make a demonstration atom\n(def a (atom 0))\n;; #'user/a \n\n;; failing to set the demonstration atom because the old-value does not match. \n(compare-and-set! a 10 20)\n;;=> false\n\n;; as you can see there was no change to the atom\n@a\n;;=> 0\n\n;; but when the old-value matches the atom is set to the new-value.\n(compare-and-set! a 0 10)\n;;=> true\n\n@a\n;;=> 10\n", :created-at 1308629522000, :updated-at 1420734640517, :_id "542692cfc026201cdc326e27"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; Use compare-and-set! to implement a version of swap!\n;; that stops retrying after some number of attempts, for example\n;; because of a slow update fn and high concurrency on the atom:\n\n(defn swap-or-bail! [a f & [attempts]]\n (loop [i (or attempts 3)]\n (if (zero? i)\n (println \"Could not update. Bailing out.\")\n (let [old (deref a)\n success? (compare-and-set! a old (f old))]\n (when-not success?)\n (println \"Update failed. Retry\" i)\n (recur (dec i)))))))\n\n(defn slow-inc [x]\n (Thread/sleep 5000) \n (inc x))\n\n(def a (atom 0))\n(def f (future (swap-or-bail! a slow-inc)))\n(reset! a 1)\n;; \"Update failed. Retry 3\"\n(reset! a 2)\n;; \"Update failed. Retry 2\"\n(reset! a 3)\n;; Could not update. Bailing out.", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1553605079299, :updated-at 1584291384572, :_id "5c9a21d7e4b0ca44402ef6cb"}], :notes [{:author {:login "chbrown", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/360279?v=3"}, :updated-at 1471197839931, :created-at 1471197839931, :body "`compare-and-set!` actually runs an equality comparison, not an identity comparison. The documentation should read:\n\n> Atomically sets the value of atom to newval if and only if the current value of the atom is identical equal to oldval.\n\n (def my-sym (atom 'a))\n (identical? @my-sym 'a)\n ;;=> false\n (= @my-sym 'a)\n ;;=> true\n (compare-and-set! my-sym 'a 'z)\n ;;=> true\n @my-sym\n ;;=> z", :_id "57b0b28fe4b02d8da95c2700"} {:author {:login "favila", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1603620?v=3"}, :updated-at 1492977098400, :created-at 1492977098400, :body "The note that `compare-and-set!` uses equality comparison is wrong, `compare-and-set!` really _does_ use *identity comparison* (Java `==`). Internally, Clojure uses the `AtomicReference.compareAndSet(old, new)` method.\n\nThe reason his example works is due to interning of the `a` symbol: in his example, each `a` is the same (identical) object.\n\nBut as you can see from the example below, even numeric autoboxing can lead to surprising results:\n\n (def a (atom 0))\n ;=> #'user/a\n (compare-and-set! a 0 100)\n ;=> true\n ;(compare-and-set! a 100 200)\n ;=> true\n ;; Fails?! (on Oracle JVM 8 with default settings)\n (compare-and-set! a 200 300)\n ;=> false\n @a\n ;=> 200 ; WAT?\n\nClojure almost always uses boxed numbers (via Java autoboxing) unless you take special steps to avoid it. compare-and-set! only accepts Objects, so numbers are autoboxed to Longs.\n\nJava JVMs will usually intern small integers; by default Oracle/OpenJDK will intern -127 to 128 (the `byte` range) so that all such boxed numbers are identical. This can be altered with the `-XX:AutoBoxCacheMax=` command line flag. This may vary by JVM implementation, too.\n\n(In fact, on ClojureCLR, `compare-and-set!` of longs always fails because the CLR does not intern small numbers, see [this bug report](https://dev.clojure.org/jira/browse/CLJCLR-28).)\n\nSo in the example above, `compare-and-set!` on 0 and 100 work fine due to this auto-interning, but the compare with 200 fails because: `(identical? 200 200)` is false due to autoboxing: two distinct invisible `Long` objects are created for each \"200\" value.\n\nYou don't have to worry about this with `swap!` because the \"old\" value it compares against for the compare-and-set operation is always from the atom itself, so identity comparison works as long as no one else put a different object in the atom in the meantime. However, it is easy to imagine a pathological case with a highly-contented atom where everyone keeps putting the same \"equal\" value into it over and over, and yet swappers have to retry over and over.", :_id "58fd05cae4b01f4add58fe9a"}], :arglists ["atom oldval newval"], :doc "Atomically sets the value of atom to newval if and only if the\n current value of the atom is identical to oldval. Returns true if\n set happened, else false", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/compare-and-set!"} {:ns "clojure.core", :name "*use-context-classloader*", :type "var", :see-alsos nil, :examples [{:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}], :body ";; *use-context-classloader* is always bound to true regarldess of any \n;; outer binding setting and thus ignored.\n;; The initial idea was to have a way to tell Clojure to ignore\n;; the context classloader (supposedly set by external libs or frameworks)\n;; in some pretty specific OSGi scenarios. Original context can be found at:\n;; https://groups.google.com/g/clojure/c/aXsFBdowdsA/m/1Ez894XuT30J and\n;; additional use cases https://clojure.atlassian.net/browse/CLJ-2593\n\n(import '[clojure.lang DynamicClassLoader])\n(def custom-classloader (DynamicClassLoader.))\n(.setContextClassLoader (Thread/currentThread) custom-classloader)\n\n(identical?\n (.. (fn []) getClass getClassLoader getParent)\n custom-classloader)\n;; true\n\n;; This should return false and use some other class loader\n(binding [*use-context-classloader* false]\n (identical?\n (.. (fn []) getClass getClassLoader getParent)\n custom-classloader))\n;; true\n\n;; WARNING: If the examples above don't seem to return the expected results, \n;; be aware that tools like Leiningen[https://leiningen.org/] or\n;; nRepl[https://github.com/nrepl/nrepl] alter the context class loader. \n;; Please use a vanilla REPL like \n;; clojure.deps[https://clojure.org/guides/getting_started] instead.", :author {:avatar-url "https://avatars.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1617620930283, :updated-at 1655802050958, :_id "606aefc2e4b0b1e3652d74b1"} {:updated-at 1655794528435, :created-at 1655794528435, :author {:login "KingMob", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/946421?v=4"}, :body ";; The above example has one minor caveat to be aware of for those who need \n;; to work with classloaders. *use-context-classloader* is not technically\n;; ignored, because RT/baseLoader will use it. But it's usually overridden \n;; by RT/makeClassLoader, which pushes a binding that sets it to true every \n;; time it's called. And RT/makeClassLoader is called every time eval or \n;; compile1 is called and in some versions of load(), so it happens a lot.", :_id "62b16b60e4b0b1e3652d7609"}], :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*use-context-classloader*"} {:ns "clojure.core", :name "await1", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1610778845682, :author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/19522656?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "await", :ns "clojure.core"}, :_id "600288dde4b0b1e3652d7434"} {:created-at 1610778852896, :author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/19522656?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "await-for", :ns "clojure.core"}, :_id "600288e4e4b0b1e3652d7435"}], :line 3291, :examples nil, :notes [{:body "Looking at the source, it seems to take an agent, wait until it's queue is empty, then return the agent. When the agent has a positive queue count, it implements the standard `(await a)` and then returns `a`, the agent.\n\nUse: `(await1 a)`", :created-at 1610778678000, :updated-at 1610778828434, :author {:avatar-url "https://avatars0.githubusercontent.com/u/19522656?v=4", :account-source "github", :login "Crowbrammer"}, :_id "60028836e4b0b1e3652d7433"}], :arglists ["a"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/await1"} {:added "1.0", :ns "clojure.core", :name "let", :special-form true, :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1290671337000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "letfn", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b09"} {:created-at 1399434293000, :author {:login "Chort409", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/73da2cf9145cfb9c900b31436ee435a6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "if-let", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ba0"} {:created-at 1412886358634, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "fn", :library-url "https://github.com/clojure/clojure"}, :_id "5436ef56e4b0ae795603157d"} {:created-at 1602614306958, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "for", :ns "clojure.core"}, :_id "5f85f422e4b0b1e3652d73de"}], :line 4481, :examples [{:author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:avatar-url "https://avatars2.githubusercontent.com/u/12958644?v=4", :account-source "github", :login "funkrider"} {:login "dijonkitchen", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4"}], :body ";; let is a Clojure special form, a fundamental building block of the language.\n;;\n;; In addition to parameters passed to functions, let provides a way to create\n;; lexical bindings of data structures to symbols. The binding, and therefore \n;; the ability to resolve the binding, is available only within the lexical \n;; context of the let. \n;; \n;; let uses pairs in a vector for each binding you'd like to make and the value \n;; of the let is the value of the last expression to be evaluated. let also \n;; allows for destructuring which is a way to bind symbols to only part of a \n;; collection.\n\n;; A basic use for a let:\nuser=> (let [x 1] \n x)\n1\n\n;; Note that the binding for the symbol y won't exist outside of the let:\nuser=> (let [y 1] \n y)\n1\nuser=> (prn y)\njava.lang.Exception: Unable to resolve symbol: y in this context (NO_SOURCE_FILE:7)\n\n;; Note that if you use def inside a let block, your interned variable is within \n;; the current namespace and will appear OUTSIDE of the let block. \nuser=> (let [y 1] \n (def z y) \n y)\n1\nuser=> z\n1\n\n;; Another valid use of let:\nuser=> (let [a 1 b 2] \n (+ a b))\n3\n\n;; The forms in the vector can be more complex (this example also uses\n;; the thread macro):\nuser=> (let [c (+ 1 2)\n [d e] [5 6]] \n (-> (+ d e) (- c)))\n8\n\n;; The bindings for let need not match up (note the result is a numeric\n;; type called a ratio):\nuser=> (let [[g h] [1 2 3]] \n (/ g h))\n1/2\n\n;; From http://clojure-examples.appspot.com/clojure.core/let with permission.", :created-at 1278720629000, :updated-at 1556647963303, :_id "542692c7c026201cdc3269bb"} {:updated-at 1285500534000, :created-at 1279162869000, :body "user=> (let [a (take 5 (range))\n {:keys [b c d] :or {d 10 b 20 c 30}} {:c 50 :d 100}\n [e f g & h] [\"a\" \"b\" \"c\" \"d\" \"e\"]\n _ (println \"I was here!\")\n foo 12\n bar (+ foo 100)]\n [a b c d e f g h foo bar])\nI was here!\n[(0 1 2 3 4) 20 50 100 \"a\" \"b\" \"c\" (\"d\" \"e\") 12 112]\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692c7c026201cdc3269c2"} {:author {:login "johnfn", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ffffd204ecbbae82a04f5b574d76746b?r=PG&default=identicon"}, :editors [], :body "; :as example \n\nuser=> (let [[x y :as my-point] [5 3]]\n (println x y)\n (println my-point))\n\n5 3\n[5 3]\n\n; :as names the group you just destructured.\n\n; equivalent to (and better than)\n\nuser=> (let [[x y] [5 3]\n my-point [x y]]\n ;...", :created-at 1312965326000, :updated-at 1312965326000, :_id "542692c7c026201cdc3269c4"} {:author {:login "leifp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d2f37720f063404ef83b987d2824353d?r=PG&default=identicon"}, :editors [], :body ";;; map destructuring, all features\nuser=>\n(let [\n ;;Binding Map\n {:keys [k1 k2] ;; bind vals with keyword keys\n :strs [s1 s2] ;; bind vals with string keys\n :syms [sym1 sym2] ;; bind vals with symbol keys\n :or {k2 :default-kw, ;; default values\n s2 :default-s, \n sym2 :default-sym} \n :as m} ;; bind the entire map to `m`\n ;;Data\n {:k1 :keyword1, :k2 :keyword2, ;; keyword keys\n \"s1\" :string1, \"s2\" :string2, ;; string keys\n 'sym1 :symbol1, ;; symbol keys\n ;; 'sym2 :symbol2 ;; `sym2` will get default value\n }] \n [k1 k2 s1 s2 sym1 sym2 m]) ;; return value\n\n[:keyword1, :keyword2, \n :string1, :string2,\n :symbol1, :default-sym, ;; key didn't exist, so got the default\n {'sym1 :symbol1, :k1 :keyword1, :k2 :keyword2, \n \"s1\" :string1, \"s2\" :string2}]\n\n;; remember that vector and map destructuring can also be used with \n;; other macros that bind variables, e.g. `for` and `doseq`", :created-at 1335261849000, :updated-at 1335261849000, :_id "542692d3c026201cdc326ff3"} {:author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :editors [], :body ";;; no value of a key\nuser> (let [{:keys [a b] :as m} (:x {})]\n [a b m])\n[nil nil nil]\n\n;;; same as above\nuser> (let [{:keys [a b] :as m} nil]\n [a b m])\n[nil nil nil]\n\n;;; similar case on Vector\nuser> (let [[a b :as v] nil]\n [a b v])\n[nil nil nil]\n", :created-at 1399634796000, :updated-at 1399634796000, :_id "542692d3c026201cdc326ff4"} {:body ";; lexical clojure (or let-over-fn) is an idiom for doing, in functional languages,\n;; something very similar to object based programming.\n;; Using combinations of 'let' and 'fn' can produce many interesting results.\n\n;; note the use of the ! on the functions to indicate the side effect\n(defn counter []\n (let [cnt (atom 0)]\n {:inc! (fn [] (swap! cnt inc))\n :dec! (fn [] (swap! cnt dec)) \n :get (fn [] @cnt)} ))\n\n;; we can now make and use the object\n(let [cnt (counter)]\n ((:inc! cnt))\n ((:inc! cnt)) \n ((:get cnt)))\n;;=> 2", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1412885156677, :updated-at 1412886345817, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :_id "5436eaa4e4b0ae795603157c"} {:updated-at 1464664767084, :created-at 1464664767084, :author {:login "freezhan", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5796449?v=3"}, :body "(let [[a b & c :as d] [1 2 3 4 5]]\n (println a) ; 1\n (println b) ; 2\n (println c) ; (3 4 5)\n d) ;[1 2 3 4 5]", :_id "574d02bfe4b0bafd3e2a046b"} {:editors [{:login "dijonkitchen", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4"}], :body ";;define F1Car record\n(defrecord F1Car [team engine tyre oil])\n\n;;build the constructor distructing a single map with options\n(defn make-f1team [f1-team f1-engine {:keys [f1-tyre f1-oil] :as opts}]\n (let [{:keys [tyre oil]} opts]\n (map->F1Car {:team f1-team\n :engine f1-engine\n :tyre f1-tyre\n :oil f1-oil})))\n\n;;create a record\n(def mclaren (make-f1team \"RedBull\" \"Renault\" {:f1-tyre\"Pirelli\" :f1-oil \"Castrol\"}))\n\n;;retrieve values\n(keys mclaren)\n(vals mclaren)\n(:team mclaren)\n(:oil mclaren)", :author {:avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4", :account-source "github", :login "ibercode"}, :created-at 1510307566093, :updated-at 1556648054942, :_id "5a0576eee4b0a08026c48caa"} {:updated-at 1556559048678, :created-at 1556559048678, :author {:login "funkrider", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/12958644?v=4"}, :body ";;It is possible to enumerate the symbols created within a let using a macro.\n(defmacro local-context []\n (let [symbols (keys &env)]\n (zipmap (map (fn [sym] `(quote ~sym)) symbols) symbols)))\n\n(let [a :b lc (local-context)] lc)\n;; => {a :b}", :_id "5cc734c8e4b0ca44402ef713"} {:updated-at 1651606596047, :created-at 1651606596047, :author {:login "rgkirch", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6143833?v=4"}, :body ";; the destructuring key, k in this example, doesn't have to be a literal keyword\n(let [k (keyword \"name\")\n {person-name k} {:name \"john\"}]\n person-name)\n;; => \"john\"", :_id "62718444e4b0b1e3652d75e5"}], :macro true, :notes [{:updated-at 1297072373000, :body "Nota Bene: `let` in Clojure is like `let*` in Scheme -- each init-expr has access to the preceding binding forms. (There is also a `let*`, but it is more or less `let` without destructuring, and in fact is the underlying implementation.)", :created-at 1297072373000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fb2"} {:body "Be aware that `let`’s `:or` always evaluates the default value, unlike the `or` macro:\n\n user=> (let [{:keys [a]\n :or {a (do (println \"toto\") 1)}} {}]\n a)\n toto\n 1\n\n user=> (let [{:keys [a]\n :or {a (do (println \"toto\") 1)}} {:a 2}]\n a)\n toto\n 2 ", :created-at 1554372403311, :updated-at 1554372446160, :author {:avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4", :account-source "github", :login "bfontaine"}, :_id "5ca5d733e4b0ca44402ef6fd"}], :arglists ["bindings & body"], :doc "binding => binding-form init-expr\n\n Evaluates the exprs in a lexical context in which the symbols in\n the binding-forms are bound to their respective init-exprs or parts\n therein.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/let", :forms ["(let [bindings*] exprs*)"]} {:added "1.0", :ns "clojure.core", :name "ref-set", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1284616929000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "ref", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d91"} {:created-at 1498153558604, :author {:login "devn", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "alter", :ns "clojure.core"}, :_id "594c0256e4b06e730307db40"} {:created-at 1498153567222, :author {:login "devn", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "commute", :ns "clojure.core"}, :_id "594c025fe4b06e730307db41"} {:created-at 1498153571630, :author {:login "devn", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "dosync", :ns "clojure.core"}, :_id "594c0263e4b06e730307db42"}], :line 2455, :examples [{:updated-at 1285495563000, :created-at 1280777271000, :body "user=> (def foo (ref {}))\n#'user/foo\n\nuser=> (dosync\n (ref-set foo {:foo \"bar\"}))\n{:foo \"bar\"}\n\nuser=> @foo\n{:foo \"bar\"}\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692c9c026201cdc326acb"}], :notes nil, :arglists ["ref val"], :doc "Must be called in a transaction. Sets the value of ref.\n Returns val.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ref-set"} {:added "1.1", :ns "clojure.core", :name "pop-thread-bindings", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1374313672000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "push-thread-bindings", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eff"} {:created-at 1374313678000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "binding", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f00"}], :line 1931, :examples nil, :notes nil, :arglists [""], :doc "Pop one set of bindings pushed with push-binding before. It is an error to\n pop bindings without pushing before.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/pop-thread-bindings"} {:added "1.0", :ns "clojure.core", :name "interleave", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1293096421000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "interpose", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ed3"} {:created-at 1325197345000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "zipmap", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ed4"}], :line 4309, :examples [{:author {:login "cdorrat", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5dedcb7069d39421760f6d255def10c3?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; This example takes a list of keys and a separate list of values and \n;; inserts them into a map.\n(apply assoc {} \n (interleave [:fruit :color :temp] \n [\"grape\" \"red\" \"hot\"]))\n\n;;=> {:temp \"hot\", :color \"red\", :fruit \"grape\"}\n", :created-at 1278756097000, :updated-at 1421097481582, :_id "542692ccc026201cdc326c48"} {:author {:login "kotarak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon"}, :editors [{:login "kotarak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; Simple example:\n(interleave [:a :b :c] [1 2 3])\n;;=> (:a 1 :b 2 :c 3)", :created-at 1279026371000, :updated-at 1421097499209, :_id "542692ccc026201cdc326c4c"} {:author {:login "kotarak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body ";; The shortest input stops interleave:\n\n(interleave [:a :b :c] [1 2])\n;;=> (:a 1 :b 2)\n\n(interleave [:a :b] [1 2 3])\n;;=> (:a 1 :b 2)", :created-at 1279026486000, :updated-at 1422937238232, :_id "542692ccc026201cdc326c4f"} {:author {:login "octopusgrabbus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(def s1 [[:000-00-0000 \"TYPE 1\" \"JACKSON\" \"FRED\"]\n [:000-00-0001 \"TYPE 2\" \"SIMPSON\" \"HOMER\"]\n [:000-00-0002 \"TYPE 4\" \"SMITH\" \"SUSAN\"]])\n\n(interleave (map #(nth % 0 nil) s1) (map #(nth % 1 nil) s1))\n;;=> (:000-00-0000 \"TYPE 1\" \n;; :000-00-0001 \"TYPE 2\"\n;; :000-00-0002 \"TYPE 4\")", :created-at 1334887108000, :updated-at 1421097410949, :_id "542692d3c026201cdc326fd1"} {:author {:login "octopusgrabbus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(def s1 [[:000-00-0000 \"TYPE 1\" \"JACKSON\" \"FRED\"]\n [:000-00-0001 \"TYPE 2\" \"SIMPSON\" \"HOMER\"]\n [:000-00-0002 \"TYPE 4\" \"SMITH\" \"SUSAN\"]])\n\n(def cols [0 2 3])\n\n(defn f1 \n [s1 col] \n (map #(get-in s1 [% col] nil) (range (count s1))))\n\n(apply interleave (map (partial f1 s1) cols))\n;;=> (:000-00-0000 \"JACKSON\" \"FRED\" \n;; :000-00-0001 \"SIMPSON\" \"HOMER\" \n;; :000-00-0002 \"SMITH\" \"SUSAN\")", :created-at 1334887172000, :updated-at 1421097441002, :_id "542692d3c026201cdc326fd2"} {:body "(interleave (repeat \"a\") [1 2 3])\n;;=>(\"a\" 1 \"a\" 2 \"a\" 3)\n", :author {:login "ttkk1024", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/145719?v=3"}, :created-at 1431650103962, :updated-at 1431650103962, :_id "55553f37e4b01ad59b65f4d1"} {:updated-at 1553297861379, :created-at 1553290561134, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :body ";; interleave can be used as an opposite of zipmap\n(let [m {:a 1, :b 2, :c 3}]\n (split-at (count m) (apply interleave m)))\n;; => [(:a :b :c) (1 2 3)]\n;; (but really, a simpler solution would be [(keys m) (vals m)].)", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4", :account-source "github", :login "bfontaine"}], :_id "5c955541e4b0ca44402ef6bc"}], :notes [{:body "Behaviour of
(interleave [4 5 6])
\napparently depends on which Clojure version you're using. In 1.10.0 the result is:\n
[4 5 6]
", :created-at 1567536152090, :updated-at 1567536173810, :author {:avatar-url "https://avatars2.githubusercontent.com/u/179958?v=4", :account-source "github", :login "holtzermann17"}, :_id "5d6eb418e4b0ca44402ef7ab"}], :arglists ["" "c1" "c1 c2" "c1 c2 & colls"], :doc "Returns a lazy seq of the first item in each coll, then the second etc.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/interleave"} {:added "1.0", :ns "clojure.core", :name "printf", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1329894578000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "format", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e35"} {:created-at 1330170804000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.pprint", :name "cl-format", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e36"} {:created-at 1417278644991, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "println", :library-url "https://github.com/clojure/clojure"}, :_id "5479f4b4e4b03d20a10242b9"}], :line 5746, :examples [{:author {:login "lambder", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1c0c20072f52de3a6335cae183b865f6?r=PG&default=identicon"}, :editors [{:login "jeffi", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1195619?v=3"}], :body "(printf \"1 + 2 is %s%n\" 3)", :created-at 1299610618000, :updated-at 1433459544222, :_id "542692ccc026201cdc326cad"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; Click the link to clojure.core/format under See also for\n;; more extensive examples. printf and format take the same\n;; arguments -- the difference is that format returns a formatted\n;; string, whereas printf sends the formatted string to *out*.\n\n;; Also note that printf output is buffered, and does not automatically\n;; flush at any time, not even when printing newlines. Thus the last few lines\n;; of output may never appear if your program exits before the buffer is\n;; flushed. Use (flush) or a (println ...) call to force flushing of the buffer.", :created-at 1331440764000, :updated-at 1417278553807, :_id "542692d4c026201cdc327038"}], :notes nil, :arglists ["fmt & args"], :doc "Prints formatted output, as per format", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/printf"} {:added "1.0", :ns "clojure.core", :name "map?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1411815243526, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "hash-map", :library-url "https://github.com/clojure/clojure"}, :_id "5426974be4b0d1509f919f73"} {:created-at 1414508257391, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "set?", :library-url "https://github.com/clojure/clojure"}, :_id "544faee1e4b0dc573b892fa9"} {:created-at 1414508398671, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "vector?", :library-url "https://github.com/clojure/clojure"}, :_id "544faf6ee4b03d20a1024283"} {:created-at 1550854368361, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "associative?", :ns "clojure.core"}, :_id "5c7028e0e4b0ca44402ef6a0"}], :line 167, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "(map? {:a 1 :b 2 :c 3})\n;;=> true\n\n(map? (hash-map :a 1 :b 2))\n;;=> true\n\n(map? (sorted-map :a 1 :b 2))\n;;=> true\n\n(map? (array-map :a 1 :b 2))\n;;=> true\n\n(map? '(1 2 3))\n;;=> false\n\n(map? #{:a :b :c})\n;;=> false", :created-at 1279074290000, :updated-at 1423276232206, :_id "542692cbc026201cdc326bdf"} {:updated-at 1443731276562, :created-at 1443731276562, :author {:login "hura", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/671872?v=3"}, :body "\"Note that Records also implement `clojure.lang.IPersistentMap`:\"\n\n(defrecord XRec [])\n(map? (->XRec))\n;; => true", :_id "560d974ce4b08e404b6c1c8c"}], :notes nil, :arglists ["x"], :doc "Return true if x implements IPersistentMap", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/map_q"} {:added "1.0", :ns "clojure.core", :name "->", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1289746069000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "->>", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c48"} {:created-at 1412262619860, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "as->", :library-url "https://github.com/clojure/clojure"}, :_id "542d6adbe4b05f4d257a298a"} {:created-at 1412882642031, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "get-in", :library-url "https://github.com/clojure/clojure"}, :_id "5436e0d2e4b06dbffbbb00c5"} {:created-at 1431612379634, :author {:login "pladdy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/11509380?v=3"}, :to-var {:ns "clojure.core", :name "some->", :library-url "https://github.com/clojure/clojure"}, :_id "5554abdbe4b03e2132e7d162"} {:created-at 1436359125547, :author {:login "jw-00000", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2936?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "doto", :ns "clojure.core"}, :_id "559d19d5e4b00f9508fd66fd"} {:created-at 1471532173241, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "..", :ns "clojure.core"}, :_id "57b5cc8de4b0b5e6d7a4fa59"}], :line 1677, :examples [{:updated-at 1447300863348, :created-at 1278953347000, :body ";; Use of `->` (the \"thread-first\" macro) can help make code\n;; more readable by removing nesting. It can be especially\n;; useful when using host methods:\n\n;; Arguably a bit cumbersome to read:\nuser=> (first (.split (.replace (.toUpperCase \"a b c d\") \"A\" \"X\") \" \"))\n\"X\"\n\n;; Perhaps easier to read:\nuser=> (-> \"a b c d\" \n .toUpperCase \n (.replace \"A\" \"X\") \n (.split \" \") \n first)\n\"X\"\n\n;; It can also be useful for pulling values out of deeply-nested\n;; data structures:\nuser=> (def person \n {:name \"Mark Volkmann\"\n :address {:street \"644 Glen Summit\"\n :city \"St. Charles\"\n :state \"Missouri\"\n :zip 63304}\n :employer {:name \"Object Computing, Inc.\"\n :address {:street \"12140 Woodcrest Dr.\"\n :city \"Creve Coeur\"\n :state \"Missouri\"\n :zip 63141}}})\n \nuser=> (-> person :employer :address :city)\n\"Creve Coeur\"\n\n;; same as above, but with more nesting\nuser=> (:city (:address (:employer person)))\n\"Creve Coeur\"\n\n;; Note that this operator (along with ->>) has at times been\n;; referred to as a 'thrush' operator.\n\n;; http://blog.fogus.me/2010/09/28/thrush-in-clojure-redux/\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/34f159f89cbd1d9beac0276f5a7af552?r=PG&default=identicon", :account-source "clojuredocs", :login "uvtc"} {:avatar-url "https://www.gravatar.com/avatar/34f159f89cbd1d9beac0276f5a7af552?r=PG&default=identicon", :account-source "clojuredocs", :login "uvtc"} {:avatar-url "https://www.gravatar.com/avatar/34f159f89cbd1d9beac0276f5a7af552?r=PG&default=identicon", :account-source "clojuredocs", :login "uvtc"} {:avatar-url "https://www.gravatar.com/avatar/1fabe200e8b19ec248fa8285cd6b493b?r=PG&default=identicon", :account-source "clojuredocs", :login "amithgeorge"} {:avatar-url "https://avatars.githubusercontent.com/u/333974?v=3", :account-source "github", :login "eneroth"} {:login "yang-wei", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5494874?v=3"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}, :_id "542692ccc026201cdc326c53"} {:author {:login "na_ka_na", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/38aaeb9ed42ddefd5aa63f8b9c4b84a4?r=PG&default=identicon"}, :editors [], :body ";; Your own REPL! (Read Eval Print Loop)\n\n;; We would need a little helper macro for that\n;; It does what its name says - loops forever\nuser=> (defmacro loop-forever [& body] `(loop [] ~@body (recur)))\n\n;; Your own REPL\nuser=> (loop-forever (println (eval (read)))) \n(+ 1 2)\n3\n\n;; If you read the above code left to right (outside in) it reads LPER.\n;; Inside out it reads REPL alright.\n\n;; Sometimes it might be easier to read code outside in, just like a sequence of steps:\n;; 1. Read, 2. Eval, 3. Print, 4. Loop\n;; Here's how -> helps you:\n\nuser=> (-> (read) (eval) (println) (loop-forever)) \n(+ 1 2)\n3\n\n;; Does that read easier for you? If it does, -> is your friend!\n\n;; To see what Clojure did behind the scenes with your -> expression:\nuser=> (require 'clojure.walk)\nnil\nuser=> (clojure.walk/macroexpand-all '(-> (read) (eval) (println) (loop-forever)))\n(loop* [] (println (eval (read))) (recur))\n\n;; You can even use ->'s cousin ->> to setup your own REPL:\nuser=> (->> (read) (eval) (println) (while true))\n(+ 1 2)\n3\n\n;; Can you see why we can't use -> to write the above?\n\n", :created-at 1294071196000, :updated-at 1294071196000, :_id "542692ccc026201cdc326c5a"} {:author {:login "BertrandDechoux", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/528360?v=3"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"} {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"} {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}], :body "user=> (def c 5)\nuser=> (-> c (+ 3) (/ 2) (- 1)) \n3\n\n;; and if you are curious why\nuser=> (use 'clojure.walk)\nuser=> (macroexpand-all '(-> c (+ 3) (/ 2) (- 1)))\n(- (/ (+ c 3) 2) 1)\n", :created-at 1339249204000, :updated-at 1339250710000, :_id "542692d1c026201cdc326f3c"} {:body ";; simplest usage example, fill as second item in the first and second form\n\nuser=> (-> \"foo\"\n (str \"bar\")\n (str \"zoo\"))\n\"foobarzoo\"\nuser=> (str \"foo\" \"bar\")\n\"foobar\"\nuser=> (str (str \"foo\" \"bar\") \"zoo\")\n\"foobarzoo\"", :author {:login "arathunku", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/749393?v=3"}, :created-at 1429647887382, :updated-at 1429647887382, :_id "5536b20fe4b01bb732af0a85"} {:editors [{:login "alvarogarcia7", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4199136?v=3"}], :body "(-> 3 (- 2)) ; It means (- 3 2)\n=> 1\n\n(->> 3 (- 2)) ; It means (- 2 3)\n=> -1\n\n(doto 3 (- 2)) ; It means (- 3 2) but return the first object 3\n=> 3", :author {:avatar-url "https://avatars.githubusercontent.com/u/4446025?v=3", :account-source "github", :login "expert0226"}, :created-at 1452151863527, :updated-at 1454886061151, :_id "568e1437e4b0e0706e05bd9e"} {:updated-at 1462650593323, :created-at 1462650593323, :author {:login "eggsyntax", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1233514?v=3"}, :body ";; Be cautious with anonymous functions; they must be wrapped in an outer\n;; pair of parens.\n(-> 10\n #(/ % 2))\n;; will throw an exception, but\n(-> 10\n (#(/ % 2)))\n;; will work fine. Similarly,\n(-> 10\n (fn [n] (/ n 2)))\n;; will throw an exception, but\n(-> 10\n ((fn [n] (/ n 2))))\n;; works as intended.\n", :_id "572e46e1e4b039e78aadabfc"} {:editors [{:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"}], :body ";; How to thread functions that expect more than one argument\n\n;; Say you want to thread this.\nuser=> (inc (/ 10 2))\n=> 6\n\n;; This obviously won't work\nuser=> (-> 2 10 / inc)\n=> ClassCastException java.lang.Long cannot be cast to clojure.lang.IFn\n\n;; Since Clojure is expecting a function instead of `10` in `(10 2)`\nuser=> (clojure.walk/macroexpand-all '(-> 2 10 + inc))\n=> (inc (+ (10 2)))\n\n;; Instead you have two options, either just\nuser=> (-> (/ 10 2) inc)\n=> 6\n\n;; or\nuser=> (-> 10 (/ 2) inc)\n=> 6", :author {:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"}, :created-at 1464759684437, :updated-at 1464761625892, :_id "574e7584e4b0bafd3e2a046d"} {:editors [{:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"}], :body ";; For large threads you can use commas (interpreted as whitespaces) \n;; to visualize where the items are going to be inserted.\n\nuser=> (-> + (reduce 10 [6 4]) (* 5) (/ 100))\n=> 1\n\n;; with two commas (you can use one if you prefer)\nuser=> (-> + (reduce ,, 10 [6 4]) (* ,, 5) (/ ,, 100))\n=> 1\n\n;; For instance:\n;; (reduce ,, 10 [6 4])\n;; means\n;; (reduce + 10 [6 4])", :author {:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"}, :created-at 1464761041214, :updated-at 1464761604810, :_id "574e7ad1e4b0bafd3e2a046e"} {:updated-at 1503919516240, :created-at 1503919516240, :author {:login "MokkeMeguru", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/30849444?v=4"}, :body ";; 4Clojure Question 38\n\n(= (#(-> %& \n sort \n reverse \n first) 1 8 3 4) 8)", :_id "59a3fd9ce4b09f63b945ac57"}], :macro true, :notes [{:updated-at 1280208863000, :body "See also ->> which is similar but threads the first expr as the last argument of the forms.", :created-at 1280208863000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f8e"} {:updated-at 1374299741000, :body "I have a [short blog](http://wangjinquan.me/show/Clojure%20线性(箭头)�作符) on this, in case you are still confused on it and understand Chinese.", :created-at 1374299714000, :author {:login "John Wang", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d66c259a1fa85832e41fb9b90c7e613c?r=PG&default=identicon"}, :_id "542692edf6e94c6970522008"} {:body "Can be used as an alternative to get-in.", :created-at 1412882630144, :updated-at 1412882630144, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :_id "5436e0c6e4b0ae795603157a"}], :arglists ["x & forms"], :doc "Threads the expr through the forms. Inserts x as the\n second item in the first form, making a list of it if it is not a\n list already. If there are more forms, inserts the first form as the\n second item in second form, etc.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/->"} {:added "1.0", :ns "clojure.core", :name "defstruct", :file "clojure/core.clj", :static true, :type "macro", :column 1, :see-alsos [{:created-at 1312838555000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "struct", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a87"} {:created-at 1312849643000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "create-struct", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a88"} {:created-at 1335411176000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defrecord", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a89"} {:created-at 1446587127297, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "deftype", :ns "clojure.core"}, :_id "56392af7e4b04b157a6648e3"} {:created-at 1446587141438, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defprotocol", :ns "clojure.core"}, :_id "56392b05e4b04b157a6648e4"}], :line 4045, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (defstruct person :name :age :height)\n#'user/person\n\nuser=> (struct person \"george\" 22 115)\n{:name \"george\", :age 22, :height 115}", :created-at 1280748955000, :updated-at 1285495885000, :_id "542692c7c026201cdc3269d6"}], :macro true, :notes [{:updated-at 1335411165000, :body "Structs are obsolete. Use records instead. See `defrecord`.", :created-at 1335411165000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fe0"} {:updated-at 1391537723000, :body "Are structs obsolete ? Or will become obsolete ? The docs for 'defrecord' have 'Alpha - Subject To Change' ?", :created-at 1391537723000, :author {:login "monojohnny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/79d11fd92782ff24d9ae806b72b73d2f?r=PG&default=identicon"}, :_id "542692edf6e94c697052201c"} {:updated-at 1392247001000, :body "The doc string for defrecord has been changed in Clojure 1.6 to remove the 'alpha' designation, along with many other Clojure functions: https://github.com/clojure/clojure/commit/93d13d0c0671130b329863570080c72799563ac7", :created-at 1392247001000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :_id "542692edf6e94c697052201d"} {:author {:login "jhigdon", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/45405?v=4"}, :updated-at 1550940905930, :created-at 1550940905930, :body "Adding to why people are saying it's obsolete:\n\nhttps://clojure.org/reference/datatypes#_deftype_and_defrecord\n\nexplains how where defstruct/deftype/defrecord differ\n\nand https://clojure.org/reference/data_structures#StructMaps is where they suggest a record might better serve your needs", :_id "5c717ae9e4b0ca44402ef6a1"} {:author {:login "metasoarous", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/88556?v=4"}, :updated-at 1605646244437, :created-at 1605646169773, :body "In _general_, records should be preferred over structs. However, structs aren't _entirely_ obsolete.\n\nThey can still be useful when you need/want to create record-like objects dynamically; That is, when you don't know the field names at compile time. A typical example of this might be loading rows from a CSV (as [semantic-csv](https://github.com/metasoarous/semantic-csv) does). The advantage in this case over using regular maps is significantly improved performance creating and using these objects.\n\nHowever, note that to use structs dynamically, you have to use `create-struct`, rather than `defstruct`, as above. So if anything, one could argue that `defstruct` is obsolete, but not necessary `create-struct` & `struct`.", :_id "5fb43759e4b0b1e3652d740d"}], :arglists ["name & keys"], :doc "Same as (def name (create-struct keys...))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/defstruct"} {:added "1.0", :ns "clojure.core", :name "*err*", :type "var", :see-alsos nil, :examples nil, :notes nil, :arglists [], :doc "A java.io.Writer object representing standard error for print operations.\n\n Defaults to System/err, wrapped in a PrintWriter", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*err*"} {:added "1.0", :ns "clojure.core", :name "get", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1324306493000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "map-indexed", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bb1"} {:created-at 1359887523000, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "get-in", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bb2"} {:created-at 1360286957000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "find", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bb3"} {:created-at 1416824761214, :author {:login "alilee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/16739?v=3"}, :to-var {:ns "clojure.core", :name "select-keys", :library-url "https://github.com/clojure/clojure"}, :_id "547307b9e4b03d20a10242b2"} {:created-at 1416824821178, :author {:login "alilee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/16739?v=3"}, :to-var {:ns "clojure.core", :name "nth", :library-url "https://github.com/clojure/clojure"}, :_id "547307f5e4b03d20a10242b3"}], :line 1494, :examples [{:updated-at 1545395916321, :created-at 1280321427000, :body "(get [1 2 3] 1)\n;;=> 2\n\n(get [1 2 3] 5)\n;;=> nil\n\n(get [1 2 3] 5 100)\n;;=> 100\n\n(get {:a 1 :b 2} :b)\n;;=> 2\n\n(get {:a 1 :b 2} :z \"missing\")\n;;=> \"missing\"\n\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "sanel", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/213914?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon", :account-source "clojuredocs", :login "gstamp"}, :_id "542692cdc026201cdc326cd7"} {:author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; to get an index of the element of a vector, use .indexOf\n(def v [\"one\" \"two\" \"three\" \"two\"])\n;; #'user/v\n\n(.indexOf v \"two\")\n;;=> 1\n\n(.indexOf v \"foo\")\n;;=> -1\n", :created-at 1324306658000, :updated-at 1421261046680, :_id "542692d3c026201cdc326fbd"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; the system environment has a hash-map semantic\n(get (System/getenv) \"SHELL\")\n;;=> \"/bin/bash\"\n\n(get (System/getenv) \"PATH\")\n;;=> \"/usr/local/bin:/sbin:/usr/sbin:/usr/bin:/bin\"", :created-at 1324314703000, :updated-at 1421261106767, :_id "542692d3c026201cdc326fbe"} {:updated-at 1421261190882, :created-at 1340441156000, :body ";; 'get' is not the only option\n(def my-map {:a 1 :b 2 :c 3})\n\n;; maps act like functions taking keys \n(my-map :a)\n;;=> 1\n\n;; even keys (if they are keywords) act like functions\n(:b my-map)\n;;=> 2", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"}, :_id "542692d3c026201cdc326fbf"} {:author {:login "cympfh", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7ad064788bb989f0c9ae552257355d6?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; it is tempting to try an index on a list\n(get '(a b c) 1)\n;;=> nil\n\n;; but you should use nth\n(nth '(a b c) 1)\n;;=> b", :created-at 1394404668000, :updated-at 1421261345010, :_id "542692d3c026201cdc326fc0"} {:updated-at 1461265877674, :created-at 1461265877674, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :body ";; Get also works with strings:\n(get \"abc\" 1)\n;;=> \\b", :_id "571925d5e4b0fc95a97eab50"} {:updated-at 1496171084580, :created-at 1492450542481, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/20086?v=3"}, :body ";; For sorted stuff, \"key\" must be of the same type of the existing keys. \n;; This allows descending the sorted tree in log(N) average.\n\n(get (hash-map :a 1 :b 2) \"a\" \"not found\")\n;; \"not found\"\n\n(get (sorted-map :a 1 :b 2) \"a\" \"not found\")\n;; ClassCastException\n\n;; get works on transient maps, but silently fails on transient sets.\n;; A similar issue affects contains?.\n\n(get (transient #{0 1 2}) 1)\n;; nil\n\n;; get uses int cast with precision loss, with (.intValue x).\n;; The example below is explained because 4294967296 equal 2^32, thus\n;; (.intValue 4294967296) returns 0.\n;; Be careful with sufficiently large keys:\n\n(get [\"a\" \"b\" \"c\"] 4294967296)\n;; \"a\"", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/20086?v=3", :account-source "github", :login "reborg"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/109629?v=3"}], :_id "58f4fceee4b01f4add58fe94"} {:editors [{:login "puppe", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1393865?v=4"}], :body ";; Specifying 'not-found' does NOT guarantee that the return value is\n;; not 'nil'.\n\n(get {} :a 42)\n;;=> 42\n\n(get {:a nil} :a 42)\n;;=> nil\n\n;; This may be especially relevant if you use records, as all pre-defined keys\n;; will usually be present.\n\n(defrecord R [a b])\n(def r (map->R {}))\n\nr\n;;=> #user.R{:a nil :b nil}\n\n(get r :a 42)\n;;=> nil\n\n;; Consider using 'or' instead, as 'nil' is \"falsy\".\n\n(or (get {:a nil} :a) 42)\n;;=> 42", :author {:avatar-url "https://avatars2.githubusercontent.com/u/1393865?v=4", :account-source "github", :login "puppe"}, :created-at 1576172735814, :updated-at 1576172805891, :_id "5df27cbfe4b0ca44402ef7f8"} {:editors [{:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4"}], :body ";; Specifying not-found doesn't mean that the expression won't be evaluated.\n;; This can be a problem if you intend to materialize the not-found value \n;; only if key is not set.\n\n(get {:a 1} :a (#(println \"else\")))\n;; else\n;;=> 1\n\n;; using an `or` can solve your problem here\n(or (get {:a 1} :a)\n (println \"not found\"))\n;;=> 1", :author {:avatar-url "https://avatars2.githubusercontent.com/u/633523?v=4", :account-source "github", :login "timofeytt"}, :created-at 1595920651962, :updated-at 1666965797097, :_id "5f1fd10be4b0b1e3652d7326"} {:updated-at 1690985032681, :created-at 1690985032681, :author {:login "usametov", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5256128?v=4"}, :body ";; how to deal with nil map, defensive coding example:\n;; try to get :a key from nil map \n(get nil :a :a1)\n;;=> :a1\n", :_id "64ca6248e4b08cf8563f4bd7"}], :notes [{:body "Why is this character/string?", :created-at 1420334049781, :updated-at 1420334049781, :author {:login "Pierre-Thibault", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10163425?v=3"}, :_id "54a893e1e4b09260f767ca86"} {:author {:login "hgijeon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7885562?v=3"}, :updated-at 1449649145088, :created-at 1449649145088, :body "(:mykey my-hash-map :none) means the same as (get my-hash-map :mykey :none) and
\n('mysym my-hash-map :none) means the same as (get my-hash-map 'mysym :none).
\nSo, you can use (:a {:a 1 :b 2} :not-inserted) as (get {:a 1 :b 2} :a :not-inserted).
\nSee \nhttp://clojure.org/data_structures#Data Structures-Keywords and\nhttp://clojure.org/data_structures#Data Structures-Symbols", :_id "5667e3f9e4b0f47c7ec61147"} {:author {:login "navigaid", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/10371727?v=4"}, :updated-at 1545127452738, :created-at 1545127452738, :body "`(get get get get)` is equivalent to `get`\n\nas in:\n\n```\n((get get get get) {:a 1} :a)\n```", :_id "5c18c61ce4b0ca44402ef5ec"}], :arglists ["map key" "map key not-found"], :doc "Returns the value mapped to key, not-found or nil if key not present.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/get"} {:added "1.0", :ns "clojure.core", :name "doto", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1436359076539, :author {:login "jw-00000", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2936?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "->", :ns "clojure.core"}, :_id "559d19a4e4b00f9508fd66fb"} {:created-at 1436359083907, :author {:login "jw-00000", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2936?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "->>", :ns "clojure.core"}, :_id "559d19abe4b00f9508fd66fc"} {:created-at 1557781859408, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "..", :ns "clojure.core"}, :_id "5cd9dd63e4b0ca44402ef722"}], :line 3852, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [{:login "ozzloy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c546d3f104228c483309c760926e6e3?r=PG&default=identicon"} {:avatar-url "https://avatars.githubusercontent.com/u/37649?v=3", :account-source "github", :login "fasiha"} {:login "dominem", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11671382?v=4"}], :body ";; Note that even though println returns nil, doto still returns the HashMap object\n(doto (java.util.HashMap.)\n (.put \"a\" 1)\n (.put \"b\" 2)\n (println))\n;;=> #\n;;=> {\"b\" 2, \"a\" 1}\n\n;; Equivalent to\n(def m (java.util.HashMap.))\n(.put m \"a\" 1)\n(.put m \"b\" 2)\nm\n;;=> {\"a\" 1, \"b\" 2}\n(println m)\n;;=> #object[java.util.HashMap 0x727fcc37 {a=1, b=2}]", :created-at 1293673034000, :updated-at 1565336332524, :_id "542692c9c026201cdc326ae6"} {:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"} {:login "jakebasile", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/766907?v=2"}], :body ";; quick demonstration of using a Collections function on the resulting ArrayList\n\nuser=> (def al (doto (java.util.ArrayList.) (.add 11) (.add 3) (.add 7)))\n#'user/al\nuser=> al\n#\nuser=> (java.util.Collections/sort al)\nnil\nuser=> al\n#\nuser=>", :created-at 1313965605000, :updated-at 1412632698246, :_id "542692c9c026201cdc326ae8"} {:author {:login "jimpil", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c3cf214ed0c5f0bca153b1c1177575d6?r=PG&default=identicon"}, :editors [{:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"} {:login "schmee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3405586?v=3"}], :body ";; careful when calling 'dotimes' from within a 'doto' statement\nuser=> (doto (java.util.ArrayList.)\n (.add -2)\n (.add -1)\n (dotimes [i 3] (.add i)))\njava.lang.IllegalArgumentException: dotimes requires a vector for its binding (NO_SOURCE_FILE:1)\n\n; what has happened is that (java.util.ArrayList.) has secretly\n; become the first argument to 'dotimes' and thus the exception\n; informs us that it can't find the binding vector required for\n; 'dotimes' to expand. You can cure this behaviour by simply using\n; 'do' instead of 'doto' or by wrapping the call to 'dotimes' in\n; a function. e.g:\n\n;using 'let' with implicit 'do' instead of 'doto'\nuser=> (let [al (java.util.ArrayList.)]\n (.add al -2)\n (.add al -1)\n (dotimes [i 3] (.add al i))\n al);return the ArrayList\n# ;exactly what we intended\n\n;wrapping 'dotimes' in a function literal\nuser=>(doto (java.util.ArrayList.)\n (.add -2)\n (.add -1)\n (#(dotimes [i 3] (.add % i))))\n# ;exactly what we intended again\n", :created-at 1339783113000, :updated-at 1421092637298, :_id "542692d2c026201cdc326f98"} {:updated-at 1650763751893, :created-at 1633711183120, :author {:login "benjamin-asdf", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/38900087?v=4"}, :body "; useful during development when you want to log something\n; without changing the structure of your code\n\n(+\n (doto 42 println)\n 10)\n\n=> 52\n\n; similarly wrapping tap> in a threading macro for intermediate results\n\n(-> :hello\n {:hello \"Hello\"}\n (doto tap>) ; tap> \"Hello\"\n (str \" World!\"))\n\n=> \"Hello World!\"", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/38900087?v=4", :account-source "github", :login "benjamin-asdf"} {:login "dgb23", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10947371?v=4"}], :_id "6160744fe4b0b1e3652d7554"}], :macro true, :notes nil, :arglists ["x & forms"], :doc "Evaluates x then calls all of the methods and functions with the\n value of x supplied at the front of the given arguments. The forms\n are evaluated in order. Returns x.\n\n (doto (new java.util.HashMap) (.put \"a\" 1) (.put \"b\" 2))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/doto"} {:added "1.0", :ns "clojure.core", :name "identity", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1365638085000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "nil?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e76"} {:created-at 1493319344537, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "some?", :ns "clojure.core"}, :_id "59023eb0e4b01f4add58fe9e"} {:created-at 1544362967323, :author {:login "Ramblurr", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/14830?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "constantly", :ns "clojure.core"}, :_id "5c0d1bd7e4b0ca44402ef5e9"}], :line 1451, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (identity 4)\n4", :created-at 1279071803000, :updated-at 1332950516000, :_id "542692ccc026201cdc326c9a"} {:author {:login "cschreiner", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/93bff5e102f3d5bcc426e28e06c3c503?r=PG&default=identicon"}, :editors [{:login "cschreiner", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/93bff5e102f3d5bcc426e28e06c3c503?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (filter identity [1 2 3 nil 4 false true 1234])\n(1 2 3 4 true 1234)", :created-at 1279209894000, :updated-at 1332950531000, :_id "542692ccc026201cdc326c9c"} {:author {:login "cschreiner", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/93bff5e102f3d5bcc426e28e06c3c503?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (map #(%1 %2) (cycle [inc identity]) [1 2 3 4 5 6 7 8 9 10])\n(2 2 4 4 6 6 8 8 10 10)\n", :created-at 1279209982000, :updated-at 1285500217000, :_id "542692ccc026201cdc326c9f"} {:author {:login "cschreiner", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/93bff5e102f3d5bcc426e28e06c3c503?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (partition-by identity (sort \"abcdaabccc\"))\n((\\a \\a \\a) (\\b \\b) (\\c \\c \\c \\c) (\\d))\n", :created-at 1280212301000, :updated-at 1285501489000, :_id "542692ccc026201cdc326ca1"} {:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body "user=> (map first (partition-by identity [1 1 2 3 3 1 1 5 5]))\n(1 2 3 1 5)", :created-at 1310849421000, :updated-at 1310849421000, :_id "542692ccc026201cdc326ca3"} {:author {:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"}, :editors [], :body "user=> (group-by identity \"abracadabra\")\n{\\a [\\a \\a \\a \\a \\a], \\b [\\b \\b], \\r [\\r \\r], \\c [\\c], \\d [\\d]}", :created-at 1312216209000, :updated-at 1312216209000, :_id "542692ccc026201cdc326ca4"} {:body "user=> (map #(identity %) [1 2 3 4]) ; ~ (map (fn [x] x) [1 2 3 4])\n(1 2 3 4)", :author {:login "protsenkovi", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/431393?v=3"}, :created-at 1417761372684, :updated-at 1417761372684, :_id "5481525ce4b03d20a10242c3"} {:updated-at 1539899393566, :created-at 1539899393566, :author {:login "peter-kehl", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/4270240?v=4"}, :body "; `identity` can serve in workarounds, because you can't pass a macro\n; to a function. For example, you can't pass `and` as a parameter to `apply`:\n(apply and '(true 1 \"yes\"))\n; \\=> CompilerException... Can't take value of a macro...\n\n; Instead:\n(every? identity '(true 1 \"yes\"))\n", :_id "5bc90001e4b00ac801ed9ee7"}], :notes [{:updated-at 1280212784000, :body "I don't quite see the usefulness of this :P", :created-at 1280212784000, :author {:login "Jacolyte", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f91"} {:updated-at 1313418353000, :body "It's useful for example with -> macro when we eventually want to return its argument (in this case: state)\r\n\r\n\r\n\r\n(defn example[state]\r\n (-> state\r\n update-function-1\r\n update-function-2\r\n identity))", :created-at 1313418233000, :author {:login "dturczanski", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22c58e86fe0fa676e1fcbe71c1dba1bf?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fc5"} {:updated-at 1316077178000, :body "Here is another good example:\r\n
(some identity ((juxt :foo :bar) {:bar :b}))
\r\nequivalent to \r\n
 (let [map {:bar b}] (or (:foo map) (:bar map)))", :created-at 1316077178000, :author {:login "lancepantz", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9fbd3eb69f978b77c1bd66436971cdb2?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fcb"} {:body "user=> (mapcat identity [[[0 1] [1 2]] [[11 12]]])\n([0 1] [1 2] [11 12])\n", :created-at 1424195865165, :updated-at 1424195865165, :author {:login "tlightsky", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/429211?v=3"}, :_id "54e38119e4b0b716de7a652c"}], :arglists ["x"], :doc "Returns its argument.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/identity"} {:added "1.0", :ns "clojure.core", :name "into", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1399644560000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "conj", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c52"} {:created-at 1539774381439, :author {:login "witek", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/209520?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "concat", :ns "clojure.core"}, :_id "5bc717ade4b00ac801ed9edb"}], :line 6887, :examples [{:author {:login "Miki", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/52338b3d753f00bb7724f2d2ca060a4?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"}], :body "; Maps can be constructed from a sequence of 2-vectors or a sequence \n; of maps\nuser=> (into (sorted-map) [ [:a 1] [:c 3] [:b 2] ] )\n{:a 1, :b 2, :c 3}\nuser=> (into (sorted-map) [ {:a 1} {:c 3} {:b 2} ] )\n{:a 1, :b 2, :c 3}\n\n; When maps are the input source, they convert into an unordered sequence \n; of key-value pairs, encoded as 2-vectors\nuser=> (into [] {1 2, 3 4})\n[[1 2] [3 4]]\n", :created-at 1278846273000, :updated-at 1404822264000, :_id "542692cbc026201cdc326bac"} {:author {:login "cran1988", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/6261b9b7e6263f013dfb1330a43a501?r=PG&default=identicon"}, :editors [{:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"} {:avatar-url "https://avatars.githubusercontent.com/u/4881607?v=3", :account-source "github", :login "sa2812"}], :body "; Items are conj'ed one at a time, which puts them at the head of \n; the destination list\nuser=> (into () '(1 2 3))\n(3 2 1)\n\n; This does not happen for a vector, however, due to the behavior of conj:\nuser=> (into [1 2 3] '(4 5 6))\n[1 2 3 4 5 6]\n", :created-at 1310276614000, :updated-at 1436264587298, :_id "542692cbc026201cdc326baf"} {:updated-at 1514491228692, :created-at 1334632023000, :body "(defn test-key-inclusion-cols\n  \"return all values in column1 that aren't in column2\"\n  [column1 column2]\n  (filter (complement (into #{} column2)) column1))\n", :editors [{:login "jcburley", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/430319?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon", :account-source "clojuredocs", :login "octopusgrabbus"}, :_id "542692d3c026201cdc326fd8"} {:author {:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"}, :editors [], :body "; Change from one type of map to another\nuser=> (into (sorted-map) {:b 2 :c 3 :a 1})\n{:a 1, :b 2, :c 3}", :created-at 1399534625000, :updated-at 1399534625000, :_id "542692d3c026201cdc326fd9"} {:updated-at 1448739135641, :created-at 1448739135641, :author {:login "dxlr8r", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1648056?v=3"}, :body "; Convert a nested ordering map to hash-map (or another)\nuser=> (use 'flatland.ordered.map)\nuser=> (def ord-map (ordered-map :a \"a\" :b \"b\" :c {:d \"d\" :e \"e\"}))\nuser=> ord-map\n#ordered/map ([:a \"a\"] [:b \"b\"] [:c {:d \"d\", :e \"e\"}]) \n\nuser=> (use 'clojure.walk)\nuser=> (defn disorder [ordering-map map-fn] \n  (postwalk #(if (map? %) (into map-fn %) %) ordering-map))\n\nuser=> (disorder ord-map {})\n{:a \"a\", :b \"b\", :c {:d \"d\", :e \"e\"}}", :_id "565a013fe4b0be225c0c47a0"} {:updated-at 1458739828450, :created-at 1458739828450, :author {:login "ha0ck", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3716736?v=3"}, :body ";impl apply merge\nuser=> (into {:x 4} [{:a 1} {:b 2} {:c 3}])\n\n{:x 4, :a 1, :b 2, :c 3}", :_id "56f29a74e4b07ac9eeceed15"} {:updated-at 1462324693090, :created-at 1462324000684, :author {:login "fasiha", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/37649?v=3"}, :body ";; How do we use a transducer?\n\n; Define the transducer with `comp` but in `->` order:\n(def xform (comp (map #(+ 2 %))\n                 (filter odd?)))\n; adds 2, then omits if result is even.\n\n(into [-1 -2] xform (range 10))\n; => [-1 -2 3 5 7 9 11]\n\n\n; Alternatively, using `transduce` directly:\n(transduce xform conj [-1 -2] (range 10))\n; => [-1 -2 3 5 7 9 11]\n\n; Alternatively, using reduce and explicitly calling `map` and `filter`:\n(reduce conj [-1 -2] (->> (range 10)\n                          (map #(+ 2 %))\n                          (filter odd?)))\n; => [-1 -2 3 5 7 9 11]\n\n\n;; Let's benchmark, using Criterium (https://github.com/hugoduncan/criterium)\n(require '[criterium.core :refer [quick-bench]])\n(quick-bench (into [-1 -2] xform (range 1000000)))\n;   Execution time lower quantile : 54.368948 ms ( 2.5%)\n;   Execution time upper quantile : 55.976303 ms (97.5%)\n\n(quick-bench (transduce xform conj [-1 -2] (range 1000000)))\n;   Execution time lower quantile : 77.738505 ms ( 2.5%)\n;   Execution time upper quantile : 87.088016 ms (97.5%): 1.5x slower than into\n\n(quick-bench (reduce conj [-1 -2] (->> (range 1000000) \n                                       (map #(+ 2 %))\n                                       (filter odd?))))\n;   Execution time lower quantile : 92.607522 ms ( 2.5%)\n;   Execution time upper quantile : 100.426780 ms (97.5%): 1.8x slower than into", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/37649?v=3", :account-source "github", :login "fasiha"}], :_id "57294b20e4b050526f331420"} {:updated-at 1482220266209, :created-at 1482220266209, :author {:login "aksenov", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1590180?v=3"}, :body ";; Interesting case you can't directly convert list or sequence into map (due performance reasons). One should use vector instead.\n\n;; This is ok:\n(into {} [[:a \"a\"] [:b \"b\"]])\n;;=> {:a \"a\", :b \"b\"}\n\n;; But this isn't:\n(into {} ['(:a \"a\") '(:b \"b\")])\n;;=> ClassCastException clojure.lang.Keyword cannot be cast to java.util.Map$Entry clojure.lang.ATransientMap.conj (ATransientMap.java:44)", :_id "5858e2eae4b004d3a355e2c8"} {:editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :body ";; merging two arrays using the transducer `cat`\n(into [] cat [[1 2 3 ] [4 5 6 ]])\n;=> [1 2 3 4 5 6]\n\n(into '() cat [[1 2 3 ] [4 5 6 ]])\n;=> (6 5 4 3 2 1)\n\n(into '() [1 2 3 4 5 6])\n;=> (6 5 4 3 2 1)", :author {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}, :created-at 1517940935300, :updated-at 1519691300149, :_id "5a79f0c7e4b0e2d9c35f741e"} {:editors [{:login "lsevero", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/3440467?v=4"}], :body ";Into is useful to concatenate vectors of maps\n(def a [{:a 1 :b 2} {:a 3 :b 4}])\n(def b [{:c \"c\" :d \"d\"} {:c \"cc\" :d \"dd\"}])\n\n(into a b)\n;=> [{:a 1, :b 2} {:a 3, :b 4} {:c \"c\", :d \"d\"} {:c \"cc\", :d \"dd\"}]\n\n;concat will return a similar result, but will be a lazy-seq instead of a vector", :author {:avatar-url "https://avatars2.githubusercontent.com/u/3440467?v=4", :account-source "github", :login "lsevero"}, :created-at 1582056539595, :updated-at 1582056838335, :_id "5e4c445be4b0ca44402ef83d"} {:editors [{:login "littleli", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/544082?v=4"}], :body ";; Java 9 introduced immutable collections constructed with static 'of' methods\n;; These collections have specific implementation details and are used usually along with Java streams\n;; They cannot be used as operators like this (a-map :key)\n;; Use 'into' to convert them to Clojure collections with improved utility\n\n(into [] (java.util.List/of :a :b :c))\n;=> [:a :b :c]\n\n(into #{} (java.util.Set/of :a :b :c))\n;=> #{:c :b :a}\n\n(into {} (java.util.Map/of :a \"aa\" :b \"bb\" :c \"cc\"))\n;=> {:c \"cc\", :b \"bb\", :a \"aa\"}\n", :author {:avatar-url "https://avatars0.githubusercontent.com/u/544082?v=4", :account-source "github", :login "littleli"}, :created-at 1588591562483, :updated-at 1596476819086, :_id "5eaffbcae4b087629b5a18fd"} {:updated-at 1600132004721, :created-at 1600132004721, :author {:login "luiszambon", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/41161270?v=4"}, :body "; into will return the coll type of the first parameter\n\n(def list-example '(1 2 3 4))\n;=> #'list-example\n(def vector-example [1 2 3 4])\n;=> #'vector-example\n(def set-example #{1 2 3 4})\n;=> #'set-example\n\n(class (into list-example vector-example))\n;=> clojure.lang.PersistentList\n(class (into vector-example list-example))\n;=> clojure.lang.PersistentVector\n(class (into set-example list-example))\n;=> clojure.lang.PersistentHashSet", :_id "5f6013a4e4b0b1e3652d73bd"}], :notes nil, :arglists ["" "to" "to from" "to xform from"], :doc "Returns a new coll consisting of to-coll with all of the items of\n  from-coll conjoined. A transducer may be supplied.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/into"} {:added "1.0", :ns "clojure.core", :name "areduce", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "amap", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342853655000, :_id "542692ebf6e94c6970521ec7"}], :line 5265, :examples [{:updated-at 1446748965601, :created-at 1281617241000, :body ";; This should be about as quick as summing up a array of floats in java.\n\nuser=> (defn asum [^floats xs]\n         (areduce xs i ret (float 0)\n                  (+ ret (aget xs i))))\n\nuser=> (asum (float-array [1 2 3]))\n6.0\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon", :account-source "clojuredocs", :login "gstamp"}, :_id "542692cec026201cdc326df8"}], :macro true, :notes nil, :arglists ["a idx ret init expr"], :doc "Reduces an expression across an array a, using an index named idx,\n  and return value named ret, initialized to init, setting ret to the \n  evaluation of expr at each step, returning ret.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/areduce"} {:added "1.0", :ns "clojure.core", :name "long", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "int", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917169000, :_id "542692eaf6e94c6970521b73"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "longs", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917368000, :_id "542692eaf6e94c6970521b74"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "long-array", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917373000, :_id "542692eaf6e94c6970521b75"} {:created-at 1496088186511, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unchecked-long", :ns "clojure.core"}, :_id "592c7e7ae4b093ada4d4d79c"}], :line 3480, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "rand0m86", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/aa88f28de4d9335e744f8d10d5ebf8a6?r=PG&default=identicon"} {:login "rand0m86", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/aa88f28de4d9335e744f8d10d5ebf8a6?r=PG&default=identicon"}], :body "v.1.3.0\nuser=> (let [num (* 1234567890 21)] [num (int num) (long num)])\n[25925925690 156121914 25925925690]\n\nv.1.6.0\nuser=> (let [num (* 1234567890 21)] [num (int num) (long num)])\nIllegalArgumentException Value out of range for int: 25925925690", :created-at 1281031682000, :updated-at 1406257844000, :_id "542692c7c026201cdc326992"} {:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "rand0m86", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/aa88f28de4d9335e744f8d10d5ebf8a6?r=PG&default=identicon"} {:login "rand0m86", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/aa88f28de4d9335e744f8d10d5ebf8a6?r=PG&default=identicon"}], :body "v.1.3.0\nuser=> (= 21 (long 21))\ntrue \n\n;; but\nuser=> (.equals 21 (long 21))\nfalse \n\n;; and thus\nuser=> (get {21 :twenty-one} (long 21))\nnil \n\nv.1.6.0\nuser=> (= 21 (long 21))\ntrue \n\nuser=> (.equals 21 (long 21))\ntrue\n\nuser=> (.equals 21.0 (long 21))\nfalse\n\nuser=> (.equals (long 21.0) (long 21)) \ntrue", :created-at 1281031694000, :updated-at 1406257882000, :_id "542692c7c026201cdc326996"} {:updated-at 1596590278008, :created-at 1596590278008, :author {:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}, :body "(long 123)\n;;=> 123\n\n(long 1.23)\n;;=> 1\n\n(long 1.2345678901234567890)\n;;=> 1\n\n(long -1)\n;;=> -1\n\n;; Casting a string does not work\n(long \"123\")\n;;=> Execution error (ClassCastException) at user/eval187 (REPL:1).\n;;java.lang.String cannot be cast to java.lang.Number\n\n;; Use Java interop instead\n(Long/parseLong \"123\")\n;;=> 123\n\n;; Content originally posted by u/didibus on https://clojuredocs.org/clojure.core/num", :_id "5f2a08c6e4b0b1e3652d7361"}], :notes [{:updated-at 1394070050000, :body "the second example is no longer true.", :created-at 1394070050000, :author {:login "clojureking", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/92625b8a6be91bb8c688d0d07b4e2a32?r=PG&default=identicon"}, :_id "542692edf6e94c6970522020"}], :arglists ["x"], :doc "Coerce to long", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/long"} {:added "1.0", :ns "clojure.core", :name "double", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1579780040730, :author {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "float", :ns "clojure.core"}, :_id "5e2987c8e4b0ca44402ef81c"} {:created-at 1579780063873, :author {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "bigdec", :ns "clojure.core"}, :_id "5e2987dfe4b0ca44402ef81d"}], :line 3492, :examples [{:author {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (double 1)\n1.0", :created-at 1283814485000, :updated-at 1332952958000, :_id "542692cec026201cdc326ddb"} {:updated-at 1522204835943, :created-at 1522204835943, :author {:login "yuxuan813", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/22159831?v=4"}, :body ";; Ratios can be explicitly coerced to a floating-point representation:\nuser=> (double 1/3)\n;= 0.3333333333333333", :_id "5abb00a3e4b045c27b7fac28"} {:updated-at 1596590762065, :created-at 1596590762065, :author {:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}, :body ";; Casting a string does not work\n(double \"123.456\")\n;;=> Execution error (ClassCastException) at user/eval197 (REPL:1).\n;;java.lang.String cannot be cast to java.lang.Number\n\n;; Use Java interop instead\n(Double/parseDouble \"123.456\")\n;;=> 123.456\n\n;; Content originally posted by u/didibus on https://clojuredocs.org/clojure.core/num", :_id "5f2a0aaae4b0b1e3652d7366"}], :notes nil, :arglists ["x"], :doc "Coerce to double", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/double"} {:added "1.7", :ns "clojure.core", :name "volatile?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1437146147516, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "volatile!", :ns "clojure.core"}, :_id "55a91c23e4b0080a1b79cda6"} {:created-at 1492395420814, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "vswap!", :ns "clojure.core"}, :_id "58f4259ce4b01f4add58fe8e"} {:created-at 1492395448747, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "vreset!", :ns "clojure.core"}, :_id "58f425b8e4b01f4add58fe8f"}], :line 2548, :examples [{:editors [{:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}], :body "(def a (volatile! 0))\n\nuser=> (volatile? a)\n;;=> true\n\n(def b 0)\n\nuser=> (volatile? b)\n;;=> false", :author {:avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3", :account-source "github", :login "ertugrulcetin"}, :created-at 1460034117197, :updated-at 1460034139185, :_id "57065a45e4b075f5b2c864cf"}], :notes nil, :arglists ["x"], :doc "Returns true if x is a volatile.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/volatile_q"} {:added "1.0", :ns "clojure.core", :name "definline", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1612735270827, :author {:login "KingMob", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/946421?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defmacro", :ns "clojure.core"}, :_id "60206326e4b0b1e3652d744b"}], :line 5229, :examples nil, :macro true, :notes [{:updated-at 1354753534000, :body "Note that, as for macros, the arguments to definline are potentially subject to double evaluation if they are used more than once in the body. For example:\r\n\r\n
\r\nuser=> (definline bad-sqr [x] `(* ~x ~x))\r\n#'user/bad-sqr\r\nuser=> (bad-sqr (do (println \"x\") 5))\r\nx\r\nx\r\n25\r\n
\r\n\r\n", :created-at 1354753534000, :author {:login "glchapman", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a5176d5d971ba68c15f4afe376aeaf18?r=PG&default=identicon"}, :_id "542692edf6e94c6970521ff8"} {:updated-at 1385846788000, :body "Any non-like-a-function behaviour should be avoided, because otherwise function will behave differently depending on whether it's inlined or not:\r\n\r\n user=> (definline bad-if [cond then] `(if ~cond ~then))\r\n #'user/bad-if\r\n user=> (bad-if nil (do (prn :side-effect) :not-returned))\r\n nil\r\n user=> (let [bad-if bad-if] (bad-if nil (do (prn :side-effect) :not-returned)))\r\n :side-effect\r\n nil\r\n", :created-at 1385846788000, :author {:login "Alexey Tarasevich", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/43e0398b89022d32b43de4c968069312?r=PG&default=identicon"}, :_id "542692edf6e94c6970522013"}], :arglists ["name & decl"], :doc "Experimental - like defmacro, except defines a named function whose\n body is the expansion, calls to which may be expanded inline as if\n it were a macro. Cannot be used with variadic (&) args.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/definline"} {:added "1.0", :ns "clojure.core", :name "nfirst", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1343067247000, :author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "next", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eb5"} {:created-at 1482184108272, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "first", :ns "clojure.core"}, :_id "585855ace4b004d3a355e2c3"} {:created-at 1482184112724, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ffirst", :ns "clojure.core"}, :_id "585855b0e4b004d3a355e2c4"} {:created-at 1482184132251, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "fnext", :ns "clojure.core"}, :_id "585855c4e4b004d3a355e2c5"} {:created-at 1482184136369, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nnext", :ns "clojure.core"}, :_id "585855c8e4b004d3a355e2c6"}], :line 105, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (nfirst [])\nnil \n\nuser=> (nfirst ['(a b c) '(b a c) '(c b a) '(a c b)])\n(b c)\n\nuser=> (nfirst {:a 1, :b 2, :c 3, :d 4})\n(1)\n\nuser=> (nfirst #{1 2 3})\njava.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Integer (NO_SOURCE_FILE:0)", :created-at 1281033567000, :updated-at 1332950990000, :_id "542692cec026201cdc326d83"}], :notes nil, :arglists ["x"], :doc "Same as (next (first x))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/nfirst"} {:added "1.0", :ns "clojure.core", :name "meta", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1302719092000, :author {:login "dnaumov", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/361cb3cfa29928ddff4c49cbb5ad0cbd?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-meta", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ec0"} {:created-at 1302719254000, :author {:login "dnaumov", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/361cb3cfa29928ddff4c49cbb5ad0cbd?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "*print-meta*", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ec1"} {:created-at 1489661787389, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/10404?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "vary-meta", :ns "clojure.core"}, :_id "58ca6f5be4b01f4add58fe75"}], :line 202, :examples [{:author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(use 'clojure.pprint)\n(pprint (meta #'first))\n;;=> prints the following...\n{:ns #,\n :name first,\n :added \"1.0\",\n :file \"clojure/core.clj\",\n :static true,\n :column 1,\n :line 49,\n :arglists ([coll]),\n :doc\n \"Returns the first item in the collection. Calls seq on its\\n \n argument. If coll is nil, returns nil.\"}", :created-at 1280777073000, :updated-at 1434396446014, :_id "542692cfc026201cdc326e8f"} {:updated-at 1519676797874, :created-at 1519670280917, :author {:login "finalfantasia", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/2316604?v=4"}, :body ";; attach metadata to s.\n;; ^:private is a shorthand notation for ^{:private true} and\n;; ^String is a shorthand notation for ^{:tag java.lang.String}.\n(def ^:private ^String s \"Hello, world!\")\n\n;; inspect the metadata attached to s.\n;; note, you need to use the var #'s, instead of the symbol s, as the argument.\n(clojure.pprint/pprint (meta #'s))\n;; =>\n{:private true,\n :tag java.lang.String,\n :line 3,\n :column 1,\n :file \"/tmp/form-init5430922801479403331.clj\",\n :name s,\n :ns #object[clojure.lang.Namespace 0x13fca031 \"user\"]}\n", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/2316604?v=4", :account-source "github", :login "finalfantasia"}], :_id "5a945408e4b0316c0f44f8f0"} {:editors [{:login "randomizedthinking", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5283430?v=4"}], :body ";; attach metadata to var x\n(def ^{:version 1} x [1 2 3])\n\n;; retrieve metadata of var x: note the notation\n(meta #'x)\n;; =>\n{:version 1,\n :line 3,\n :column 1,\n :file \"...\",\n :name x,\n :ns ...}\n\n;; attach metadata to an obj\n(def y ^{:version 1} [1 2 3])\n\n(meta y) ;=> {:version 1}\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/5283430?v=4", :account-source "github", :login "randomizedthinking"}, :created-at 1670874928008, :updated-at 1670875211552, :_id "63978730e4b0b1e3652d7699"}], :notes nil, :arglists ["obj"], :doc "Returns the metadata of obj, returns nil if there is no metadata.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/meta"} {:ns "clojure.core", :name "find-protocol-impl", :file "clojure/core_deftype.clj", :type "function", :column 1, :see-alsos nil, :line 535, :examples nil, :notes nil, :arglists ["protocol x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/find-protocol-impl"} {:added "1.0", :ns "clojure.core", :name "bit-and-not", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 1320, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (bit-and-not 2r1100 2r1001) ; (and X (not Y))\n4\n;; 4 = 2r0100", :created-at 1280339735000, :updated-at 1332952979000, :_id "542692cfc026201cdc326e25"} {:body ";; here is the truth table for AND-NOT (which is not the same as NAND) \n(Integer/toBinaryString (bit-and-not 2r1100 2r1010) )\n;;=> \"100\"\n;; or 2r0100\n\n;; NAND would be...\n(Integer/toBinaryString (bit-not (bit-and 2r1100 2r1010)) )\n;;=> \"11111111111111111111111111110111\"\n;; which is clearly not the same\n\n;; this operation is material non-implication\n(= (bit-and-not 2r1100 2r1010) (bit-and 2r1100 (bit-not 2r1010)) )\n;;=> true\n", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1414515398672, :updated-at 1414515782150, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :_id "544fcac6e4b03d20a1024296"} {:updated-at 1666990058605, :created-at 1666990058605, :author {:login "bhlieberman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/60364696?v=4"}, :body ";;flip the bits of a seq\n(map (fn [n] (bit-and-not 0xff n)) (range 1 10)) ; ~n & 0xff\n;;=> (254 253 252 251 250 249 248 247 246)\n", :_id "635c3feae4b0b1e3652d767d"}], :notes nil, :arglists ["x y" "x y & more"], :doc "Bitwise and with complement", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bit-and-not"} {:added "1.5", :ns "clojure.core", :name "*default-data-reader-fn*", :file "clojure/core.clj", :type "var", :column 1, :see-alsos [{:created-at 1529611952524, :author {:login "puredanger", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/171129?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "*data-readers*", :ns "clojure.core"}, :_id "5b2c06b0e4b00ac801ed9e1a"} {:created-at 1529611964217, :author {:login "puredanger", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/171129?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "tagged-literal", :ns "clojure.core"}, :_id "5b2c06bce4b00ac801ed9e1b"}], :dynamic true, :line 7787, :examples [{:editors [{:login "puredanger", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/171129?v=4"}], :body ";; Clojure includes a generic tagged-literal type, able to read any\n;; tagged literal. This makes a great default-data-reader-fn.\n\n;; Clojure can't read tagged literals without a registered reader:\nuser=> #object[clojure.lang.Namespace 0x23bff419 \"user\"]\nRuntimeException No reader function for tag object clojure.lang.LispReader$CtorReader.readTagged (LispReader.java:1430)\n\n;; Set tagged-literal to be the default tagged value reader:\nuser=> (set! *default-data-reader-fn* tagged-literal)\n\n;; Try again\nuser=> #object[clojure.lang.Namespace 0x23bff419 \"user\"]\n#object [clojure.lang.Namespace 599782425 \"user\"]\n\n;; Now it works, and reads to a TaggedLiteral object, which\n;; supports ILookup on :tag and :form keys\nuser=> [(:tag *1) (:form *1)]\n[object [clojure.lang.Namespace 599782425 \"user\"]]\n", :author {:avatar-url "https://avatars0.githubusercontent.com/u/171129?v=4", :account-source "github", :login "puredanger"}, :created-at 1529611907877, :updated-at 1529636650211, :_id "5b2c0683e4b00ac801ed9e19"}], :notes nil, :arglists [], :doc "When no data reader is found for a tag and *default-data-reader-fn*\n is non-nil, it will be called with two arguments,\n the tag and the value. If *default-data-reader-fn* is nil (the\n default), an exception will be thrown for the unknown tag.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*default-data-reader-fn*"} {:added "1.0", :ns "clojure.core", :name "var?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1289214474000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "def", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dc9"} {:created-at 1289214479000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "var", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dca"} {:created-at 1362015178000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "var-get", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dcc"} {:created-at 1362015184000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "var-set", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dcd"} {:created-at 1362015190000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-local-vars", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dce"}], :line 4975, :examples [{:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [], :body "(def my-symbol)\n(var? #'my-symbol)\n=> true\n\n(var? (var my-symbol))\n=> true\n\n(var? (def my-symbol2))\n=> true", :created-at 1289214469000, :updated-at 1289214469000, :_id "542692cac026201cdc326b63"} {:author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :editors [], :body "=> *clojure-version*\n{:major 1, :minor 5, :incremental 0, :qualifier \"RC17\"}\n=> var?\n#\n=> (var?)\n;ArityException Wrong number of args (0) passed to: core$var-QMARK- clojure.lang.AFn.throwArity (AFn.java:437)\n=> (var? 1)\nfalse\n=> (var? defn)\n;CompilerException java.lang.RuntimeException: Can't take value of a macro: #'clojure.core/defn, compiling:(NO_SOURCE_PATH:1:1) \n=> (var? #'defn)\ntrue\n=> (var? #'defn 1 2 3 4)\n;ArityException Wrong number of args (5) passed to: core$var-QMARK- clojure.lang.AFn.throwArity (AFn.java:437)\n=> (var? (var defn))\ntrue\n=> (var? apply)\nfalse\n=> (var? #'apply)\ntrue\n", :created-at 1362015139000, :updated-at 1362015139000, :_id "542692d5c026201cdc3270b2"}], :notes nil, :arglists ["v"], :doc "Returns true if v is of type clojure.lang.Var", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/var_q"} {:ns "clojure.core", :name "method-sig", :file "clojure/core_proxy.clj", :type "function", :column 1, :see-alsos nil, :line 20, :examples [{:updated-at 1682607087713, :created-at 1496052873728, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body ";;;; (method-sig) turns java.lang.reflect.Method into a vector \n;;;; of the form [name (param-types) return-type]\n\n(->> String .getMethods (filter #(= (.getName %) \"indexOf\")))\n;;=> (#object[java.lang.reflect.Method 0x4a499a6c \"public int java.lang.String.indexOf(java.lang.String,int)\"]\n;; #object[java.lang.reflect.Method 0x29b045b3 \"public int java.lang.String.indexOf(int)\"]\n;; #object[java.lang.reflect.Method 0x55ce8ae4 \"public int java.lang.String.indexOf(java.lang.String)\"]\n;; #object[java.lang.reflect.Method 0x33a58323 \"public int java.lang.String.indexOf(int,int)\"])\n\n(->> String .getMethods (filter #(= (.getName %) \"indexOf\")) (map method-sig))\n;;=> ([\"indexOf\" (java.lang.String int) int]\n;; [\"indexOf\" (int) int]\n;; [\"indexOf\" (java.lang.String) int]\n;; [\"indexOf\" (int int) int])", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4", :account-source "github", :login "tomdl89"}], :_id "592bf489e4b093ada4d4d791"}], :notes nil, :arglists ["meth"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/method-sig"} {:added "1.0", :ns "clojure.core", :name "unchecked-add-int", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1423522083291, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "+", :library-url "https://github.com/clojure/clojure"}, :_id "54d93923e4b0e2ac61831d2d"} {:created-at 1423522088305, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "+'", :library-url "https://github.com/clojure/clojure"}, :_id "54d93928e4b081e022073c73"} {:created-at 1488034480881, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unchecked-subtract-int", :ns "clojure.core"}, :_id "58b19ab0e4b01f4add58fe63"}], :line 1191, :examples [{:updated-at 1488034461415, :created-at 1488034461415, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :body ";; Adding two int-range Longs works\n(unchecked-add-int 1 1)\n;;=> 2\n\n;; Adding two int-range BigInts works\n(unchecked-add-int 1N 1N)\n;;=> 2\n\n;; Doubles are truncated\n(unchecked-add-int 1 1.9)\n;;=> 2\n\n;; BigDecimals are truncated\n(unchecked-add-int 1 1.9M)\n;;=> 2\n\n;; Uncaught integer overflow\n(unchecked-add-int Integer/MAX_VALUE 1)\n;;=> -2147483648\n\n;; Uncaught integer underflow\n(unchecked-add-int Integer/MIN_VALUE -1)\n;;=> 2147483647\n\n;; Fails for Longs outside of int range\n(unchecked-add-int 2147483648 0)\n;;=> IllegalArgumentException Value out of range for int: 2147483648 clojure.lang.RT.intCast (RT.java:1205)\n\n;; Fails for BigInts outside of int range\n(unchecked-add-int 2147483648N 0)\n;;=> IllegalArgumentException Value out of range for int: 2147483648 clojure.lang.RT.intCast (RT.java:1205)\n\n;; Fails for Doubles outside of int range\n(unchecked-add-int 2147483648.0 0)\n;;=> IllegalArgumentException Value out of range for int: 2147483648 clojure.lang.RT.intCast (RT.java:1205)\n\n;; Fails for BigDecimals outside of int range\n(unchecked-add-int 2147483648.0M 0)\n;;=> IllegalArgumentException Value out of range for int: 2147483648 clojure.lang.RT.intCast (RT.java:1205)", :_id "58b19a9de4b01f4add58fe62"}], :notes nil, :arglists ["x y"], :doc "Returns the sum of x and y, both int.\n Note - uses a primitive operator subject to overflow.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-add-int"} {:ns "clojure.core", :name "unquote-splicing", :file "clojure/core.clj", :type "var", :column 1, :see-alsos [{:created-at 1319195960000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unquote", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d37"}], :line 14, :examples [{:author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=2"}, :editors [], :body "user=> (let [x `(2 3)] \n `(1 ~x))\n(1 (2 3))\n\nuser=> (let [x `(2 3)] \n `(1 ~@x)) \n(1 2 3)\n", :created-at 1305077817000, :updated-at 1305077817000, :_id "542692c8c026201cdc326a73"} {:author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :editors [], :body "user=> `(1 2 ~(list 3 4))\n\n(1 2 (3 4))\n\nuser=> `(1 2 ~@(list 3 4))\n\n(1 2 3 4)\n\n; borrowed from StackOverflow: \n; http://stackoverflow.com/questions/4571042/can-someone-explain-clojures-unquote-splice-in-simple-terms", :created-at 1319196585000, :updated-at 1319196585000, :_id "542692d5c026201cdc3270b0"} {:editors [{:login "green-coder", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4"}], :body ";; The splicing works at any location in the enclosing structure.\n`(1 ~@(list 2 3) 4 ~@(list 5 6) 7)\n=> (1 2 3 4 5 6 7)\n\n;; The enclosing structure can be a list, a vector or a set.\n`[1 ~@(list 2 3) 4 ~@(list 5 6) 7]\n=> [1 2 3 4 5 6 7]\n\n`#{1 ~@(list 2 3) 4 ~@(list 5 6) 7}\n=> #{7 1 4 6 3 2 5}\n\n;; The splicing produces a sequence from any `sequential?` value.\n`(1 ~@'(2 3) 4 ~@[5 6] 7 ~@(range 8 10))\n=> (1 2 3 4 5 6 7 8 9)\n\n`(1 ~@{2 3 4 5} 6)\n=> (1 [2 3] [4 5] 6)\n\n;; It currently does not work well inside maps.\n;; https://dev.clojure.org/jira/browse/CLJ-1425\n`{1 2 ~@[3 4]}\nSyntax error reading source at (REPL:1:15).\nMap literal must contain an even number of forms\n\n`{1 ~@[2 3] 4 ~@[5 6]}\n=> {1 2, 3 4, 5 6}\n\n;; Workaround: don't use the map literals\n`(hash-map 1 2 ~@[3 4])\n=> (clojure.core/hash-map 1 2 3 4)", :author {:avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4", :account-source "github", :login "green-coder"}, :created-at 1547668738996, :updated-at 1547671826780, :_id "5c3f8d02e4b0ca44402ef61c"}], :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unquote-splicing"} {:added "1.6", :ns "clojure.core", :name "hash-ordered-coll", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1495656275875, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "hash-unordered-coll", :ns "clojure.core"}, :_id "5925e753e4b093ada4d4d744"} {:created-at 1495656285147, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "hash", :ns "clojure.core"}, :_id "5925e75de4b093ada4d4d745"}], :line 5186, :examples [{:updated-at 1495656268428, :created-at 1495656268428, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body ";;;; Clojure's (hash-ordered-coll) produces the same hash code regardless\n;;;; of collection type when both of the following two conditions are met:\n;;;; (1) collections contain the same elements\n;;;; (2) collection elements are ordered the same when returned by .iterator()\n\n(hash-ordered-coll [1 2])\n;;=> 156247261\n(hash-ordered-coll '(1 2))\n;;=> 156247261\n(hash-ordered-coll (sorted-set 1 2))\n;;=> 156247261\n(hash-ordered-coll (doto (new java.util.ArrayList) (.add 1) (.add 2)))\n;;=> 156247261\n(hash-ordered-coll (doto (new java.util.TreeSet) (.add 1) (.add 2)))\n;;=> 156247261\n\n(hash-ordered-coll [2 1])\n;;=> -1994590503\n(hash-ordered-coll '(2 1))\n;;=> -1994590503\n(hash-ordered-coll (sorted-set-by > 2 1))\n;;=> -1994590503\n(hash-ordered-coll (doto (new java.util.ArrayList) (.add 2) (.add 1)))\n;;=> -1994590503\n(hash-ordered-coll (doto (new java.util.TreeSet >) (.add 2) (.add 1)))\n;;=> -1994590503\n\n;;;; Notice that this differs from (hash) which \n;;;; (1) doesn't rely on element order as returned by .iterator()\n;;;; (2) falls back on Java's .hashCode() for non-Clojure collections\n\n(hash [1 2])\n;;=> 156247261\n(hash '(1 2))\n;;=> 156247261\n(hash (sorted-set 1 2))\n;;=> 460223544\n(hash (sorted-set-by > 2 1))\n;;=> 460223544\n(hash (doto (new java.util.ArrayList) (.add 1) (.add 2)))\n;;=> 994\n(hash (doto (new java.util.TreeSet) (.add 1) (.add 2)))\n;;=> 3\n", :_id "5925e74ce4b093ada4d4d743"} {:updated-at 1495657079980, :created-at 1495657079980, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body ";;;;\n;;;; Only accepts implementations of java.lang.Iterable\n;;;;\n\n(hash-ordered-coll true)\n;;=> ClassCastException java.lang.Boolean cannot be cast to java.lang.Iterable\n(hash-ordered-coll 1)\n;;=> ClassCastException java.lang.Long cannot be cast to java.lang.Iterable\n(hash-ordered-coll \\c)\n;;=> ClassCastException java.lang.Character cannot be cast to java.lang.Iterable\n\n;;;;\n;;;; Being seqable is not sufficient!\n;;;;\n\n(hash-ordered-coll \"12\")\n;;=> ClassCastException java.lang.String cannot be cast to java.lang.Iterable\n(hash-ordered-coll (int-array [1 2]))\n;;=> ClassCastException [I cannot be cast to java.lang.Iterable\n(hash-ordered-coll nil)\n;;=> NullPointerException", :_id "5925ea77e4b093ada4d4d747"}], :notes nil, :arglists ["coll"], :doc "Returns the hash code, consistent with =, for an external ordered\n collection implementing Iterable.\n See http://clojure.org/data_structures#hash for full algorithms.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/hash-ordered-coll"} {:added "1.1", :ns "clojure.core", :name "future", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1332389737000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "future-cancel", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c95"} {:created-at 1336536261000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "shutdown-agents", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c96"} {:created-at 1349259124000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "promise", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c97"} {:created-at 1349558136000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "realized?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c98"} {:created-at 1291441344000, :author {:login "pauldoo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5cb916d3c8abc9f45a093209e72489fb?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "delay", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e73"} {:created-at 1291473035000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "future?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e74"} {:created-at 1300437104000, :author {:login "ninjudd", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7ced25585a7556e9b9b975c1f9e136e3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "future-call", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e75"} {:created-at 1413483298913, :author {:login "Chort409", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1062637?v=2"}, :to-var {:ns "clojure.core", :name "future-done?", :library-url "https://github.com/clojure/clojure"}, :_id "54400b22e4b05802a3cc25dc"} {:created-at 1537551889359, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "locking", :ns "clojure.core"}, :_id "5ba52e11e4b00ac801ed9ea3"}], :line 6990, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "azkesz", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/467196a4f2498080c9740a81fcbde855?r=PG&default=identicon"} {:login "azkesz", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/467196a4f2498080c9740a81fcbde855?r=PG&default=identicon"} {:login "azkesz", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/467196a4f2498080c9740a81fcbde855?r=PG&default=identicon"} {:login "yayitswei", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/179c73a6ff978b738c014abeb1ead0f9?r=PG&default=identicon"} {:login "luke", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ac463e1534de6c3a7bbe42365286cd?r=PG&default=identicon"}], :body ";; A future's calculation is started here and it runs in another thread\nuser=> (def f (future (Thread/sleep 10000) (println \"done\") 100))\n#'user/f\n;;if you wait 10 seconds before dereferencing it you'll see \"done\"\n\n;; When you dereference it you will block until the result is available.\nuser=> @f\ndone\n100\n\n;; Dereferencing again will return the already calculated value.\n=> @f\n100\n", :created-at 1281077331000, :updated-at 1346904770000, :_id "542692c9c026201cdc326a74"} {:author {:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "yayitswei", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/179c73a6ff978b738c014abeb1ead0f9?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/2139?v=3", :account-source "github", :login "jamieorc"} {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}], :body ";; save the example in a script (e.g. test-future.clj) then run it in the console\n;;\n;; > clojure test-future.clj\n\n(println \"[Main] calculate the answer to life the universe and everything\")\n\n;; Used Thread/sleep to simulate long running process\n(def what-is-the-answer-to-life\n (future \n (println \"[Future] started computation\")\n (Thread/sleep 3000) ;; running for 3 seconds\n (println \"[Future] completed computation\")\n 42))\n \n(println \"[Main] created future\")\n\n(Thread/sleep 1000)\n(println \"[Main] do other things while waiting for the answer\")\n(println \"[Main] get the answer\")\n(println \"[Main] the result\" @what-is-the-answer-to-life)\n(shutdown-agents)\n\n\n;; You may get something like this\n;;\n;; [Main] calculate the answer to life, the universe and everything\n;; [Future] started computation\n;; [Main] created future\n;; [Main] do other things while waiting for the answer\n;; [Main] get the answer\n;; [Future] completed computation\n;; [Main] the result 42\n\n\n;; Note: If you leave out the call to (shutdown-agents), the program\n;; will on most (all?) OS/JVM combinations \"hang\" for 1 minute before\n;; the process exits. It is waiting for a thread created by the\n;; future call to be shut down. shutdown-agents will shut them down\n;; immediately, or (System/exit ) will exit immediately\n;; without waiting for them to shut down.\n\n;; This wait occurs even if you use futures indirectly through some other Clojure\n;; functions that use them internally, such as pmap or clojure.java.shell/sh\n\n;; http://dev.clojure.org/jira/browse/CLJ-124 is a ticket opened against Clojure,\n;; as this 1-minute wait is not considered desirable behavior.", :created-at 1312375403000, :updated-at 1518117159450, :_id "542692c9c026201cdc326a7b"} {:editors [{:avatar-url "https://avatars.githubusercontent.com/u/367789?v=3", :account-source "github", :login "mattvvhat"} {:login "bkovitz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3"}], :updated-at 1462724896381, :created-at 1428550055119, :author {:avatar-url "https://avatars.githubusercontent.com/u/367789?v=3", :account-source "github", :login "mattvvhat"}, :body ";; Futures will not raise their exceptions...\n=> (def my-future (future (/ 1 0))\n\n;; ...until dereferenced!\n=> @my-future\nArithmeticException Divide by zero clojure.lang.Numbers.divide", :_id "5525f1a7e4b033f34014b768"} {:editors [{:login "siddharthjain-in", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6537820?v=4"}], :body ";; Given two URLs, create two futures to slurp their HTML, and return \n;; the page that returns first.\n;; This works because promises can only be delivered once.\n(let [p (promise)]\n (let [angieslist \"https://angieslist.com\" \n homeadvisor \"https://homeadvisor.com\"]\n (doseq [url [angieslist homeadvisor]]\n (future (let [response (slurp url)]\n (deliver p response)))))\n @p)\n", :author {:avatar-url "https://avatars1.githubusercontent.com/u/1291508?v=4", :account-source "github", :login "tomgeorge"}, :created-at 1590118285193, :updated-at 1627314798087, :_id "5ec7478de4b087629b5a190e"} {:editors [{:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4"}], :body ";; You may want to do some cleanup whenever you cancel your `future`\n;; InterruptedException is the catch!\n\n;; lets say we want to feed our doge, but only a limited time...\n(defn connect! [conn] (println (reset! conn \"[doge] very yum\")))\n(defn response [conn] (println (reset! conn \"[doge] so full\")))\n(defn clean [conn] (println (reset! conn \"[doge] so hungry\")))\n\n(let [feed-time (rand-int 2000)\n connection (atom \"[doge] such ready\")\n doge-ops (future\n (try\n (println @connection)\n (connect! connection)\n (Thread/sleep 1000)\n (response connection)\n (catch InterruptedException ie\n (clean connection))\n (finally (println \"[doge] wow\"))))]\n (printf \"[Main] granting many feeding time: %dms\\n\" feed-time)\n (if (= :too-late (deref doge-ops feed-time :too-late))\n (do (println \"[Main] stop!\")\n (future-cancel doge-ops))\n @doge-ops))\n\n;; if he's lucky:\n[Main] granting many feeding time: 1582ms\n[doge] such ready\n[doge] very yum\n[doge] so full\n[doge] wow\n=> nil\n\n;; if he's unlucky:\n[Main] granting many feeding time: 569ms\n[doge] such ready\n[doge] very yum\n[Main] stop!\n=> true\n[doge] so hungry\n[doge] wow\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4", :account-source "github", :login "loeschzwerg"}, :created-at 1651240015047, :updated-at 1651241054178, :_id "626bec4fe4b0b1e3652d75d8"}], :macro true, :notes nil, :arglists ["& body"], :doc "Takes a body of expressions and yields a future object that will\n invoke the body in another thread, and will cache the result and\n return it on all subsequent calls to deref/@. If the computation has\n not yet finished, calls to deref/@ will block, unless the variant of\n deref with timeout is used. See also - realized?.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/future"} {:added "1.0", :ns "clojure.core", :name "reset-meta!", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1458508963890, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "meta", :ns "clojure.core"}, :_id "56ef14a3e4b09295d75dbf31"} {:created-at 1458508972022, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "vary-meta", :ns "clojure.core"}, :_id "56ef14ace4b09295d75dbf32"} {:created-at 1458508987478, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "alter-meta!", :ns "clojure.core"}, :_id "56ef14bbe4b09295d75dbf33"} {:created-at 1458509000330, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "with-meta", :ns "clojure.core"}, :_id "56ef14c8e4b09295d75dbf34"}], :line 2416, :examples [{:updated-at 1458508861290, :created-at 1458508861290, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :body "(def ^{:key \"val\"} my-var \"\")\n;;=> #'user/my-var\n\n(meta #'my-var)\n;;=> {:key \"val\", :ns #, :name my-var, :file \"NO_SOURCE_PATH\", :column 1, :line 1}\n\n(reset-meta! #'my-var {:new-key \"new-val\"}) ; replace all metadata\n;;=> {:new-key \"new-val\"}\n\n(meta #'my-var)\n;;=> {:new-key \"new-val\"}\n\n", :_id "56ef143de4b0b41f39d96ceb"}], :notes nil, :arglists ["iref metadata-map"], :doc "Atomically resets the metadata for a namespace/var/ref/agent/atom", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/reset-meta!"} {:added "1.0", :ns "clojure.core", :name "cycle", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1360759662000, :author {:login "rahulpilani", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3c3585fc1c6bf074ed5f268c9ebcb2f?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "lazy-seq", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ea1"} {:created-at 1434128252248, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:ns "clojure.core", :name "map", :library-url "https://github.com/clojure/clojure"}, :_id "557b0f7ce4b03e2132e7d18d"} {:created-at 1553543700422, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "repeat", :ns "clojure.core"}, :_id "5c993214e4b0ca44402ef6c9"}], :line 2979, :examples [{:author {:login "nipra", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/142529?v=3"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"}], :body "user=> (take 5 (cycle [\"a\" \"b\"]))\n(\"a\" \"b\" \"a\" \"b\" \"a\")\n\nuser=> (take 10 (cycle (range 0 3)))\n(0 1 2 0 1 2 0 1 2 0)\n\n", :created-at 1279160241000, :updated-at 1305843374000, :_id "542692ccc026201cdc326c30"} {:body ";; Typically map works through its set of collections\n;; until any one of the collections is consumed.\n;; 'cycle' can be used to repeat the shorter collections\n;; until the longest collection is consumed.\n(mapv #(vector %2 %1) (cycle [1 2 3 4]) [:a :b :c :d :e :f :g :h :i :j :k :l])\n;;=> [[:a 1] [:b 2] [:c 3] [:d 4] [:e 1] [:f 2] [:g 3] [:h 4] [:i 1] [:j 2] [:k 3] [:l 4]]", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1434128630375, :updated-at 1434128842939, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :_id "557b10f6e4b01ad59b65f4f2"}], :notes nil, :arglists ["coll"], :doc "Returns a lazy (infinite!) sequence of repetitions of the items in coll.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/cycle"} {:added "1.0", :ns "clojure.core", :name "fn", :special-form true, :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1360339005000, :author {:login "ViljamiPeltola", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1535c08820796d57a212a46a6bdd4cca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defn", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c77"}], :line 4513, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"} {:login "jumblerg", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f9e06cdf33ea6f2958a8b6430d9fe22?r=PG&default=identicon"} {:login "jumblerg", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f9e06cdf33ea6f2958a8b6430d9fe22?r=PG&default=identicon"}], :body ";; simple anonymous function passed to (map )\nuser=> (map (fn [x] (* x x)) (range 1 10))\n(1 4 9 16 25 36 49 64 81) \n\n;; anonymous function with a name. not so anonymous now is it?\n;; this is useful in stack traces\n(fn add [a b] (+ a b))\n\n;; anonymous function with two params, the second is destructured\nuser=> (reduce (fn [m [k v]] (assoc m v k)) {} {:b 2 :a 1 :c 3})\n{2 :b, 1 :a, 3 :c} \n\n;; define and instantly call an anonymous function\nuser=> ((fn [a b c] (+ a b c)) 2 4 6)\n12\n\n;; define and instantly call an anonymous variadic function \n;; \"nums\" is a list here\nuser=> ((fn [& nums] (/ (apply + nums) (count nums))) 1 2 3 4)\n5/2 \n\n;; define and instantly call an anonymous mixed function\n;; \"nums\" is a list, while \"int\" is a number\nuser=> ((fn [int & nums] (+ int (/ (apply + nums) (count nums)))) 10 1 2 3 4)\n25/2 \n\n;; define and instantly call an anonymous overloaded function \n;; even though it is quite pointless\nuser=> ((fn ([a] (inc a)) ([a b] (+ a b))) 3)\n4\n\n", :created-at 1280346731000, :updated-at 1410072276000, :_id "542692c7c026201cdc326977"} {:author {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; the shortcut form for (fn ) is #( )\n;; where parameters are referred by their index with the prefix %\n\n;; the equivalent of \nuser=> ((fn [a b c] (+ a b c)) 2 4 6)\n12\n\n;; is\nuser=> (#(+ %1 %2 %3) 2 4 6)\n12\n", :created-at 1284093085000, :updated-at 1285487263000, :_id "542692c7c026201cdc326983"} {:editors [{:login "enc7", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/12020265?v=3"}], :body ";; shortcut form #() cannot be used for maps etc.\n\nuser=> ((fn [] {:a 1}))\n{:a 1}\n\nuser=> (#({:a 1}))\nArityException Wrong number of args (0) passed to: PersistentArrayMap\n\nuser=> (#([1]))\nArityException Wrong number of args (0) passed to: PersistentVector\n\n;; explanation for the\tfirst error:\n;; #(f) is a shortcut for (fn [] (f))\n;; that means (#({:a 1})) is shortcut for ((fn [] ({:a 1})))\n;; which leads to the error above because you cannot apply a map to an empty\n;; argument list.\n\n;; i.e. you can only use #() shortcut if the fn body is a list.\n;; As ((fn [] {:a 1})) has the same result \n;; as ((fn [] (identity {:a 1}))), you can write:\n\nuser=> (#(identity {:a 1}))\n{:a 1}", :author {:avatar-url "https://avatars.githubusercontent.com/u/5733420?v=3", :account-source "github", :login "trimtab613"}, :created-at 1442862274788, :updated-at 1448575959557, :_id "560054c2e4b08e404b6c1c80"} {:updated-at 1515615145069, :created-at 1515615145069, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;map and anonymous function\n;;apply a function to a collection using an anonymous function\n\n(defn byten\n [nums]\n (map #(* 10 %) nums))\n\n(byten [1 2 3 4 5])\n;;(10 20 30 40 50)", :_id "5a5673a9e4b0a08026c48ceb"} {:updated-at 1565772877274, :created-at 1565772877274, :author {:login "terjedahl", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/11754710?v=4"}, :body ";; shortcut form #() expands to an args-list-count as per \n;; the highest N in %N references within it, \n;; irrespective of whether a lower %N is referenced or not:\n\n(macroexpand-1 '#(prn))\n;;=> (fn* [] (prn))\n\n(macroexpand-1 '#(prn %))\n;;=> (fn* [p1__13122#] (prn p1__13122#))\n\n(macroexpand-1 '#(prn %1))\n;;=> (fn* [p1__13127#] (prn p1__13127#))\n\n(macroexpand-1 '#(prn %2))\n;;=> (fn* [p1__13133# p2__13132#] (prn p2__13132#))\n\n\n;; This will not work because the shortcut expands to a 0-arg fn:\n(let [a (atom :val0)] \n (add-watch a :key #(prn 'CHANGED))\n (reset! a :val1))\n;; Execution error (ArityException) at user/eval13174 (form-init5982058823921663207.clj:3).\n;; Wrong number of args (4) passed to: user/eval13174/fn--13175\n\n;; But this will work because simply referring to %4 expands it to a 4-arg fn:\n(let [a (atom :val0)] \n (add-watch a :key #(do %4 (prn 'CHANGED)))\n (reset! a :val1))\n;;CHANGED\n;;=> :val1 \n\n;; See the 4th bullet-point under \"dispatch macro\":\n;; https://clojure.org/reference/reader#_dispatch", :_id "5d53cc4de4b0ca44402ef7a3"}], :macro true, :notes [{:updated-at 1396626727000, :body "The signature is wrong. It should be (quoting from [clojure.org][1])\r\n\r\n`(fn name? [params* ] exprs*)`\r\n\r\n`(fn name? ([params* ] exprs*)+)`\r\n\r\n\r\n [1]: http://clojure.org/special_forms#fn", :created-at 1396626504000, :author {:login "Thumbnail", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/db68e51797a2382e185b42ce6534b7a4?r=PG&default=identicon"}, :_id "542692edf6e94c6970522023"} {:author {:login "terjedahl", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/11754710?v=3"}, :updated-at 1461052793332, :created-at 1461052793332, :body "What is the purpose of `name?` ?", :_id "5715e579e4b0fc95a97eab4d"} {:author {:login "vvvvalvalval", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5859120?v=3"}, :updated-at 1463756441418, :created-at 1463756441418, :body "@terjedahl `name?` allows for self-recursion, as well as generating more human-friendly class names; it can also make the code clearer.", :_id "573f2699e4b0a1a06bdee494"} {:author {:login "battlmonstr", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/11477595?v=3"}, :updated-at 1471784633567, :created-at 1471784633567, :body "This leaves more questions. What is the performance cost? Why (fn name...) is repeated twice? What is a \"binding-form\"?\n\nThe syntax looks good compared to [lambda function](http://dobegin.com/lambda-functions-everywhere/) syntax in other programming languages.", :_id "57b9a6b9e4b0709b524f04d2"} {:author {:login "bfabry", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/29587?v=3"}, :updated-at 1475793669553, :created-at 1475793669553, :body "`fn` also supports the prepost map, the same as `defn`\n```\nboot.user=> (def adder (fn [x] {:post [(pos? %)]} (inc x)))\n#'boot.user/adder\nboot.user=> (adder -2)\n\njava.lang.AssertionError: Assert failed: (pos? %)\n```", :_id "57f6d305e4b0709b524f052a"} {:body "A function can be defined taking specified keyword arguments:\n\n```clojure\n(defn foo [req-1 req-2 & {:keys [key-1 key-2]}\n (list req-1 req-2 key-1 key-2))\n\n(foo a b)\n(foo a b :key-1 100)\n(foo a b :key-2 200)\n(foo a b :key-2 100 :key-1 200)\n```", :created-at 1602578421430, :updated-at 1602578490558, :author {:avatar-url "https://avatars1.githubusercontent.com/u/6414129?v=4", :account-source "github", :login "jimka2001"}, :_id "5f8567f5e4b0b1e3652d73d9"}], :arglists ["& sigs"], :doc "params => positional-params* , or positional-params* & next-param\n positional-param => binding-form\n next-param => binding-form\n name => symbol\n\n Defines a function", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/fn", :forms ["(fn name? [params*] exprs*)" "(fn name? ([params*] exprs*) +)"]} {:added "1.0", :ns "clojure.core", :name "seque", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 5397, :examples [{:author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (let [start (System/nanoTime)\n q (seque\n (iterate\n #(do (Thread/sleep 400) (inc %))\n 0))]\n (println \"sleep five seconds...\")\n (Thread/sleep 5000)\n (doseq [i (take 20 q)]\n (println (int (/ (- (System/nanoTime) start) 1e7))\n \":\" i)))\n\n\n;; The iterate form returns a lazy seq that delays nearly a half-second \n;; before returning each subsequent item. Here seque starts a thread \n;; generating the lazy seq.\n\n;; The body of the let allows the seque thread to get ahead by five seconds\n;; before it begins consuming the seq using doseq. The doseq prints a \n;; timestamp and the value from the seq when it becomes available. The\n;; first 11 or so are available almost instantly, until the consuming \n;; doseq catches up with the producing iterate, at which point the consumer\n;; blocks for 400ms before each item can be printed.\n\n;;sleep five seconds...\n500 : 0\n500 : 1\n500 : 2\n500 : 3\n500 : 4\n500 : 5\n500 : 6\n500 : 7\n500 : 8\n500 : 9\n500 : 10\n500 : 11\n520 : 12\n560 : 13\n600 : 14\n640 : 15\n680 : 16\n720 : 17\n760 : 18\n800 : 19\n\n", :created-at 1283038869000, :updated-at 1285494350000, :_id "542692c9c026201cdc326ad1"} {:updated-at 1519066526582, :created-at 1519066439016, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; A relatively fast producer (a file filter) and a variable speed consumer\n;; (because of pagination) are piped together. Use seque to enable search ahead \n;; of \"n\" items assuming consumer will soon paginate.\n\n(defn search-files [q root n]\n (->> (java.io.File. root)\n file-seq\n (map (memfn getPath))\n (filter #(re-find q %))\n (seque n)))\n\n(defn paginate [n]\n (let [root (System/getProperty \"user.home\")\n search (search-files #\"\\.clj$\" root 1000)]\n (loop [results (partition n search)]\n (println (with-out-str (clojure.pprint/write (first results))))\n (println \"more?\")\n (when (= \"y\" (read-line))\n (recur (rest results))))))\n\n(paginate 3)\n;; (\"/Users/reborg/.atom/fixtures/bad.clj\"\n;; \"/Users/reborg/.atom/fixtures/empty.clj\"\n;; \"/Users/reborg/.atom/fixtures/good.clj\")\n;; more?\n\n;; Note: seque is now producing 997 items ahead.", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5a8b1d47e4b0316c0f44f8cd"}], :notes nil, :arglists ["s" "n-or-q s"], :doc "Creates a queued seq on another (presumably lazy) seq s. The queued\n seq will produce a concrete seq in the background, and can get up to\n n items ahead of the consumer. n-or-q can be an integer n buffer\n size, or an instance of java.util.concurrent BlockingQueue. Note\n that reading from a seque can block if the reader gets ahead of the\n producer.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/seque"} {:added "1.0", :ns "clojure.core", :name "empty?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1350338539000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "seq", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ba1"} {:created-at 1435246118250, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:ns "clojure.core", :name "empty", :library-url "https://github.com/clojure/clojure"}, :_id "558c1e26e4b0fad27b85f926"} {:created-at 1448373938039, :author {:login "BernhardBln", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4759839?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "not-empty", :ns "clojure.core"}, :_id "56546eb2e4b0538444398279"}], :line 6206, :examples [{:updated-at 1441306150425, :created-at 1279073789000, :body "user=> (empty? ())\ntrue\nuser=> (empty? '(1))\nfalse", :editors [{:login "Ortuna", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/221008?v=3"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/147981?v=3", :account-source "github", :login "dpritchett"}, :_id "542692cac026201cdc326b85"} {:updated-at 1350271972000, :created-at 1279386965000, :body "user=> (every? empty? [\"\" [] () '() {} #{} nil])\ntrue\n\n;example of recommended idiom for testing if not empty\nuser=> (every? seq [\"1\" [1] '(1) {:1 1} #{1}])\ntrue", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon", :account-source "clojuredocs", :login "dansalmo"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692cac026201cdc326b86"} {:updated-at 1441306161007, :created-at 1280205236000, :body "user=> (drop-while empty? [\"\" [] \"foobar\"])\n(\"foobar\")", :editors [{:login "Ortuna", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/221008?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon", :account-source "clojuredocs", :login "Jacolyte"}, :_id "542692cac026201cdc326b89"} {:author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :editors [], :body "user=> (empty? nil)\ntrue", :created-at 1401128995000, :updated-at 1401128995000, :_id "542692d2c026201cdc326f9c"} {:editors [{:login "nodename", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/48810?v=4"}], :body ";; A collection with a \"nothing\" in it is not empty.\n(= true\n (every? false? [(empty? [nil])\n (empty? #{nil})\n (empty? '(nil))]))\n\n;; But a collection of nothing is empty.\n(= true\n (every? true? [(empty? [])\n (empty? #{})\n (empty? '())]))", :author {:avatar-url "https://avatars.githubusercontent.com/u/7597818?v=3", :account-source "github", :login "Jjunior130"}, :created-at 1482301932387, :updated-at 1664300394921, :_id "585a21ece4b004d3a355e2d4"}], :notes [{:updated-at 1402523411000, :body "Some explanation of why (seq x) is preferable over (not (empty? x)) would be good. Because it's far less readable. When I come across (not (empty? x)) in some code, I immediately understand the author's intention. Not so much with (seq x).", :created-at 1402523411000, :author {:login "cap10morgan", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ccd26ba29b49316b38a46f0aa0e96893?r=PG&default=identicon"}, :_id "542692edf6e94c6970522029"} {:updated-at 1405724559000, :body "I think this is an efficiency thing. If you expand the source you can see that empty? is equivalent to (not (seq coll)) so (not (empty? coll)) would macroexpand to (not (not (seq coll)) ", :created-at 1405724559000, :author {:login "phreed", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a0c739cf289be18be932dc3022e6fd3?r=PG&default=identicon"}, :_id "542692edf6e94c697052202d"} {:body "Avoiding `(not (empty? s))` because it macroexpands into `(not (not ...))`, on the grounds of efficiency, is ridiculous. \n\nI'm a fan of:\n\n```clojure\n(when (not-empty s)\n ...)\n```", :created-at 1421094984999, :updated-at 1421094984999, :author {:login "moea", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1453611?v=3"}, :_id "54b43048e4b081e022073c01"} {:author {:login "cmal", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1773318?v=3"}, :updated-at 1478343485388, :created-at 1478343485388, :body "If I just want to return false when empty, true when not empty, then what can I use if I am going to avoid (not (empty? ...))?", :_id "581dbb3de4b024b73ca35a22"} {:author {:login "yogsototh", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/93899?v=3"}, :updated-at 1481783695983, :created-at 1481783695983, :body "Just note `(not (empty? x))` is not perfectly equivalent to `seq`:\n\n~~~\nuser=> (seq '(1 2))\n(1 2)\nuser=> (not (empty? '(1 2)))\ntrue\n~~~", :_id "5852398fe4b004d3a355e2ba"} {:body "```\nuser> (let [r (and (not (empty? [])))] r)\n;; => false\nuser> (let [r (and (seq []))] r)\n;; => nil\n```\n", :created-at 1605311878358, :updated-at 1605311895281, :author {:avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4", :account-source "github", :login "MicahElliott"}, :_id "5faf1d86e4b0b1e3652d7405"} {:author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}, :updated-at 1685380825029, :created-at 1685380764695, :body "`(seq x)` is considered idiomatic, so in theory it should be understood by experienced Clojurians. `(not (empty? x))` might be better when you expect your code to be read by those who don't fit that description. (However, there are a number of Clojure idioms that could be confusing to those without much experience; avoiding them all might not be desirable.)", :_id "6474de9ce4b08cf8563f4bc3"}], :arglists ["coll"], :doc "Returns true if coll has no items - same as (not (seq coll)).\n Please use the idiom (seq x) rather than (not (empty? x))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/empty_q"} {:added "1.0", :ns "clojure.core", :name "short", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "int", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917689000, :_id "542692ebf6e94c6970521f21"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "byte", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917692000, :_id "542692ebf6e94c6970521f22"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "shorts", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917699000, :_id "542692ebf6e94c6970521f23"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "short-array", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917703000, :_id "542692ebf6e94c6970521f24"} {:created-at 1496261330759, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unchecked-short", :ns "clojure.core"}, :_id "592f22d2e4b06e730307db1a"}], :line 3498, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (class (short 1))\njava.lang.Short", :created-at 1281948540000, :updated-at 1332952892000, :_id "542692c7c026201cdc3269a1"} {:editors [{:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}], :body "(short 123)\n;;=> 123\n\n(short 1.23)\n;;=> 1\n\n(short 1.2345678901234567890)\n;;=> 1\n\n(short -1.23)\n;;=> -1\n\n;; Casting a string does not work\n(short \"123\")\n;;=> Execution error (ClassCastException) at user/eval169 (REPL:1).\n;;java.lang.String cannot be cast to java.lang.Number\n\n;; Use Java interop instead\n(Short/parseShort \"123\")\n;;=> 123\n\n;; Content originally posted by u/didibus on https://clojuredocs.org/clojure.core/num", :author {:avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4", :account-source "github", :login "wdhowe"}, :created-at 1596573268703, :updated-at 1596590353567, :_id "5f29c654e4b0b1e3652d735f"}], :notes nil, :arglists ["x"], :doc "Coerce to short", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/short"} {:added "1.2", :ns "clojure.core", :name "definterface", :file "clojure/core_deftype.clj", :type "macro", :column 1, :see-alsos [{:created-at 1432923318577, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :to-var {:ns "clojure.core", :name "defprotocol", :library-url "https://github.com/clojure/clojure"}, :_id "5568acb6e4b03e2132e7d17b"} {:created-at 1432923344729, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :to-var {:ns "clojure.core", :name "gen-interface", :library-url "https://github.com/clojure/clojure"}, :_id "5568acd0e4b01ad59b65f4e9"} {:created-at 1432923416186, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :to-var {:ns "clojure.core", :name "defrecord", :library-url "https://github.com/clojure/clojure"}, :_id "5568ad18e4b01ad59b65f4ea"} {:created-at 1432923425325, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :to-var {:ns "clojure.core", :name "deftype", :library-url "https://github.com/clojure/clojure"}, :_id "5568ad21e4b03e2132e7d17d"}], :line 20, :examples [{:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; Part of a definterface from a Clojure program for the n-body problem\n;; at the Computer Language Benchmarks Game web site.\n;; For the rest of the program using it, see:\n;; http://github.com/jafingerhut/clojure-benchmarks/blob/master/nbody/nbody.clj-14.clj\n\n;; Currently Clojure does not permit type hints of arrays, e.g. ^ints as\n;; argument types or return types in a definterface. This may be enhanced\n;; later.\n\n(definterface IBody\n (^String name []) ;; return type String, no arguments\n (^double mass []) ;; return type double\n (^double x [])\n (clone [] \"returns copy of self\") ; return type defaults to ^Object\n ;; 3 arguments of type double. A deftype that implements this interface\n ;; must implement the method p! The definterface must use:\n ;; _BANG_ for ! in Clojure method name\n ;; _PLUS_ for +\n ;; _ for -\n (p_BANG_ [^double x ^double y ^double z] \"set pos.\")\n ;; After name demangling, this must be implemented by Clojure method named v+!\n (v_PLUS__BANG_ [^double vx ^double vy ^double vz] \"add to velocity\"))\n", :created-at 1298555484000, :updated-at 1298556086000, :_id "542692cdc026201cdc326d3c"} {:body ";; Note these differences between defprotocol and definterface:\n\n;; defprotocol requires that methods specify a first parameter, which \n;; will be the record object, while definterface requires that this\n;; parameter be left out:\n(definterface I (fooey []))\n;=> user.I\n(defprotocol P (fooey []))\n;=> IllegalArgumentException Definition of function fooey in protocol P must take at least one arg. clojure.core/emit-protocol/fn--5964 (core_deftype.clj:612)\n(defprotocol P (fooey [this]))\n;=> P\n\n;; However, defrecord requires that a parameter for the record object\n;; be used, even with interfaces. (A similar point applies to deftype.)\n(defrecord Irec [stuff] I (fooey [] \"foo\"))\n;=> CompilerException java.lang.IllegalArgumentException: Must supply at least one argument for 'this' in: fooey, compiling:(NO_SOURCE_PATH:1:1) \n(defrecord Irec [stuff] I (fooey [this] \"foo\"))\n;=> user.Irec\n(defrecord Prec [stuff] P (fooey [this] \"foo\"))\n;=> user.Prec\n\n;; Using an interface, only the dot form of the method is available with \n;; defrecord, while the protocol also allows use of normal Clojure function\n;; syntax. (Similar points apply to deftype.)\n(.fooey (Irec. 42))\n;=> \"foo\"\n(fooey (Irec. 42))\n;=> IllegalArgumentException No implementation of method: :fooey of protocol: #'user/P found for class: user.Irec clojure.core/-cache-protocol-fn (core_deftype.clj:544)\n(.fooey (Prec. 42))\n;=> \"foo\"\n(fooey (Prec. 42))\n;=> \"foo\"\n", :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :created-at 1432922847490, :updated-at 1432923131996, :editors [{:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}], :_id "5568aadfe4b03e2132e7d175"}], :macro true, :notes nil, :arglists ["name & sigs"], :doc "Creates a new Java interface with the given name and method sigs.\n The method return types and parameter types may be specified with type hints,\n defaulting to Object if omitted.\n\n (definterface MyInterface\n (^int method1 [x])\n (^Bar method2 [^Baz b ^Quux q]))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/definterface"} {:added "1.10", :ns "clojure.core", :name "add-tap", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1590688364048, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "tap>", :ns "clojure.core"}, :_id "5ecffa6ce4b087629b5a1919"} {:created-at 1590688390865, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "remove-tap", :ns "clojure.core"}, :_id "5ecffa86e4b087629b5a191c"} {:created-at 1661551771193, :author {:login "djblue", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1986211?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "datafy", :ns "clojure.datafy"}, :_id "6309449be4b0b1e3652d765a"}], :line 7868, :examples [{:updated-at 1660914021711, :created-at 1660914021711, :author {:login "earthfail", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/21296448?v=4"}, :body ";; log to a file\n(defn log [x] \n (spit \"event.log\" (str x \\newline) :append true))\n\n;; add log function to tap\n(add-tap log) ;;_=> returns nil\n\n(add-tap println)\n\n\n(tap> \"hello\") \n;; prints hello\n;; returns true if successful\n;; event.log:\n;; hello\\n\n(tap> \"clojure\")\n;; prints clojure\n;; returns true\n;; event.log:\n;; hello\\n\n;; clojure\\n\n\n;; the tap set is a hash-set so every adding the same function twice has no effect \n(add-tap println) \n(tap> \"<3\")\n;; prints <3\n;; returns true\n;; event.log:\n;; hello\\n\n;; clojure\\n\n;; <3\\n", :_id "62ff8965e4b0b1e3652d763e"} {:editors [{:login "djblue", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1986211?v=4"}], :body ";; Your tap target function can do interesting things when it receives a value\n;; before printing it\n(require '[clojure.datafy :refer [datafy]])\n(add-tap (comp prn datafy))\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/1986211?v=4", :account-source "github", :login "djblue"}, :created-at 1661551901572, :updated-at 1662581217249, :_id "6309451de4b0b1e3652d765b"}], :notes nil, :arglists ["f"], :doc "adds f, a fn of one argument, to the tap set. This function will be called with anything sent via tap>.\n This function may (briefly) block (e.g. for streams), and will never impede calls to tap>,\n but blocking indefinitely may cause tap values to be dropped.\n Remember f in order to remove-tap", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/add-tap"} {:added "1.4", :ns "clojure.core", :name "filterv", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1413317009497, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "filter", :library-url "https://github.com/clojure/clojure"}, :_id "543d8191e4b02688d208b1b7"} {:created-at 1534449404739, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "mapv", :ns "clojure.core"}, :_id "5b75d6fce4b00ac801ed9e61"}], :line 6921, :examples [{:editors [{:login "dijonkitchen", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4"}], :updated-at 1550019407140, :created-at 1413316994942, :author {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=2", :account-source "github", :login "phreed"}, :body ";; very similar to filter but returns a vector\n(filterv even? (range 10))\n;;=> [0 2 4 6 8]\n\n(filterv (fn [x]\n (= (count x) 1))\n [\"a\" \"aa\" \"b\" \"n\" \"f\" \"lisp\" \"clojure\" \"q\" \"\"])\n;;=> [\"a\" \"b\" \"n\" \"f\" \"q\"]\n\n(filterv #(= (count %) 1)\n [\"a\" \"aa\" \"b\" \"n\" \"f\" \"lisp\" \"clojure\" \"q\" \"\"])\n;;=> [\"a\" \"b\" \"n\" \"f\" \"q\"]\n", :_id "543d8182e4b0a3cf052fe477"}], :notes nil, :arglists ["pred coll"], :doc "Returns a vector of the items in coll for which\n (pred item) returns logical true. pred must be free of side-effects.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/filterv"} {:added "1.0", :ns "clojure.core", :name "hash", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1369891154000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "get", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aa5"} {:created-at 1495647939893, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "hash-ordered-coll", :ns "clojure.core"}, :_id "5925c6c3e4b093ada4d4d737"} {:created-at 1495647979480, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "hash-unordered-coll", :ns "clojure.core"}, :_id "5925c6ebe4b093ada4d4d738"}], :line 5165, :examples [{:updated-at 1456675282601, :created-at 1280319931000, :body "user=> (hash \"a\")\n1455541201\nuser=> (.hashCode \"a\") ; notice that this is different than (hash \"a\")\n97\nuser=> (hash 1)\n1392991556\nuser=> (.hashCode 1) ; notice that this is different than (hash 1)\n1\nuser=> (hash nil)\n0\nuser=> (hash [1 2 3])\n30817\nuser=> (hash [1 2 3 4])\n955331", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon", :account-source "clojuredocs", :login "gstamp"}, :_id "542692cbc026201cdc326bc4"} {:updated-at 1548542144072, :created-at 1548542144072, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :body ";; In most cases, hash is _consistent_ with =, meaning that for two values x, y,\n;; if (= x y), then (= (hash x) (hash y)). This is a property of hash that\n;; is relied upon for hash-based lookup of keys in maps and\n;; elements in sets to work correctly.\n\n;; There are some pairs of Java objects x, y where even though (= x y) is true,\n;; (= (hash x) (hash y)) is _not_ true.\n\n;; Search for the word \"consistent\" in this article for some categories of such\n;; objects: https://clojure.org/guides/equality\n\n;; In particular, the section titled \"Equality and hash\":\n;; https://clojure.org/guides/equality#equality_and_hash", :_id "5c4ce0c0e4b0ca44402ef640"} {:editors [{:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4"}], :body ";; Equality is measured by the content\n;; Hashes of lists AND vectors are equal by content\n=> (= (hash '(1 2 3)) (hash [1 2 3]))\ntrue\n\n;; Also works with clojure-\"Objects\" like LazySeq\n=> (= (hash [1 2 3]) (hash (map identity [1 2 3])))\ntrue\n\n;; but not with sets\n=> (= (hash [1 2 3]) (hash (set [1 2 3])))\nfalse", :author {:avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4", :account-source "github", :login "loeschzwerg"}, :created-at 1647338501091, :updated-at 1647339498450, :_id "62306405e4b0b1e3652d75bb"}], :notes [{:author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :updated-at 1456676195346, :created-at 1456676195346, :body "Despite what the doc-string says values returned by `(hash)` are different from `(.hashCode)` for more than just `Integer`, `Short`, `Byte` and Clojure collections.\n\nThe list also includes: Keywords, Symbols, Functions, Sequences, `String`, `Long` and `BigInteger` (as of Clojure 1.7.0).", :_id "56d31d63e4b0b41f39d96cd5"}], :arglists ["x"], :doc "Returns the hash code of its argument. Note this is the hash code\n consistent with =, and thus is different than .hashCode for Integer,\n Short, Byte and Clojure collections.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/hash"} {:added "1.0", :ns "clojure.core", :name "quot", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1305751242000, :author {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rem", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b7e"} {:created-at 1305751245000, :author {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "mod", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b7f"} {:created-at 1435174860426, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:ns "clojure.core", :name "unchecked-divide-int", :library-url "https://github.com/clojure/clojure"}, :_id "558b07cce4b0fad27b85f923"} {:created-at 1468958158412, :author {:login "chrismurrph", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10278575?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "/", :ns "clojure.core"}, :_id "578e85cee4b0bafd3e2a04b2"}], :line 1261, :examples [{:updated-at 1632985121009, :created-at 1279992131000, :body ";; (quot m n) is the value of m/n, rounded towards 0 to the nearest integer.\n;; m, n need not be integers.\n\nuser=> (quot 10 3)\n3\n\nuser=> (quot 11 3)\n3\n\nuser=> (quot 12 3)\n4\n\nuser=> (quot -5.9 3)\n-1.0\n\nuser=> (quot 10 -3)\n-3\n\nuser=> (quot 15 0)\nArithmeticException / by zero clojure.lang.Numbers.quotient (Numbers.java:1764)\n\n\n;; For ClojureScript (at least v1.10.597), `num`, `div` should be integer.\n;; Otherwise, it does not work correctly due to its implementation:\nhttp://cljs.github.io/api/cljs.core/quot\n\n;; in clojure,\nuser=> (quot 286.3 21.2)\n13.0\n\n;; in clojurescript\ncljs.user=> (quot 286.3 21.2)\n12", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "jngbng", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/552977?v=4"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}, :_id "542692cbc026201cdc326bec"} {:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}], :body ";; note that the \"/\" function and the quot function are not equivalent\n\nuser=> (= (/ 4 2) (quot 4 2))\ntrue\n\nuser=> (= (/ 3 2) (quot 3 2))\nfalse\n", :created-at 1316301245000, :updated-at 1316301327000, :_id "542692cbc026201cdc326bf0"}], :notes nil, :arglists ["num div"], :doc "quot[ient] of dividing numerator by denominator.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/quot"} {:added "1.0", :ns "clojure.core", :name "ns-aliases", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1374148394000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "alias", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b61"} {:created-at 1512036368133, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ns-unalias", :ns "clojure.core"}, :_id "5a1fd810e4b0a08026c48cc7"}], :line 4274, :examples [{:editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "domokato", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2388832?v=4"}], :updated-at 1646765005254, :created-at 1416004195771, :author {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}, :body ";; clojure.core contains an alias\n(ns-aliases 'clojure.core)\n;;=> {jio #}\n\n;; To start with there are no namespace aliases in the user namespace.\n(ns-aliases 'user)\n;;=> {}\n\n;; ...but we can add an alias to the user namespace.\n(alias 'string 'clojure.string) \n(ns-aliases 'user)\n;;=> {string #{Namespace clojure.string>}\n\n", :_id "54668263e4b0dc573b892fc9"} {:body ";; Suppose you want to pass a namespace as an argument...\n(ns wip (:require [clojure.string :as string]\n [clojure.pprint :as pp]))\n(defn foo [nspace] nspace)\n\n;; ...pretty easy to do if you use the namespace symbol.\n(foo (the-ns 'clojure.string))\n;;=> #\n\n;; but, a bit of a problem if you want to pass the alias.\n(foo (the-ns 'string))\n;; java.lang.Exception: No namespace: string found...\n\n;; We can make a function that will serve using ns-aliases.\n(defn the-alias [name] (get (ns-aliases *ns*) name))\n(the-alias 'string)\n;;=> #\n\n(foo (the-alias 'string))\n;;=> #\n\n;; A more direct function can be written.\n;; but this uses an undocumented function.\n(defn the-alias [alias-name] (.lookupAlias *ns* (symbol alias-name)))\n(the-alias \"pp\")\n;;=> #\n\n\n\n\n", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1416006101219, :updated-at 1416243613962, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :_id "546689d5e4b0dc573b892fcc"}], :notes nil, :arglists ["ns"], :doc "Returns a map of the aliases for the namespace.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ns-aliases"} {:added "1.0", :ns "clojure.core", :name "read", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1313054766000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "read-string", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f56"} {:created-at 1352963657000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "*read-eval*", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f57"}], :line 3741, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [], :body "user=> (read)\n( + 1 1 ) ; <= User types this\n(+ 1 1)\nuser=> (eval (read))\n(+ 1 1) ; <= User types this\n2\n", :created-at 1286263972000, :updated-at 1286263972000, :_id "542692c8c026201cdc326a15"} {:author {:login "Chris Riddoch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c908fbef70e8540f700a6b362cf57e9e?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; WARNING: You SHOULD NOT use clojure.core/read or\n;; clojure.core/read-string to read data from untrusted sources. They\n;; were designed only for reading Clojure code and data from trusted\n;; sources (e.g. files that you know you wrote yourself, and no one\n;; else has permission to modify them).\n\n;; Instead, either:\n\n;; (1) Use another data serialization format such as JSON, XML,\n;; etc. and a library for reading them that you trust not to have\n;; vulnerabilities, or\n\n;; (2) if you want a serialization format that can be read safely and\n;; looks like Clojure data structures, use edn\n;; (https://github.com/edn-format/edn). For Clojure 1.3 and later,\n;; the tools.reader contrib library provides an edn reader\n;; (http://github.com/clojure/tools.reader). There is also\n;; clojure.edn/read and clojure.edn/read-string provided in Clojure\n;; 1.5.\n\n;; You definitely should not use clojure.core/read or read-string if\n;; *read-eval* has its default value of true, because an attacker\n;; could cause your application to execute arbitrary code while it is\n;; reading. Example:\n\nuser=> (read-string \"#=(clojure.java.shell/sh \\\"echo\\\" \\\"hi\\\")\")\n{:exit 0, :out \"hi\\n\", :err \"\"}\n\n;; It is straightforward to modify the example above into more\n;; destructive ones that remove all of your files, copy them to\n;; someone else's computer over the Internet, install Trojans, etc.\n\n;; Even if you do bind *read-eval* to false first, like so:\n\n(defn read-string-unsafely [s]\n (binding [*read-eval* false]\n (read-string s)))\n\n;; you may hope you are safe reading untrusted data that way, but in\n;; Clojure 1.4 and earlier, an attacker can send data that causes your\n;; system to execute arbitrary Java constructors. Most of these are\n;; benign, but it only takes one to ruin your application's day.\n;; Examples that should scare you:\n\n;; This causes a socket to be opened, as long as the JVM sandboxing\n;; allows it.\n(read-string-unsafely \"#java.net.Socket[\\\"www.google.com\\\" 80]\")\n\n;; This causes precious-file.txt to be created if it doesn't exist, or\n;; if it does exist, its contents will be erased (given appropriate\n;; JVM sandboxing permissions, and underlying OS file permissions).\n(read-string-unsafely \"#java.io.FileWriter[\\\"precious-file.txt\\\"]\")\n\n;; The particular issue of executing arbitrary Java constructors used\n;; in the examples above no longer works in Clojure 1.5 when\n;; *read-eval* is false. Even so, you SHOULD NEVER USE\n;; clojure.core/read or clojure.core/read-string for reading untrusted\n;; data. Use an edn reader or a different data serialization format.\n\n;; Why should I do this, you may ask, if Clojure 1.5 closes the Java\n;; constructor hole? Because clojure.core/read and read-string are\n;; designed to be able to do dangerous things, and they are not\n;; documented nor promised to be safe from unwanted side effects. If\n;; you use them for reading untrusted data, and a dangerous side\n;; effect is found in the future, you will be told that you are using\n;; the wrong tool for the job. clojure.edn/read and read-string, and\n;; the tools.reader.edn library, are documented to be safe from\n;; unwanted side effects, and if any bug is found in this area it\n;; should get quick attention and corrected.\n\n;; If you understand all of the above, and want to use read or\n;; read-string to read data from a _trusted_ source, continue on\n;; below.\n\n;; read wants its reader arg (or *in*) to be a java.io.PushbackReader.\n;; with-open closes r after the with-open body is done. *read-eval*\n;; specifies whether to allow #=() forms when reading, and evaluate\n;; them as a side effect while reading.\n\n(defn read-from-file-with-trusted-contents [filename]\n (with-open [r (java.io.PushbackReader.\n (clojure.java.io/reader filename))]\n (binding [*read-eval* false]\n (read r))))\n\nuser=> (spit \"testfile.txt\" \"{:a 1 :b 2 :c 3}\")\nnil\nuser=> (read-from-file-with-trusted-contents \"testfile.txt\")\n{:a 1, :b 2, :c 3}\n", :created-at 1325831086000, :updated-at 1364783739000, :_id "542692d5c026201cdc327056"}], :notes [{:updated-at 1286264042000, :body "This function is for reading clojure objects not a general input function.", :created-at 1286264042000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f98"}], :arglists ["" "stream" "stream eof-error? eof-value" "stream eof-error? eof-value recursive?" "opts stream"], :doc "Reads the next object from stream, which must be an instance of\n java.io.PushbackReader or some derivee. stream defaults to the\n current value of *in*.\n\n Opts is a persistent map with valid keys:\n :read-cond - :allow to process reader conditionals, or\n :preserve to keep all branches\n :features - persistent set of feature keywords for reader conditionals\n :eof - on eof, return value unless :eofthrow, then throw.\n if not specified, will throw\n\n Note that read can execute code (controlled by *read-eval*),\n and as such should be used only with trusted sources.\n\n For data structure interop use clojure.edn/read", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/read"} {:added "1.3", :ns "clojure.core", :name "unchecked-double", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 3552, :examples [{:updated-at 1507300542297, :created-at 1507300542297, :author {:login "PhillRoyle", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/7779270?v=4"}, :body "\n;; the function taking a BigDecimal with limited decimal places\n(unchecked-double 1.77M)\n=> 1.77\n\n;; the function taking a double with limited decimal places\n(unchecked-double 1.22)\n=> 1.22\n\n;; the function taking '0'\n(unchecked-double 0)\n=> 0.0\n\n;; the function does (eventually) round up...:\n(unchecked-double 1.000000000123456789)\n=> 1.0000000001234568\n;;...or down:\n(unchecked-double 1.000000000123456489)\n=> 1.0000000001234566", :_id "59d794bee4b03026fe14ea51"}], :notes nil, :arglists ["x"], :doc "Coerce to double. Subject to rounding.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-double"} {:added "1.0", :ns "clojure.core", :name "key", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1318592856000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "keys", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f60"} {:created-at 1434396249722, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:ns "clojure.core", :name "val", :library-url "https://github.com/clojure/clojure"}, :_id "557f2659e4b01ad59b65f4f4"} {:created-at 1517622978859, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "map", :ns "clojure.core"}, :_id "5a7516c2e4b0e2d9c35f7411"} {:created-at 1517622990497, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "hash-map", :ns "clojure.core"}, :_id "5a7516cee4b0e2d9c35f7412"}], :line 1567, :examples [{:updated-at 1434395508050, :created-at 1280777907000, :body ";; the following emulates 'keys'\n(map key {:a 1 :b 2})\n;;=> (:a :b)\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692cac026201cdc326b66"} {:body ";; extracts the key of a map entry\n(key (clojure.lang.MapEntry. :a :b))\n;;=> :a\n", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1434396125134, :updated-at 1434396125134, :_id "557f25dde4b03e2132e7d191"}], :notes nil, :arglists ["e"], :doc "Returns the key of the map entry.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/key"} {:added "1.0", :ns "clojure.core", :name "longs", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "long-array", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917385000, :_id "542692ebf6e94c6970521f53"}], :line 5383, :examples [{:updated-at 1656673080931, :created-at 1656673080931, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body "(def my-floats (float-array [1.1 2.2 3.3]));; => #'user/my-floats\n\n;; long-array will convert where possible\n(long-array my-floats);; => [1, 2, 3]\n\n;; longs will not\n(try (longs my-floats)\n (catch ClassCastException e (ex-message e)));; => \"[F cannot be cast to [J\"", :_id "62bed338e4b0b1e3652d7614"} {:editors [{:login "randomizedthinking", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5283430?v=4"}], :body ";; longs does cast but not convert arrays\n;; it is used as a type-hinting device to avoid reflections\n;; very important for computation intensive codes\n(binding [*print-meta* true]\n (def ^longs x (long-array [1 2 4]))\n (clojure.pprint/pprint #'x)) ;; ^{:tag #function[clojure.core/longs], ...}", :author {:avatar-url "https://avatars.githubusercontent.com/u/5283430?v=4", :account-source "github", :login "randomizedthinking"}, :created-at 1679352950506, :updated-at 1679353150365, :_id "6418e476e4b08cf8563f4b80"} {:updated-at 1682270999390, :created-at 1682270999390, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; Casting avoids expensive reflection, so to see the benefit, enable warning:\n(set! *warn-on-reflection* true)\n\n;; We'll def a long-array but won't type-hint the var:\n(def my-array (long-array [10 20 30 40 50 60]))\n\n;; and try to amap over it without using `longs` or type hinting amap's args:\n(amap my-array i _ (unchecked-inc ^long (aget my-array i)))\n;; Reflection warning… call to static method alength on clojure.lang.RT can't be resolved (argument types: unknown).\n;; Reflection warning… call to static method aclone on clojure.lang.RT can't be resolved (argument types: unknown).\n;; Reflection warning… call to static method aget on clojure.lang.RT can't be resolved (argument types: unknown, int).\n;; Reflection warning… call to static method aset on clojure.lang.RT can't be resolved (argument types: unknown, int, long).\n;; => [11, 21, 31, 41, 51, 61]\n\n;; We can use `longs` to avoid reflection:\n(amap (longs my-array) i _ (unchecked-inc ^long (aget (longs my-array) i)))\n;; => [11, 21, 31, 41, 51, 61]\n\n;; Just as we can type hint in place:\n(amap ^longs my-array i _ (unchecked-inc ^long (aget ^longs my-array i)))\n;; => [11, 21, 31, 41, 51, 61]\n\n;; Or type hint the var:\n(def ^\"[J\" my-array (long-array [10 20 30 40 50 60]))\n(amap my-array i _ (unchecked-inc ^long (aget my-array i)))\n;; => [11, 21, 31, 41, 51, 61]\n", :_id "64456b17e4b08cf8563f4b90"}], :notes nil, :arglists ["xs"], :doc "Casts to long[]", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/longs"} {:added "1.0", :ns "clojure.core", :name "not=", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1412341716329, :author {:login "verma", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/242524?v=2"}, :to-var {:ns "clojure.core", :name "=", :library-url "https://github.com/clojure/clojure"}, :_id "542e9fd4e4b05f4d257a29a0"} {:created-at 1412341728824, :author {:login "verma", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/242524?v=2"}, :to-var {:ns "clojure.core", :name "not", :library-url "https://github.com/clojure/clojure"}, :_id "542e9fe0e4b05f4d257a29a1"}], :line 819, :examples [{:author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"} {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (not= 1 1)\nfalse\n\nuser=> (not= 1 2)\ntrue\n\nuser=> (not= true true)\nfalse\n\nuser=> (not= true false)\ntrue\n\nuser=> (not= true true true true)\nfalse\n\nuser=> (not= true true false true)\ntrue\n", :created-at 1280778104000, :updated-at 1285495471000, :_id "542692c6c026201cdc32690f"} {:updated-at 1565641574887, :created-at 1565641574887, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :body ";; See the Clojure Equality guide for more details:\n;; https://clojure.org/guides/equality", :_id "5d51cb66e4b0ca44402ef7a1"} {:updated-at 1677517538988, :created-at 1677513608119, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; An exception to the docstring:\n\n(not= ##NaN ##NaN)\n;; => false\n\n(not (= ##NaN ##NaN))\n;; => true\n\n;; This is because of various shortcuts for checking identity when checking equality.\n;; As a rule of thumb, don't rely on either for testing against the ##NaN literal.\n;; Decide on which logic you want, and explicitly test. E.g.\n\n(defn != [x y]\n (or (not= x y)\n (Double/isNaN x)\n (Double/isNaN y)))\n\n(!= ##NaN ##NaN)\n;; => true", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4", :account-source "github", :login "tomdl89"}], :_id "63fcd388e4b08cf8563f4b73"}], :notes nil, :tag "java.lang.Boolean", :arglists ["x" "x y" "x y & more"], :doc "Same as (not (= obj1 obj2))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/not="} {:added "1.0", :ns "clojure.core", :name "string?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1596596389180, :author {:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "str", :ns "clojure.core"}, :_id "5f2a20a5e4b0b1e3652d7371"}], :line 160, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user=> (string? \"abc\")\ntrue\n\nuser=> (string? \"\")\ntrue\n\nuser=> (string? \\a)\nfalse\n\nuser=> (string? 1)\nfalse\n\nuser=> (string? [\"a\" \"b\" \"c\"])\nfalse\n\nuser=> (string? nil)\nfalse", :created-at 1280546643000, :updated-at 1423277887409, :_id "542692c7c026201cdc326945"}], :notes nil, :arglists ["x"], :doc "Return true if x is a String", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/string_q"} {:added "1.9", :ns "clojure.core", :name "uri?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1627821463966, :author {:login "Okwori", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/16775439?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "instance?", :ns "clojure.core"}, :_id "61069597e4b0b1e3652d7525"}], :line 7845, :examples [{:updated-at 1495999488091, :created-at 1495999488091, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body "(uri? (new java.net.URI \"http://clojuredocs.org/\"))\n;;=> true\n\n(uri? (new java.net.URL \"http://clojuredocs.org/\"))\n;;=> false\n(uri? \"http://clojuredocs.org/\")\n;;=> false\n", :_id "592b2400e4b093ada4d4d781"} {:updated-at 1627822753593, :created-at 1627822683340, :author {:login "Okwori", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/16775439?v=4"}, :body ";; When fetching URI db.type\n\n;;(uri? #object[com.cognitect.transit.impl.URIImpl 0x3ec31528 \"https://www.datomic.com/details.html\")\n(uri? (com.cognitect.transit.impl.URIImpl. \"https://www.datomic.com/details.html\"))\n;;=> false\n\n(instance? com.cognitect.transit.impl.URIImpl \n (com.cognitect.transit.impl.URIImpl. \"https://www.datomic.com/details.html\")) \n;;=> true\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/16775439?v=4", :account-source "github", :login "Okwori"}], :_id "61069a5be4b0b1e3652d7526"}], :notes nil, :arglists ["x"], :doc "Return true if x is a java.net.URI", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/uri_q"} {:added "1.0", :ns "clojure.core", :name "aset-double", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1349125867000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "double-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521abb"}], :line 3966, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; create an array of 10 doubles and set one of the elements to 3.1415\n\nuser=> (def ds (double-array 10))\n#'user/ds\nuser=> (vec ds)\n[0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0]\nuser=> (aset-double ds 3 3.1415)\n3.1415\nuser=> (vec ds)\n[0.0 0.0 0.0 3.1415 0.0 0.0 0.0 0.0 0.0 0.0]\nuser=>", :created-at 1313914664000, :updated-at 1313914664000, :_id "542692ccc026201cdc326c88"}], :notes [{:body "See [aset](http://clojuredocs.org/clojure.core/aset) for illustrations of multi-dimensional syntax.", :created-at 1432829167201, :updated-at 1432829167201, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :_id "55673cefe4b01ad59b65f4e1"}], :arglists ["array idx val" "array idx idx2 & idxv"], :doc "Sets the value at the index/indices. Works on arrays of double. Returns val.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/aset-double"} {:added "1.0", :ns "clojure.core", :name "unchecked-multiply-int", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 1219, :examples nil, :notes nil, :arglists ["x y"], :doc "Returns the product of x and y, both int.\n Note - uses a primitive operator subject to overflow.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-multiply-int"} {:ns "clojure.core", :name "chunk-rest", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1443934917158, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-first", :ns "clojure.core"}, :_id "5610b2c5e4b08e404b6c1c95"} {:created-at 1443934931280, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-next", :ns "clojure.core"}, :_id "5610b2d3e4b0686557fcbd45"}], :line 704, :examples [{:updated-at 1443935100136, :created-at 1443935100136, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :body "(let [chunked-cons (seq (range 1 42))\n rest-chunk (chunk-rest chunked-cons)]\n\n (class rest-chunk)\n ;; => clojure.lang.LazySeq\n\n (first rest-chunk)\n ;; => 33\n\n (last rest-chunk)\n ;; => 41\n)", :_id "5610b37ce4b08e404b6c1c96"}], :notes nil, :tag "clojure.lang.ISeq", :arglists ["s"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/chunk-rest"} {:added "1.0", :ns "clojure.core", :name "pcalls", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1299212798000, :author {:login "weakreference", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/86146f8bd5207b97701c0f16f0017334?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pvalues", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521be6"} {:created-at 1336537809000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "future", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521be7"} {:created-at 1518042729804, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pmap", :ns "clojure.core"}, :_id "5a7b7e69e4b0316c0f44f8aa"}], :line 7037, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (pcalls function-1 function-2 ...)\n\n(result1 result2 ...)", :created-at 1281093054000, :updated-at 1332951378000, :_id "542692cdc026201cdc326ccf"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; pcalls is implemented using Clojure futures. See examples for 'future'\n;; for discussion of an undesirable 1-minute wait that can occur before\n;; your standalone Clojure program exits if you do not use shutdown-agents.", :created-at 1336537804000, :updated-at 1336537804000, :_id "542692d4c026201cdc32702e"}], :notes nil, :arglists ["& fns"], :doc "Executes the no-arg fns in parallel, returning a lazy sequence of\n their values", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/pcalls"} {:ns "clojure.core", :name "*allow-unresolved-vars*", :type "var", :see-alsos nil, :examples [{:updated-at 1596399672161, :created-at 1596398748332, :author {:login "eltonlaw", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/14999531?v=4"}, :body ";; Symbols are resolved during analysis phase, throws error\n;; because a is not defined anywhere reachable\nuser=> (clojure.lang.Compiler/analyze clojure.lang.Compiler$C/EXPRESSION '(+ 1 a))\n\nSyntax error compiling at (REPL:1:68).\nUnable to resolve symbol: a in this context\n\n;; Don't throw an exception on unresolvable symbol, assumption that\n;; there's somewhere else vars are defined not visible to analyzer\n;; (Ex. some external javascript library)\nuser=> (binding [*allow-unresolved-vars* true]\n #_=> (clojure.lang.Compiler/analyze clojure.lang.Compiler$C/EXPRESSION '(+ 1 a)))\n\n#object[clojure.lang.Compiler$StaticMethodExpr 0x1441fb4f \"clojure.lang.Compiler$StaticMethodExpr@1441fb4f\"]\n", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/14999531?v=4", :account-source "github", :login "eltonlaw"}], :_id "5f271c9ce4b0b1e3652d732e"}], :notes [{:author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :updated-at 1617633337145, :created-at 1617633337145, :body "Originally added to support specific ClojureScript use of the analyzer in the preliminary version of ClojureScript by C.Houser, see https://github.com/richhickey/clojure-contrib/blob/master/clojurescript/src/clojure/contrib/clojurescript.clj#L307-L310.", :_id "606b2039e4b0b1e3652d74b3"}], :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*allow-unresolved-vars*"} {:added "1.2", :ns "clojure.core", :name "remove-all-methods", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1337585106000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "remove-method", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c88"} {:created-at 1341270438000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "prefers", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c89"} {:created-at 1341270443000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "methods", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c8a"} {:created-at 1341270446000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "get-method", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c8b"} {:created-at 1341270452000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defmulti", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c8c"} {:created-at 1341270455000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defmethod", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c8d"}], :line 1789, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; example showing use of multi-methods before and after remove-all-methods\n;; after removing all the methods, both circle and line tos functions throw\n;; exceptions\n\nuser=> (defmulti tos :Ob)\nnil\nuser=> (defn line [p1 p2] {:Ob :line :p1 p1 :p2 p2})\n#'user/line\nuser=> (defn circle [cent rad] {:Ob :circle :cent cent :rad rad})\n#'user/circle\nuser=> (defmethod tos :line [l] (str \"Line:\" (l :p1) (l :p2)))\n#\nuser=> (defmethod tos :circle [c] (str \"Circle:\" (c :cent) (c :rad)))\n#\nuser=> (println (tos (circle [2 3] 3.3)))\nCircle:[2 3]3.3\nnil\nuser=> (println (tos (line [1 1][0 0])))\nLine:[1 1][0 0]\nnil\nuser=> (remove-all-methods tos)\n#\nuser=> (println (tos (circle [2 3] 3.3)))\njava.lang.IllegalArgumentException: No method in multimethod 'tos' for dispatch\nvalue: :circle (NO_SOURCE_FILE:0)\nuser=> (println (tos (line [1 1][0 0])))\njava.lang.IllegalArgumentException: No method in multimethod 'tos' for dispatch\nvalue: :line (NO_SOURCE_FILE:0)\nuser=>", :created-at 1313920017000, :updated-at 1313920017000, :_id "542692ccc026201cdc326c6b"}], :notes nil, :arglists ["multifn"], :doc "Removes all of the methods of multimethod.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/remove-all-methods"} {:added "1.0", :ns "clojure.core", :name "ns-resolve", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1289661007000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "resolve", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b3d"}], :line 4359, :examples [{:author {:login "jamesqiu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc1268deaa7f2e78fe2b5ea76e6481d8?r=PG&default=identicon"}, :editors [], :body "user=> (defn f [n] (* n n n))\n#'user/f\nuser=> ((ns-resolve *ns* (symbol \"f\")) 10)\n1000", :created-at 1328007015000, :updated-at 1328007015000, :_id "542692d4c026201cdc32701e"} {:author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :editors [], :body ";; See also http://clojure.org/namespaces for information on namespaces in Clojure and how to inspect and manipulate them", :created-at 1348479408000, :updated-at 1348479408000, :_id "542692d4c026201cdc32701f"} {:updated-at 1601821751716, :created-at 1601821751716, :author {:login "jimka2001", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/6414129?v=4"}, :body ";; In the binary form of `ns-resolve`, if a fully qualified symbol is given as second argument of `ns-resolve`, then the namespace (given as first argument) is ignored\n(ns-resolve (find-ns 'clojure.core) 'clojure-rte.core/xyzzy)\n;; => #'clojure-rte.core/xyzzy", :_id "5f79dc37e4b0b1e3652d73c8"}], :notes [{:updated-at 1332557686000, :body "The appropriate value for the env arg is what you get from the implicit &env arg available to a macro.", :created-at 1332557686000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fdb"}], :arglists ["ns sym" "ns env sym"], :doc "Returns the var or Class to which a symbol will be resolved in the\n namespace (unless found in the environment), else nil. Note that\n if the symbol is fully qualified, the var/Class to which it resolves\n need not be present in the namespace.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ns-resolve"} {:added "1.5", :ns "clojure.core", :name "as->", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1411997691800, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "->", :library-url "https://github.com/clojure/clojure"}, :_id "54295ffbe4b09282a148f1ed"} {:created-at 1411997716841, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "->>", :library-url "https://github.com/clojure/clojure"}, :_id "54296014e4b09282a148f1ee"} {:created-at 1411997732554, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "cond->", :library-url "https://github.com/clojure/clojure"}, :_id "54296024e4b09282a148f1ef"} {:created-at 1411997750265, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "cond->>", :library-url "https://github.com/clojure/clojure"}, :_id "54296036e4b09282a148f1f1"} {:created-at 1411997759234, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "some->", :library-url "https://github.com/clojure/clojure"}, :_id "5429603fe4b09282a148f1f2"} {:created-at 1411997771032, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "some->>", :library-url "https://github.com/clojure/clojure"}, :_id "5429604be4b09282a148f1f3"}], :line 7572, :examples [{:body "(def owners [{:owner \"Jimmy\"\n :pets (ref [{:name \"Rex\"\n :type :dog}\n {:name \"Sniffles\"\n :type :hamster}])} \n {:owner \"Jacky\" \n :pets (ref [{:name \"Spot\" \n :type :mink}\n {:name \"Puff\" \n :type :magic-dragon}])}])\n\n;; This example is contrived as there are other more \n;; terse ways of expressing the idea. It demonstrates\n;; several of the ways to extract items from a collection.\n;; Notice how the collection can be used in function or \n;; parameter position.\n(as-> owners $ (nth $ 0) (:pets $) (deref $) ($ 1) ($ :type))\n;;=> :hamster", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1412263021928, :updated-at 1412263021928, :_id "542d6c6de4b05f4d257a298b"} {:body "(as-> 0 n\n (inc n) ; n is 0 here passed from first parameter to as->\n (inc n)) ; n is 1 here passed from result of previous inc expression\n;;=> 2", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1422928871993, :updated-at 1422928871993, :_id "54d02be7e4b0e2ac61831cf2"} {:editors [{:login "jamesmacaulay", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/340?v=3"}], :body "; use it in the middle of a -> pipeline to sprinkle in some flexibility\n(-> [10 11]\n (conj 12)\n (as-> xs (map - xs [3 2 1]))\n (reverse))\n; (11 9 7)", :author {:avatar-url "https://avatars.githubusercontent.com/u/340?v=3", :account-source "github", :login "jamesmacaulay"}, :created-at 1452207578399, :updated-at 1452207828195, :_id "568eeddae4b0f37b65a3c280"} {:updated-at 1456947738297, :created-at 1456947738297, :author {:login "x", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/693546?v=3"}, :body ";; when you want to use arbitrary positioning of your argument in a thread macro\n(as-> {:a 1 :b 2} m\n (update m :a + 10)\n (reduce (fn [s [_ v]] (+ s v)) 0 m))\n\n;; when you'd like an if statement in your thread\n(as-> {:a 1 :b 2} m\n (update m :a + 10)\n (if update-b\n (update m :b + 10)\n m))", :_id "56d7421ae4b0b41f39d96cdb"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"} {:login "greydrizzle", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/5403136?v=4"}], :body ";; as-> with destructured binding\n\n(let [req {:host \"//mysite.com\" :path \"/a/123\" :x \"15.1\" :y \"84.2\"}]\n (as-> req {:keys [host path x y] :as m}\n (assoc m :url (str host path))\n (assoc m :coord [(Double/valueOf x) (Double/valueOf y)])))\n\n;; {:host \"//mysite.com\" :path \"/a/123\" :x \"15.1\" :y \"84.2\" :url \"//mysite.com/a/123\" :coord [15.1 84.2]}", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1532889321412, :updated-at 1554166083397, :_id "5b5e08e9e4b00ac801ed9e3a"}], :macro true, :notes nil, :arglists ["expr name & forms"], :doc "Binds name to expr, evaluates the first form in the lexical context\n of that binding, then binds name to that result, repeating for each\n successive form, returning the result of the last form.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/as->"} {:added "1.0", :ns "clojure.core", :name "aset-boolean", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1493752979563, :author {:login "barak-haviv", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/2076998?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "boolean-array", :ns "clojure.core"}, :_id "5908dc93e4b01f4add58fea1"}], :line 3956, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; create an array of 10 booleans and set one value to true\n;; using aset-boolean\n\nuser=> (def bs (boolean-array 10))\n#'user/bs\nuser=> (vec bs)\n[false false false false false false false false false false]\nuser=> (aset-boolean bs 2 true)\ntrue\nuser=> (vec bs)\n[false false true false false false false false false false]\nuser=>", :created-at 1313914167000, :updated-at 1313914167000, :_id "542692ccc026201cdc326c67"}], :notes [{:body "See [aset](http://clojuredocs.org/clojure.core/aset) for illustrations of multi-dimensional syntax.", :created-at 1432829103674, :updated-at 1432829103674, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :_id "55673cafe4b03e2132e7d171"}], :arglists ["array idx val" "array idx idx2 & idxv"], :doc "Sets the value at the index/indices. Works on arrays of boolean. Returns val.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/aset-boolean"} {:added "1.0", :ns "clojure.core", :name "trampoline", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1289618007000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "loop", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521df6"} {:created-at 1289618015000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "recur", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521df7"} {:created-at 1422376146394, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:ns "clojure.core", :name "letfn", :library-url "https://github.com/clojure/clojure"}, :_id "54c7bcd2e4b081e022073c35"}], :line 6299, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(defn foo [x]\n (if (< x 0)\n (println \"done\")\n #(foo (do (println :x x) (dec x)))))\n;; #'user/foo\n\n;; `trampoline` will keep calling the function \n;; for as long as \"foo\" returns a function.\n\n(trampoline foo 10)\n;; :x 10\n;; :x 9\n;; :x 8\n;; :x 7\n;; :x 6\n;; :x 5\n;; :x 4\n;; :x 3\n;; :x 2\n;; :x 1\n;; :x 0\n;; done\n;;=> nil", :created-at 1293675043000, :updated-at 1422375388791, :_id "542692cfc026201cdc326e3b"} {:body ";; Short tutorial-style article with example of using trampoline at this link:\n;; http://jakemccrary.com/blog/2010/12/06/trampolining-through-mutual-recursion/", :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :created-at 1421338043181, :updated-at 1421338043181, :_id "54b7e5bbe4b0e2ac61831cb5"} {:body ";; Using mutually recursive functions to implement a finite state machine (FSM)\n;; This machine has three states {a b c} and \n;; seven transitions {:a-b :a-c :b-a :b-c :c-a :c-b :final}.\n\n(defn foo [cmds]\n(letfn\n [(a-> [[_ & rs]]\n #(case _ \n :a-b (b-> rs)\n :a-c (c-> rs)\n false))\n (b-> [[_ & rs]]\n #(case _ \n :b-a (a-> rs)\n :b-c (c-> rs)\n false))\n (c-> [[_ & rs]]\n #(case _ \n :c-a (a-> rs)\n :c-b (c-> rs)\n :final true\n false))]\n (trampoline a-> cmds)))\n \n(foo [:a-b :b-c :c-a :a-c :final])\n;;=> true", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1422376023904, :updated-at 1422376335709, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :_id "54c7bc57e4b081e022073c33"} {:body ";; from \n;; Mutually recursive functions are nice for implementing \n;; finite state machines (FSAs)\n\n(defn elevator [commands]\n (letfn\n [(ff-open [[_ & r]]\n \"When the elevator is open on the 1st floor\n it can either close or be done.\"\n #(case _\n :close (ff-closed r)\n :done true\n false))\n (ff-closed [[_ & r]]\n \"When the elevator is closed on the 1st floor\n it can either open or go up.\"\n #(case _\n :open (ff-open r)\n :up (sf-closed r)\n false))\n (sf-closed [[_ & r]]\n \"When the elevator is closed on the 2nd floor\n it can either go down or open.\"\n #(case _\n :down (ff-closed r)\n :open (sf-open r)\n false))\n (sf-open [[_ & r]]\n \"When the elevator is open on the 2nd floor\n it can either close or be done\"\n #(case _\n :close (sf-closed r)\n :done true\n false))]\n\n (trampoline ff-open commands)))\n\n(elevator [:close :open :close :up :open :open :done])\n ;=> false\n(elevator [:close :up :open :close :down :open :done])\n ;=> true\n;; run at your own risk!\n(elevator (cycle [:close :open])) \n ; ... runs forever", :author {:login "foxlog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/150418?v=3"}, :created-at 1431484190885, :updated-at 1592576350068, :editors [{:login "foxlog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/150418?v=3"} {:avatar-url "https://avatars0.githubusercontent.com/u/1719584?v=4", :account-source "github", :login "eihli"}], :_id "5552b71ee4b01ad59b65f4cf"} {:updated-at 1482914635322, :created-at 1482914635322, :author {:login "mhmdsalem1993", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10787314?v=3"}, :body ";; without trampoline\n(declare hatt)\n(defn catt [n]\n (when-not (zero? n)\n (when (zero? (rem n 100))\n (println \"catt:\" n))\n (hatt (dec n))))\n(defn hatt [n]\n (when-not (zero? n)\n (if (zero? (rem n 100))\n (println \"hatt:\" n))\n (catt (dec n))))\n\n;; std=> catt: 100000000\n;; std=> catt: 99999900\n;; std=> catt: 99999800\n;; std=> catt: 99999700\n;; std=> catt: 99999600\n;; std=> catt: 99999500\n;; std=> catt: 99999400\n;; .\n;; .\n;; .\n;; std => CompilerException java.lang.StackOverflowError\n\n;; with trampoline\n\n(declare hattr)\n\n(defn cattr [n]\n (when-not (zero? n)\n (when (zero? (rem n 100))\n (println \"cattr:\" n))\n (fn [] (hattr (dec n)))))\n(defn hattr [n]\n (when-not (zero? n)\n (if (zero? (rem n 100))\n (println \"hatttr:\" n))\n (fn [] (cattr (dec n)))))\n\n(trampoline cattr 10000000)\n\n;; std=> catt: 100000000\n;; std=> catt: 99999900\n;; std=> catt: 99999800\n;; std=> catt: 99999700\n;; std=> catt: 99999600\n;; std=> catt: 99999500\n;; std=> catt: 99999400\n;; .\n;; .\n;; .\n;; std=> catt: 100\n", :_id "58637b4be4b0fd5fb1cc9645"}], :notes [{:updated-at 1291742621000, :body "A tutorial on how to use trampoline is available here: \r\n\r\nhttp://pramode.net/clojure/2010/05/08/clojure-trampoline/\r\n\r\nand here:\r\n\r\nhttp://jakemccrary.com/blog/2010/12/06/trampolining-through-mutual-recursion.html", :created-at 1286956413000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f9a"} {:author {:login "dvingo", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/467827?v=4"}, :updated-at 1588175434827, :created-at 1588175434827, :body "The links above are dead. Here are the archived versions:\n\nhttps://web.archive.org/web/20190626232715/http://pramode.net:80/clojure/2010/05/08/clojure-trampoline/\n\nhttps://web.archive.org/web/20110111121137/http://jakemccrary.com:80/blog/2010/12/06/trampolining-through-mutual-recursion.html", :_id "5ea9a24ae4b087629b5a18eb"}], :arglists ["f" "f & args"], :doc "trampoline can be used to convert algorithms requiring mutual\n recursion without stack consumption. Calls f with supplied args, if\n any. If f returns a fn, calls that fn with no arguments, and\n continues to repeat, until the return value is not a fn, then\n returns that non-fn value. Note that if you want to return a fn as a\n final value, you must wrap it in some data structure and unpack it\n after trampoline returns.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/trampoline"} {:added "1.9", :ns "clojure.core", :name "double?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1496005756299, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "float?", :ns "clojure.core"}, :_id "592b3c7ce4b093ada4d4d784"} {:created-at 1496005947631, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "decimal?", :ns "clojure.core"}, :_id "592b3d3be4b093ada4d4d785"} {:created-at 1496005954103, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "bigdec?", :ns "clojure.core"}, :_id "592b3d42e4b093ada4d4d786"}], :line 1426, :examples [{:updated-at 1496005747580, :created-at 1496005747580, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body ";;;; true for instances of java.lang.Double\n\n(double? 1.0)\n;;=> true\n(double? (new Double \"1\"))\n;;=> true\n\n;;;; false for instances of java.lang.Float, java.lang.BigDecimal\n\n(double? (new Float \"1\"))\n;;=> false\n(double? 1.0M)\n;;=> false\n(double? (new BigDecimal \"1\"))\n;;=> false\n", :_id "592b3c73e4b093ada4d4d783"}], :notes nil, :arglists ["x"], :doc "Return true if x is a Double", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/double_q"} {:added "1.0", :ns "clojure.core", :name "when-not", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1302596050000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "when", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d1b"} {:created-at 1323280013000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "when-let", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d1c"} {:created-at 1334293346000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "if", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d1d"}], :line 499, :examples [{:updated-at 1423066223241, :created-at 1280776138000, :body ";; build tuples over sets with the same cardinality \n(map\n #(when-not (= %2 %3) [%1 %2 %3])\n (iterate inc 0) ; a lazy list of indecies\n [:a :b :c]\n [:a :a :a])\n;;=> (nil [1 :b :a] [2 :c :a])\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692c8c026201cdc326a4a"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; See examples for \"if\" explaining Clojure's idea of logical true\n;; and logical false.", :created-at 1334293370000, :updated-at 1334293370000, :_id "542692d6c026201cdc3270b7"} {:body ";; when-not is similar to unless (in other languages).\n;; An alias can be provided with a macro\n(defmacro unless [& args] `(when-not ~@args))\n\n(map #(unless (= %2 %3) [%1 %2 %3])\n (iterate inc 0) ; a lazy list for indecies\n [:a :b :c]\n [:a :a :a]) \n;;=> (nil [1 :b :a] [2 :c :a])", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1423066081989, :updated-at 1423066244981, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :_id "54d243e1e4b081e022073c5c"} {:updated-at 1546901293467, :created-at 1546901293467, :author {:login "dijonkitchen", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4"}, :body "(when-not false 2)\n;; 2\n", :_id "5c33d72de4b0ca44402ef614"} {:updated-at 1546901306925, :created-at 1546901306925, :author {:login "dijonkitchen", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4"}, :body "(when-not true 2)\n;; nil\n", :_id "5c33d73ae4b0ca44402ef615"}], :macro true, :notes nil, :arglists ["test & body"], :doc "Evaluates test. If logical false, evaluates body in an implicit do.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/when-not"} {:added "1.0", :ns "clojure.core", :name "*1", :file "clojure/core.clj", :type "var", :column 1, :see-alsos [{:created-at 1302912238000, :author {:login "hoornet", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5834f829a9def19620d4014c46642172?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "*2", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b4a"} {:created-at 1302912243000, :author {:login "hoornet", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5834f829a9def19620d4014c46642172?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "*3", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b4b"}], :dynamic true, :line 6279, :examples [{:updated-at 1412880834853, :created-at 1279047952000, :body "\"Hello!\"\n;;=> \"Hello!\"\n\n*1\n;;=> \"Hello!\"\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=2", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692cac026201cdc326b1a"}], :notes nil, :arglists [], :doc "bound in a repl thread to the most recent value printed", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*1"} {:added "1.0", :ns "clojure.core", :name "vec", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1291951288000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vector", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521adb"} {:created-at 1291951295000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vector?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521adc"} {:created-at 1291951303000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vector-of", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521add"}], :line 367, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4", :account-source "github", :login "dijonkitchen"} {:login "whiteknees", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/67022623?v=4"}], :body "user=> (vec '(1 2 3))\n[1 2 3]\n\nuser=> (vec [1 2 3])\n[1 2 3]\n\nuser=> (vec #{1 2 3})\n[1 2 3]\n\nuser=> (vec {:a 1 :b 2 :c 3})\n[[:a 1] [:b 2] [:c 3]]\n\nuser=> (vector {:a 1 :b 2 :c 3})\n[{:a 1, :b 2, :c 3}]\n\nuser=> (vec '())\n[]\n\nuser=> (vec nil)\n[]", :created-at 1279075384000, :updated-at 1663872522168, :_id "542692c9c026201cdc326a97"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; Warning. If the arg is a Java array, then the returned vector will alias it,\n;; and modifying the array will thus modify the vector. To avoid this, do\n;; not modify the array after the vec call. One way to guarantee this is to\n;; make a copy of the array, call vec on the new array, and then lose all\n;; references to the copy so it cannot be accessed in any way.\n\nuser=> (def a (to-array (repeat 4 0)))\n#'user/a\nuser=> (seq a)\n(0 0 0 0)\nuser=> (def v (vec a))\n#'user/v\nuser=> v\n[0 0 0 0]\n\n;; Now change a, and v changes, too, since they share state.\nuser=> (aset a 2 -5)\n-5\nuser=> v\n[0 0 -5 0]\n\n;; One way to avoid this\nuser=> (def v (vec (aclone a)))\n#'user/v\nuser=> v\n[0 0 -5 0]\nuser=> (aset a 2 -20)\n-20\nuser=> v\n[0 0 -5 0]\n", :created-at 1334463665000, :updated-at 1334463665000, :_id "542692d5c026201cdc3270b4"}], :notes nil, :arglists ["coll"], :doc "Creates a new vector containing the contents of coll. Java arrays\n will be aliased and should not be modified.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/vec"} {:added "1.0", :ns "clojure.core", :name "*print-meta*", :type "var", :see-alsos [{:created-at 1351128584000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pr", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e5d"} {:created-at 1623879909739, :author {:login "squiter", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/238017?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pprint", :ns "clojure.pprint"}, :_id "60ca70e5e4b0b1e3652d750d"}], :examples [{:author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :editors [{:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"} {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}], :body "user=> (binding [*print-meta* true] \n (pr (var defmacro)) )\n;;^{:macro true, :ns #, :name defmacro, :arglists ^{:line 424, :column 15} ([name doc-string? attr-map? [params*] body] [name doc-string? attr-map? ^{:line 425, :column 46} ([params*] body) + attr-map?]), :column 1, :added \"1.0\", :doc \"Like defn, but the resulting function name is declared as a\\n macro and will be used as a macro by the compiler when it is\\n called.\", :line 419, :file \"clojure/core.clj\"} #'clojure.core/defmacro\nnil\n", :created-at 1351126556000, :updated-at 1351126806000, :_id "542692d1c026201cdc326f37"} {:updated-at 1623879875905, :created-at 1623879875905, :author {:login "squiter", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/238017?v=4"}, :body "user=> (binding [*print-meta* true]\n (-> \"{:a ^{:b :c} {}}\"\n clojure.edn/read-string\n clojure.pprint/pprint))\n{:a ^{:b :c} {}}\nnil", :_id "60ca70c3e4b0b1e3652d750c"}], :notes [{:updated-at 1351128651000, :body "\"printing an object\" means via **pr** not print or println", :created-at 1351128651000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :_id "542692edf6e94c6970521ff1"} {:author {:login "squiter", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/238017?v=4"}, :updated-at 1623879652487, :created-at 1623879652487, :body "The `*print-meta*` works for `print` and `pprint` after Clojure 1.10.2. Source: https://clojure.atlassian.net/browse/CLJ-1445", :_id "60ca6fe4e4b0b1e3652d750b"}], :arglists [], :doc "If set to logical true, when printing an object, its metadata will also\n be printed in a form that can be read back by the reader.\n\n Defaults to false.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*print-meta*"} {:added "1.0", :ns "clojure.core", :name "when", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1323279976000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "when-not", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aed"} {:created-at 1323279997000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "when-let", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aee"} {:created-at 1334293253000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "if", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aef"} {:created-at 1602793798332, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "boolean", :ns "clojure.core"}, :_id "5f88b146e4b0b1e3652d73e5"}], :line 493, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"} {:login "frangio", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/646001f0ba2b7df47a16c0a1d5b62225?r=PG&default=identicon"}], :body "user=> (when (= 1 1) true)\ntrue\n\nuser=> (when (not= 1 1) true)\nnil", :created-at 1279071998000, :updated-at 1325845615000, :_id "542692cec026201cdc326df2"} {:author {:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"}, :editors [{:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"} {:login "ElieLabeca", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/724e1112a2be4d5af767c0cf152d087e?r=PG&default=identicon"}], :body "user=> (def has-value (when true\n (println \"Hello World\")\n \"Returned Value\"))\nHello World\n#'user/has-value\n\nuser=> has-value\n\"Returned Value\"\n\n", :created-at 1311798084000, :updated-at 1331756178000, :_id "542692cec026201cdc326df5"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; See examples for \"if\" explaining Clojure's idea of logical true\n;; and logical false.", :created-at 1334293296000, :updated-at 1334293296000, :_id "542692d6c026201cdc3270b5"} {:body ";; When is a macro of (if .. do ..)\n\nuser=> (macroexpand '(when 1 2 3 4))\n(if 1 (do 2 3 4))\n\n;; if 1 is true, do will evaluate 2 3 4, but return values of 2 and 3 would be \n;; ignored. Value of 4 (last value) would always be returned. \n;; See https://clojuredocs.org/clojure.core/do for details\n\nuser=> (if 1 (do 2 3 4))\n4\n\n", :author {:login "nickzam", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/89377?v=3"}, :created-at 1421838215231, :updated-at 1421838215231, :_id "54bf8787e4b0e2ac61831cbe"}], :macro true, :notes nil, :arglists ["test & body"], :doc "Evaluates test. If logical true, evaluates body in an implicit do.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/when"} {:added "1.0", :ns "clojure.core", :name "int", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1333595304000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "char", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d49"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "long", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917185000, :_id "542692ebf6e94c6970521d4a"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "integer?", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917243000, :_id "542692ebf6e94c6970521d4b"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "ints", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917294000, :_id "542692ebf6e94c6970521d4c"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "int-array", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917326000, :_id "542692ebf6e94c6970521d4d"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "short", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917681000, :_id "542692ebf6e94c6970521d4e"}], :line 882, :examples [{:updated-at 1661231771832, :created-at 1280208450000, :body "user=> (int 1)\n1\n\nuser=> (int 1M)\n1\n\nuser=> (int 1.2)\n1\n\nuser=> (int \\1)\n49\n\nuser=> (int \\a)\n97\n\n;; Strings cannot be cast to an int.\nuser=> (int \"1\")\nExecution error (ClassCastException) at user/eval175 (REPL:1).\njava.lang.String cannot be cast to java.lang.Character\n\n;; Use Java interop instead\n(Integer/parseInt \"1\")\n;;=> 1\n\n;; Using JavaScript interop for ClojureScript\n(js/parseInt \"5\")\n;;=> 5\n\n(js/parseInt \"5.22\")\n;;=> 5", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"} {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"} {:avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon", :account-source "clojuredocs", :login "Ljos"} {:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"} {:avatar-url "https://avatars.githubusercontent.com/u/747125?v=4", :account-source "github", :login "metehan"} {:login "mathisto", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8226466?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon", :account-source "clojuredocs", :login "Jacolyte"}, :_id "542692cec026201cdc326d78"}], :notes [{:author {:login "jw-00000", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/2936?v=4"}, :updated-at 1529869571125, :created-at 1529869571125, :body "To convert a string containing a number to an integer, use Java's Integer/parseInt, e.g. `(Integer/parseInt \"-10\")`.", :_id "5b2ff503e4b00ac801ed9e1e"}], :arglists ["x"], :doc "Coerce to int", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/int"} {:added "1.8", :ns "clojure.core", :name "map-entry?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1602615292813, :author {:login "victoraldecoa", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/2746668?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "key", :ns "clojure.core"}, :_id "5f85f7fce4b0b1e3652d73e3"} {:created-at 1602615302919, :author {:login "victoraldecoa", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/2746668?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "val", :ns "clojure.core"}, :_id "5f85f806e4b0b1e3652d73e4"}], :line 1478, :examples [{:updated-at 1476873674402, :created-at 1476873674402, :author {:login "G1enY0ung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/15034155?v=3"}, :body "user=> (class {:a 1 :b 2})\nclojure.lang.PersistentArrayMap\n\nuser=> (class (first {:a 1 :b 2}))\nclojure.lang.MapEntry\n;; A map entry is treated as an ordered collection of key and value.\n;; https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/MapEntry.java\n\nuser=> (map-entry? (first {:a 1 :b 2}))\ntrue", :_id "58074dcae4b001179b66bdce"}], :notes nil, :arglists ["x"], :doc "Return true if x is a map entry", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/map-entry_q"} {:added "1.0", :ns "clojure.core", :name "ns-refers", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1288055172000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "ns-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a82"}], :line 4254, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [], :body "user> (ns-refers 'clojure.main)\n{sorted-map #'clojure.core/sorted-map, read-line #'clojure.core/read-line, re-pattern #'clojure.core/re-pattern, keyword? #'clojure.core/keyword?, val #'clojure.core/val, chunked-seq? #'clojure.core/chunked-seq?, *compile-path* #'clojure.core/*compile-path*, ...chop...}", :created-at 1288075058000, :updated-at 1288075058000, :_id "542692c9c026201cdc326af9"}], :notes nil, :arglists ["ns"], :doc "Returns a map of the refer mappings for the namespace.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ns-refers"} {:added "1.0", :ns "clojure.core", :name "rand", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1292321223000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rand-int", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f6a"} {:created-at 1311342603000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rand-nth", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f6b"} {:created-at 1434034912362, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:ns "clojure.core", :name "shuffle", :library-url "https://github.com/clojure/clojure"}, :_id "5579a2e0e4b03e2132e7d18c"}], :line 4911, :examples [{:author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Test `rand` never returns `n`:\nuser=> (some (partial <= 10) (take 100000 (repeatedly (fn [] (int (rand 10))))))\nnil\n", :created-at 1279658909000, :updated-at 1285497610000, :_id "542692c8c026201cdc326a0f"} {:author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :editors [], :body "user=> (rand)\n0.17469201779243182\n\nuser=> (rand 100)\n49.542391492950834", :created-at 1286329327000, :updated-at 1286329327000, :_id "542692c8c026201cdc326a11"}], :notes nil, :arglists ["" "n"], :doc "Returns a random floating point number between 0 (inclusive) and\n n (default 1) (exclusive).", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/rand"} {:added "1.0", :ns "clojure.core", :name "second", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1295238626000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "first", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b2a"} {:created-at 1303125643000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "nth", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b2b"} {:created-at 1374512098000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "fnext", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b2c"} {:created-at 1374512133000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "next", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b2d"}], :line 91, :examples [{:updated-at 1423275208669, :created-at 1279071308000, :body "user=> (second '(:alpha :bravo :charlie))\n:bravo\n\nuser=> (second [1 2 3])\n2\n\nuser=> (second {:a 1 :b 2 :c 3})\n[:b 2]\n\nuser=> (second #{1 2 3})\n2\n\nuser=> (second [1 2])\n2\n\nuser=> (second [1])\nnil\n\nuser=> (second [])\nnil\n\nuser=> (second nil)\nnil", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"} {:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"} {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/147981?v=3", :account-source "github", :login "dpritchett"}, :_id "542692c7c026201cdc326949"}], :notes [{:author {:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}, :updated-at 1520169736267, :created-at 1520169736267, :body "Synonym of `fnext`.", :_id "5a9bf308e4b0316c0f44f90b"}], :arglists ["x"], :doc "Same as (first (next x))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/second"} {:added "1.2", :ns "clojure.core", :name "vector-of", :file "clojure/gvec.clj", :type "function", :column 1, :see-alsos [{:created-at 1291951396000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vec", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c44"} {:created-at 1291951401000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vector", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c45"} {:created-at 1291951406000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vector?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c46"}], :line 484, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user=> (conj (vector-of :int) 1 2 3)\n[1 2 3] ; <-- note, these are unboxed internally\n\nuser=> (vector-of :int 1 2 3)\n[1 2 3] ; same here\n\nuser=> (type (conj (vector-of :int) 1 2 3))\nclojure.core.Vec\n", :created-at 1284711309000, :updated-at 1423523824042, :_id "542692c6c026201cdc3268d1"}], :notes [{:author {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}, :updated-at 1581663088148, :created-at 1581663088148, :body "The primary use of `vector-of` is to be space efficient. As most of Clojure deals with boxed types, boxing/unboxing will happen everytime an element is taken out/inserted.", :_id "5e464370e4b0ca44402ef838"}], :arglists ["t" "t & elements"], :doc "Creates a new vector of a single primitive type t, where t is one\n of :int :long :float :double :byte :short :char or :boolean. The\n resulting vector complies with the interface of vectors in general,\n but stores the values unboxed internally.\n\n Optionally takes one or more elements to populate the vector.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/vector-of"} {:ns "clojure.core", :name "hash-combine", :file "clojure/core_deftype.clj", :type "function", :column 1, :see-alsos nil, :line 126, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Calculates the hashes for x and y and produces a new hash that represents\n;; the combination of the two.\n\nuser=> (hash-combine 100 \"a\")\n-1640524969\n", :created-at 1280320404000, :updated-at 1285496804000, :_id "542692cdc026201cdc326d1e"}], :notes nil, :arglists ["x y"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/hash-combine"} {:added "1.0", :ns "clojure.core", :name ">", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1291975136000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "=", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c4f"} {:created-at 1291975141000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "not=", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c50"} {:created-at 1291975147000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "<", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c51"}], :line 1070, :examples [{:author {:login "mattdw", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ee24aacb65359196b0a1bad050f9a62f?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "Iceland_jack", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c889e0a95a3bb07f90ab28ad442f1127?r=PG&default=identicon"}], :body "user=> (> 1 2)\nfalse\nuser=> (> 2 1)\ntrue\nuser=> (> 2 2)\nfalse\nuser=> (> 6 5 4 3 2)\ntrue\nuser=> (sort > (vals {:foo 5, :bar 2, :baz 10}))\n(10 5 2)", :created-at 1280322039000, :updated-at 1340813399000, :_id "542692ccc026201cdc326c96"}], :notes nil, :arglists ["x" "x y" "x y & more"], :doc "Returns non-nil if nums are in monotonically decreasing order,\n otherwise false.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/>"} {:added "1.0", :ns "clojure.core", :name "replace", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1281451180000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.walk", :name "prewalk-replace", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dc2"} {:created-at 1281451198000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.walk", :name "postwalk-replace", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dc3"} {:created-at 1385849073000, :author {:login "Alexey Tarasevich", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/43e0398b89022d32b43de4c968069312?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dc4"} {:created-at 1439523160945, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "replace", :ns "clojure.string"}, :_id "55cd6158e4b072d7f27980e7"}], :line 5058, :examples [{:updated-at 1670326100220, :created-at 1280289240000, :body ";; Vectors in the first argument are implicitly treated like maps\n;; from zero-based indexes to values so this is equivalent to\n;;\n;; (replace {0 :zeroth, 1 :first, 2 :second, 3 :third, 4 :fourth} [0 2 4 0])\nuser=> (replace [:zeroth :first :second :third :fourth] [0 2 4 0])\n[:zeroth :second :fourth :zeroth]\n\nuser=> (replace [10 9 8 7 6] [0 2 4])\n[10 8 6]", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/c889e0a95a3bb07f90ab28ad442f1127?r=PG&default=identicon", :account-source "clojuredocs", :login "Iceland_jack"} {:avatar-url "https://www.gravatar.com/avatar/c889e0a95a3bb07f90ab28ad442f1127?r=PG&default=identicon", :account-source "clojuredocs", :login "Iceland_jack"} {:login "agnul", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7526067?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/2c8ecc24181d171df85a26458b9cd5f?r=PG&default=identicon", :account-source "clojuredocs", :login "jneira"}, :_id "542692cbc026201cdc326bca"} {:author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=2"}, :editors [{:login "Iceland_jack", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c889e0a95a3bb07f90ab28ad442f1127?r=PG&default=identicon"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user=> (replace {2 :two, 4 :four} [4 2 3 4 5 6 2])\n[:four :two 3 :four 5 6 :two]\n\nuser=> (replace '{0 ZERO, 1 ONE, 2 TWO} '(This is the code 0 1 2 0))\n(This is the code ZERO ONE TWO ZERO)", :created-at 1305078367000, :updated-at 1423093999544, :_id "542692cbc026201cdc326bce"} {:author {:login "Alexey Tarasevich", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/43e0398b89022d32b43de4c968069312?r=PG&default=identicon"}, :editors [], :body "; Behaves somewhat similar to map, but notice the differences\nuser=> (map [:zeroth :first :second :third :fourth] [0 2 4 0])\n(:zeroth :second :fourth :zeroth)\n\n; 1. replace returns a vector, while map returns a seq\n; 2. replace keeps unmatched values, while map replace with nil\nuser=> (map {} [0])\n(nil)\nuser=> (map [] [0])\nIndexOutOfBoundsException clojure.lang.PersistentVector.arrayFor (PersistentVector.java:107)\n", :created-at 1385849488000, :updated-at 1385849488000, :_id "542692d5c026201cdc327071"} {:updated-at 1472236519899, :created-at 1472236519899, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body "user=> (replace {2 :a, 4 :b} [1 2 3 4])\n;;=> [1 :a 3 :b]", :_id "57c08be7e4b0709b524f04d5"} {:updated-at 1517940922527, :created-at 1517935073686, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; On hash-maps:\n\n(def user {:name \"jack\" :city \"London\" :id 123})\n(defn entry [k v] (clojure.lang.MapEntry/create k v))\n(def sub {(entry :city \"London\") [:postcode \"WD12\"]})\n\n(into {} (replace sub user))\n;; {:name \"jack\", :postcode \"WD12\", :id 123}", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5a79d9e1e4b0e2d9c35f741b"}], :notes [{:updated-at 1280289719000, :body "The behaviour for vectors was a little strange for me. I'd say replace \"selects\" from \"smap\" the indexes which are in \"coll\"", :created-at 1280289719000, :author {:login "jneira", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2c8ecc24181d171df85a26458b9cd5f?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f92"}], :arglists ["smap" "smap coll"], :doc "Given a map of replacement pairs and a vector/collection, returns a\n vector/seq with any elements = a key in smap replaced with the\n corresponding val in smap. Returns a transducer when no collection\n is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/replace"} {:added "1.9", :ns "clojure.core", :name "int?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495654441434, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "integer?", :ns "clojure.core"}, :_id "5925e029e4b093ada4d4d73c"} {:created-at 1495654448767, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "number?", :ns "clojure.core"}, :_id "5925e030e4b093ada4d4d73d"} {:created-at 1495654503504, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pos-int?", :ns "clojure.core"}, :_id "5925e067e4b093ada4d4d73e"} {:created-at 1495654510856, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "neg-int?", :ns "clojure.core"}, :_id "5925e06ee4b093ada4d4d73f"} {:created-at 1495654522385, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nat-int?", :ns "clojure.core"}, :_id "5925e07ae4b093ada4d4d740"}], :line 1400, :examples [{:editors [{:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}], :body ";; Note that this will return true for things which aren't strictly Java ints:\n(int? 42) \n;; => true\n\n(int? (java.lang.Integer. 42)) \n;; => true\n\n(int? (java.lang.Long. 42)) \n;; => true\n\n(int? 42.0)\n;; => false\n\n(int? (bigdec 42))\n;; => false\n\n;; The distinction between int? and integer? is that integer? will return true \n;; for BigInts:\n\n(int? (bigint 42)) \n;; => false\n\n(integer? (bigint 42)) \n;; => true\n\n(int? java.math.BigInteger/ONE)\n;; => false\n\n(integer? java.math.BigInteger/ONE)\n;; => true\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/94482?v=3", :account-source "github", :login "timgilbert"}, :created-at 1495654364949, :updated-at 1495655962185, :_id "5925dfdce4b093ada4d4d73a"} {:editors [{:login "liuchong", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/236058?v=4"}], :body ";; Here is the definition, it's simple (and 呵呵哒):\n;;\n;; (defn int?\n;; \"Return true if x is a fixed precision integer\"\n;; {:added \"1.9\"}\n;; [x] (or (instance? Long x)\n;; (instance? Integer x)\n;; (instance? Short x)\n;; (instance? Byte x)))\n;;\n\n(int? (Long/MAX_VALUE))\n;; => true\n\n(int? (Long/MIN_VALUE))\n;; => true\n\n(int? 0.0)\n;; => false", :author {:avatar-url "https://avatars2.githubusercontent.com/u/236058?v=4", :account-source "github", :login "liuchong"}, :created-at 1572414469669, :updated-at 1572414534344, :_id "5db92405e4b0ca44402ef7d5"}], :notes nil, :arglists ["x"], :doc "Return true if x is a fixed precision integer", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/int_q"} {:added "1.0", :ns "clojure.core", :name "associative?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1570520657017, :author {:login "xmo-odoo", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/7571158?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "assoc", :ns "clojure.core"}, :_id "5d9c3e51e4b0ca44402ef7c5"} {:created-at 1570520665970, :author {:login "xmo-odoo", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/7571158?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "assoc-in", :ns "clojure.core"}, :_id "5d9c3e59e4b0ca44402ef7c6"} {:created-at 1570520672069, :author {:login "xmo-odoo", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/7571158?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "update", :ns "clojure.core"}, :_id "5d9c3e60e4b0ca44402ef7c7"} {:created-at 1570520678789, :author {:login "xmo-odoo", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/7571158?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "update-in", :ns "clojure.core"}, :_id "5d9c3e66e4b0ca44402ef7c8"}], :line 6244, :examples [{:author {:login "Clinton", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e460563f35b0b25d8671d6ef83f54ce?r=PG&default=identicon"}, :editors [], :body "user=> (associative? [1 2 3]) ; vector\ntrue\nuser=> (associative? '(1 2 3)) ; list\nfalse\nuser=> (associative? {:a 1 :b 2}) ; map\ntrue\nuser=> (associative? #{:a :b :c}) ; set\nfalse\nuser=> (associative? \"fred\") ; string\nfalse\n", :created-at 1327061297000, :updated-at 1327061297000, :_id "542692d2c026201cdc326f4d"}], :notes nil, :arglists ["coll"], :doc "Returns true if coll implements Associative", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/associative_q"} {:added "1.3", :ns "clojure.core", :name "unchecked-int", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1496090254478, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "int", :ns "clojure.core"}, :_id "592c868ee4b093ada4d4d79f"}], :line 3534, :examples [{:updated-at 1496090244589, :created-at 1496090244589, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body "(unchecked-int 1)\n;;=> 1\n(unchecked-int 1N)\n;;=> 1\n(unchecked-int 1.1)\n;;=> 1\n(unchecked-int 1.9)\n;;=> 1\n(unchecked-int 5/3)\n;;=> 1\n\n(unchecked-int -1)\n;;=> -1\n(unchecked-int -1N)\n;;=> -1\n(unchecked-int -1.1)\n;;=> -1\n(unchecked-int -1.9)\n;;=> -1\n(unchecked-int -5/3)\n;;=> -1\n\n;;;; Note that (unchecked-int) does not range check its argument\n;;;; so integer overflow or rounding may occur. \n;;;; Use (int) if you want to throw an exception in such cases.\n\n(unchecked-int 2147483648)\n;;=> -2147483648\n(unchecked-int -2147483649)\n;;=> 2147483647\n\n(int 2147483648)\n;;=> IllegalArgumentException Value out of range for int: 2147483648\n(long -2147483649)\n;;=> IllegalArgumentException Value out of range for int: -2147483649\n\n(unchecked-int 1.0E9)\n;;=> 1000000000\n(unchecked-int 1.0E10)\n;;=> 2147483647\n(unchecked-int 1.0E11)\n;;=> 2147483647\n\n(int 1.0E9)\n;;=> 1000000000\n(int 1.0E10)\n;;=> IllegalArgumentException Value out of range for int: 1.0E10\n(int 1.0E11)\n;;=> IllegalArgumentException Value out of range for int: 1.0E11", :_id "592c8684e4b093ada4d4d79e"}], :notes nil, :arglists ["x"], :doc "Coerce to int. Subject to rounding or truncation.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-int"} {:added "1.2", :ns "clojure.core", :name "set-error-handler!", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1287220602000, :author {:login "hugoduncan", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/80fa2a15219b987664e4d6f5c78b4c27?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "agent", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c1e"} {:created-at 1287220615000, :author {:login "hugoduncan", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/80fa2a15219b987664e4d6f5c78b4c27?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "agent-error", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c1f"} {:created-at 1329375224000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "restart-agent", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c20"}], :line 2194, :examples [{:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [{:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"} {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"} {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}], :body "(def bond (agent 7))\n\n(defn err-handler-fn [ag ex]\n (println \"evil error occured: \" ex \" and we still have value \" @ag))\n\n(set-error-handler! bond err-handler-fn)\n\n;;division by zero:\n\n(send bond (fn [x] (/ x 0)))\n=>evil error occured: #Divide by zero> and we still have value 7\n\n(send bond inc)\n=>FAILURE ;;Agent is failed, needs restart, but keeps the last OK value\n\n@bond\n=>7\n\n(restart-agent bond 7) ;; or replace 7 with @ag\n\n(send bond inc)\n=># ;;because of async update\n\n@bond\n=>8\n", :created-at 1329375108000, :updated-at 1329375308000, :_id "542692d5c026201cdc32707d"} {:updated-at 1497900465897, :created-at 1497900465897, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/7083783?v=3"}, :body "(deftest t-rstart\n (future (println \"running in a thread...\"))\n (let [agt (agent 0)\n\n ; This doesn't work\n h01 (fn [a e]\n (println :10 \"agent error found:\" )\n (println :11 \"restarting agent...\")\n (restart-agent a 100)\n (Thread/sleep 100)\n (println :12 \"agent restarted, state=\" @a))\n\n ; This works. Need to call restart-agent in a separate thread\n h02 (fn [a e]\n (println :20 \"agent error found:\" )\n (future\n (println :21 \"restarting agent...\")\n (restart-agent a 200)\n (println :22 \"agent restarted, state=\" @a))) ;=> 200\n ]\n (set-error-handler! agt h02)\n (send agt inc)\n (Thread/sleep 100) (println :01 @agt) ;=> 1\n (Thread/sleep 100) (send agt #(/ % 0))\n (Thread/sleep 100) (println :02 @agt) ;=> 200\n (Thread/sleep 100) (send agt inc)\n (Thread/sleep 100) (println :03 @agt) ;=> 201\n))\n\n; Output\n; running in a thread...\n; :01 1\n; :20 agent error found:\n; :21 restarting agent...\n; :22 agent restarted, state= 200\n; :02 200\n; :03 201", :_id "594825b1e4b06e730307db3c"}], :notes nil, :arglists ["a handler-fn"], :doc "Sets the error-handler of agent a to handler-fn. If an action\n being run by the agent throws an exception or doesn't pass the\n validator fn, handler-fn will be called with two arguments: the\n agent and the exception.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/set-error-handler!"} {:ns "clojure.core", :name "inst-ms*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["inst"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core/inst-ms*"} {:added "1.0", :ns "clojure.core", :name "keyword?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1495715288280, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "simple-keyword?", :ns "clojure.core"}, :_id "5926cdd8e4b093ada4d4d761"} {:created-at 1495715310898, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "qualified-keyword?", :ns "clojure.core"}, :_id "5926cdeee4b093ada4d4d763"} {:created-at 1548518287990, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "keyword", :ns "clojure.core"}, :_id "5c4c838fe4b0ca44402ef637"}], :line 568, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"} {:login "borkdude", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/284934?v=4"}], :body "(keyword? 'x)\n;;=> false\n\n(keyword? :x)\n;;=> true\n\n(keyword? true)\n;;=> false\n\n;; Note: some of the keywords below are non-conformant and will not work\n;; with destructuring. For more info see 'keyword'.\n\n(keyword? :-)\n;;=> true\n\n(keyword? :+)\n;;=> true\n\n(keyword? :-o)\n;;=> true\n\n(keyword? :')\n;;=> true\n\n(keyword? :#)\n;;=> true\n\n(keyword? :)\n;;=> true\n\n(keyword? :'/-)\n;;=> true\n\n(keyword? :'//-)\n;;=> true\n\n(keyword? :////)\n;;=> true\n\n(keyword? :'//-,)\n;;=> true\n\n(keyword? :'//,-)\n;;=> ArityException Wrong number of args (2) passed to: core/keyword? clojure.lang.AFn.throwArity (AFn.java:429)\n;; Note: the comma is taken as space, so the code above is equivalent to\n(keyword? :'// -)\n\n(keyword? :-:)\n;;=> RuntimeException Invalid token: :-: clojure.lang.Util.runtimeException (Util.java:221)\n;;=> RuntimeException Unmatched delimiter: ) clojure.lang.Util.runtimeException (Util.java:221)\n;; https://clojure.org/reference/reader states:\n;; \"Symbols beginning or ending with ':' are reserved by Clojure.\"\n\n(keyword? :-:-)\n;;=> true\n;; https://clojure.org/reference/reader states:\n;; \"A symbol can contain one or more non-repeating ':'s\" and:\n;; \"Keywords are like symbols, [...]\"\n\n(keyword? :....)\n;;=> true\n\n(keyword? :,,,,)\n;;=> RuntimeException Invalid token: : clojure.lang.Util.runtimeException (Util.java:221)\n;;=> RuntimeException Unmatched delimiter: ) clojure.lang.Util.runtimeException (Util.java:221)\n;; Note: the comma is taken as space, so the code above is equivalent to\n(keyword? : )\n\n(keyword? :a:b:c)\n;;=> true\n\n(keyword? :a.b.c)\n;;=> true\n\n(keyword? :73)\n;;=> true\n\n", :created-at 1279074168000, :updated-at 1551304081227, :_id "542692c6c026201cdc3268cc"}], :notes nil, :arglists ["x"], :doc "Return true if x is a Keyword", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/keyword_q"} {:added "1.0", :ns "clojure.core", :name "force", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1342465196000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "delay", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d92"}], :line 761, :examples [{:author {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}, :editors [{:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}], :body ";; an example for delay using an event-queue\nuser> (import [java.util.concurrent PriorityBlockingQueue])\njava.util.concurrent.PriorityBlockingQueue\nuser> (defn create-event-element [delayed-event tme]\n (struct event delayed-event tme))\n#'user/create-event-element\nuser> (defn comp-queue [e1 e2]\n (if (< (:time e1) (:time e2))\n true false))\n#'user/comp-queue\nuser> (defn update [n]\n\t(reset! c n))\n#'user/update\nuser> (defn create-event-queue [comp-queue size]\n (new PriorityBlockingQueue size (comp comp-queue)))\n#'user/create-event-queue\nuser> (def queue (create-event-queue comp-queue 10))\n#'user/queue\nuser> (def elements (take 10 (repeatedly \n\t\t\t (fn[](create-event-element \n\t\t\t\t (delay (update (rand-int 20)))\n\t\t\t\t (rand))))))\n#'user/elements\nuser> (def c (atom 0))\n#'user/c\nuser> @c\n0\nuser> (doseq [e elements]\n\t (.add queue e))\nnil\nuser> (dotimes [_ 10]\n\t (let [e (.poll queue)]\n\t\t (println \"c=\" @c)\n\t\t (print \"time=\" (:time e) \":\")\n\t\t (println (force (:object e)))))\nc= 0\ntime= 0.07805244345581108 :19\nc= 19\ntime= 0.24297414417455565 :6\nc= 6\ntime= 0.24427040715816817 :0\nc= 0\ntime= 0.24938478920862384 :17\nc= 17\ntime= 0.33612588239752494 :6\nc= 6\ntime= 0.5148481493716295 :5\nc= 5\ntime= 0.5823642080700586 :7\nc= 7\ntime= 0.7674970100941858 :4\nc= 4\ntime= 0.9206272921555505 :14\nc= 14\ntime= 0.9958255204018474 :4\nnil\nuser> @c\n4\nuser> (def elements (take 10 (repeatedly \n\t\t\t (fn[](create-event-element \n\t\t\t\t (delay (update (rand-int 20)))\n\t\t\t\t (rand))))))\n#'user/elements\n;; if we check 'element', delay objects will be evaluated. The below is\n;; this example. Please compare the above with the below.\nuser> elements \n({:object #, :time 0.48566816399656854} {:object #, :time 0.9374202154797486} {:object #, :time 0.3271116626875401} {:object #, :time 0.8843712542267577} {:object #, :time 0.86383171974926} {:object #, :time 0.2120086056700251} {:object #, :time 0.9406336968276247} {:object #, :time 0.2150071400135528} {:object #, :time 0.7520042839572664} {:object #, :time 0.6264819751284463})\n;; The object of the last elements is #. Therefore,\n;; This indicates the atom 'c' has already updated.\nuser> @c \n1 \nuser> (doseq [e elements]\n\t (.add queue e))\nnil\n;; 'atom c' has never been updated because it has already\n;; been evaluated.\nuser> (dotimes [_ 10]\n\t (let [e (.poll queue)]\n\t\t (println \"c=\" @c)\n\t\t (print \"time=\" (:time e) \":\")\n\t\t (println (force (:object e)))))\nc= 1\ntime= 0.2120086056700251 :14\nc= 1\ntime= 0.2150071400135528 :0\nc= 1\ntime= 0.3271116626875401 :17\nc= 1\ntime= 0.48566816399656854 :16\nc= 1\ntime= 0.6264819751284463 :1\nc= 1\ntime= 0.7520042839572664 :7\nc= 1\ntime= 0.86383171974926 :10\nc= 1\ntime= 0.8843712542267577 :15\nc= 1\ntime= 0.9374202154797486 :19\nc= 1\ntime= 0.9406336968276247 :5\nnil\nuser> ", :created-at 1308852117000, :updated-at 1308852376000, :_id "542692cdc026201cdc326ce6"} {:author {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}, :editors [{:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}], :body ";; the tarai benchmark comparing non-lazy version with lazy-version\n(defn tarai [x y z]\n (if (<= (x) (y))\n (y)\n (recur (fn [] (tarai (fn [] (- (x) 1)) y z))\n (fn [] (tarai (fn [] (- (y) 1)) z x))\n (fn [] (tarai (fn [] (- (z) 1)) x y)))))\n\n(defn tarai-d [x y z]\n (if (<= (force x) (force y))\n (force y)\n (recur (delay (tarai-d (- (force x) 1) y z))\n (delay (tarai-d (- (force y) 1) z x))\n (delay (tarai-d (- (force z) 1) x y)))))\n\nuser> (dotimes [_ 10] (time (tarai (fn [] 192) (fn [] 96) (fn [] 0))))\n\"Elapsed time: 139.660729 msecs\"\n\"Elapsed time: 132.493587 msecs\"\n\"Elapsed time: 135.867772 msecs\"\n\"Elapsed time: 132.924774 msecs\"\n\"Elapsed time: 137.491084 msecs\"\n\"Elapsed time: 134.72752 msecs\"\n\"Elapsed time: 132.969652 msecs\"\n\"Elapsed time: 135.795754 msecs\"\n\"Elapsed time: 134.261724 msecs\"\n\"Elapsed time: 138.059968 msecs\"\n\nnil\nuser> (dotimes [_ 10 ] (time (tarai-d 192 96 0)))\n\"Elapsed time: 3.181795 msecs\"\n\"Elapsed time: 2.960096 msecs\"\n\"Elapsed time: 3.000855 msecs\"\n\"Elapsed time: 3.140536 msecs\"\n\"Elapsed time: 3.658821 msecs\"\n\"Elapsed time: 3.319659 msecs\"\n\"Elapsed time: 2.9182 msecs\"\n\"Elapsed time: 3.125442 msecs\"\n\"Elapsed time: 2.944342 msecs\"\n\"Elapsed time: 2.951613 msecs\"\nnil", :created-at 1308905934000, :updated-at 1308906319000, :_id "542692cdc026201cdc326ce9"} {:updated-at 1564512316203, :created-at 1564511910921, :author {:login "jordangedney", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/5439697?v=4"}, :body ";; Similarly to deref/@ you can evaluate a delay using force\n\nuser> (def new-delay (delay (println \"I only print once\") 5))\n#'user/new-delay\n\nuser> (force new-delay)\nI only print once\n5\n\nuser> (force new-delay)\n5\n\n;; force works with expressions other than delays: \n\nuser> (force (println \"\\\\O\"))\n\\O\nnil\n\nuser> (force :field)\n:field", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/5439697?v=4", :account-source "github", :login "jordangedney"}], :_id "5d408ea6e4b0ca44402ef78d"}], :notes nil, :arglists ["x"], :doc "If x is a Delay, returns the (possibly cached) value of its expression, else returns x", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/force"} {:added "1.1", :ns "clojure.core", :name "bound-fn*", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1350609405000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bound-fn", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e82"}], :line 1994, :examples [{:author {:login "metajack", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/194d8437f5baed192c90be27369c4922?r=PG&default=identicon"}, :editors [], :body "(def ^:dynamic *some-var* nil)\n\n(defn f [] (println *some-var*))\n\n;; run f without a new binding\nuser=> (f)\nnil\nnil\n\n;; run f with a new binding\nuser=> (binding [*some-var* \"hello\"]\n (f))\nhello\nnil\n\n;; run f in a thread with a new binding\nuser=> (binding [*some-var* \"goodbye\"]\n (.start (Thread. f)))\nnil\nnil\n\n;; run a bound f in a thread with a new binding\nuser=> (binding [*some-var* \"goodbye\"]\n (.start (Thread. (bound-fn* f))))\ngoodbye\nnil\n", :created-at 1331769960000, :updated-at 1331769960000, :_id "542692d2c026201cdc326f5d"} {:updated-at 1613596413856, :created-at 1613596413856, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :body ";; Capture thread local bindings so the lazy sequence can realize outside\n;; the binding block\n\n(def ^:dynamic *a* nil)\n\n(binding [*a* 1] (map #(+ % *a*) (range 10)))\n;; NullPointerException clojure.lang.Numbers.ops (Numbers.java:1013)\n\n(binding [*a* 1] (map (bound-fn* #(+ % *a*)) (range 10)))\n;; (1 2 3 4 5 6 7 8 9 10)\n", :_id "602d86fde4b0b1e3652d7456"}], :notes nil, :arglists ["f"], :doc "Returns a function, which will install the same bindings in effect as in\n the thread at the time bound-fn* was called and then call f with any given\n arguments. This may be used to define a helper function which runs on a\n different thread, but needs the same bindings in place.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bound-fn*"} {:added "1.2", :ns "clojure.core", :name "namespace-munge", :file "clojure/core_deftype.clj", :type "function", :column 1, :see-alsos [{:created-at 1559582586002, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "munge", :ns "clojure.core"}, :_id "5cf5577ae4b0ca44402ef747"}], :line 13, :examples [{:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";;; replace \"-\" to \"_\" (this is the only conversion this fn does)\nuser=> (namespace-munge \"hello-world\")\n\"hello_world\"", :author {:avatar-url "https://avatars.githubusercontent.com/u/932074?v=3", :account-source "github", :login "redraiment"}, :created-at 1487211126912, :updated-at 1683030639215, :_id "58a50a76e4b01f4add58fe58"}], :notes nil, :arglists ["ns"], :doc "Convert a Clojure namespace name to a legal Java package name.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/namespace-munge"} {:added "1.2", :ns "clojure.core", :name "group-by", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1318588913000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "partition-by", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bf8"} {:created-at 1332443915000, :author {:login "Cosmi", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10f2eae92de67116fa98d06ec55fcf29?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "frequencies", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bf9"}], :line 7146, :examples [{:author {:login "mvonrohr", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/59714f4428e8ef53b809ee923203531?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; group strings by their length\n(group-by count [\"a\" \"as\" \"asd\" \"aa\" \"asdf\" \"qwer\"])\n;;=> {1 [\"a\"], 2 [\"as\" \"aa\"], 3 [\"asd\"], 4 [\"asdf\" \"qwer\"]}\n\n;; group integers by a predicate\n(group-by odd? (range 10))\n;;=> {false [0 2 4 6 8], true [1 3 5 7 9]}\n", :created-at 1279083015000, :updated-at 1420742429526, :_id "542692cdc026201cdc326cd2"} {:author {:login "Brool", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/781c0e32be2a2f7117dabd76a3fb7c3?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "uvtc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/34f159f89cbd1d9beac0276f5a7af552?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; group by a primary key\n(group-by :user-id [{:user-id 1 :uri \"/\"} \n {:user-id 2 :uri \"/foo\"} \n {:user-id 1 :uri \"/account\"}])\n\n;;=> {1 [{:user-id 1, :uri \"/\"} \n;; {:user-id 1, :uri \"/account\"}],\n;; 2 [{:user-id 2, :uri \"/foo\"}]}\n", :created-at 1285069474000, :updated-at 1420742470832, :_id "542692cdc026201cdc326cd4"} {:editors [{:login "Canna71", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5303303?v=3"}], :body ";; group by multiple criteria\n(def words [\"Air\" \"Bud\" \"Cup\" \"Awake\" \"Break\" \"Chunk\" \"Ant\" \"Big\" \"Check\"])\n(group-by (juxt first count) words)\n\n;;{[\\A 3] [\"Air\" \"Ant\"], \n;;[\\B 3] [\"Bud\" \"Big\"], \n;;[\\C 3] [\"Cup\"], \n;;[\\A 5] [\"Awake\"], \n;;[\\B 5] [\"Break\"], \n;;[\\C 5] [\"Chunk\" \"Check\"]}", :author {:avatar-url "https://avatars.githubusercontent.com/u/5303303?v=3", :account-source "github", :login "Canna71"}, :created-at 1471771939875, :updated-at 1471772272493, :_id "57b97523e4b0709b524f04cf"} {:updated-at 1486507759173, :created-at 1486507759173, :author {:login "pavanred", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/60858?v=3"}, :body "user=> (group-by :category [{:category \"a\" :id 1}\n {:category \"a\" :id 2}\n {:category \"b\" :id 3}])\n;;{\"a\" [{:category \"a\", :id 1} {:category \"a\", :id 2}], \n;; \"b\" [{:category \"b\", :id 3}]}\n\nuser=> (group-by #(get % :category) [{:category \"a\" :id 1}\n {:category \"a\" :id 2}\n {:category \"b\" :id 3}])\n;;{\"a\" [{:category \"a\", :id 1} {:category \"a\", :id 2}], \n;; \"b\" [{:category \"b\", :id 3}]}\n\nuser=> (defn my-category [item] (get item :category))\n;;#'user/my-category\n\nuser=> (group-by my-category [{:category \"a\" :id 1}\n {:category \"a\" :id 2}\n {:category \"b\" :id 3}])\n;;{\"a\" [{:category \"a\", :id 1} {:category \"a\", :id 2}], \n;; \"b\" [{:category \"b\", :id 3}]}\n", :_id "589a4eefe4b01f4add58fe3f"} {:updated-at 1528069898970, :created-at 1528069898970, :author {:login "statcompute", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/4590938?v=4"}, :body "(require '[ultra-csv.core :refer [read-csv]])\n \n(def ds (read-csv \"/home/liuwensui/Downloads/nycflights.csv\"))\n \n(map\n (fn [x] {:year (first (key x))\n :month (last (key x))\n :flights (count (val x))})\n (group-by (juxt :year :month) ds))", :_id "5b147f0ae4b00ac801ed9e0b"} {:editors [{:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}], :body ";; Find anagrams\n(def words [\"meat\" \"mat\" \"team\" \"mate\" \"eat\" \"tea\"])\n\n(group-by set words)\n;;=> {#{\\a \\e \\m \\t} [\"meat\" \"team\" \"mate\"],\n;; #{\\a \\m \\t} [\"mat\"], \n;; #{\\a \\e \\t} [\"eat\" \"tea\"]}\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4", :account-source "github", :login "MicahElliott"}, :created-at 1581460975386, :updated-at 1581461174115, :_id "5e432defe4b0ca44402ef830"}], :notes nil, :arglists ["f coll"], :doc "Returns a map of the elements of coll keyed by the result of\n f on each element. The value at each key will be a vector of the\n corresponding elements, in the order they appeared in coll.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/group-by"} {:added "1.0", :ns "clojure.core", :name "prn", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1290672937000, :author {:login "dale", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a7a1eca257c6cea943fea41e5cc3e9a3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "println", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cc3"} {:created-at 1291028040000, :author {:login "dale", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a7a1eca257c6cea943fea41e5cc3e9a3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pr", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cc4"}], :line 3714, :examples [{:updated-at 1402400103000, :created-at 1335592532000, :body "user=> (prn \"fred\" 1)\n\"fred\" 1\nnil\n\nuser=> (def items [ \"hello\" :a 1 (list :b 2) \\c {:d 4} #{5 6 7} ])\n#'user/items\n\n; prn outputs items in a machine-readable format, such as in a source\n; file. Note the double-quotes around the string \"hello\" and the escaped letter \"c\".\nuser=> (prn items)\n[\"hello\" :a 1 (:b 2) \\c {:d 4} #{5 6 7}]\nnil\n\n; println is for human-readable output, like a report. Note the lack of quotes around the string \"hello\", and the unescaped letter \"c\". \nuser=> (println items)\n[hello :a 1 (:b 2) c {:d 4} #{5 6 7}]\nnil\n\n; pr-str produces a string with escaped punctuation, so that println yields the same result as the original prn call.\nuser=> (println (pr-str items))\n[\"hello\" :a 1 (:b 2) \\c {:d 4} #{5 6 7}]\nnil\n\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon", :account-source "clojuredocs", :login "cloojure"} {:avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon", :account-source "clojuredocs", :login "cloojure"} {:avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon", :account-source "clojuredocs", :login "cloojure"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692d4c026201cdc32703b"}], :notes nil, :arglists ["& more"], :doc "Same as pr followed by (newline). Observes *flush-on-newline*", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/prn"} {:added "1.2", :ns "clojure.core", :name "extend", :file "clojure/core_deftype.clj", :type "function", :column 1, :see-alsos [{:created-at 1326611307000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "satisfies?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e53"} {:created-at 1326611311000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "extends?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e54"} {:created-at 1326611316000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "extenders", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e55"} {:created-at 1394618470000, :author {:login "Chort409", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/73da2cf9145cfb9c900b31436ee435a6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "extend-type", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e56"} {:created-at 1394618476000, :author {:login "Chort409", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/73da2cf9145cfb9c900b31436ee435a6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "extend-protocol", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e57"}], :line 768, :examples [{:author {:login "semperos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/edeae8e7534b3d554e4ec2c35ffc68d?r=PG&default=identicon"}, :editors [{:login "semperos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/edeae8e7534b3d554e4ec2c35ffc68d?r=PG&default=identicon"}], :body "; From Sean Devlin's talk on protocols at Clojure Conj\n(defprotocol Dateable\n (to-ms [t]))\n\n(extend java.lang.Number\n Dateable\n {:to-ms identity})\n\n(extend java.util.Date\n Dateable\n {:to-ms #(.getTime %)})\n\n(extend java.util.Calendar\n Dateable\n {:to-ms #(to-ms (.getTime %))})", :created-at 1296704103000, :updated-at 1296705296000, :_id "542692c7c026201cdc3269d3"} {:updated-at 1542060365406, :created-at 1542060009207, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; \"extend\" enables the definition of concrete implementations\n;; after declaration time. This provides \n;; a lightweight version of abstract methods/classes.\n\n(defprotocol IBaz\n (foo [_])\n (bar [_])\n (baz [_]))\n\n;; DefaultBaz contains some default implementations.\n(def DefaultBaz\n {:foo (fn [_] (str \"DefaultBaz::foo\"))\n :bar (fn [_] (str \"DefaultBaz::bar\"))})\n\n(defrecord MyBaz [])\n\n;; MyBaz accepts \"bar\" as default from the \"super-class\"\n;; but overrides \"foo\". \"baz\" is provided without override.\n(extend MyBaz\n IBaz\n (assoc DefaultBaz \n :foo (fn [this] (str \"MyBaz::foo\"))\n :baz (fn [this] (str \"MyBaz::baz\"))))\n\n(def my-baz (->MyBaz))\n(foo my-baz)\n;; \"MyBaz::foo\"\n\n;; Note: additional \"extend-*\" calls will change all instances\n;; created so far.\n\n(extend-type MyBaz\n IBaz\n (foo [this] (str \"NEW\")))\n\n(foo my-baz)\n;; \"NEW\"", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5be9f7e9e4b00ac801ed9ef3"}], :notes nil, :arglists ["atype & proto+mmaps"], :doc "Implementations of protocol methods can be provided using the extend construct:\n\n (extend AType\n AProtocol\n {:foo an-existing-fn\n :bar (fn [a b] ...)\n :baz (fn ([a]...) ([a b] ...)...)}\n BProtocol \n {...} \n ...)\n \n extend takes a type/class (or interface, see below), and one or more\n protocol + method map pairs. It will extend the polymorphism of the\n protocol's methods to call the supplied methods when an AType is\n provided as the first argument. \n\n Method maps are maps of the keyword-ized method names to ordinary\n fns. This facilitates easy reuse of existing fns and fn maps, for\n code reuse/mixins without derivation or composition. You can extend\n an interface to a protocol. This is primarily to facilitate interop\n with the host (e.g. Java) but opens the door to incidental multiple\n inheritance of implementation since a class can inherit from more\n than one interface, both of which extend the protocol. It is TBD how\n to specify which impl to use. You can extend a protocol on nil.\n\n If you are supplying the definitions explicitly (i.e. not reusing\n exsting functions or mixin maps), you may find it more convenient to\n use the extend-type or extend-protocol macros.\n\n Note that multiple independent extend clauses can exist for the same\n type, not all protocols need be defined in a single extend call.\n\n See also:\n extends?, satisfies?, extenders", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/extend"} {:added "1.0", :ns "clojure.core", :name "unchecked-multiply", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1423522441619, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "*", :library-url "https://github.com/clojure/clojure"}, :_id "54d93a89e4b081e022073c76"} {:created-at 1423522447793, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "*'", :library-url "https://github.com/clojure/clojure"}, :_id "54d93a8fe4b0e2ac61831d31"}], :line 1226, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "kentros", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/765acc548dfd021fd854d75f9da3d0a9?r=PG&default=identicon"}], :body ";; the unchecked-multiply function silently overflows\n\nuser=> (* 1000000000000 10)\n10000000000000\nuser=> (unchecked-multiply 1000000000000 10)\n10000000000000\n\nuser=> (* 3037000500 3037000500)\nArithmeticException integer overflow clojure.lang.Numbers.throwIntOverflow (Numbers.java:1424)\nuser=> (unchecked-multiply 3037000500 3037000500)\n-9223372036709301616\n\n", :created-at 1313910992000, :updated-at 1407321150000, :_id "542692c6c026201cdc326917"}], :notes nil, :arglists ["x y"], :doc "Returns the product of x and y, both long.\n Note - uses a primitive operator subject to overflow.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-multiply"} {:added "1.5", :ns "clojure.core", :name "some->>", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1412083996468, :author {:login "jw-00000", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2936?v=2"}, :to-var {:ns "clojure.core", :name "->>", :library-url "https://github.com/clojure/clojure"}, :_id "542ab11ce4b0df9bb778a59d"} {:created-at 1412084003950, :author {:login "jw-00000", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2936?v=2"}, :to-var {:ns "clojure.core", :name "some->", :library-url "https://github.com/clojure/clojure"}, :_id "542ab123e4b0df9bb778a59e"}], :line 7598, :examples [{:editors [{:login "pzeldin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/12401420?v=3"}], :body ";; an example of looking up a value from a\n;; map and performing an operation(addition)\n;; on it if it exists\nuser=> (some->> {:y 3 :x 5}\n (:y)\n (- 2))\n\n-1\n\n\n;; if we were to look up a value which\n;; doesn't exist, it will safely short-circuit\nuser=> (some->> {:y 3 :x 5}\n (:z)\n (- 2))\n\nnil\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/1583002?v=3", :account-source "github", :login "superfunc"}, :created-at 1446217046027, :updated-at 1457975262515, :_id "56338556e4b04b157a6648dc"}], :macro true, :notes nil, :arglists ["expr & forms"], :doc "When expr is not nil, threads it into the first form (via ->>),\n and when that result is not nil, through the next etc", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/some->>"} {:added "1.4", :ns "clojure.core", :name "default-data-readers", :file "clojure/core.clj", :type "var", :column 1, :see-alsos nil, :line 7750, :examples [{:updated-at 1546539310208, :created-at 1546539310208, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; As of Clojure 1.10 the content is:\ndefault-data-readers\n;; {uuid #'clojure.uuid/default-uuid-reader, \n;; inst #'clojure.instant/read-instant-date}\n\n;; Which allows reading of UUIDs and Instants:\n(type (read-string \"#inst \\\"2017-08-23T10:22:22.000-00:00\\\"\"))\n;; java.util.Date\n(type (read-string \"#uuid \\\"374c8c4-fd89-4f1b-a11f-42e334ccf5ce\\\"\"))\n;; java.util.UUID\n\n;; And is overridable with \"*data-readers*\"\n(binding [*data-readers* {'uuid identity}]\n (read-string \"#uuid \\\"374c8c4-fd89-4f1b-a11f-42e334ccf5ce\\\"\"))\n;; \"374c8c4-fd89-4f1b-a11f-42e334ccf5ce\"\n\n;; Or options from edn/read-string\n(require '[clojure.edn :as edn])\n(edn/read-string {:readers {'inst (constantly :nope)}} \n \"#inst \\\"2017-08-23T10:22:22.000-00:00\\\"\")\n;; :nope", :_id "5c2e512ee4b0ca44402ef60d"}], :notes nil, :arglists [], :doc "Default map of data reader functions provided by Clojure. May be\n overridden by binding *data-readers*.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/default-data-readers"} {:ns "clojure.core", :name "->VecSeq", :file "clojure/gvec.clj", :type "function", :column 1, :see-alsos nil, :line 58, :examples nil, :notes nil, :arglists ["am vec anode i offset"], :doc "Positional factory function for class clojure.core.VecSeq.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/->VecSeq"} {:added "1.0", :ns "clojure.core", :name "even?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "odd?", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1354423235000, :_id "542692ebf6e94c6970521dd1"}], :line 1386, :examples [{:updated-at 1406097631000, :created-at 1279073824000, :body "user=> (even? 2)\ntrue\n\nuser=> (even? 1)\nfalse", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/147981?v=3", :account-source "github", :login "dpritchett"}, :_id "542692ccc026201cdc326cb5"} {:author {:login "replore", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e7869fe1a48cb1814c657eaca6bea3eb?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (filter even? (range 10))\n(0 2 4 6 8)", :created-at 1321356072000, :updated-at 1332949375000, :_id "542692d2c026201cdc326f9e"}], :notes nil, :arglists ["n"], :doc "Returns true if n is even, throws an exception if n is not an integer", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/even_q"} {:added "1.0", :ns "clojure.core", :name "unchecked-dec", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1289217146000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-add", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c37"} {:created-at 1289217151000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-dec", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c38"} {:created-at 1289217154000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-inc", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c39"} {:created-at 1289217159000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-negate", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c3a"} {:created-at 1289217163000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-divide", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c3b"} {:created-at 1289217168000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-subtract", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c3c"} {:created-at 1289217172000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-multiply", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c3d"} {:created-at 1289217176000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-remainder", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c3e"} {:created-at 1423522315984, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "dec", :library-url "https://github.com/clojure/clojure"}, :_id "54d93a0be4b0e2ac61831d2e"} {:created-at 1423522329856, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "dec'", :library-url "https://github.com/clojure/clojure"}, :_id "54d93a19e4b081e022073c75"}], :line 1170, :examples [{:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (unchecked-dec 4)\n3\n\nuser=> (unchecked-dec Integer/MIN_VALUE)\n2147483647\n\n", :created-at 1289217142000, :updated-at 1289267924000, :_id "542692c6c026201cdc326939"} {:updated-at 1488018651069, :created-at 1488018651069, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :body ";; Illustrates the difference between (dec), (dec') and (unchecked-dec)\n\n;; The \"N\" suffix denotes a BigInt instance\n;; https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/BigInt.java\n\nLong/MIN_VALUE\n;;=> -9223372036854775808\n\n(dec Long/MIN_VALUE)\n;;=> ArithmeticException integer overflow clojure.lang.Numbers.throwIntOverflow (Numbers.java:1501)\n\n(dec' Long/MIN_VALUE)\n;;=> -9223372036854775809N \n\n;; Notice how the resulting number becomes POSITIVE:\n(unchecked-dec Long/MIN_VALUE)\n;;=> 9223372036854775807 \n\n\n", :_id "58b15cdbe4b01f4add58fe5e"}], :notes nil, :arglists ["x"], :doc "Returns a number one less than x, a long.\n Note - uses a primitive operator subject to overflow.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-dec"} {:ns "clojure.core", :name "Inst", :file "clojure/core.clj", :type "var", :column 1, :see-alsos nil, :line 6780, :examples nil, :notes nil, :arglists [], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core/Inst"} {:added "1.7", :ns "clojure.core", :name "tagged-literal?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 7719, :examples nil, :notes nil, :arglists ["value"], :doc "Return true if the value is the data representation of a tagged literal", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/tagged-literal_q"} {:added "1.0", :ns "clojure.core", :name "double-array", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1349125799000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "doubles", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ac2"} {:created-at 1349125811000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "aget", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ac3"} {:created-at 1349125816000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "aset", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ac4"} {:created-at 1349125826000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "aset-double", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ac5"}], :line 5317, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; create a double array using double-array\n;; and show it can be used with the standard Java functions\n;; binarySearch and fill\n\nuser=> (def ds (double-array (range 3 20)))\n#'user/ds\nuser=> (type ds)\n[D\nuser=> (vec ds)\n[3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0]\nuser=> (java.util.Arrays/binarySearch ds 10.0)\n7\nuser=> (java.util.Arrays/fill ds 3 8 99.0)\nnil\nuser=> (vec ds)\n[3.0 4.0 5.0 99.0 99.0 99.0 99.0 99.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19\n.0]\nuser=>", :created-at 1313906832000, :updated-at 1313906832000, :_id "542692cac026201cdc326b10"} {:updated-at 1661427039227, :created-at 1661427039227, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=4"}, :body "(double-array [1 2.2 3.5])\n;;=> #object[\"[D\" 0x249e3e74 \"[D@249e3e74\"]\n\n(vec (double-array [1 2.2 3.5]))\n;;=> [1.0 2.2 3.5]", :_id "63075d5fe4b0b1e3652d7651"}], :notes nil, :arglists ["size-or-seq" "size init-val-or-seq"], :doc "Creates an array of doubles", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/double-array"} {:added "1.0", :ns "clojure.core", :name "in-ns", :type "function", :see-alsos [{:created-at 1331258262000, :author {:login "frangio", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/646001f0ba2b7df47a16c0a1d5b62225?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ns", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c41"}], :examples [{:updated-at 1497795624520, :created-at 1285103646000, :body ";; Let's create new namespace, create new variable in it, then access it from\n;; another namespace\n\n;; create the namespace and switch to it\n(in-ns 'first-namespace)\n;;=> #\n\n;; create a variable and check it\n;; first-namespace=> \n(def my-var \"some value\")\n;;=> #'first-namespace/my-var\n\n;; first-namespace=> \nmy-var\n;;=> \"some value\"\n\n;; create another namespace and switch to this one\n;; first-namespace=> \n(in-ns 'second-namespace)\n;;=> #\n\n;; use variable from the other namespace here\n;; second-namespace=> \nfirst-namespace/my-var\n;;=> \"some value\"\n\n;; in-ns works within top-level forms (e.g. the compiler or the REPL)\n;; It may fail when called within a function at runtime because *ns* is a Var\n;; and unless there are thread-local bindings for *ns*, it cannot be set!\nsecond.namespace=> (defn swap-ns! [ns-name] (clojure.core/in-ns ns-name))\n;; #'second.namespace/swap-ns!\n\nsecond.namespace=> (swap-ns! 'other.ns)\n;; #namespace[other.ns]\n\n;; Later, at runtime...\n;; Throws IllegalStateException(\"Can't change/establish root binding of: *ns* with set\")\n;; Remember, *ns* is a root var and in-ns calls set!, which only works after\n;; someone somewhere calls the binding macro (or Java equivalent)\n(defn -main\n [& args]\n (println *ns*)\n (second.namespace/swap-ns! 'arbitrary-namespace))\n;; prints #namespace[clojure.core] and then will crash", :editors [{:avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon", :account-source "clojuredocs", :login "belun"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "Artiavis", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1834136?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon", :account-source "clojuredocs", :login "belun"}, :_id "542692cdc026201cdc326d10"} {:author {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; The \"in-ns\" function works almost the same as \"ns\", but does not load\n;; clojure.core \n\n;; user=>\n(in-ns 'my-namespace)\n;;=> #\n\n;; the function clojure.core/inc won't just work\n;; my-namespace=> \n(inc 1)\n;; java.lang.Exception: Unable to resolve symbol: inc in this context\n;; (NO_SOURCE_FILE:15)\n\n;; my-namespace=>\n(clojure.core/inc 1)\n;;=> 2\n", :created-at 1285105578000, :updated-at 1423811341705, :_id "542692cdc026201cdc326d13"}], :notes nil, :arglists ["name"], :doc "Sets *ns* to the namespace named by the symbol, creating it if needed.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/in-ns"} {:added "1.0", :ns "clojure.core", :name "create-ns", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1284970193000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "remove-ns", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cb1"} {:created-at 1284970227000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "find-ns", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cb2"} {:created-at 1502465564365, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "intern", :ns "clojure.core"}, :_id "598dce1ce4b0d19c2ce9d712"}], :line 4132, :examples [{:author {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:avatar-url "https://avatars.githubusercontent.com/u/412966?v=3", :account-source "github", :login "nasser"}], :body ";; This won't work because the symbol my-new-namespace isn't defined yet\nuser=> (create-ns my-new-namespace)\njava.lang.Exception: Unable to resolve symbol: my-new-namespace in this context (NO_SOURCE_FILE:2)\n\n\n;; This won't work because create-ns expects a symbol, not a string \nuser=> (create-ns \"my-new-namespace\")\njava.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.Symbol (NO_SOURCE_FILE:0)\n\n\n;; Here my-new-namespace is quoted and passed literally to create-ns\n;; without being looked up. It works as documented.\nuser=> (create-ns 'my-new-namespace)\n#\n", :created-at 1284947276000, :updated-at 1457302200380, :_id "542692cac026201cdc326b8f"} {:author {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"}, :editors [{:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:avatar-url "https://avatars.githubusercontent.com/u/340?v=3", :account-source "github", :login "jamesmacaulay"} {:login "siddharthjain-in", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6537820?v=4"}], :body ";; Let's create a namespace and check for our result\n;; the new namespace will be \"my-new-namespace\"\n\n;; it does not exist yet, so looking for it, finds nothing\nuser=> (find-ns 'my-new-namespace) \nnil\n\n;; let's create it\nuser=> (create-ns 'my-new-namespace)\n#\n\n;; now searching for it again will have a result\nuser=> (find-ns 'my-new-namespace)\n#\n", :created-at 1284947982000, :updated-at 1651887290877, :_id "542692cac026201cdc326b91"} {:author {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"}, :editors [{:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; You can create a namespace, not switch to it and still work in, by storing it\n\n;; create the namespace\nuser=> (def for-later-use (create-ns 'my-namespace))\n#'user/for-later-use\n\n;; assign a value for a variable\nuser=> (intern for-later-use 'my-var \"some value\")\n#'my-namespace/my-var\n;; notice how the \"for-later-use\" symbol has been evaluated to the namespace it represents\n\n;; check the new variable\nuser=> my-namespace/my-var\n\"some value\"\n\n;; you can also work on a namespace by using the its name\n;; (but quoting it) instead of the return of \"create-ns\"\nuser=> (intern 'my-namespace 'my-var \"some other value\")\n#'my-namespace/my-var\n\n;; check the new assignment and see what's changed\nuser=> my-namespace/my-var\n\"some other value\"\n", :created-at 1285113908000, :updated-at 1285485928000, :_id "542692cbc026201cdc326b96"}], :notes nil, :arglists ["sym"], :doc "Create a new namespace named by the symbol if one doesn't already\n exist, returns it or the already-existing namespace of the same\n name.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/create-ns"} {:added "1.0", :ns "clojure.core", :name "re-matcher", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1282039999000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "re-find", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b2e"}], :line 4849, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [{:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}], :body "user=> (def *matcher* (re-matcher #\"\\d+\" \"abc12345def\"))\n#'user/*matcher*\n\nuser=> (re-find *matcher*)\n\"12345\"", :created-at 1280546885000, :updated-at 1317219277000, :_id "542692c8c026201cdc326a0d"} {:updated-at 1622895302889, :created-at 1622895302889, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=4"}, :body ";\n; Java supports named capture groups\n;\n; Define a phone number pattern with some named groups\n(let [patt (re-pattern \"(?\\\\d{3})-(?\\\\d{3})-(?\\\\d{4})\")]\n ; `re-matches` will find the capturing groups and stick them in a vector\n ; after the full match The capture groups are numbered starting with 1.\n ; The full match is like group zero.\n (is= [\"619-239-5464\" \"619\" \"239\" \"5464\"] (re-matches patt \"619-239-5464\"))\n\n ; Construct a java.util.regex.Matcher. Keep in mind that it is a mutable object!\n (let [matcher (re-matcher patt \"619-239-5464\")]\n ; Execute the Matcher via `re-find`. It returns all 4 groups and caches them\n (is= [\"619-239-5464\" \"619\" \"239\" \"5464\"] (re-find matcher))\n\n ; `re-groups` simply returns the cached result from the Matcher\n (is= [\"619-239-5464\" \"619\" \"239\" \"5464\"] (re-groups matcher))\n\n ; We need the instance function Matcher.group( ) to\n ; extract the named group\n (is= \"619\" (.group matcher \"area\"))\n (is= \"239\" (.group matcher \"prefix\"))\n (is= \"5464\" (.group matcher \"tail\"))))\n", :_id "60bb6ac6e4b0b1e3652d7507"}], :notes [{:body "17:44 < mearnsh> tsdh: re-matcher should be avoided because the Matcher object it returns mutates in a non-thread-safe way", :created-at 1417436686825, :updated-at 1417436686825, :author {:login "r4um", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/629631?v=3"}, :_id "547c5e0ee4b0dc573b892fe8"} {:author {:login "timmc", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/78608?v=3"}, :updated-at 1461677086067, :created-at 1461677086067, :body "It's fine to use from a controlled context. For instance, if you have a let that creates a Matcher, pulls out groups, and returns the data, you're working in a single-threaded context and the mutable object never even escapes.\n", :_id "571f6c1ee4b0fc95a97eab57"}], :tag "java.util.regex.Matcher", :arglists ["re s"], :doc "Returns an instance of java.util.regex.Matcher, for use, e.g. in\n re-find.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/re-matcher"} {:added "1.0", :ns "clojure.core", :name "defn", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1334710750000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "def", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521edb"} {:created-at 1334710756000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defn-", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521edc"} {:created-at 1361269869000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defmacro", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521edd"} {:created-at 1399636777000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "fn", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ede"} {:created-at 1460434537177, :author {:login "ivanpierre", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/625541?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "declare", :ns "clojure.core"}, :_id "570c7669e4b075f5b2c864e7"}], :line 283, :examples [{:updated-at 1361268155000, :created-at 1279161740000, :body "user=> (defn foo [a b c]\n\t (* a b c))\n#'user/foo\nuser=> (foo 1 2 3)\n6\n\nuser=> (defn bar [a b & [c]]\n (if c\n (* a b c)\n (* a b 100)))\n#'user/bar\nuser=> (bar 5 6)\n3000\nuser=> (bar 5 6 2)\n60\n\nuser=> (defn baz [a b & {:keys [c d] :or {c 10 d 20}}]\n (* a b c d))\n#'user/baz\nuser=> (baz 2 3)\n1200\nuser=> (baz 2 3 :c 5)\n600\nuser=> (baz 2 3 :c 5 :d 6)\n180\n\nuser=> (defn boo [a b & {:keys [c d] :or {c 10 d 20} :as all-specified}]\n (println all-specified)\n (* a b c d))\n#'user/boo\nuser=> (boo 2 3)\nnil\n1200\nuser=> (boo 2 3 :c 5)\n{:c 5}\n600\nuser=> (boo 1 2 :d 3 :c 4)\n{:c 4, :d 3}\n24\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon", :account-source "clojuredocs", :login "AtKaaZ"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692cbc026201cdc326bd1"} {:author {:login "kotarak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon"}, :editors [{:login "kotarak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (defn bar\n ([a b] (bar a b 100))\n ([a b c] (* a b c)))\n#'user/bar\nuser=> (bar 5 6)\n3000\nuser=> (bar 5 6 2)\n60\n", :created-at 1279213901000, :updated-at 1285496324000, :_id "542692cbc026201cdc326bd6"} {:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}], :body ";; You can use destructuring to have keyword arguments. This would be a\n;; pretty verbose version of map (in an example a bit more verbose than\n;; the first above):\n\n(defn keyworded-map [& {function :function sequence :sequence}]\n (map function sequence))\n\n;; You can call it like this:\n\nuser=> (keyworded-map :sequence [1 2 3] :function #(+ % 2))\n(3 4 5)\n\n\n;; The declaration can be shortened with \":keys\" if your local variables \n;; should be named in the same way as your keys in the map:\n\n(defn keyworded-map [& {:keys [function sequence]}]\n (map function sequence))\n", :created-at 1280457897000, :updated-at 1317454000000, :_id "542692cbc026201cdc326bd9"} {:author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :editors [{:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"} {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"} {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}], :body "(defn somefn\n [req1 req2 ;required params\n & {:keys [a b c d e] ;optional params\n :or {a 1 ;optional params with preset default values other than the nil default\n ; b takes nil if not specified on call\n c 3 ; c is 3 when not specified on call\n d 0 ; d is 0 --//--\n ; e takes nil if not specified on call\n }\n :as mapOfParamsSpecifiedOnCall ;takes nil if no extra params(other than the required ones) are specified on call\n }]\n (println req1 req2 mapOfParamsSpecifiedOnCall a b c d e)\n )\n\n=> (somefn 9 10 :b 2 :d 4)\n;9 10 {:b 2, :d 4} 1 2 3 4 nil\nnil\n=> (somefn)\n;ArityException Wrong number of args (0) passed to: funxions$somefn ;clojure.lang.AFn.throwArity (AFn.java:437)\n=> (somefn 9 10)\n;9 10 nil 1 nil 3 0 nil\nnil\n=> (somefn 9 10 :x 123)\n;9 10 {:x 123} 1 nil 3 0 nil\nnil\n=> (somefn 9 10 123)\n;IllegalArgumentException No value supplied for key: 123 ;clojure.lang.PersistentHashMap.create (PersistentHashMap.java:77)\n=> (somefn 9 10 123 45)\n;9 10 {123 45} 1 nil 3 0 nil\nnil\n=> (try \n (somefn 9 10 123)\n (catch IllegalArgumentException e (println \"caught:\" e)))\n;caught: #\nnil", :created-at 1361269606000, :updated-at 1361269847000, :_id "542692d2c026201cdc326f7c"} {:updated-at 1442603127799, :created-at 1442603127799, :author {:login "dxlr8r", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1648056?v=3"}, :body ";; :as only include parameters provided, not the default (:or) ones.\n;; This is some boilerplate code to get around this. \n;; Hopefully not needed in the future revisions of Clojure.\n\n(defn bar [f g h & {:keys [override]}]\n (let [default {:a 1 :b 2 :c 3}\n args (merge default override)]\n (conj '() f g h args)))\n\n(bar 1 2 3 :override {:a 9 :z 5}) ; returns -> ({:z 5, :a 9, :b 2, :c 3} 3 2 1)\n", :_id "55fc6077e4b06a9ffaad4fc1"} {:updated-at 1516276416080, :created-at 1516276416080, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;defn basic examples\n(defn say-hi [name]\n (str \"Hi \" name))\n\n(say-hi \"Jack\")\n;;\"Hi Jack\"\n\n;;the same result using def\n(def say-hello (fn [name]\n (str \"Hello \" name)))\n\n(say-hello \"Bob\")\n;;\"Hello Bob\"\n\n;;the same result using def and an anonymous function\n(def say-bye #(str \"Bye Bye \" %))\n\n(say-bye \"Mark\")\n;;\"Bye Bye Mark\"", :_id "5a608ac0e4b0a08026c48cff"} {:updated-at 1516725425484, :created-at 1516725425484, :author {:login "jakubholynet", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/624958?v=4"}, :body ";;define a function with metadata\n(defn hello {:awesome true} [] nil)\n\n(meta #'hello)\n=>\n{:arglists ([]),\n :awesome true,\n ...\n}\n\n;; define a function with a return value type hint\n(defn hinted ^long [] 42)\n\n(-> #'hinted meta :arglists first meta :tag)\n=> long\n\n;; both metadata on the fn and return type hint (on the argument vector)\n(defn hinted+meta {:awesome true} ^long [] 42)", :_id "5a6764b1e4b09621d9f53a76"} {:updated-at 1547395275348, :created-at 1547395275348, :author {:login "victorb", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/459764?v=4"}, :body ";; Documentation can also be added with `defn`\n=> (defn add \"Adds two numbers\" [x y] (+ x y))\n#'user/add\n\n;; This documentation can be read with the `doc` function\n=> (doc add) \n-------------------------\nuser/add\n([x y])\n Adds two numbers\n\n;; It can also be used when searching for functions with `find-doc`\n=> (find-doc \"two numbers\")\n-------------------------\nuser/add\n([x y])\n Adds two numbers", :_id "5c3b60cbe4b0ca44402ef61a"} {:updated-at 1550694890901, :created-at 1550694890901, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :body ";; prepost-map examples\n\n;; check that exactly one of :a or :b are in the argument map: \n(defn example\n [{:keys [a b]}]\n {:pre [(not (and a b))\n (or a b)]}\n (println a b))\n;; #'user/example\n\n(example {:a 1 :b 2})\n;; Execution error (AssertionError) at user/example (REPL:1).\n;; Assert failed: (not (and a b))\n\n(example {:c 1 :d 2})\n;; Execution error (AssertionError) at user/example (REPL:1).\n;; Assert failed: (or a b)\n\n(example {:a 1 :c 2})\n;; 1 nil\n;; nil\n\n;; check that the error-free average is between the max and min of the arguments:\n(defn avg\n [error & nums]\n {:post [(<= (apply min nums) % (apply max nums))]}\n (/ (apply + error nums)\n (count nums)))\n;; #'user/avg\n\n(avg 0 1 2 3 4 5)\n;; 3\n\n(avg 100 1 2 3 4 5)\n;; Execution error (AssertionError) at user/avg (REPL:1).\n;; Assert failed: (<= (apply min nums) % (apply max nums))\n", :_id "5c6db9eae4b0ca44402ef69c"} {:updated-at 1578771116812, :created-at 1578770937032, :author {:login "boraseoksoon", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/6975179?v=4"}, :body ";; To inverse boolean\n\n(defn ! [bool]\n (if (= bool true)\n false true))\n\n(! true)\n;; => false\n\n(! false)\n;; => true", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/6975179?v=4", :account-source "github", :login "boraseoksoon"}], :_id "5e1a21f9e4b0ca44402ef813"} {:updated-at 1590107719852, :created-at 1590107719852, :author {:login "mdave16", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/15642321?v=4"}, :body "; You can also destructure inside the method\n(defn foo\n \"Will be passed a hash\"\n [{x :bar y :baz}]\n (+ x y))\n\n(foo 1 2)\n; Wrong number of args (2) passed\n\n(foo {:bar 1 :baz 2})\n; 3\n\n(defn potentially-confusing-fn\n \"Will be passed a hash with one key\"\n [{x :match}]\n (* x x))\n\n(potentially-confusing-fn 1)\n; NullPointerException and nil return\n\n(potentially-confusing-fn {:match 2})\n; 4", :_id "5ec71e47e4b087629b5a190d"}], :macro true, :notes nil, :arglists ["name doc-string? attr-map? [params*] prepost-map? body" "name doc-string? attr-map? ([params*] prepost-map? body) + attr-map?"], :doc "Same as (def name (fn [params* ] exprs*)) or (def\n name (fn ([params* ] exprs*)+)) with any doc-string or attrs added\n to the var metadata. prepost-map defines a map with optional keys\n :pre and :post that contain collections of pre or post conditions.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/defn"} {:added "1.0", :ns "clojure.core", :name "ref", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1284616785000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "alter", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d3e"} {:created-at 1284616936000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "ref-set", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d3f"} {:created-at 1323973222000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "add-watch", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d40"} {:created-at 1326521654000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "dosync", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d41"} {:created-at 1349393302000, :author {:login "eric", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2b0c9ae6f1da9716451e7c86bc87230b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "commute", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d42"} {:created-at 1349397556000, :author {:login "eric", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2b0c9ae6f1da9716451e7c86bc87230b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ensure", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d43"} {:created-at 1364770237000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref-history-count", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d44"} {:created-at 1364770253000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref-min-history", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d45"} {:created-at 1364770260000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref-max-history", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d46"} {:created-at 1364873716000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "set-validator!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d47"}], :line 2262, :examples [{:author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"} {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"} {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"} {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"} {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"} {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}], :body "user=> (ref [])\n#\n\nuser=> (ref 1 :validator pos?)\n#\n\n=> (ref 0 :validator pos?)\nIllegalStateException Invalid reference state clojure.lang.ARef.validate (ARef.java:33)\n\n=> (dosync (ref-set (ref 1 :validator pos?) 0))\nIllegalStateException Invalid reference state clojure.lang.ARef.validate (ARef.java:33)\n\n=> (dosync (ref-set (ref 1 :validator pos?) 2))\n2", :created-at 1280779137000, :updated-at 1360387666000, :_id "542692cac026201cdc326b3a"} {:updated-at 1470997853281, :created-at 1470997853281, :author {:login "Lacty", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7412474?v=3"}, :body "; create(ref)\n(def a (ref '(1 2 3)))\n\n; read(deref)\n(deref a) ; -> (1 2 3)\n\n; rewrite(ref-set)\n; (ref-set a '(3 2 1)) err!\n(dosync (ref-set a '(3 2 1)))\n\n(deref a) ; -> (3 2 1)", :_id "57ada55de4b0bafd3e2a04e7"} {:updated-at 1548668131418, :created-at 1548668131418, :author {:login "Activeghost", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10783037?v=4"}, :body ";; EXAMPLE: Storing an object in a state map to control it's lifecycle\n(def state (ref {}))\n\n(defn start->streams\n []\n (log/info \"[start->streams] enter\")\n\n;; deref state and do something with it (in this case, check if we have created it)\n (when (not (instance? KafkaStreams (:streams @state)))\n (let [config-file (s/conform ::configs/configuration-file (configs/config CONFIG_PATH))\n kafka-config (s/conform ::configs/kafka-configuration (:processor.config/kafka-configuration config-file))\n stream-processing-props {StreamsConfig/APPLICATION_ID_CONFIG (:applicationid kafka-config)\n StreamsConfig/COMMIT_INTERVAL_MS_CONFIG (:auto.commit.interval.ms kafka-config)\n StreamsConfig/BOOTSTRAP_SERVERS_CONFIG (:bootstrap-servers kafka-config)\n StreamsConfig/DEFAULT_KEY_SERDE_CLASS_CONFIG (.getName (.getClass (Serdes/String)))\n StreamsConfig/DEFAULT_VALUE_SERDE_CLASS_CONFIG (.getName (.getClass (Serdes/String)))\n StreamsConfig/PROCESSING_GUARANTEE_CONFIG StreamsConfig/EXACTLY_ONCE}]\n (try \n (log/infof \"[start->streams] creating kafka stream with config: %s\" stream-processing-props)\n\n (dosync \n\n;; update the ref and store an object in the state map\n (alter state conj (-> { :streams (KafkaStreams. (topology) (StreamsConfig. stream-processing-props))})))\n (log/info \"[start->streams] stream created\")\n\n (catch Exception e (log/error e)))))\n\n;; deref the state and call an fn on the contained object\n (.start (:streams @state)))\n", :_id "5c4ecce3e4b0ca44402ef655"} {:updated-at 1553601306531, :created-at 1553601306531, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Refs automatically deref their content when used as a function:\n(def m (ref {:a 1 :b 2}))\n\n(m :a)\n;; 1\n\n;; Refs natural ordering is by creation time (oldest first), not their content:\n(def z (ref 10))\n(def y (ref 12))\n(def x (ref 1))\n\n(map deref (sort [x y z]))\n;; (10 12 1)", :_id "5c9a131ae4b0ca44402ef6ca"}], :notes nil, :arglists ["x" "x & options"], :doc "Creates and returns a Ref with an initial value of x and zero or\n more options (in any order):\n\n :meta metadata-map\n\n :validator validate-fn\n\n :min-history (default 0)\n :max-history (default 10)\n\n If metadata-map is supplied, it will become the metadata on the\n ref. validate-fn must be nil or a side-effect-free fn of one\n argument, which will be passed the intended new state on any state\n change. If the new state is unacceptable, the validate-fn should\n return false or throw an exception. validate-fn will be called on\n transaction commit, when all refs have their final values.\n\n Normally refs accumulate history dynamically as needed to deal with\n read demands. If you know in advance you will need history you can\n set :min-history to ensure it will be available when first needed (instead\n of after a read fault). History is limited, and the limit can be set\n with :max-history.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ref"} {:added "1.3", :ns "clojure.core", :name "bigint", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1509577775565, :author {:login "chrm", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/448995?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "biginteger", :ns "clojure.core"}, :_id "59fa542fe4b0a08026c48c90"} {:created-at 1567418361421, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "bigdec", :ns "clojure.core"}, :_id "5d6ce7f9e4b0ca44402ef7aa"}], :line 3619, :examples [{:author {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"} {:login "rebcabin", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/880b0bb3a4be9237326dd69565444dee?r=PG&default=identicon"}], :body "user=> (bigint 30)\n30\n\n\n;; Actually do something BigInteger-ish... (http://download.oracle.com/javase/6/docs/api/)\n\nuser=> (def x (bigint 97))\n#'user/x\n\nuser=> (.isProbablePrime (.toBigInteger x) 100)\ntrue\n", :created-at 1283817133000, :updated-at 1375568824000, :_id "542692cec026201cdc326d94"} {:author {:login "rebcabin", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/880b0bb3a4be9237326dd69565444dee?r=PG&default=identicon"}, :editors [{:login "rebcabin", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/880b0bb3a4be9237326dd69565444dee?r=PG&default=identicon"} {:avatar-url "https://avatars2.githubusercontent.com/u/31996?v=4", :account-source "github", :login "avelino"}], :body "user> (= (bigint 42) (clojure.lang.BigInt/fromBigInteger (BigInteger. \"42\")))\ntrue\nuser> (= 42N (bigint 42))\ntrue\nuser> (= 42 (bigint 42))\ntrue\nuser> (= 42 (clojure.lang.BigInt/fromBigInteger (BigInteger. \"42\")))\ntrue\n", :created-at 1375568690000, :updated-at 1528931565159, :_id "542692d2c026201cdc326f4f"} {:author {:login "rebcabin", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/880b0bb3a4be9237326dd69565444dee?r=PG&default=identicon"}, :editors [{:login "rebcabin", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/880b0bb3a4be9237326dd69565444dee?r=PG&default=identicon"}], :body "user> (reduce * (repeat 20 1000))\nArithmeticException integer overflow clojure.lang.Numbers.throwIntOverflow (Numbers.java:1388)\n\nuser> (reduce * (repeat 20 (bigint 1000)))\n1000000000000000000000000000000000000000000000000000000000000N\n", :created-at 1375569614000, :updated-at 1375569672000, :_id "542692d2c026201cdc326f51"} {:updated-at 1509577762158, :created-at 1509577762158, :author {:login "chrm", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/448995?v=4"}, :body ";; There is a difference between `BigInt` and `BigInteger`. The first is from\n;; Clojure and should be better for performace, because less unboxing is\n;; necessary. The second is from Java and has more functionality.\n;; https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html\n\n(type 123N)\n;; => clojure.lang.BigInt\n\n(type (bigint 123))\n;; => clojure.lang.BigInt\n\n(type (biginteger 123))\n;; => java.math.BigInteger\n\n(.modInverse (bigint 123) (bigint 4))\n;; IllegalArgumentException No matching method found: modInverse for class\n;; clojure.lang.BigInt\n\n(.modInverse (biginteger 123) (biginteger 4))\n;; => 3", :_id "59fa5422e4b0a08026c48c8f"} {:updated-at 1535909892844, :created-at 1535909892844, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/7083783?v=4"}, :body "; It also works for strings\n(bigint \"12345\") => 12345N\n", :_id "5b8c2004e4b00ac801ed9e7e"} {:updated-at 1598220963933, :created-at 1598220963933, :author {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}, :body ";; Take care with ratios the decimal part is removed not rounded\nuser=> (bigint 5/4) ; 1.25\n;; 1N\n\nuser=> (bigint 5/2) ; 2.5\n;; 2N", :_id "5f42eaa3e4b0b1e3652d73a7"}], :notes [{:updated-at 1375486531000, :body "The last example does not seem to work; there seems to be a missing coercion from Clojure BigInt to Java BigInteger. I get
\r\nIllegalArgumentException No matching method found: isProbablePrime for class clojure.lang.BigInt  clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:53)
", :created-at 1375486531000, :author {:login "rebcabin", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/880b0bb3a4be9237326dd69565444dee?r=PG&default=identicon"}, :_id "542692edf6e94c697052200a"}], :tag "clojure.lang.BigInt", :arglists ["x"], :doc "Coerce to BigInt", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bigint"} {:added "1.2", :ns "clojure.core", :name "extends?", :file "clojure/core_deftype.clj", :type "function", :column 1, :see-alsos [{:created-at 1302036433000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defprotocol", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cb6"} {:created-at 1491526670270, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/10404?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defrecord", :ns "clojure.core"}, :_id "58e6e40ee4b01f4add58fe84"} {:created-at 1491526677033, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/10404?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "deftype", :ns "clojure.core"}, :_id "58e6e415e4b01f4add58fe85"} {:created-at 1501651292857, :author {:login "chbrown", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/360279?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "satisfies?", :ns "clojure.core"}, :_id "5981615ce4b0d19c2ce9d705"}], :line 556, :examples [{:author {:login "mstoeckli", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/271f1fe6c39e19db5714ce29b64d3ad5?r=PG&default=identicon"}, :editors [], :body "user=> (defprotocol Area (get-area [this]))\nArea\n\nuser=> (defrecord Rectangle [width height]\n Area\n (get-area [this]\n (* width height)))\nuser.Rectangle\n\n(extends? Area Rectangle)\ntrue\n", :created-at 1337146392000, :updated-at 1337146392000, :_id "542692d3c026201cdc326fa4"}], :notes nil, :arglists ["protocol atype"], :doc "Returns true if atype extends protocol", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/extends_q"} {:added "1.1", :ns "clojure.core", :name "promise", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1343782692000, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "realized?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ed2"} {:created-at 1291473023000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "future", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f35"} {:created-at 1301868450000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "deliver", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f36"}], :line 7096, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "neveu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/197e0539bc06e120eea534aa2a7d3ec0?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (def x (promise))\n#'user/x\n;; Trying to deref at this point will make your repl wait forever\n\n\nuser=> (deliver x 100)\n#<core$promise$reify__5534@4369a50b: 100>\n\n;; the promise has been delivered, deref x will return immediately\nuser=> @x\n100\n\n", :created-at 1280748732000, :updated-at 1285488731000, :_id "542692c7c026201cdc3269c8"} {:author {:login "neotyk", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/366ff985977b3aab09510bc335cd44a4?r=PG&default=identicon"}, :editors [], :body ";; Create a promise\nuser> (def p (promise))\n#'user/p ; p is our promise\n\n;; Check if was delivered/realized\nuser> (realized? p)\nfalse ; No yet\n\n;; Delivering the promise\nuser> (deliver p 42)\n#\n\n;; Check again if it was delivered\nuser> (realized? p)\ntrue ; Yes!\n\n;; Deref to see what has been delivered\nuser> @p\n42\n\n;; Note that @ is shorthand for deref\nuser> (deref p)\n42\n", :created-at 1324962605000, :updated-at 1324962605000, :_id "542692d4c026201cdc32703f"} {:updated-at 1481568139131, :created-at 1474382276273, :author {:login "JoshAaronJones", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19951591?v=3"}, :body ";; Illustrates how threads can work together via promises\n;; First, an example to show a future that delivers\n\nuser=> (def p (promise))\n#'user/p\n\n;; future that will deliver the promise from another thread after 10 sec delay\nuser=> (future\n (Thread/sleep 10000)\n (deliver p 123))\n#future[{:status :pending, :val nil} 0x9a51df1]\n\n;; within 10 seconds dereference p, and wait for delivery of the value\nuser=> @p\n123\n\n\n;; Now, an example to show a future that blocks while waiting for a promise\n;; to be delivered -- this is used to achieve callback-style functionality\n\n;; redefine p\nuser=> (def p (promise))\n#'user/p\n\n;; create a new callback thread that will wait for a promise to be delivered\nuser=> (future\n (println \"About to block while waiting for 'p'\")\n (println \"Now I can do some work with the value \" @p))\nAbout to block while waiting for 'p'\n#future[{:status :pending, :val nil} 0x1737df29]\n\n;; deliver the promise, triggering the blocking callback thread\nuser=> (deliver p 123)\nNow I can do some work with the value 123\n#promise[{:status :ready, :val 123} 0x674a4c4a]", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/19951591?v=3", :account-source "github", :login "JoshAaronJones"} {:login "jamieorc", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2139?v=3"}], :_id "57e149c4e4b0709b524f0502"}], :notes nil, :arglists [""], :doc "Returns a promise object that can be read with deref/@, and set,\n once only, with deliver. Calls to deref/@ prior to delivery will\n block, unless the variant of deref with timeout is used. All\n subsequent derefs will return the same delivered value without\n blocking. See also - realized?.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/promise"} {:added "1.0", :ns "clojure.core", :name "aset-char", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 3981, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; create an array of 10 characters (initially set to blank by default)\n;; and set one of the elements to the character \"a\"\n\nuser=> (def cs (char-array 10))\n#'user/cs\nuser=> (vec cs)\n[\\ \\ \\ \\ \\ \\ \\ \\ \\ \\ ]\nuser=> (aset-char cs 3 \\a)\n\\a\nuser=> (vec cs)\n[\\ \\ \\ \\a \\ \\ \\ \\ \\ \\ ]\nuser=>", :created-at 1313914505000, :updated-at 1313914505000, :_id "542692c9c026201cdc326ad3"}], :notes [{:body "See [aset](http://clojuredocs.org/clojure.core/aset) for illustrations of multi-dimensional syntax.", :created-at 1432829137215, :updated-at 1432829137215, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :_id "55673cd1e4b01ad59b65f4de"}], :arglists ["array idx val" "array idx idx2 & idxv"], :doc "Sets the value at the index/indices. Works on arrays of char. Returns val.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/aset-char"} {:added "1.0", :ns "clojure.core", :name "rseq", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1293103256000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "reverse", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c2e"}], :line 1581, :examples [{:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (vec (range 10))\n[0 1 2 3 4 5 6 7 8 9]\n\nuser=> (rseq (vec (range 10)))\n(9 8 7 6 5 4 3 2 1 0)\n", :created-at 1282324324000, :updated-at 1285494434000, :_id "542692c8c026201cdc326a58"} {:author {:login "clojureking", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/92625b8a6be91bb8c688d0d07b4e2a32?r=PG&default=identicon"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "(rseq (into (sorted-map) {:a 1 :b 2}))\n;; => ([:b 2] [:a 1])", :created-at 1409352627000, :updated-at 1423095124718, :_id "542692d5c026201cdc327078"} {:updated-at 1613699307202, :created-at 1613698736253, :author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :body ";; Huge performance boost for vectors and sorted maps over `reverse`.\n\n(def nums (vec (range 1000000)))\n(time (reverse nums))\n;; \"Elapsed time: 30.1222 msecs\"\n(time (rseq nums))\n;; \"Elapsed time: 0.0664 msecs\"", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4", :account-source "github", :login "Crowbrammer"}], :_id "602f16b0e4b0b1e3652d7457"} {:updated-at 1680191517830, :created-at 1680191517830, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; The docstring doesn't mention sorted-sets directly\n;; Arguably they are implied by mention of sorted-maps\n\n(def ss (into (sorted-set) (range 1e6)))\n\n;; So this is a constant time way of getting the last element:\n\n(time (first (rseq ss)))\n\"Elapsed time: 0.04606 msecs\"\n;; => 999999\n\n;; vs the linear approach:\n\n(time (last ss))\n\"Elapsed time: 164.557625 msecs\"\n;; => 999999\n\n", :_id "6425b01de4b08cf8563f4b88"}], :notes nil, :arglists ["rev"], :doc "Returns, in constant time, a seq of the items in rev (which\n can be a vector or sorted-map), in reverse order. If rev is empty returns nil", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/rseq"} {:added "1.10", :ns "clojure.core", :name "ex-cause", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1636723273402, :author {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ex-info", :ns "clojure.core"}, :_id "618e6a49e4b0b1e3652d756f"} {:created-at 1636723280306, :author {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ex-data", :ns "clojure.core"}, :_id "618e6a50e4b0b1e3652d7570"} {:created-at 1636723289915, :author {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ex-message", :ns "clojure.core"}, :_id "618e6a59e4b0b1e3652d7571"}], :line 4808, :examples [{:updated-at 1636723247465, :created-at 1636723247465, :author {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4"}, :body ";; (ex-cause e) gives you the next linked exception in an Exception-chain\n;; Use \n(def a 1) ;;=> #'user/a\n(def b 0) ;;=> #'user/b\n\n(def chain \n (try \n (/ a b)\n (catch ArithmeticException ae\n (ex-info ;; contextualize ae with ExceptionInfo\n \"Send help, please\"\n {:divisor a\n :divident b}\n ae)))) \n;;=> #'user/chain\n\nchain\n;;=>\n;#error{:cause \"Divide by zero\",\n; :via [{:type clojure.lang.ExceptionInfo,\n; :message \"Send help, please\",\n; :data {:divisor 1, :divident 0},\n; :at [...]}\n; {:type java.lang.ArithmeticException,\n; :message \"Divide by zero\",\n; :at [clojure.lang.Numbers divide \"Numbers.java\" 188]}],\n; :trace [[clojure.lang.Numbers divide \"Numbers.java\" 188]\n; [...]\n; [java.lang.Thread run \"Thread.java\" 829]]}\n\n(ex-cause chain)\n;;=>\n;#error{:cause \"Divide by zero\",\n; :via [{:type java.lang.ArithmeticException, ;; <-- ae is first.\n; :message \"Divide by zero\",\n; :at [clojure.lang.Numbers divide \"Numbers.java\" 188]}],\n; :trace [[clojure.lang.Numbers divide \"Numbers.java\" 188]\n; [...]", :_id "618e6a2fe4b0b1e3652d756e"} {:updated-at 1636972033983, :created-at 1636972033983, :author {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4"}, :body ";; You can use ex-cause to extract the messages of a chain:\n(defn ex-msg-chain [ex delimiter]\n (->> ex\n (iterate ex-cause)\n (take-while some?)\n (mapv ex-message)\n (interpose delimiter)\n (apply str))\n;;=> #'user/ex-msg-chain\n\n;; Let's try this on a simple chained Exception\n(def chained-ex\n (ex-info \"top-level\"\n {:level 1}\n (ex-info \"sec-level\"\n {:level 2}\n (ex-info \"low-level\"\n {:level 3}))))\n;;=> #'user/chained-ex\n\n(ex-msg-chain chained-ex \" -> \")\n;;=> \"top-level -> sec-level -> low-level\"", :_id "61923601e4b0b1e3652d7578"}], :notes nil, :arglists ["ex"], :doc "Returns the cause of ex if ex is a Throwable.\n Otherwise returns nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ex-cause"} {:added "1.0", :ns "clojure.core", :name "construct-proxy", :file "clojure/core_proxy.clj", :type "function", :column 1, :see-alsos [{:created-at 1539823552877, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "get-proxy-class", :ns "clojure.core"}, :_id "5bc7d7c0e4b00ac801ed9edf"} {:created-at 1539823559598, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "proxy", :ns "clojure.core"}, :_id "5bc7d7c7e4b00ac801ed9ee0"}], :line 290, :examples [{:updated-at 1539823495958, :created-at 1539823495958, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Compared to \"proxy\" you have the option to pick different \n;; constructors on the same proxy class.\n\n(def MyThread (get-proxy-class Thread))\n\n(defn t\n ([clazz f] (construct-proxy clazz f))\n ([clazz id f] (construct-proxy clazz f id)))\n\n(str (t MyThread #()))\n;; \"Thread[Thread-2,5,main]\"\n\n(str (t MyThread \"***MYTHREAD***\" #()))\n;; \"Thread[***MYTHREAD***,5,main]\"\n", :_id "5bc7d787e4b00ac801ed9ede"}], :notes nil, :arglists ["c & ctor-args"], :doc "Takes a proxy class and any arguments for its superclass ctor and\n creates and returns an instance of the proxy.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/construct-proxy"} {:added "1.0", :ns "clojure.core", :name "agent-errors", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 2236, :examples nil, :deprecated "1.2", :notes nil, :arglists ["a"], :doc "DEPRECATED: Use 'agent-error' instead.\n Returns a sequence of the exceptions thrown during asynchronous\n actions of the agent.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/agent-errors"} {:added "1.0", :ns "clojure.core", :name "*compile-files*", :type "var", :see-alsos nil, :examples [{:updated-at 1584381840421, :created-at 1584381840421, :author {:login "devn", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/10421?v=4"}, :body ";; Ensure that the `require` doesn't result in AOT'd class files\n(binding [*compile-files* false]\n (require 'foo.bar))", :_id "5e6fbf90e4b087629b5a18bf"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}], :body ";; The \"defruntime\" macro below prevents initialization of a definition \n;; during AOT compilation but allows it (once only) at runtime. Can be used to\n;; load configuration files or other runtime only data.\n\n(defmacro defruntime [sym & body]\n `(defonce ~sym\n (when-not *compile-files* ~@body)))\n\n(defruntime config\n (println \"This won't happen during AOT compile\"))\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1613847596666, :updated-at 1614012007913, :_id "60315c2ce4b0b1e3652d745f"}], :notes nil, :arglists [], :doc "Set to true when compiling files, false otherwise.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*compile-files*"} {:added "1.10", :ns "clojure.core", :name "ex-message", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1602605078561, :author {:login "m0smith", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/398808?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ex-data", :ns "clojure.core"}, :_id "5f85d016e4b0b1e3652d73db"} {:created-at 1602605096620, :author {:login "m0smith", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/398808?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ex-info", :ns "clojure.core"}, :_id "5f85d028e4b0b1e3652d73dc"}], :line 4800, :examples [{:updated-at 1587607327636, :created-at 1587603158684, :author {:login "thiagorfaria", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/5934045?v=4"}, :body "(try\n (let [error-message \"Something went wrong!\"\n error-data {:error 404}]\n (throw (ex-info error-message error-data)))\n (catch Exception e\n (prn (str \"Oops! \" (ex-message e)))\n (prn (str \"Because! \" (ex-data e)))))\n\n;; => \"Oops! Something went wrong!\"\n;; \"Because! {:error 404}\"", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/5934045?v=4", :account-source "github", :login "thiagorfaria"}], :_id "5ea0e6d6e4b087629b5a18dc"}], :notes nil, :arglists ["ex"], :doc "Returns the message attached to ex if ex is a Throwable.\n Otherwise returns nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ex-message"} {:ns "clojure.core", :name "*math-context*", :type "var", :see-alsos [{:created-at 1635281435762, :author {:login "Chouser", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/36110?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "with-precision", :ns "clojure.core"}, :_id "61786a1be4b0b1e3652d755c"}], :examples nil, :notes nil, :tag "java.math.MathContext", :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*math-context*"} {:added "1.0", :ns "clojure.core", :name "float", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1496073295794, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unchecked-float", :ns "clojure.core"}, :_id "592c444fe4b093ada4d4d796"} {:created-at 1593104025671, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "bigdec", :ns "clojure.core"}, :_id "5ef4d699e4b0b1e3652d730f"}], :line 3486, :examples [{:updated-at 1496073286628, :created-at 1283814444000, :body "(float 1)\n;;=> 1.0\n(float 1.11)\n;;=> 1.11\n(float 1.111111111111111111111111111M)\n;;=> 1.1111112\n\n;;;; Note that (float) range checks its argument and throws an exception\n;;;; if the value is out of range.\n;;;; Use (unchecked-float) instead if you want to skip the range checks.\n\n(float Double/MAX_VALUE)\n;;=> IllegalArgumentException Value out of range for float: 1.7976931348623157E308\n(unchecked-float Double/MAX_VALUE)\n;;=> Infinity\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon", :account-source "clojuredocs", :login "Miles"}, :_id "542692c9c026201cdc326afd"} {:editors [{:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}], :body ";; Casting a string does not work\n(float \"123.456\")\n;;=> Execution error (ClassCastException) at user/eval193 (REPL:1).\n;;java.lang.String cannot be cast to java.lang.Number\n\n;; Use Java interop instead\n(Float/parseFloat \"123.456\")\n;;=> 123.456\n\n;; Content originally posted by u/didibus on https://clojuredocs.org/clojure.core/num", :author {:avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4", :account-source "github", :login "wdhowe"}, :created-at 1596590631704, :updated-at 1596590780119, :_id "5f2a0a27e4b0b1e3652d7365"}], :notes nil, :arglists ["x"], :doc "Coerce to float", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/float"} {:added "1.0", :ns "clojure.core", :name "pr-str", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1299623857000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pr", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b27"} {:created-at 1313054793000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "read-string", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b28"} {:created-at 1360241771000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "prn-str", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b29"} {:created-at 1517964034880, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "str", :ns "clojure.core"}, :_id "5a7a4b02e4b0e2d9c35f7420"}], :line 4736, :examples [{:author {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}, :editors [{:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"} {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}], :body "user=> (def x [1 2 3 4 5])\n#'user/x\nuser=> x\n[1 2 3 4 5]\n\n\n;; Turn that data into a string...\nuser=> (pr-str x)\n\"[1 2 3 4 5]\"\n\n\n;; ...and turn that string back into data!\nuser=> (read-string (pr-str x))\n[1 2 3 4 5]\n", :created-at 1284257614000, :updated-at 1287792086000, :_id "542692cbc026201cdc326c20"} {:author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :editors [], :body ";; you can think of pr-str as the inverse of read-string\n;; turn string into symbols\nuser=> (read-string \"(a b foo :bar)\")\n(a b foo :bar)\n\n;;turn symbols into a string\nuser=> (pr-str '(a b foo :bar))\n\"(a b foo :bar)\"", :created-at 1346843924000, :updated-at 1346843924000, :_id "542692d4c026201cdc327032"} {:author {:login "GyrosOfWar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8abc292bf5d9e88cfcbcfbe492774a38?r=PG&default=identicon"}, :editors [{:login "GyrosOfWar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8abc292bf5d9e88cfcbcfbe492774a38?r=PG&default=identicon"} {:login "GyrosOfWar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8abc292bf5d9e88cfcbcfbe492774a38?r=PG&default=identicon"} {:login "GyrosOfWar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8abc292bf5d9e88cfcbcfbe492774a38?r=PG&default=identicon"}], :body "(defn write-object\n \"Serializes an object to disk so it can be opened again later.\n Careful: It will overwrite an existing file at file-path.\"\n [obj file-path]\n (with-open [wr (writer file-path)]\n (.write wr (pr-str obj)))))", :created-at 1391924453000, :updated-at 1391924601000, :_id "542692d4c026201cdc327033"} {:updated-at 1516110350763, :created-at 1516110350763, :author {:login "martinklepsch", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/97496?v=4"}, :body ";; Be careful with side-effects that are part of lazy sequences.\n;; Especially printing can yield unexpected results.\nuser=> (->> (range 10)\n (map #(do (println %) %))\n (pr-str))\n\n\"(0\\n1\\n2\\n3\\n4\\n5\\n6\\n7\\n8\\n9\\n0 1 2 3 4 5 6 7 8 9)\"\n", :_id "5a5e020ee4b0a08026c48cf7"} {:editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :body ";; sometimes when printing lazy sequences you do not get what you want.\n(str (take 5 (range 10)))\n;=> \"clojure.lang.LazySeq@1b554e1\"\n\n;; in those cases `pr-str` to the rescue.\n(pr-str (take 5 (range 10)))\n;=> \"(0 1 2 3 4)\"", :author {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}, :created-at 1517963998229, :updated-at 1517964057656, :_id "5a7a4adee4b0e2d9c35f741f"} {:editors [{:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}], :body ";; Be aware that pr-str and friends are influenced by a couple global variables\n;; such as *print-length*:\n\n(set! *print-length* 10)\n(pr-str (range 15))\n;=> \"(0 1 2 3 4 5 6 7 8 9 ...)\"\n\n(set! *print-length* -1)\n(pr-str (range 15))\n;=> \"(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14)\"", :author {:avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4", :account-source "github", :login "bfontaine"}, :created-at 1522748816082, :updated-at 1522748961361, :_id "5ac34d90e4b045c27b7fac30"}], :notes nil, :tag "java.lang.String", :arglists ["& xs"], :doc "pr to a string, returning it", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/pr-str"} {:added "1.0", :ns "clojure.core", :name "concat", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1332796328000, :author {:login "Olivenmann", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d5b1703fb08dd81e4cb2f653a3aaf10b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "conj", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521da6"} {:created-at 1343083284000, :author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "into", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521da7"} {:created-at 1520441797302, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "lazy-cat", :ns "clojure.core"}, :_id "5aa019c5e4b0316c0f44f90f"} {:created-at 1590171359727, :author {:login "themustafabasit", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/24441401?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "quote", :ns "clojure.core"}, :_id "5ec816dfe4b087629b5a190f"} {:created-at 1597428941227, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "mapcat", :ns "clojure.core"}, :_id "5f36d4cde4b0b1e3652d7377"} {:created-at 1597429044495, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "zipmap", :ns "clojure.core"}, :_id "5f36d534e4b0b1e3652d7378"} {:created-at 1685378146800, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "cat", :ns "clojure.core"}, :_id "6474d462e4b08cf8563f4bbf"} {:created-at 1685378175177, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "cat", :ns "clojure.core.reducers"}, :_id "6474d47fe4b08cf8563f4bc0"}], :line 718, :examples [{:updated-at 1473090562851, :created-at 1279026744000, :body "\nuser=> (concat [1 2] [3 4])\n(1 2 3 4)\n\nuser=> (into [] (concat [1 2] [3 4]))\n[1 2 3 4]\n\nuser=> (concat [:a :b] nil [1 [2 3] 4])\n(:a :b 1 [2 3] 4)\n\n=> (concat [1] [2] '(3 4) [5 6 7] #{9 10 8})\n(1 2 3 4 5 6 7 8 9 10)\n;; The last three elements might appear in a different order.\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon", :account-source "clojuredocs", :login "john.r.woodward"} {:avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon", :account-source "clojuredocs", :login "john.r.woodward"} {:avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon", :account-source "clojuredocs", :login "AtKaaZ"} {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon", :account-source "clojuredocs", :login "kotarak"}, :_id "542692c9c026201cdc326a99"} {:author {:login "Bob Jarvis", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5ba4bce40c00d30a3b924cbaaf94c17a?r=PG&default=identicon"}, :editors [], :body "user=> (concat \"abc\" \"def\")\n(\\a \\b \\c \\d \\e \\f)\n", :created-at 1392247889000, :updated-at 1392247889000, :_id "542692d2c026201cdc326f66"} {:body "user=> (apply concat '(([1 2]) ([3 4] [5 6]) ([7 8])))\n([1 2] [3 4] [5 6] [7 8])\n", :author {:login "prabhathk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/11288784?v=3"}, :created-at 1430731339291, :updated-at 1430731382642, :editors [{:login "prabhathk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/11288784?v=3"}], :_id "55473a4be4b06eaacc9cda88"} {:updated-at 1501863107172, :created-at 1501863107172, :author {:login "RobinNagpal", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/745748?v=4"}, :body "user=> (concat '(1 2 3) '(4 5 6))\n;; (1 2 3 4 5 6)", :_id "59849cc3e4b0d19c2ce9d707"} {:updated-at 1501863170406, :created-at 1501863170406, :author {:login "RobinNagpal", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/745748?v=4"}, :body "user=> (concat [1 2 3] [4 5 6])\n;; (1 2 3 4 5 6)", :_id "59849d02e4b0d19c2ce9d708"} {:editors [{:login "RobinNagpal", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/745748?v=4"}], :body "(concat {:a \"A\" :b \"B\" :c \"C\"} {:d \"D\" :e \"E\"})\n;; ([:a \"A\"] [:b \"B\"] [:c \"C\"] [:d \"D\"] [:e \"E\"])", :author {:avatar-url "https://avatars3.githubusercontent.com/u/745748?v=4", :account-source "github", :login "RobinNagpal"}, :created-at 1501863260134, :updated-at 1501863287333, :_id "59849d5ce4b0d19c2ce9d709"} {:updated-at 1520436404730, :created-at 1520436404730, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body "(defn padding-right [s width pad] \n (apply str (take width (concat s (repeat pad)))))\n\n(padding-right \"Clojure\" 10 \" \")\n;; \"Clojure \"", :_id "5aa004b4e4b0316c0f44f90e"} {:editors [{:login "manojarya", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/2968153?v=4"}], :body ";; beware! concat returns a lazy 'sequence'. \n\n(conj (concat [1 2] [3 4]) 5) ; doesn't return (1 2 3 4 5)\n;;=>(5 1 2 3 4)", :author {:avatar-url "https://avatars0.githubusercontent.com/u/2968153?v=4", :account-source "github", :login "manojarya"}, :created-at 1569483435769, :updated-at 1569512850496, :_id "5d8c6aabe4b0ca44402ef7c1"} {:editors [{:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}], :body ";; Here is a good article by Stuart Sierra in his \"Clojure Dont's\" series\n;; on concat, and how using it in certain ways can lead to surprisingly large\n;; stack usage:\n;; https://stuartsierra.com/2015/04/26/clojure-donts-concat\n\n(first (reduce concat (map next-results (range 1 4000))))\n;; StackOverflowError clojure.core/seq (core.clj:133)\n\n(nth (iterate #(concat % [1 2 3]) [1 2 3]) 4000)\n;; StackOverflowError clojure.core/seq (core.clj:133)", :author {:avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4", :account-source "github", :login "jafingerhut"}, :created-at 1577571723261, :updated-at 1611951560722, :_id "5e07d58be4b0ca44402ef801"} {:updated-at 1590171425117, :created-at 1588243083702, :author {:login "themustafabasit", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/24441401?v=4"}, :body ";; list 1\n(def list1 (list 'let ['x 10]))\n;; => #'user/list1\nlist1\n;; => (let [x 10])\n\n;; list 2\n(def list2 (list '(println \"x:\" x) '(println \"Bye!\")))\n;; => #'user/list2\nlist2\n;; => ((println \"x:\" x) (println \"Bye!\"))\n\n;; ***\n;; concat all the elements of list1 & list2, and return a new list \n;; In this case - let + [x 10] + (println \"x:\" x) + (println \"Bye!\")\n\n(concat list1 list2)\n;; => (let [x 10] (println \"x:\" x) (println \"Bye!\"))\n\n(eval (concat list1 list2))\n;; => x: 10\n;; Bye!\n;; nil\n\n\n;; see also - quote", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/24441401?v=4", :account-source "github", :login "themustafabasit"}], :_id "5eaaaa8be4b087629b5a18ec"} {:editors [{:login "wactbprot", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/113518?v=4"}], :body "(concat [1 2 3] nil)\n;; => (1 2 3)\n\n(concat [1 2 3] [nil])\n;; => (1 2 3 nil)", :author {:avatar-url "https://avatars.githubusercontent.com/u/113518?v=4", :account-source "github", :login "wactbprot"}, :created-at 1612534560315, :updated-at 1612534622108, :_id "601d5320e4b0b1e3652d7449"}], :notes nil, :arglists ["" "x" "x y" "x y & zs"], :doc "Returns a lazy seq representing the concatenation of the elements in the supplied colls.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/concat"} {:added "1.0", :ns "clojure.core", :name "aset-short", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 3971, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; create an array of 10 shorts and set one of the values to 31415\n\nuser=> (def ss (short-array 10))\n#'user/ss\nuser=> (vec ss)\n[0 0 0 0 0 0 0 0 0 0]\nuser=> (aset-short ss 3 31415)\n31415\nuser=> (vec ss)\n[0 0 0 31415 0 0 0 0 0 0]\nuser=>", :created-at 1313915280000, :updated-at 1313915280000, :_id "542692cac026201cdc326b1c"}], :notes [{:body "See [aset](http://clojuredocs.org/clojure.core/aset) for illustrations of multi-dimensional syntax.", :created-at 1432829129279, :updated-at 1432829129279, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :_id "55673cc9e4b01ad59b65f4dd"}], :arglists ["array idx val" "array idx idx2 & idxv"], :doc "Sets the value at the index/indices. Works on arrays of short. Returns val.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/aset-short"} {:added "1.5", :ns "clojure.core", :name "set-agent-send-off-executor!", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1553631504676, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "set-agent-send-executor!", :ns "clojure.core"}, :_id "5c9a8910e4b0ca44402ef6d9"} {:created-at 1553631511505, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "send-via", :ns "clojure.core"}, :_id "5c9a8917e4b0ca44402ef6da"} {:created-at 1559240493574, :author {:login "pdbrown", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1607096?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "shutdown-agents", :ns "clojure.core"}, :_id "5cf01f2de4b0ca44402ef73a"}], :line 2095, :examples [{:updated-at 1553631658338, :created-at 1553631497381, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; This permanently change the thread pool used by agents receiving \n;; tasks with \"send-off\". Use this to control thread pools of applications\n;; you don't own.\n\n(import '[java.util.concurrent Executors])\n(def fj-pool (Executors/newWorkStealingPool 20))\n(set-agent-send-off-executor! fj-pool)", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5c9a8909e4b0ca44402ef6d8"}], :notes nil, :arglists ["executor"], :doc "Sets the ExecutorService to be used by send-off", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/set-agent-send-off-executor!"} {:added "1.0", :ns "clojure.core", :name "ns", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1289000801000, :author {:login "remleduff", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f14b40211cdc07185c43edf8f4bd7a5b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "use", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f07"} {:created-at 1289000808000, :author {:login "remleduff", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f14b40211cdc07185c43edf8f4bd7a5b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "require", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f08"} {:created-at 1289000818000, :author {:login "remleduff", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f14b40211cdc07185c43edf8f4bd7a5b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "refer", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f09"} {:created-at 1291628676000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "import", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f0a"} {:created-at 1312583994000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ns-publics", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f0b"} {:created-at 1340999276000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "in-ns", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f0c"} {:created-at 1355453198000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "remove-ns", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f0d"} {:created-at 1366844150000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ns-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f0e"} {:created-at 1398960898000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "*ns*", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f0f"} {:created-at 1686507880947, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "alias", :ns "clojure.core"}, :_id "64861168e4b08cf8563f4bc9"}], :line 5764, :examples [{:updated-at 1514387836686, :created-at 1279069109000, :body ";; Generate a Java class\n(ns org.clojuredocs.test\n (:gen-class))\n\n(defn -main [] (println \"Hello, World!\"))\n\n\n;; After compilation:\nsh$ java -cp classes org.clojuredocs.test\nHello, World!\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon", :account-source "clojuredocs", :login "devijvers"} {:avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon", :account-source "clojuredocs", :login "devijvers"} {:avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon", :account-source "clojuredocs", :login "devijvers"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:login "jcburley", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/430319?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon", :account-source "clojuredocs", :login "devijvers"}, :_id "542692cac026201cdc326b6e"} {:updated-at 1541261966025, :created-at 1284948992000, :body ";; Let's create a namespace and then assign it as the current namespace\nuser=> (create-ns 'my-new-namespace)\n#namespace[my-new-namespace]\n\nuser=> (ns 'my-new-namespace)\njava.lang.ClassCastException: clojure.lang.PersistentList cannot be cast to\n clojure.lang.Symbol (NO_SOURCE_FILE:26)\n;; oops, this is not the way to do it; if create-ns needs a symbol, ns does not\n\nuser=> (ns my-new-namespace)\nnil\n\nmy-new-namespace=>\n;; it worked as the current namespace is our newly created one\n\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon", :account-source "clojuredocs", :login "belun"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:login "enocom", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1175430?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon", :account-source "clojuredocs", :login "belun"}, :_id "542692cac026201cdc326b73"} {:author {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"}, :editors [{:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Generating a class so we can call Clojure from Java \n(ns com.domain.tiny\n (:gen-class\n :name com.domain.tiny\n :methods [#^{:static true} [binomial [int int] double]]))\n\n(defn binomial\n \"Calculate the binomial coefficient.\"\n [n k]\n (let [a (inc n)]\n (loop [b 1\n c 1]\n (if (> b k)\n c\n (recur (inc b) (* (/ (- a b) b) c))))))\n\n(defn -binomial\n \"A Java-callable wrapper around the 'binomial' function.\"\n [n k]\n (binomial n k))\n\n(defn -main []\n (println (str \"(binomial 5 3): \" (binomial 5 3)))\n (println (str \"(binomial 10042 111): \" (binomial 10042 111))))\n\n\n;; Calling from Java\nimport com.domain.tiny;\n\npublic class Main {\n\n public static void main(String[] args) {\n System.out.println(\"(binomial 5 3): \" + tiny.binomial(5, 3));\n System.out.println(\"(binomial 10042, 111): \" + tiny.binomial(10042, 111));\n }\n}\n\n\n;; The result was:\n(binomial 5 3): 10.0\n(binomial 10042, 111): 4.9068389575068143E263\n\n\n;; Example was borrowed from clartaq @ Stack Overflow", :created-at 1285031740000, :updated-at 1285486378000, :_id "542692cac026201cdc326b76"} {:author {:login "remleduff", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f14b40211cdc07185c43edf8f4bd7a5b?r=PG&default=identicon"}, :editors [{:login "remleduff", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f14b40211cdc07185c43edf8f4bd7a5b?r=PG&default=identicon"} {:login "remleduff", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f14b40211cdc07185c43edf8f4bd7a5b?r=PG&default=identicon"} {:login "remleduff", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f14b40211cdc07185c43edf8f4bd7a5b?r=PG&default=identicon"} {:login "remleduff", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f14b40211cdc07185c43edf8f4bd7a5b?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=3"}], :body ";; Create a namespace named demo.namespace.\n(ns demo.namespace)\n\n;; Clojure recommends namespaces be at least \"two segments\" (ie, they should\n;; have at least one '.') otherwise it will create a class in the \"default\n;; package\", which is discouraged.\n\n;; If this declaration appears in a file named \"demo/namespace.clj\" present\n;; in your classpath, it is known as a \"lib\", \"demo/namespace.clj\" is the lib's\n;; \"root resource\". See http://clojure.org/libs\n\n;; From a clean repl you can load the lib using\nuser=>(require 'demo.namespace) \n; or\nuser=>(use 'demo.namespace)", :created-at 1288999353000, :updated-at 1423811574430, :_id "542692cac026201cdc326b79"} {:author {:login "remleduff", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f14b40211cdc07185c43edf8f4bd7a5b?r=PG&default=identicon"}, :editors [{:login "remleduff", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f14b40211cdc07185c43edf8f4bd7a5b?r=PG&default=identicon"} {:login "remleduff", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f14b40211cdc07185c43edf8f4bd7a5b?r=PG&default=identicon"} {:login "remleduff", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f14b40211cdc07185c43edf8f4bd7a5b?r=PG&default=identicon"} {:login "remleduff", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f14b40211cdc07185c43edf8f4bd7a5b?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=3"}], :body ";; This example will illustrate changing between namespaces at the repl\n\n;; At the repl, the ns macro can be used to create a namespace, but it is\n;; used to change the current namespace (be careful of typos)\nuser=>(ns demo.namespace)\nnil\ndemo.namespace=> ; The prompt at the repl is now \"demo.namespace\" reflecting\n ; that the current namespace is no longer \"user\".\n\n;; Add a new function to demo.namespace\ndemo.namespace=>(defn foo [] (prn \"Hello from demo.namespace\"))\n#'demo.namespace/foo\n\n;; From within \"demo.namespace\" we can use foo without qualifying it\ndemo.namespace=>(foo)\n\"Hello from demo.namespace\"\nnil\n\n;; Switch back to the \"user\" namespace\ndemo.namespace=>(ns user)\nnil\n\n;; We can no longer use \"foo\" without qualification\nuser=> (foo)\njava.lang.Exception: Unable to resolve symbol: foo in this context\n (NO_SOURCE_FILE:4)\n\nuser=> (demo.namespace/foo)\n\"Hello from demo.namespace\"\nnil\n\n;; The public symbols of \"demo.namespace\" can be \"referred into\" the \"user\"\n;; namespace if desired\nuser=> (refer 'demo.namespace)\nnil\n\n;; foo is now an alias in the \"user\" namespace which refers to the\n;; \"demo.namespace/foo\" symbol\nuser=> (foo)\n\"Hello from demo.namespace\"\nnil", :created-at 1289000535000, :updated-at 1423811666025, :_id "542692cac026201cdc326b7e"} {:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [], :body "(ns rosettacode.24game\n (:require [clojure.string :as str])\n (:use clojure.test))\n\n(deftest test\n (is (= \"ABC\" (str/capitalize \"abc\")))", :created-at 1289383303000, :updated-at 1289383303000, :_id "542692cac026201cdc326b83"} {:author {:login "scode", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/87b4fd6e7ac86cbf1f1b683f7856057?r=PG&default=identicon"}, :editors [], :body ";; Multiple required namespaces with aliases\n(ns demo.namespace\n (:require [com.example.httplib :as httplib]\n [com.example.otherlib :as otherlib]))\n", :created-at 1297670267000, :updated-at 1297670267000, :_id "542692cac026201cdc326b84"} {:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body ";; In clojure 1.4 and higher you can use the refer function from within\n;; a require which is equivalent to (:use foo only [...]) but still \n;; allows you to reference the required namespace:\n(ns my.ns.example\n (:require [my.lib :refer [function1 function2]]))\n\n;; And :refer :all is equivalent to :use :\n(ns my.ns.example\n (:require [my.lib :refer :all]))\n", :created-at 1340687963000, :updated-at 1357904913000, :_id "542692d4c026201cdc327014"} {:updated-at 1358656144000, :created-at 1358656144000, :body "(ns foo.bar\n (:refer-clojure :exclude [ancestors printf])\n (:require [clojure.contrib sql sql.tests])\n (:use [my.lib this that])\n (:import [java.util Date Timer Random]\n (java.sql Connection Statement)))", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692d4c026201cdc327017"} {:editors [{:login "PetrGlad", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/124476?v=3"}], :body "; Gotchas\n(ns newns1 [:require clojure.string])\n; newns1=> nil ; Success\n; Note use of vector instead of list - ns macro successfuly processes it \n; but some tools that read this code might not recognize this dependency.\n; Always write ns as per documentation.\n\n(in-ns 'newns2)\n; newns2=> #object[clojure.lang.Namespace 0x29a8c1fb \"newns2\"]\n; New namespace was successfully created\n(first [])\n; newns2=> CompilerException java.lang.RuntimeException: \n; Unable to resolve symbol: first in this context, \n; compiling:(NO_SOURCE_PATH:7:1) \n; Although \"first\" is in core library, it's name is not available here. \n; To fix this do\n(clojure.core/refer-clojure)\n; newns2=> nil\n(first [])\n; newns2=> nil ; Success\n\n; \"ns\" macro both switches to a namespace and refers default library, \n; \"in-ns\" just switches to given namespace\n(ns newns3)\n; newns3=> nil\n(first [])\n; newns3=> nil\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/124476?v=3", :account-source "github", :login "PetrGlad"}, :created-at 1473163926788, :updated-at 1473164242037, :_id "57ceb296e4b0709b524f04e4"} {:updated-at 1508739714948, :created-at 1508739714948, :author {:login "thescalaguy", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/24409454?v=4"}, :body ";; Shows how to use an attr-map\n;; These are arbitrary key-value pairs\n(ns cljdocs.example.core\n \"This is a doc string, FYI :D\"\n {:author \"John Doe\"\n :last-update-date \"23-10-2017\"})\n=> nil\n\n;; The keys in the attr-map are merged with the compiler-generated attr-map\n(meta *ns*)\n=> {:doc \"This is a doc string, FYI :D\", :author \"John Doe\", :last-update-date \"23-10-2017\"}\n", :_id "59ed8a82e4b03026fe14ea93"} {:updated-at 1549690956926, :created-at 1549690956926, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1836941?v=4"}, :body ";; If you import a Java class with an unqualified name (perhaps from local\n;; source file), use the bare class name without placing it in a vector or list:\n(ns foo.bar\n (:import MyClass))", :_id "5c5e684ce4b0ca44402ef674"} {:updated-at 1627881643879, :created-at 1604651002536, :author {:login "green-coder", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4"}, :body ";; References to things in a given namespace can be locally renamed.\n(ns foo.bar\n (:require [clojure.string :refer [blank?]\n :rename {blank? contains-only-spaces-likes?}]))\n\n(contains-only-spaces-likes? \" \")\n; => true\n", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4", :account-source "github", :login "green-coder"}], :_id "5fa507fae4b0b1e3652d73ff"}], :macro true, :notes [{:updated-at 1291628686000, :body "Good description of use/require/import here:\r\n\r\nhttp://blog.8thlight.com/articles/2010/12/6/clojure-libs-and-namespaces-require-use-import-and-ns", :created-at 1291628686000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fac"} {:body "[How to `ns` — Stuart Sierra’s Opinionated Style Guide for Clojure Namespace Declarations]( https://stuartsierra.com/2016/clojure-how-to-ns.html)\n> Make it look like this:\n>
(ns com.example.my-application.server\n  \"Example application HTTP server and routing.\"\n  (:refer-clojure :exclude [send])\n  (:require\n   [clojure.core.async :as async :refer [! >!!]]\n   [com.example.my-application.base]\n   [com.example.my-application.server.sse :as server.sse]\n   [io.pedestal.http :as http]\n   [io.pedestal.http.sse :as http.sse]\n   [ring.util.response :as response])\n  (:import\n   (java.nio.file Files LinkOption)\n   (org.apache.commons.io FileUtils)))
", :created-at 1597543297488, :updated-at 1597552862469, :author {:avatar-url "https://avatars3.githubusercontent.com/u/2316604?v=4", :account-source "github", :login "finalfantasia"}, :_id "5f389381e4b0b1e3652d7379"} {:author {:login "matasaru", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1546100?v=4"}, :updated-at 1668983174412, :created-at 1668983174412, :body "The post referred in the first note has moved to:\n\nhttps://8thlight.com/insights/clojure-libs-and-namespaces-require-use-import-and-ns", :_id "637aa986e4b0b1e3652d768c"}], :arglists ["name docstring? attr-map? references*"], :doc "Sets *ns* to the namespace named by name (unevaluated), creating it\n if needed. references can be zero or more of: (:refer-clojure ...)\n (:require ...) (:use ...) (:import ...) (:load ...) (:gen-class)\n with the syntax of refer-clojure/require/use/import/load/gen-class\n respectively, except the arguments are unevaluated and need not be\n quoted. (:gen-class ...), when supplied, defaults to :name\n corresponding to the ns name, :main true, :impl-ns same as ns, and\n :init-impl-ns true. All options of gen-class are\n supported. The :gen-class directive is ignored when not\n compiling. If :gen-class is not supplied, when compiled only an\n nsname__init.class will be generated. If :refer-clojure is not used, a\n default (refer 'clojure.core) is used. Use of ns is preferred to\n individual calls to in-ns/require/use/import:\n\n (ns foo.bar\n (:refer-clojure :exclude [ancestors printf])\n (:require (clojure.contrib sql combinatorics))\n (:use (my.lib this that))\n (:import (java.util Date Timer Random)\n (java.sql Connection Statement)))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ns"} {:added "1.0", :ns "clojure.core", :name "symbol", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1289212889000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "var", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d00"} {:created-at 1289212892000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "var?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d01"} {:created-at 1331269623000, :author {:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "symbol?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d02"} {:created-at 1331269707000, :author {:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "name", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d03"} {:created-at 1331269713000, :author {:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "namespace", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d04"} {:created-at 1350410406000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "keyword", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d05"} {:created-at 1450416041205, :author {:login "blx", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/887504?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "resolve", :ns "clojure.core"}, :_id "567397a9e4b09a2675a0ba79"} {:created-at 1571179415471, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "deref", :ns "clojure.core"}, :_id "5da64b97e4b0ca44402ef7cd"}], :line 589, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; Returns a symbol with the given namespace and name.\n;;\n;; (symbol name): name can be a string or a symbol.\n;;\n;; (symbol ns name): ns and name must both be strings.\n;;\n;; A symbol string begins with a non-numeric character and can contain\n;; alphanumeric characters and *, +, !, -, _, and ?. (see\n;; http://clojure.org/reader for details).\n;;\n;; symbol does not validate input strings for ns and name, and may return\n;; improper symbols with undefined behavior for non-conformant ns and\n;; name.\n\nuser=> (symbol 'foo)\nfoo\n\nuser=> (symbol \"foo\")\nfoo\n\nuser=> (symbol \"clojure.core\" \"foo\")\nclojure.core/foo\n", :created-at 1280546541000, :updated-at 1331646095000, :_id "542692c8c026201cdc326a06"} {:updated-at 1406075648000, :created-at 1331680187000, :body ";; some gotchas to be aware of:\n\nuser=> (symbol \"user\" 'abc)\nClassCastException clojure.lang.Symbol cannot be cast to java.lang.String clojure.core/symbol (core.clj:523)\n\nuser=> (symbol *ns* \"abc\")\nClassCastException clojure.lang.Namespace cannot be cast to java.lang.String clojure.core/symbol (core.clj:523)\n\nuser=> (symbol 'user \"abc\")\nClassCastException clojure.lang.Symbol cannot be cast to java.lang.String clojure.core/symbol (core.clj:523)\n\n\n;; Warning - the following generated symbols are non-conformant and may wreak\n;; serious havoc in the near/far future when least expected...\n\nuser=> (symbol \"abc def\")\nabc def\n\nuser=> (symbol \"123def\")\n123def\n\nuser=> (symbol \"/123/def/ghi\")\n/123/def/ghi\n\nuser=> (symbol \"/abc/def/ghi\")\n/abc/def/ghi", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"}], :author {:avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon", :account-source "clojuredocs", :login "franks42"}, :_id "542692d5c026201cdc3270a0"} {:body ";; but keywords and numbers are not names\n(symbol 3)\n;; Long cannot be cast to String\n\n;; ... and so they cannot be converted to symbols\n(symbol :dog) \n;; Keyword cannot be cast to String", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1412434976752, :updated-at 1412435184005, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :_id "54300c20e4b05f4d257a29a3"}], :notes nil, :tag "clojure.lang.Symbol", :arglists ["name" "ns name"], :doc "Returns a Symbol with the given namespace and name. Arity-1 works\n on strings, keywords, and vars.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/symbol"} {:added "1.0", :ns "clojure.core", :name "to-array-2d", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1375613655000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "to-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eac"}], :line 4003, :examples [{:author {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user> (def a (to-array-2d [[1 2 3][4 5 6]]))\n#'user/a\nuser> (alength a)\n2\nuser> (alength (aget a 0))\n3\nuser> (aget a 0 0)\n1\nuser> (aget a 0 1)\n2\nuser> (aget a 0 2)\n3\nuser> (aget a 1 0)\n4\nuser> (aget a 2 0)\n→ ERROR\nnil\n\nuser> ", :created-at 1307740341000, :updated-at 1325519043000, :_id "542692cac026201cdc326b5b"} {:updated-at 1486711509639, :created-at 1313976771000, :body ";; quick example of a ragged array where the length of each element of the \n;; 2d array is unique\n\nuser=> (def a (to-array-2d [[0][1 2][3 4 5][6 7 8 9]]))\n#'user/a\nuser=> (map alength [(aget a 0)(aget a 1)(aget a 2)])\n(1 2 3)\nuser=>\nuser=> (aget a 0 2)\nArrayIndexOutOfBoundsException java.lang.reflect.Array.get (Array.java:-2)", :editors [{:login "zezhenyan", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8064559?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon", :account-source "clojuredocs", :login "shockbob"}, :_id "542692cac026201cdc326b5d"}], :notes nil, :tag "[[Ljava.lang.Object;", :arglists ["coll"], :doc "Returns a (potentially-ragged) 2-dimensional array of Objects\n containing the contents of coll, which can be any Collection of any\n Collection.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/to-array-2d"} {:added "1.0", :ns "clojure.core", :name "mod", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1305751254000, :author {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rem", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e34"} {:created-at 1414324069552, :author {:login "alilee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/16739?v=2"}, :to-var {:ns "clojure.core", :name "quot", :library-url "https://github.com/clojure/clojure"}, :_id "544cdf65e4b03d20a102427c"} {:created-at 1468958800877, :author {:login "chrismurrph", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10278575?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "/", :ns "clojure.core"}, :_id "578e8850e4b0bafd3e2a04b3"}], :line 3566, :examples [{:author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :editors [{:login "jeffmad", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c526ef2dcf52b0cf18875fcb5616cee0?r=PG&default=identicon"} {:login "jeffmad", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c526ef2dcf52b0cf18875fcb5616cee0?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "rvlieshout", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/139665?v=2"}], :body "user=> (mod 10 5)\n0\n\nuser=> (mod 10 6)\n4\n\nuser=> (mod 10 10)\n0\n\nuser=> (mod 10 -1)\n0\n\n;; The mod function is defined as the amount by which a number exceeds the\n;; largest integer multiple of the divisor that is not greater than that number.\n;; The largest integer multiple of 5 not greater than -2 is 5 * -1 = -5.\n;; The amount by which -2 exceeds -5 is 3. \n;;\nuser=> (mod -2 5) \n3", :created-at 1279992236000, :updated-at 1415184216966, :_id "542692cec026201cdc326d7d"} {:updated-at 1558287692250, :created-at 1466434631179, :author {:login "dijonkitchen", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/11434205?v=3"}, :body ";; rem and mod are commonly used to get the remainder.\n;; mod means Knuth's mod, Don't confuse it with ANSI C's %\n;; operator, which despite being pronounced\n;; 'mod' actually implements rem, i.e. -10 % 3 = -1.\n;; mod has sign of divisor.\n;; Absolute value depends on dividend and divisor having \n;; same sign or not.\n\nuser=> (mod -10 3)\n2\n\nuser=> (rem -10 3)\n-1\n\nuser=> (mod 10 -3)\n-2\nuser=> (mod -10 -3)\n-1\nuser=> (mod 10 3)\n1", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/7660326?v=4", :account-source "github", :login "Shinkenjoe"} {:login "vaer-k", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4069456?v=4"}], :_id "57680447e4b0bafd3e2a048a"} {:updated-at 1486561191724, :created-at 1486561191724, :author {:login "betegelse", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6758479?v=3"}, :body ";; It works for float / double numbers, too, where it is defined as\n;; (- n (* (Math/floor (/ n d)) d))\n\nuser=> (mod 1.5 1)\n;;=> 0.5\n\nuser=> (mod 475.095 7)\n;;=> 6.095000000000027\n\nuser=> (mod 1024.8402 5.12)\n;;=> 0.8402000000000953\n\nuser=> (mod -1024.8402 5.12)\n;;=> 4.279799999999905\n\nuser=> (let [n 1024.8402\n d 5.12\n q (Math/floor (/ n d))\n r (mod n d)]\n (->> (* q d) (+ r) (- n)))\n;;=> 0.0\n", :_id "589b1fa7e4b01f4add58fe40"}], :notes [{:updated-at 1314955596000, :body "The difference between **rem** and **mod** can be remembered by noting that **mod** always returns a value between 0 and div.", :created-at 1314955596000, :author {:login "wdkrnls", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/6d08a2f792f289b95fe1d982d4133d71?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fc8"} {:updated-at 1350500565000, :body "I am confused by the comment about the definition on lines 13+ of the example - which is not accurate when invoking mod when 'num' is positive and 'div' negative. Applying the definition to
(mod 10 -3)
we have \r\n
  • the largest multiple of -3 not exceeding 10 is 9, from using -3 as a multiplier
  • \r\n
  • however (mod 10 -3) yields -2, meaning that 10 exceeds the largest multiple not greater than 10 by -2 i.e. 10 - -2 = 12 is the largest multiple <= 10, a contradiction.
  • \r\n
  • therefore (mod 10 -3) should yield 1, not -2
  • \r\n\r\nSo unless I misunderstood, the definition should be changed to something like:
    \r\n

    \"The mod function is defined as the amount by which a number exceeds the largest integer multiple of the divisor that is not greater than that number, except when the number is positive and the divisor negative, in which case the result is the amount by which the number exceeds the smallest multiple that is not smaller than the number.\"

    \r\n\r\nOr, change the implementation to something similar to:\r\n\r\n
    (defn mod-2\r\n\t  [num div]\r\n\t  (let [m (rem num div)]\r\n\t    (if (or (zero? m) (= (pos? num) (pos? div)))\r\n\t     \tm\r\n\t     \t(if (pos? div) (+ m div) m)))) \r\n
    \r\n\t \t\r\nto fit the current definition.", :created-at 1350430293000, :author {:login "kingcode", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3d7dd4232cb043d2a3efd99e08ff0983?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fef"}], :arglists ["num div"], :doc "Modulus of num and div. Truncates toward negative infinity.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/mod"} {:added "1.0", :ns "clojure.core", :name "amap", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "areduce", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342853671000, :_id "542692ebf6e94c6970521d8d"} {:created-at 1346930905000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d8e"}], :line 5249, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "(def an-array (int-array 25000 (int 0)))\n\nuser=> (time (amap ^ints an-array \n idx \n ret \n (+ (int 1) \n (aget ^ints an-array idx))))\n\n\"Elapsed time: 14.708653 msecs\"\n\n;; Note: without type hinting the performance of would not be good.", :created-at 1281078010000, :updated-at 1285495171000, :_id "542692ccc026201cdc326c51"}], :macro true, :notes nil, :arglists ["a idx ret expr"], :doc "Maps an expression across an array a, using an index named idx, and\n return value named ret, initialized to a clone of a, then setting \n each element of ret to the evaluation of expr, returning the new \n array ret.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/amap"} {:added "1.0", :ns "clojure.core", :name "pop", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1366675885000, :author {:login "jjcomer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ef581bba2f97adb539c67a35465b3e1b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "peek", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e4d"} {:created-at 1399433581000, :author {:login "Yun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f18708f979ad613ab134cb5002558965?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rest", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e4e"} {:created-at 1400493789000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "conj", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e4f"} {:created-at 1580395434633, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "butlast", :ns "clojure.core"}, :_id "5e32ebaae4b0ca44402ef829"}], :line 1467, :examples [{:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (peek [1 2 3])\n3\nuser=> (pop [1 2 3])\n[1 2]\nuser=> (peek '(1 2 3))\n1\nuser=> (pop '(1 2 3))\n(2 3)", :created-at 1282321157000, :updated-at 1332951332000, :_id "542692cec026201cdc326db5"} {:updated-at 1523918116720, :created-at 1486084396464, :author {:login "HomoEfficio", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/17228983?v=3"}, :body "user=> (peek ())\nnil\nuser=> (pop ())\nIllegalStateException Can't pop empty list\n\nuser=> (peek [])\nnil\nuser=> (pop [])\nIllegalStateException Can't pop empty vector\n\nuser=> (peek (clojure.lang.PersistentQueue/EMPTY))\nnil\nuser=> (into [] (pop (clojure.lang.PersistentQueue/EMPTY)))\n[] ;; Can pop empty Queue", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5893d92ce4b01f4add58fe39"} {:updated-at 1518213815646, :created-at 1518213815646, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Use a vector as a LIFO stack to check for balanced brackets\n\n(require '[clojure.set :refer [map-invert]])\n\n(defn balance [form]\n (let [brackets {\\[ \\] \\( \\) \\{ \\}}\n scan (fn [q x]\n (cond\n (brackets x) (conj q x)\n ((map-invert brackets) x)\n (if (= (brackets (peek q)) x)\n (pop q)\n (throw\n (ex-info\n (str \"Unmatched delimiter \" x) {})))\n :else q))]\n (reduce scan [] form)))\n\n(balance \"(let [a (inc 1]) (+ a 2))\")\n;; ExceptionInfo Unmatched delimiter ]\n\n(balance \"(let [a (inc 1)] (+ a 2))\")\n;; []\n", :_id "5a7e1ab7e4b0316c0f44f8b4"} {:updated-at 1518707324327, :created-at 1518707324327, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;basic example on vector and list\n\n;;pop on vector returns a new vector removing the last element\n(pop [1 2 3])\n;; [1 2]\n\n;;pop on list returns a new list removing the first element\n(pop '(1 2 3)) ;; (2 3)", :_id "5a85a27ce4b0316c0f44f8be"}], :notes [{:updated-at 1349888752000, :body "Small reminder:\r\n\r\n
    \r\nDo not work for arbitrary seq but just for persistent types implementing clojure.lang.IPersistentStack (like clojure.lang.Persistent*).\r\n\r\n
    \r\nExample:\r\n
    user> (pop (cons 1 '()))\r\n; Evaluation aborted.\r\n
    \r\ndo not work because type is clojure.lang.Cons but\r\n\r\n
    user> (pop (conj '() 1))\r\n()\r\n
    \r\nworks because type is clojure.lang.PersistentList.", :created-at 1349885055000, :author {:login "tomby42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/305033855efb82d6041586b874b5bb24?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521feb"}], :arglists ["coll"], :doc "For a list or queue, returns a new list/queue without the first\n item, for a vector, returns a new vector without the last item. If\n the collection is empty, throws an exception. Note - not the same\n as next/butlast.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/pop"} {:added "1.0", :ns "clojure.core", :name "use", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1284770251000, :author {:login "rbolkey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d537f88b794c220d6ce447add22c12a7?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "refer", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dd2"} {:created-at 1284770260000, :author {:login "rbolkey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d537f88b794c220d6ce447add22c12a7?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "require", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dd3"} {:created-at 1289380610000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ns", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dd4"} {:created-at 1291628646000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "import", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dd5"}], :line 6093, :examples [{:author {:login "scode", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/87b4fd6e7ac86cbf1f1b683f7856057?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Use the namespace clojure.java.io:\nuser=> (use '(clojure.java io))\n\n", :created-at 1279160083000, :updated-at 1285497782000, :_id "542692cfc026201cdc326e03"} {:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "clizzin", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/555813697e5dc358bb27d5efd3ffa23?r=PG&default=identicon"}], :body ";; Imports only the split function from clojure.string.\nuser=> (use '[clojure.string :only (split)])\nnil\n\n;; split is now available without a namespace qualification.\nuser=> (split \"hello world\" #\" \")\n[\"hello\" \"world\"]\n\n;; You can also add the :as keyword to import the rest of clojure.string\n;; with a namespace qualification.\nuser=> (use '[clojure.string :as s :only (split)])\nnil\n\n;; Now we can access any function in clojure.string using s.\nuser=> (s/replace \"foobar\" \"foo\" \"squirrel\")\n\"squirrelbar\"\n\n;; And we can still call split with or without the s qualification.\nuser=> (split \"hello world\" #\" \")\n[\"hello\" \"world\"]\nuser=> (s/split \"hello world\" #\" \")\n[\"hello\" \"world\"]", :created-at 1279596076000, :updated-at 1294233809000, :_id "542692cfc026201cdc326e05"} {:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [{:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}], :body "(ns some.namespace\n (:require [clojure.contrib.json :as json])\n (:use [clojure.string :only [trim lower-case split]]\n [clojure.contrib.shell-out]\n [clojure.pprint]\n [clojure.test]))\n", :created-at 1291021620000, :updated-at 1338424818000, :_id "542692cfc026201cdc326e08"} {:updated-at 1474049969039, :created-at 1474049969039, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :body ";; use accepts other keywords from require that aren't listed in the docstring.\n\n;; If you try to load a namespace, and it fails to load due to an error in\n;; the source code, when you load it again after fixing the problem, you\n;; can get a \"namespace not found\" exception. Use :reload to avoid this:\n(use '[my.namespace] :reload)\n\n;; However, if the error was in source for a namespace required or used\n;; from my.namespace, you'll get the \"namespace not found\" exception\n;; after fixing the problem, even using :reload. Use :reload-all to avoid this:\n(use '[my.namespace] :reload-all)\n\n;; You can also use :verbose, which does what you would think it would do:\n(use '[my.namespace] :verbose)", :_id "57dc37b1e4b0709b524f04fb"} {:updated-at 1648959694945, :created-at 1648959694945, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}, :body ";; As the docstring says,\n;;\n;; The arguments and semantics for :exclude, :only, and :rename are the same\n;; as those documented for clojure.core/refer\n;;\n;; but the syntax for these options is derived from require, not refer.\n;; Here is an example using Clojure 1.11, in which the abs function was\n;; introduced into clojure.core.\n\n;; First let's try it with require and refer separately:\nuser=> (require 'clojure.math.numeric-tower)\nnil\nuser=> (refer 'clojure.math.numeric-tower :exclude '[abs])\nnil\nuser=> abs\n#object[clojure.core$abs 0x36fdf831 \"clojure.core$abs@36fdf831\"]\n;; The last line shows that we've correctly excluded the version of\n;; abs that numeric-tower defines, and instead are using the version of abs\n;; that's now in clojure.core.\n\n;; Now let's try it with use. The refer-style syntax doesn't work:\nuser=> (use 'clojure.math.numeric-tower :exclude '[abs])\nSyntax error compiling at (/private/var/folders/68/d0l7z7p906l07fj6s7j5_ygm0000gq/T/form-init6849217183418449171.clj:1:1).\nUnsupported option(s) supplied: :exclude\n;; Instead :exclude must be wrapped up with the namespace in a sequence,\n;; as with options for require:\nuser=> (use '[clojure.math.numeric-tower :exclude [abs]])\nnil\nuser=> abs\n#object[clojure.core$abs 0x13abd924 \"clojure.core$abs@13abd924\"]\n", :_id "624920cee4b0b1e3652d75ca"}], :notes [{:updated-at 1291628658000, :body "Good description of use/require/import here:\r\n\r\nhttp://blog.8thlight.com/articles/2010/12/6/clojure-libs-and-namespaces-require-use-import-and-ns", :created-at 1291628658000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fab"} {:updated-at 1318868130000, :body "http://blog.8thlight.com/colin-jones/2010/12/05/clojure-libs-and-namespaces-require-use-import-and-ns.html", :created-at 1318868130000, :author {:login "vikbehal", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b773242b82712096e51f5f6aed5f9abd?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fd0"} {:author {:login "rafaroca", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/609454?v=4"}, :updated-at 1667422305527, :created-at 1667422305527, :body "The blog post from 8thlight is not available under the above URL anymore. The Wayback Machine has a snapshot of it.\n\nhttps://web.archive.org/web/20220323035057/https://8thlight.com/blog/colin-jones/2010/12/05/clojure-libs-and-namespaces-require-use-import-and-ns.html", :_id "6362d861e4b0b1e3652d7680"}], :arglists ["& args"], :doc "Like 'require, but also refers to each lib's namespace using\n clojure.core/refer. Use :use in the ns macro in preference to calling\n this directly.\n\n 'use accepts additional options in libspecs: :exclude, :only, :rename.\n The arguments and semantics for :exclude, :only, and :rename are the same\n as those documented for clojure.core/refer.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/use"} {:ns "clojure.core", :name "unquote", :file "clojure/core.clj", :type "var", :column 1, :see-alsos [{:created-at 1319196053000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unquote-splicing", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d5d"} {:created-at 1537911869941, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "quote", :ns "clojure.core"}, :_id "5baaac3de4b00ac801ed9ea6"}], :line 13, :examples [{:author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=2"}, :editors [{:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=2"}], :body "user=> (let [x 2]\n `(1 x 3))\n(1 user/x 3)\n\nuser=> (let [x 2]\n `(1 ~x 3))\n(1 2 3)\n", :created-at 1305077398000, :updated-at 1305077465000, :_id "542692cec026201cdc326d76"} {:author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :editors [], :body "user=> `(1 (dec 3) 3)\n\n(1 (clojure.core/dec 3) 3)\n\nuser => `(1 ~(dec 3) 3)\n\n(1 2 3)", :created-at 1319196729000, :updated-at 1319196729000, :_id "542692d5c026201cdc3270af"}], :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unquote"} {:added "1.0", :ns "clojure.core", :name "declare", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1336168390000, :author {:login "gavilancomun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f4b1f93f88e052f9eb412a8791b6ddf1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "def", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c7e"}], :line 2776, :examples [{:updated-at 1285500741000, :created-at 1279161281000, :body "user=> (defn foo []\n (undefined-func))\n; Evaluation aborted. Unable to resolve symbol: undefined-func in this context\nnil\n\nuser=> (declare undefined-func)\n#'user/undefined-func\n\nuser=> (defn foo []\n (undefined-func))\n#'user/foo\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692cdc026201cdc326d18"} {:author {:login "lu4nx", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4acdafde2cbf672ee0389cf8016378?r=PG&default=identicon"}, :editors [{:login "lu4nx", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4acdafde2cbf672ee0389cf8016378?r=PG&default=identicon"}], :body "user=> (declare show)\n#'user/show\nuser=> (defn welcome [user-name] (prn (show) user-name))\n#'user/welcome\nuser=> (defn show [] (prn \"welcome \"))\n#'user/show\nuser=> (welcome \"lu4nx\")\n\"welcome \"\nnil \"lu4nx\"\nnil\nuser=> ", :created-at 1385992546000, :updated-at 1385992606000, :_id "542692d2c026201cdc326f78"} {:body "; def will do too.\nuser=> (def show)\n#'user/show\nuser=> (defn welcome [user-name] (prn (show) user-name))\n#'user/welcome\nuser=> (defn show [] (prn \"welcome\"))\n#'user/show\nuser=> (welcome \"lu4nx\")\n\"welcome\"\nnil \"lu4nx\"\nnil", :author {:login "kimtg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7685905?v=3"}, :created-at 1425741679616, :updated-at 1425741679616, :_id "54fb176fe4b0b716de7a6533"} {:editors [{:login "owenRiddy", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/8080718?v=4"}], :body ";;Declare (like \"def\") has a natural partner in \"var\".\n;;Consider trying to embed a to-be-defined function in a data structure:\n\n(declare foo)\n(def bar {:handy-fn foo})\n(defn foo [] 42)\n((:handy-fn bar))\n;;IllegalStateException Attempting to call unbound fn: #'user/foo clojure.lang.Var$Unbound.throwArity (Var.java:43)\n\n;;:handy-fn in bar is now permanently linked to the unbound var\n;; present when the def was evaluated. This can be avoided\n;; by not evaluating foo when creating bar.\n\n(declare foo)\n;;(def bar {:handy-fn (var foo)})\n(def bar {:handy-fn #'foo})\n(defn foo [] 42)\n((:handy-fn bar))\n;; 42", :author {:avatar-url "https://avatars0.githubusercontent.com/u/8080718?v=4", :account-source "github", :login "owenRiddy"}, :created-at 1502501725640, :updated-at 1502501762521, :_id "598e5b5de4b0d19c2ce9d714"}], :macro true, :notes nil, :arglists ["& names"], :doc "defs the supplied var names with no bindings, useful for making forward declarations.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/declare"} {:added "1.1", :ns "clojure.core", :name "dissoc!", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1329969087000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "assoc!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ea9"} {:created-at 1577916166729, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "conj!", :ns "clojure.core"}, :_id "5e0d1706e4b0ca44402ef80b"}], :line 3381, :examples [{:author {:avatar-url "https://avatars.githubusercontent.com/u/1453?v=4", :account-source "github", :login "ghoseb"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; dissoc! works on a transient map\n\n;; WARNING: Below is an example of what is called \"bashing in place\" of\n;; a transient, and is _NOT_ the correct way to use transients. See assoc!\n;; examples for some discussion of the reason.\n;; Also see one example for conj! that contains a detailed example\n;; of a wrong result that can occur if you do not use its return value.\n\n(let [my-map (transient {:x 1 :y 2 :z 3})]\n (dissoc! my-map :x) ; mistake is to use my-map below, not dissoc! return val\n (persistent! my-map)) ; returns persistent map {:y 2 :z 3}\n\n\n;; Here is a correct way to do the operation described above:\n\n(let [my-map (transient {:x 1 :y 2 :z 3})\n x (dissoc! my-map :x)] ; after this, don't use my-map again, only x\n (persistent! x)) ; returns persistent map {:y 2 :z 3}", :created-at 1293728413000, :updated-at 1577916082525, :_id "542692cbc026201cdc326c15"}], :notes nil, :arglists ["map key" "map key & ks"], :doc "Returns a transient map that doesn't contain a mapping for key(s).", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/dissoc!"} {:added "1.2", :ns "clojure.core", :name "reductions", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1289800579000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "reduce", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b07"} {:created-at 1423043837477, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "reduced", :library-url "https://github.com/clojure/clojure"}, :_id "54d1ecfde4b081e022073c59"}], :line 7214, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (reductions + [1 1 1 1])\n(1 2 3 4)\nuser=> (reductions + [1 2 3])\n(1 3 6)\n\n;; This is just like reduce except that the calculation is collected during the reduce.\nuser=> (assert (= (reduce + [1 2 3]) \n (last (reductions + [1 2 3]))))\nnil\n", :created-at 1281363432000, :updated-at 1285494988000, :_id "542692cbc026201cdc326baa"} {:body "user=> (reductions conj [] '(1 2 3))\n([] [1] [1 2] [1 2 3])", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423043905622, :updated-at 1423043905622, :_id "54d1ed41e4b081e022073c5a"} {:body "user=> (reductions + [1 2 3 4 5])\n(1 3 6 10 15)\n\n;;defining the function to perform the same reductions\nuser=> (reductions (fn [sum num] (+ sum num)) [1 2 3 4 5])\n;;(1 3 6 10 15)\n\n;;reductions using a init value 100\nuser=> (reductions (fn [sum num] (+ sum num)) 100 [1 2 3 4 5])\n;;(100 101 103 106 110 115)\n\n;;defining a function for the same reductions\nuser=>(defn add [sum num] \n #_=>(+ sum num))\n;;#'user/add\n\nuser=>(reductions add [1 2 3 4 5])\n;;(1 3 6 10 15)", :author {:login "pavanred", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/60858?v=3"}, :created-at 1427434749175, :updated-at 1427476229157, :editors [{:login "pavanred", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/60858?v=3"}], :_id "5514ecfde4b08eb9aa0a8d3a"} {:updated-at 1488836230529, :created-at 1488836230529, :author {:login "matrix10657", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1264071?v=3"}, :body ";; useful for performing lazy calculations which rely on \n;; previous calculations\n\n;; e.g. Taking an infinite list of posts with some height and \n;; adding an offset to each, which is the sum of all previous \n;; heights\n\nuser=> (def posts (repeat {:height 50}))\n#'user/posts\n\nuser=> (take 3 posts)\n({:height 50} {:height 50} {:height 50})\n\nuser=> (def posts-with-offsets\n #_=> (map #(assoc %1 :offset %2)\n #_=> posts\n #_=> (reductions + 0 (map :height posts))))\n#'user/posts-with-offsets\n\nuser=> (take 3 posts-with-offsets)\n({:height 50, :offset 0} {:height 50, :offset 50} {:height 50, :offset 100})\n\n", :_id "58bdd686e4b01f4add58fe6b"}], :notes [{:author {:login "betegelse", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6758479?v=3"}, :updated-at 1486825461877, :created-at 1486825461877, :body "I think the description above would be clearer if it stated that the result of reductions is equivalent to the sequence of results of applying reduce to `(take n coll)`, with `n` starting with 1, that is, equivalent to\n```clojure\n(defn my-reduce [op coll] (for [n (range (count coll))] (reduce op (take (inc n) coll)))\n```\n", :_id "589f27f5e4b01f4add58fe4a"} {:author {:login "jayzawrotny", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/590297?v=4"}, :updated-at 1523454828509, :created-at 1523454828509, :body "In other libraries and languages this function may be referred to as \"scan\". ", :_id "5ace136ce4b045c27b7fac3c"}], :arglists ["f coll" "f init coll"], :doc "Returns a lazy seq of the intermediate values of the reduction (as\n per reduce) of coll by f, starting with init.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/reductions"} {:added "1.0", :ns "clojure.core", :name "aset-byte", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 3976, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; create an array of 10 bytes and set one of the values to 127\n\nuser=> (def bs (byte-array 10))\n#'user/bs\nuser=> (vec bs)\n[0 0 0 0 0 0 0 0 0 0]\nuser=> (aset-byte bs 2 127)\n127\nuser=> (vec bs)\n[0 0 127 0 0 0 0 0 0 0]\nuser=>", :created-at 1313914294000, :updated-at 1313914294000, :_id "542692c6c026201cdc32692c"}], :notes [{:body "See [aset](http://clojuredocs.org/clojure.core/aset) for illustrations of multi-dimensional syntax.", :created-at 1432829120788, :updated-at 1432829120788, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :_id "55673cc0e4b03e2132e7d172"}], :arglists ["array idx val" "array idx idx2 & idxv"], :doc "Sets the value at the index/indices. Works on arrays of byte. Returns val.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/aset-byte"} {:added "1.9", :ns "clojure.core", :name "indexed?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 6274, :examples [{:updated-at 1611630046254, :created-at 1611630046254, :author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :body "(indexed? '(1 2 3)) ;;=> false\n\n(indexed? [1 2 3]) ;;=> true\n\n(indexed? {:a \"Hi\" :hello \"Why\"}) ;;=> false\n\n(indexed? (sorted-set 1 2 3)) ;;=> false\n\n(indexed? #{1 2 3}) ;;=> false", :_id "600f85dee4b0b1e3652d743d"}], :notes nil, :arglists ["coll"], :doc "Return true if coll implements Indexed, indicating efficient lookup by index", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/indexed_q"} {:added "1.1", :ns "clojure.core", :name "ref-history-count", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1329984882000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref-min-history", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eb6"} {:created-at 1329984893000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref-max-history", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eb7"} {:created-at 1364770223000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eb8"}], :line 2463, :examples [{:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [], :body "user=> (def store (ref {}))\n#'user/store\nuser=> (ref-history-count store)\n0\nuser=> (ref-max-history store)\n10\nuser=> (ref-min-history store)\n0", :created-at 1329984988000, :updated-at 1329984988000, :_id "542692d5c026201cdc327069"} {:updated-at 1656667547237, :created-at 1656667547237, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; ref must have a :min-history of >0 to use the history queue\n\n(def r (ref 42 :min-history 2));; => #'user/r\n(ref-history-count r);; => 0\n(dosync (alter r inc));; => 43\n(ref-history-count r);; => 1\n(dosync (alter r inc));; => 44\n(ref-history-count r);; => 2", :_id "62bebd9be4b0b1e3652d7611"}], :notes nil, :arglists ["ref"], :doc "Returns the history count of a ref", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ref-history-count"} {:added "1.2", :ns "clojure.core", :name "-", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1351919398000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "-'", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d20"} {:created-at 1423527267534, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "unchecked-negate", :library-url "https://github.com/clojure/clojure"}, :_id "54d94d63e4b0e2ac61831d44"} {:created-at 1423527580571, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "unchecked-subtract", :library-url "https://github.com/clojure/clojure"}, :_id "54d94e9ce4b081e022073c85"} {:created-at 1525302779122, :author {:login "NealEhardt", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1338977?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "dec", :ns "clojure.core"}, :_id "5aea45fbe4b045c27b7fac5c"}], :line 1043, :examples [{:author {:login "MrHus", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4"}, :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (- 1)\n-1 \nuser=> (- 6 3) \n3\nuser=> (- 10 3 2) \n5", :created-at 1279418306000, :updated-at 1332950680000, :_id "542692c8c026201cdc326a4f"} {:body "\n(- 0 9000000000000000000 1000000000000000000)\n;; ArithmeticException: integer overflow\n\n(-' 0 9000000000000000000 1000000000000000000)\n;;=> 10000000000000000000N \n\n\n", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1412882447241, :updated-at 1412882447241, :_id "5436e00fe4b0ae7956031579"}], :notes nil, :arglists ["x" "x y" "x y & more"], :doc "If no ys are supplied, returns the negation of x, else subtracts\n the ys from x and returns the result. Does not auto-promote\n longs, will throw on overflow. See also: -'", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/-"} {:added "1.1", :ns "clojure.core", :name "assoc!", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1324959540000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "dissoc!", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a8d"} {:created-at 1324959556000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "transient", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a8e"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "conj!", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/1453?v=4", :account-source "github", :login "ghoseb"}, :created-at 1327875049000, :_id "542692eaf6e94c6970521a8f"} {:created-at 1417201150839, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "pop!", :library-url "https://github.com/clojure/clojure"}, :_id "5478c5fee4b03d20a10242b6"} {:created-at 1417201158048, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "disj!", :library-url "https://github.com/clojure/clojure"}, :_id "5478c606e4b03d20a10242b7"} {:created-at 1417201185853, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "persistent!", :library-url "https://github.com/clojure/clojure"}, :_id "5478c621e4b0dc573b892fe2"}], :line 3368, :examples [{:author {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/1453?v=4", :account-source "github", :login "ghoseb"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; The key concept to understand here is that transients are \n;; not meant to be `bashed in place`; always use the value \n;; returned by either assoc! or other functions that operate\n;; on transients.\n\n(defn merge2\n \"An example implementation of `merge` using transients.\"\n [x y]\n (persistent! (reduce\n (fn [res [k v]] (assoc! res k v))\n (transient x)\n y)))\n\n;; Why always use the return value, and not the original? Because the return\n;; value might be a different object than the original. The implementation\n;; of Clojure transients in some cases changes the internal representation\n;; of a transient collection (e.g. when it reaches a certain size). In such\n;; cases, if you continue to try modifying the original object, the results\n;; will be incorrect. See one example for conj! that contains a detailed\n;; example of a wrong result that can occur if you do not use its return value.\n\n;; Think of transients like persistent collections in how you write code to\n;; update them, except unlike persistent collections, the original collection\n;; you passed in should be treated as having an undefined value. Only the return\n;; value is predictable.", :created-at 1307739385000, :updated-at 1577916047949, :_id "542692c8c026201cdc326a21"} {:updated-at 1482997682425, :created-at 1482997682425, :author {:login "dalzony", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/562341?v=3"}, :body "(def m (assoc! (transient {}) :x 1 :y 2))\n\n(:x m)\n;; 1\n\n(:y m)\n;; 2\n\n(count m)\n;; 2", :_id "5864bfb2e4b0fd5fb1cc9649"}], :notes nil, :arglists ["coll key val" "coll key val & kvs"], :doc "When applied to a transient map, adds mapping of key(s) to\n val(s). When applied to a transient vector, sets the val at index.\n Note - index must be <= (count vector). Returns coll.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/assoc!"} {:added "1.0", :ns "clojure.core", :name "hash-set", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1471555426806, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "sorted-set", :ns "clojure.core"}, :_id "57b62762e4b0b5e6d7a4fa5a"} {:created-at 1532623831801, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "set", :ns "clojure.core"}, :_id "5b59fbd7e4b00ac801ed9e2d"}], :line 389, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "rafael", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7adbf4434f63cedd463196b652fa7a44?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "clojureking", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/92625b8a6be91bb8c688d0d07b4e2a32?r=PG&default=identicon"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :body ";; Any duplicates are squashed (no error)\n(hash-set 1 2 1 3 1 4 1 5)\n;;=> #{1 4 3 2 5}\n\n;; There is an equivalent reader macro '#{...}'\n(= (hash-set :c :a :b) #{:b :a :c})\n;;=> true \n\n;; A string can be treated as a sequence to produce\n;; a set of the characters found in the string.\n(apply hash-set (seq \"Lorem ipsum dolor sit amet\"))\n;;=> #{\\space \\a \\d \\e \\i \\L \\l \\m \\o \\p \\r \\s \\t \\u}\n\n;; or simply (see \"set\")\n(set \"Lorem ipsum dolor sit amet\")\n;;=> #{\\space \\a \\d \\e \\i \\L \\l \\m \\o \\p \\r \\s \\t \\u}", :created-at 1280503618000, :updated-at 1532623811799, :_id "542692c6c026201cdc326931"} {:updated-at 1643941642045, :created-at 1643941642045, :author {:login "jlb0170", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4674635?v=4"}, :body ";; The \"equivalent\" reader macro throws an error when receiving duplicates, however:\n#{ 1 2 1 }\n;;=> Duplicate key: 1", :_id "61fc8f0ae4b0b1e3652d75a7"}], :notes nil, :arglists ["" "& keys"], :doc "Returns a new hash set with supplied keys. Any equal keys are\n handled as if by repeated uses of conj.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/hash-set"} {:added "1.4", :ns "clojure.core", :name "reduce-kv", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1413271598814, :author {:login "viksit", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/198669?v=2"}, :to-var {:ns "clojure.core", :name "reduce", :library-url "https://github.com/clojure/clojure"}, :_id "543cd02ee4b0a3cf052fe475"} {:created-at 1423043757434, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "reduced", :library-url "https://github.com/clojure/clojure"}, :_id "54d1ecade4b081e022073c58"}], :line 6847, :examples [{:body "Let's assume you want to apply a function to a vector of maps,\n\nInput: [{:a 1 :b 2} {:a 3 :b 4}]\n\nsuch that all vals are incremented by 1.\n\nResult: [{:a 2 :b 3} {:a 4 :b 5}]\n\nAn easy way to do so is using reduce-kv,\n\n(def vector-of-maps [{:a 1 :b 2} {:a 3 :b 4}])\n\n(defn update-map [m f] \n (reduce-kv (fn [m k v] \n (assoc m k (f v))) {} m))\n\n(map #(update-map % inc) vector-of-maps)\n\n=> ({:b 3, :a 2} {:b 5, :a 4})", :author {:login "viksit", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/198669?v=2"}, :created-at 1413271555020, :updated-at 1413271555020, :_id "543cd003e4b02688d208b1b4"} {:body ";; Swap keys and values in a map\nuser=> (reduce-kv #(assoc %1 %3 %2) {} {:a 1 :b 2 :c 3})\n{1 :a, 2 :b, 3 :c}", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423043718645, :updated-at 1423043718645, :_id "54d1ec86e4b0e2ac61831d0f"} {:updated-at 1445117098242, :created-at 1445117098242, :author {:login "Luckvery", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1178168?v=3"}, :body ";; Swap keys with values, only if values are not empty,\n;; while turning values into proper keys\n\n(def someMap { :foo \"food\", :bar \"barista\", :baz \"bazaar\"})\n\n(defn swap [someMap]\n (reduce-kv (fn [m k v]\n (if (empty? v) m (assoc m (keyword v) (name k)))) {} someMap))\n\n(swap someMap)\n\n=> {:food \"foo\", :barista \"bar\", :bazaar \"baz\"}\n", :_id "5622bcaae4b04b157a6648d6"} {:editors [{:login "bpetri", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8858685?v=3"}], :body ";; Calculate total wins and winning streaks\n(def all-games \n [{:game 1 :won true} \n {:game 2 :won false} \n {:game 3 :won true} \n {:game 4 :won true}])\n\n(reduce-kv\n (fn [result index game]\n (let [last-game (last result)\n wins (if (:won game) \n (inc (:total last-game 0)) \n (:total last-game))\n streak (if (:won game) \n (inc (:streak last-game 0)) \n 0)]\n (println (assoc game :total wins :streak streak))\n (conj result (assoc game :total wins :streak streak))))\n []\n all-games)\n\n;; Output\n;; {:game 1, :won true, :total 1, :streak 1}\n;; {:game 2, :won false, :total 1, :streak 0}\n;; {:game 3, :won true, :total 2, :streak 1}\n;; {:game 4, :won true, :total 3, :streak 2}\n\n;; [{:game 1, :won true, :total 1, :streak 1} {:game 2, :won false, :total 1, :streak 0} {:game 3, :won true, :total 2, :streak 1} {:game 4, :won true, :total 3, :streak 2}]", :author {:avatar-url "https://avatars.githubusercontent.com/u/140163?v=3", :account-source "github", :login "puppybits"}, :created-at 1446938119194, :updated-at 1461160135892, :_id "563e8607e4b0290a56055d1f"} {:editors [{:login "jvanderhyde", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6516608?v=3"}], :body ";; You can define map-kv using reduce-kv, \n;; to do something to every value in a map.\n\n(defn map-kv [f coll]\n (reduce-kv (fn [m k v] (assoc m k (f v))) (empty coll) coll))\n\n(map-kv inc {:a 12, :b 19, :c 2})\n;;=> {:c 3, :b 20, :a 13}\n\n;; It works on vectors, too.\n(map-kv inc [1 1 2 3 5])\n;;=> [2 2 3 4 6]", :author {:avatar-url "https://avatars.githubusercontent.com/u/6516608?v=3", :account-source "github", :login "jvanderhyde"}, :created-at 1473374682272, :updated-at 1473374856199, :_id "57d1e9dae4b0709b524f04eb"} {:updated-at 1486417959138, :created-at 1486417959138, :author {:login "overset", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/34342?v=3"}, :body ";; It works with indexes on vectors as well\n\n(reduce-kv (fn [res idx itm] (assoc res idx itm)) {} [\"one\" \"two\" \"three\"])\n\n;;=> {2 \"three\", 1 \"two\", 0 \"one\"}", :_id "5898f027e4b01f4add58fe3c"} {:updated-at 1486833406498, :created-at 1486833406498, :author {:login "bsifou", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8908139?v=3"}, :body "\n(defn update-map-entries[m e]\n (reduce-kv (fn [r k v] (assoc r k v)) m e))\n\n;;user=> (update-map-entries {:a 1 :b 2 :c 3} {:a 5 :b 9})\n;;{:a 5, :b 9, :c 3}\n;;user=> (update-map-entries {:a 1 :b 2 :c 3} {:a 5 :b 9 :d 8})\n;;{:a 5, :b 9, :c 3, :d 8}\n\n\n", :_id "589f46fee4b01f4add58fe4b"} {:updated-at 1596611537211, :created-at 1596611537211, :author {:login "themustafabasit", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/24441401?v=4"}, :body ";; increment map values \n(def abc-map {:a 1\n :b 2\n :c 3})\n(seq abc-map)\n;; => ([:a 1] [:b 2] [:c 3])\n\n;; via reduce \n(reduce (fn [new-map [k v]]\n (assoc new-map k (inc v)))\n {}\n abc-map)\n;; => {:a 2, :b 3, :c 4}\n\n\n;; via reduce-kv\n(reduce-kv (fn [new-map k v]\n (assoc new-map k (inc v)))\n {}\n abc-map)\n;; => {:a 2, :b 3, :c 4}\n", :_id "5f2a5bd1e4b0b1e3652d7372"} {:updated-at 1602494138585, :created-at 1602494138585, :author {:login "cdol", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/47477903?v=4"}, :body ";; filter a coll of maps with arbitrary # of preds\n\n;; setup coll\n(def people '(\t{:gender \"male\", :age-group \"child\", :origin \"Germany\", :prename \"Hans\"}\n\t\t{:gender \"male\", :age-group \"adult\", :origin \"France\", :prename \"Jacques\"}\n\t\t{:gender \"male\", :age-group \"senior\", :origin \"Estonia\", :prename \"Rasmus\"}\n\t\t{:gender \"male\", :age-group \"adult\", :origin \"Poland\", :prename \"Jakub\"}\n\t\t{:gender \"male\", :age-group \"senior\", :origin \"Germany\", :prename \"Uwe\"}\n\t\t{:gender \"female\", :age-group \"adult\", :origin \"France\", :prename \"Amélie\"}\n\t\t{:gender \"female\", :age-group \"child\", :origin \"Estonia\", :prename \"Sofia\"}\n\t\t{:gender \"female\", :age-group \"child\", :origin \"Germany\", :prename \"Emma\"}\n\t\t{:gender \"female\", :age-group \"child\", :origin \"Estonia\", :prename \"Alisa\"}\n\t\t{:gender \"female\", :age-group \"senior\", :origin \"Poland\", :prename \"Anna\"}))\n\n;; select elements using reduce-kv & filter\n(defn multi-pred [coll m] \n (reduce-kv \n (fn [erg k v] (filter #(= v (k %)) erg)) coll m) )\n\n;; two \"preds\"\n(multi-pred people {:gender \"male\", :age-group \"senior\"})\n;; => ({:gender \"male\", :age-group \"senior\", :origin \"Estonia\", :prename \"Rasmus\"} {:gender \"male\", :age-group \"senior\", :origin \"Germany\", :prename \"Uwe\"})\n\n;; three \"preds\"\n(multi-pred people {:gender \"female\", :age-group \"child\", :origin \"Estonia\"})\n;; => ({:gender \"female\", :age-group \"child\", :origin \"Estonia\", :prename \"Sofia\"} {:gender \"female\", :age-group \"child\", :origin \"Estonia\", :prename \"Alisa\"})", :_id "5f841ebae4b0b1e3652d73d6"} {:updated-at 1639378520202, :created-at 1639378520202, :author {:login "cloudbuck3t", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/90472507?v=4"}, :body ";; an example to show how to add a new key to nested maps.\n\n;; consider a map with submaps\n{:a {:b 1} :c {:d 2} :e {:f 3}}\n\n\n;; reduce-kv keeps an accumulator that \n;; starts with the value provided in init, \n;; in this case an empty map.\n\n\n;; you can return the original collection via reduce-kv this way\n(reduce-kv\n (fn [acc k v]\n (assoc acc k v))\n {}\n {:a {:b 1} :c {:d 2} :e {:f 3}}))\n\n;; the output is identical to the input.\n=> {:a {:b 1} :c {:d 2} :e {:f 3}}\n\n;; you can insert a new key-value pair into each submap \n;; by using this instead, generalized as a function\n;; that takes a map and a new-key and its new-key-value as inputs:\n\n(defn add-submap [m new-key new-keys-value]\n (reduce-kv\n (fn [acc k v]\n (assoc acc k (assoc v new-key new-keys-value)))\n {}\n m))\n\n;; notice how the value \"v\" of the key \"k\" is actually the submap on each key,\n;; when we visit :a we are looking at the first k-v pair,\n;; the key is :a, \n;; and the value is {:b 1}\n;; \n;; so we assoc a new key into that submap (the value) \n;; for each key-and-submap pairing.\n\n;; so when you run this function \n=> (add-submap {:a {:b 1} \n :c {:d 2} \n :e {:f 3}} :email-verified nil)\n\n;; the result is the original data with the new key and its val in each submap.\n=> {:a {:b 1, :email-verified nil}, \n :c {:d 2, :email-verified nil}, \n :e {:f 3, :email-verified nil}}", :_id "61b6ee58e4b0b1e3652d7588"}], :notes [{:author {:login "KingMob", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/946421?v=4"}, :updated-at 1610241088036, :created-at 1610241088036, :body "Currently broken for subvectors: [CLJ-2065](https://clojure.atlassian.net/browse/CLJ-2065)", :_id "5ffa5440e4b0b1e3652d7428"} {:author {:login "diegonayalazo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/11781279?v=4"}, :updated-at 1649396094971, :created-at 1649396032294, :body "Seems to be fixed for subvectors as of release 1.11. https://clojure.atlassian.net/browse/CLJ-2065", :_id "624fc940e4b0b1e3652d75cd"}], :arglists ["f init coll"], :doc "Reduces an associative collection. f should be a function of 3\n arguments. Returns the result of applying f to init, the first key\n and the first value in coll, then applying f to that result and the\n 2nd key and value, etc. If coll contains no entries, returns init\n and f is not called. Note that reduce-kv is supported on vectors,\n where the keys will be the ordinals.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/reduce-kv"} {:added "1.0", :ns "clojure.core", :name "or", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1300530940000, :author {:login "j1n3l0", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/6db7c6ecdbe97a1e844c88ecf587f61f?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "and", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c42"} {:created-at 1334293978000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "if", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c43"} {:created-at 1582756022836, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "some-fn", :ns "clojure.core"}, :_id "5e56f0b6e4b087629b5a18ad"}], :line 854, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [{:login "purplejacket", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/214093?v=3"}], :body "user> (or true false false)\ntrue\n\nuser> (or true true true)\ntrue\n\nuser> (or false false false)\nfalse\n\nuser> (or nil nil)\nnil\n\nuser> (or false nil)\nnil\n\nuser> (or true nil)\ntrue\n\n;; or doesn't evaluate if the first value is true\nuser> (or true (println \"foo\"))\ntrue\n\n;; order matters\nuser> (or (println \"foo\") true)\nfoo\ntrue\n\n;; does not coerce a given value to a boolean true, returns the value\nuser> (or false 42)\n42\n\nuser> (or false 42 9999)\n42\n\nuser> (or 42 9999)\n42", :created-at 1293673853000, :updated-at 1429754329073, :_id "542692cbc026201cdc326bc3"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; See examples for \"if\" explaining Clojure's idea of logical true\n;; and logical false.", :created-at 1334293981000, :updated-at 1334293981000, :_id "542692d4c026201cdc327022"} {:updated-at 1454687827177, :created-at 1454687827177, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body ";;evaluates last expression for this case\nuser> (or nil false)\nfalse\n\nuser> (or false nil)\nnil", :_id "56b4c653e4b060004fc217bc"} {:updated-at 1581256939913, :created-at 1581256939913, :author {:login "caumond", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11491686?v=4"}, :body ";; Defaulted value\nuser> (or nil \"crazy default value\")\ncrazy default value\n\nuser> (or \"value\" \"not useful default value\")\nvalue", :_id "5e4010ebe4b0ca44402ef82d"} {:updated-at 1596145782717, :created-at 1596145383310, :author {:login "luiszambon", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/41161270?v=4"}, :body ";; It cares about function's return. Example:\n;; println returns 'nil', so the next param will be evaluated.\n(or (println \"Clojure\") true \"Code\" false)\nClojure\n;;=>true\n", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/41161270?v=4", :account-source "github", :login "luiszambon"}], :_id "5f233ee7e4b0b1e3652d732b"} {:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; `or` is a macro, so can't be given where a fn is expected\n(map or [true false] [false false])\n;; => Syntax error compiling at…\n;; => Can't take value of a macro: #'clojure.core/or\n\n;; wrap in a fn instead\n(map #(or %1 %2) [true false] [false false])\n;; => (true false)", :author {:avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4", :account-source "github", :login "tomdl89"}, :created-at 1658141645967, :updated-at 1682634667591, :_id "62d53bcde4b0b1e3652d7627"}], :macro true, :notes nil, :arglists ["" "x" "x & next"], :doc "Evaluates exprs one at a time, from left to right. If a form\n returns a logical true value, or returns that value and doesn't\n evaluate any of the other expressions, otherwise it returns the\n value of the last expression. (or) returns nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/or"} {:added "1.0", :ns "clojure.core", :name "cast", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1434488356659, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:ns "clojure.core", :name "type", :library-url "https://github.com/clojure/clojure"}, :_id "55808e24e4b01ad59b65f4fe"}], :line 346, :examples [{:updated-at 1463934422291, :created-at 1289541716000, :body ";; Cast doesn't change the type of the input - it just throws an exception if it's the wrong type\n;; Since Long is a subclass of Number\nuser=> (cast Number 1) \n1\nuser=> (type (cast Number 1))\njava.lang.Long\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "tirkarthi", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3972343?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/bc41ebab54cc0e0fbe99d753876d45ce?r=PG&default=identicon", :account-source "clojuredocs", :login "Victor"}, :_id "542692cdc026201cdc326ccd"}], :notes nil, :arglists ["c x"], :doc "Throws a ClassCastException if x is not a c, else returns x.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/cast"} {:added "1.0", :ns "clojure.core", :name "reset!", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1324098243000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "swap!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ee4"} {:created-at 1360265917000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "compare-and-set!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ee5"} {:created-at 1360265926000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "atom", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ee6"} {:created-at 1527705044232, :author {:login "agarman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/138454?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "swap-vals!", :ns "clojure.core"}, :_id "5b0eedd4e4b045c27b7fac7e"} {:created-at 1527705380123, :author {:login "agarman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/138454?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reset-vals!", :ns "clojure.core"}, :_id "5b0eef24e4b045c27b7fac85"}], :line 2376, :examples [{:author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :editors [{:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"} {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (def x (atom 10))\n#'user/x\n\nuser=> @x\n10\n\nuser=> (reset! x 20)\n20\n\nuser=> @x\n20", :created-at 1281850260000, :updated-at 1416077324639, :_id "542692ccc026201cdc326cb0"}], :notes nil, :arglists ["atom newval"], :doc "Sets the value of atom to newval without regard for the\n current value. Returns newval.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/reset!"} {:added "1.0", :ns "clojure.core", :name "name", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1385200415000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "namespace", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ca3"}], :line 1589, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:login "egracer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4086884?v=3"}], :body ";; the name of the keyword is without the ':'\n;; \"str\" will retain the ':'.\n(name :x)\n;;=> \"x\"\n\n(name \"x\")\n;;=> \"x\"\n\n;; returns the symbol name as a string without the namespace.\n(name 'x)\n;;=> \"x\"\n\n(name 'user/x)\n;;=> \"x\"\n\n;; throws an error for invalid types, no nil punning\n(name nil)\n;;=> Error: Doesn't support name:\n\n(name 2)\n;;=> Error: Doesn't support name: 2", :created-at 1280319438000, :updated-at 1455058375466, :_id "542692cbc026201cdc326b9a"} {:updated-at 1548517573974, :created-at 1467226948210, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :body ";; Note that for namespaced keywords, `name` only returns the name part.\n(name :my-ns/my-name)\n;;=> \"my-name\"\n\n(name :ns/deep/key)\n;;=> \"deep/key\"\n;; For more info see: `keyword` and `keyword?`...\n(name :'//-,)\n;;=> \"/-\"\n(name :/)\n;;=> \"/\"\n(name ://)\n;;=> RuntimeException Invalid token: :// clojure.lang.Util.runtimeException (Util.java:221)\n;;=> RuntimeException Unmatched delimiter: ) clojure.lang.Util.runtimeException (Util.java:221)\n(name :///)\n;;=> \"//\"\n(namespace :///)\n;;=> \"\"\n\n;; If you want the namespace part, you can use (namespace):\n(namespace :my-ns/my-key)\n;;=> \"my-ns\"\n\n;; Using (str) will give you both parts, but also includes the leading colon.\n(str :my-ns/my-key)\n;;=> \":my-ns/my-key\"", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"}], :_id "57741b44e4b0bafd3e2a0499"} {:updated-at 1548513828805, :created-at 1478905733257, :author {:login "souenzzo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3241703?v=3"}, :body ";; To get full key\n(defn keyname [key] (str (namespace key) \"/\" (name key)))\n\n(keyname :ns/key)\n=> \"ns/key\"\n\n(keyname :ns/deep/key)\n=> \"ns/deep/key\"\n\n;; Just for fun\n(string/replace :key/val #\"^:\" \"\")\n=> \"key/val\"", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"}], :_id "58264f85e4b0782b632278bf"} {:updated-at 1548517913344, :created-at 1548517913344, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :body ";; `name` (and `namespace`) \"knows\" how a keyword was built:\n\n(name (keyword \"a/b\" \"c\"))\n;;=> \"c\"\n\n(name (keyword \"a\" \"b/c\"))\n;;=> \"b/c\"\n", :_id "5c4c8219e4b0ca44402ef636"} {:editors [{:login "green-coder", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4"}], :body ";; To get the fully qualified name of the keyword, we can use symbol.\n\n(str (symbol :a/b))\n;;=> \"a/b\"\n", :author {:avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4", :account-source "github", :login "green-coder"}, :created-at 1577551007249, :updated-at 1577551119811, :_id "5e07849fe4b0ca44402ef7ff"} {:updated-at 1635440614807, :created-at 1635440614807, :author {:login "naxels", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3195443?v=4"}, :body "; Preserves capitals\n\n(name :pageQuery)\n; => \"pageQuery\"", :_id "617ad7e6e4b0b1e3652d7560"}], :notes nil, :tag "java.lang.String", :arglists ["x"], :doc "Returns the name String of a string, symbol or keyword.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/name"} {:added "1.0", :ns "clojure.core", :name "ffirst", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1343067219000, :author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "first", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a7f"} {:created-at 1348637462000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "fnext", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a80"} {:created-at 1348637521000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "nfirst", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a81"} {:created-at 1482183756311, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nnext", :ns "clojure.core"}, :_id "5858544ce4b004d3a355e2bf"} {:created-at 1482183947394, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "next", :ns "clojure.core"}, :_id "5858550be4b004d3a355e2c2"}], :line 98, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (ffirst '([]))\nnil \n\nuser=> (ffirst ['(a b c) '(b a c)])\na \n\nuser=> (ffirst '([a b c] [b a c]))\na", :created-at 1280345631000, :updated-at 1332951869000, :_id "542692cbc026201cdc326bba"} {:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (first {:b 2 :a 1 :c 3})\n[:b 2] \n\nuser=> (ffirst {:b 2 :a 1 :c 3})\n:b", :created-at 1280345657000, :updated-at 1332951883000, :_id "542692cbc026201cdc326bbd"} {:body "user=> (first [1])\n1\n\nuser=> (ffirst [[1]])\n1", :author {:login "divyashravanthi", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6253335?v=3"}, :created-at 1432113125180, :updated-at 1432113125180, :_id "555c4fe5e4b03e2132e7d163"}], :notes nil, :arglists ["x"], :doc "Same as (first (first x))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ffirst"} {:added "1.0", :ns "clojure.core", :name "sorted-set", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1317095643000, :author {:login "pauldoo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5cb916d3c8abc9f45a093209e72489fb?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sorted-set-by", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c6b"} {:created-at 1330671694000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "subseq", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c6c"} {:created-at 1330671698000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rsubseq", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c6d"} {:created-at 1330671734000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sorted-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c6e"} {:created-at 1419807368932, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=3"}, :to-var {:ns "clojure.core", :name "into", :library-url "https://github.com/clojure/clojure"}, :_id "54a08a88e4b09260f767ca80"} {:created-at 1423277153400, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "hash-set", :library-url "https://github.com/clojure/clojure"}, :_id "54d57c61e4b0e2ac61831d1f"} {:created-at 1548553242467, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "compare", :ns "clojure.core"}, :_id "5c4d0c1ae4b0ca44402ef646"}], :line 417, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user=> (sorted-set 3 2 1)\n#{1 2 3}\n\nuser=> (sorted-set 3 2 1 1)\n#{1 2 3}\n\nuser=> #{2 1 3}\n#{1 3 2}\n\nuser=> (apply sorted-set #{2 1 3})\n#{1 2 3}", :created-at 1280319522000, :updated-at 1423277124415, :_id "542692cfc026201cdc326e6f"} {:editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}], :body "(sorted-set :a \"A\" 1)\n\n;;Exception\n;;unable to implement java.lang.String.compareTo\n\n;; This exception occurs because the default comparator, a Clojure function\n;; named `compare`, throws an exception when asked to compare two values of\n;; very dissimilar tpyes, like a keyword and a string, or a keyword and a number.\n;; If you really want a sorted set containing such dissimilar types, you will\n;; need to create your own custom comparator and use sorted-set-by.\n;; See this article for advice on creating custom comparators:\n;; https://clojure.org/guides/comparators", :author {:avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4", :account-source "github", :login "ibercode"}, :created-at 1518777459431, :updated-at 1548624108584, :_id "5a86b473e4b0316c0f44f8c5"} {:editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}], :body ";; (sorted-set ...) is equivalent in behavior to (sorted-set-by compare ...)\n;; where compare is Clojure's default comparator function clojure.core/compare\n;; See the documentation of compare for more details on its behavior.\n\n;; For a set sorted by the order that elements were added,\n;; see ordered-set: https://github.com/clj-commons/ordered\n\n;; If you deal with many large sets of integers, and want a more memory-efficient\n;; data structure for those, see int-set and dense-int-set:\n;; https://github.com/clojure/data.int-map", :author {:avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4", :account-source "github", :login "jafingerhut"}, :created-at 1548553235377, :updated-at 1548618903382, :_id "5c4d0c13e4b0ca44402ef645"}], :notes nil, :arglists ["& keys"], :doc "Returns a new sorted set with supplied keys. Any equal keys are\n handled as if by repeated uses of conj.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/sorted-set"} {:added "1.0", :ns "clojure.core", :name "counted?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1495640676349, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "bounded-count", :ns "clojure.core"}, :_id "5925aa64e4b093ada4d4d72c"}], :line 6262, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [], :body "user=> (counted? [:a :b :c])\ntrue\n\nuser=> (counted? '(:a :b :c))\ntrue\n\nuser=> (counted? {:a 1 :b 2 :c 3})\ntrue\n\nuser=> (counted? #{:a :b :c})\ntrue\n\nuser=> (counted? \"asdf\")\nfalse\n\nuser=> (counted? (into-array Integer/TYPE [1 2 3]))\nfalse", :created-at 1286508818000, :updated-at 1286508818000, :_id "542692cac026201cdc326b0c"} {:updated-at 1467307667667, :created-at 1467307667667, :author {:login "miner", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25400?v=3"}, :body ";; Lazy sequences are not counted?\n(counted? (map inc (range 5)))\n;;=> false", :_id "57755693e4b0bafd3e2a049c"}], :notes nil, :arglists ["coll"], :doc "Returns true if coll implements count in constant time", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/counted_q"} {:added "1.1", :ns "clojure.core", :name "byte-array", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1451898302123, :author {:login "muhuk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/40178?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "bytes", :ns "clojure.core"}, :_id "568a35bee4b0f37b65a3c27d"} {:created-at 1455883026411, :author {:login "guruma", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/534540?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "byte", :ns "clojure.core"}, :_id "56c70312e4b0b41f39d96ccc"}], :line 5293, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}], :body ";; create an array of bytes\n;; and demonstrate that you can use it in the standard Java fill function\n;; note the needed byte coercion in the fill function call\n\nuser=> (def bees (byte-array 10))\n#'user/bees\n\nuser=> (for [i (range 10)](aset-byte bees i (* i i)))\n(0 1 4 9 16 25 36 49 64 81)\n\nuser=> (vec bees)\n[0 1 4 9 16 25 36 49 64 81]\n\nuser=> (java.util.Arrays/fill bees (byte 122))\nnil\nuser=> (vec bees)\n[122 122 122 122 122 122 122 122 122 122]\nuser=>", :created-at 1313959908000, :updated-at 1313962959000, :_id "542692cec026201cdc326d67"} {:editors [{:login "guruma", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/534540?v=3"}], :body ";; copied from the example in clojure.core/byte\nuser=> (def x (byte-array [(byte 0x43) \n (byte 0x6c)\n (byte 0x6f)\n (byte 0x6a)\n (byte 0x75)\n (byte 0x72)\n (byte 0x65)\n (byte 0x21)]))\n#'user/x\n\nuser=> (String. x)\n\"Clojure!\"", :author {:avatar-url "https://avatars.githubusercontent.com/u/534540?v=3", :account-source "github", :login "guruma"}, :created-at 1455883152605, :updated-at 1455883201637, :_id "56c70390e4b0b41f39d96ccd"} {:editors [{:login "nivekuil", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/4633048?v=4"}], :body ";; NOTE: equality uses identity, not value semantics.\nuser=> (= (byte-array 10) (byte-array 10))\nfalse\nuser=> (java.util.Arrays/equals (byte-array 10) (byte-array 10))\ntrue\n\nuser=> (def a (byte-array [(byte 0x43)]))\n#'user/a\nuser=> (def b (byte-array [(byte 0x43)]))\n#'user/b\nuser=> (= a b)\nfalse\nuser=> (java.util.Arrays/equals a b)\ntrue", :author {:avatar-url "https://avatars3.githubusercontent.com/u/4633048?v=4", :account-source "github", :login "nivekuil"}, :created-at 1606705309670, :updated-at 1606705382806, :_id "5fc4609de4b0b1e3652d7412"}], :notes [{:body "The maximum size of a byte-array is Integer/MAX_VALUE, as arrays are int-indexed in Java. However, it is possible to pass a value that is larger than this, resulting in a cast that will wrap around. This incorrect usage will not give any indication of error.", :created-at 1625076336154, :updated-at 1625076620437, :author {:avatar-url "https://avatars.githubusercontent.com/u/1780598?v=4", :account-source "github", :login "dspearson"}, :_id "60dcb270e4b0b1e3652d7510"} {:author {:login "luposlip", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/763627?v=4"}, :updated-at 1631709838369, :created-at 1631709678505, :body "To type hint a byte array, use this non-obvious syntax:\n\n
    (.write ^OutputStream output-stream ^\"[B\" bytearray)
    ", :_id "6141e9eee4b0b1e3652d753b"}], :arglists ["size-or-seq" "size init-val-or-seq"], :doc "Creates an array of bytes", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/byte-array"} {:added "1.7", :ns "clojure.core", :name "tagged-literal", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1661550936046, :author {:login "djblue", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1986211?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "read-string", :ns "clojure.edn"}, :_id "63094158e4b0b1e3652d7656"}], :line 7725, :examples [{:updated-at 1661545330654, :created-at 1661545330654, :author {:login "Quezion", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1403153?v=4"}, :body "(def x (tagged-literal 'user {:name \"Foo\"}))\n\n(:form x) ;; Get the actual codeform\n;; => {:name \"Foo\"}\n\n(:tag x) ;; Get the tagged symbol\n;; => user", :_id "63092b72e4b0b1e3652d7654"} {:updated-at 1661546360936, :created-at 1661546360936, :author {:login "djblue", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1986211?v=4"}, :body "(require '[clojure.edn :as edn])\n(edn/read-string {:default tagged-literal} \"#js [1 2 3]\")\n;; => #js [1 2 3]\n", :_id "63092f78e4b0b1e3652d7655"}], :notes [{:author {:login "miner", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/25400?v=4"}, :updated-at 1610656712993, :created-at 1610656712993, :body "`tagged-literal` is useful as a value fo `clojure.core/*default-data-reader-fn*`", :_id "6000abc8e4b0b1e3652d7431"}], :arglists ["tag form"], :doc "Construct a data representation of a tagged literal from a\n tag symbol and a form.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/tagged-literal"} {:added "1.0", :ns "clojure.core", :name "println", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1290672953000, :author {:login "dale", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a7a1eca257c6cea943fea41e5cc3e9a3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "prn", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ae2"} {:created-at 1302236980000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "print", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ae3"} {:created-at 1374264342000, :author {:login "lbeschastny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/416170465e4045f810f09a9300dda4dd?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "println-str", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ae4"} {:created-at 1518042813319, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pprint", :ns "clojure.pprint"}, :_id "5a7b7ebde4b0316c0f44f8ac"}], :line 3733, :examples [{:author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"} {:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"} {:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"}], :body "user=> (println \"Hello world.\")\nHello world.\nnil\n\nuser=> (def items [ \"hello\" :a 1 (list :b 2) \\c {:d 4} #{5 6 7} ])\n#'user/items\n\n; println is for human-readable output, like a report. Note the lack of quotes around the string \"hello\" and the unescaped letter \"c\". \nuser=> (println items)\n[hello :a 1 (:b 2) c {:d 4} #{5 6 7}]\nnil\n\n; prn outputs items in a machine-readable format, such as in a source\n; file. Note the double-quotes around the string \"hello\" and the escaped letter \"c\".\nuser=> (prn items)\n[\"hello\" :a 1 (:b 2) \\c {:d 4} #{5 6 7}]\nnil\n\n; pr-str produces a string with escaped punctuation, so that println yields the same result as the original prn call.\nuser=> (println (pr-str items))\n[\"hello\" :a 1 (:b 2) \\c {:d 4} #{5 6 7}]\nnil\n\n; Calling println w/o args outputs a newline and nothing else.\nuser=> (println)\n\nnil\n; The newline function does the same.\nuser=> (newline)\n\nnil\nuser=>", :created-at 1280776981000, :updated-at 1402400141000, :_id "542692cec026201cdc326d9a"} {:body "; be careful when using println in functions like map\n; println has nil as its return value\n\nuser=> (map #(println %) (range 1 4))\n\n(1 2 3 nil nil nil)\n\n", :author {:login "rsachdeva", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/232903?v=2"}, :created-at 1413839939176, :updated-at 1413839939176, :_id "54457c43e4b0dc573b892fa1"}], :notes nil, :arglists ["& more"], :doc "Same as print followed by (newline)", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/println"} {:added "1.2", :ns "clojure.core", :name "extend-type", :file "clojure/core_deftype.clj", :type "macro", :column 1, :see-alsos [{:created-at 1336757561000, :author {:login "Cosmi", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10f2eae92de67116fa98d06ec55fcf29?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "extend", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521be8"} {:created-at 1351471424000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "extend-protocol", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521be9"} {:created-at 1351471431000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defprotocol", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bea"}], :line 836, :examples [{:author {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}, :editors [], :body ";;; This is a library for the shopping result.\n\n(defrecord Banana [qty])\n\n;;; 'subtotal' differ from each fruit.\n\n(defprotocol Fruit\n (subtotal [item]))\n\n(extend-type Banana\n Fruit\n (subtotal [item]\n (* 158 (:qty item))))\n\n;;; Please see the term of 'reify'.", :created-at 1315674061000, :updated-at 1315674061000, :_id "542692cbc026201cdc326bc2"}], :macro true, :notes nil, :arglists ["t & specs"], :doc "A macro that expands into an extend call. Useful when you are\n supplying the definitions explicitly inline, extend-type\n automatically creates the maps required by extend. Propagates the\n class as a type hint on the first argument of all fns.\n\n (extend-type MyType \n Countable\n (cnt [c] ...)\n Foo\n (bar [x y] ...)\n (baz ([x] ...) ([x y & zs] ...)))\n\n expands into:\n\n (extend MyType\n Countable\n {:cnt (fn [c] ...)}\n Foo\n {:baz (fn ([x] ...) ([x y & zs] ...))\n :bar (fn [x y] ...)})", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/extend-type"} {:added "1.0", :ns "clojure.core", :name "macroexpand-1", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1284957759000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "macroexpand", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b13"} {:created-at 1289586228000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.walk", :name "macroexpand-all", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b14"}], :line 4018, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [], :body "user=> (macroexpand-1 '(defstruct mystruct[a b]))\n(def mystruct (clojure.core/create-struct [a b]))\n", :created-at 1286272779000, :updated-at 1286272779000, :_id "542692cbc026201cdc326ba7"} {:updated-at 1339248839000, :created-at 1339248839000, :body "user=> (macroexpand-1 '(-> c (+ 3) (* 2)))\n(clojure.core/-> (clojure.core/-> c (+ 3)) (* 2))", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :_id "542692d4c026201cdc326ffa"} {:editors [{:login "lourkeur", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/15657735?v=4"}], :body "; When testing macro expansion in a file instead of at the REPL, \n; please note that it may be necessary to use a backquote\n; instead of a straight quote.\n\n(defmacro iiinc [x]\n `(+ 3 ~x))\n\n(deftest t-stuff\n ; This doesn't work.\n (println (macroexpand-1 '(iiinc 2))) ;=> (iiinc 2)\n\n ; Oddly, we can use the macro itself fine in our tests...\n (println (iiinc 2)) ;=> 5\n (is (= 5 (iiinc 2))) ;=> unit test passes\n\n ; This fixes it by resolving the symbol iiinc at compile-time.\n (println (macroexpand-1 `(iiinc 2)))) ;=> (+ 3 2)\n\n; Also, as the previous examples show, please remember that \n; you must quote the form you are providing to `macroexpand-1`.\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/7083783?v=3", :account-source "github", :login "cloojure"}, :created-at 1494031935843, :updated-at 1522520280321, :_id "590d1e3fe4b01f4add58feaf"}], :notes nil, :arglists ["form"], :doc "If form represents a macro form, returns its expansion,\n else returns form.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/macroexpand-1"} {:added "1.0", :ns "clojure.core", :name "assoc-in", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1291975376000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "assoc", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ac6"} {:created-at 1302248543000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "update-in", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ac7"} {:created-at 1318010528000, :author {:login "jks", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/de50bee3396570d25f900873303c98f1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "get-in", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ac9"} {:created-at 1570520711353, :author {:login "xmo-odoo", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/7571158?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "associative?", :ns "clojure.core"}, :_id "5d9c3e87e4b0ca44402ef7ca"}], :line 6161, :examples [{:author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(def users [{:name \"James\" :age 26} {:name \"John\" :age 43}])\n\n;; update the age of the second (index 1) user \n(assoc-in users [1 :age] 44)\n;;=> [{:name \"James\", :age 26} {:name \"John\", :age 44}]\n\n;; insert the password of the second (index 1) user\n(assoc-in users [1 :password] \"nhoJ\")\n;;=> [{:name \"James\", :age 26} {:password \"nhoJ\", :name \"John\", :age 43}]\n\n;; create a third (index 2) user\n;; Also (assoc m 2 {...}) or (conj m {...})\n(assoc-in users [2] {:name \"Jack\" :age 19}) \n;;=> [{:name \"James\", :age 26} {:name \"John\", :age 43} {:name \"Jack\", :age 19}]\n\n;; From http://clojure-examples.appspot.com/clojure.core/assoc-in", :created-at 1278953901000, :updated-at 1422565766316, :_id "542692cac026201cdc326b38"} {:author {:login "devth", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/70c7535cbb9fea0353250a4edda155be?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/200617?v=3", :account-source "github", :login "bsima"} {:login "elias94", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8095533?v=4"}], :body ";; can be used to update a mutable item.\n(def ppl (atom {\"persons\" {\"joe\" {:age 1}}}))\n(swap! ppl assoc-in [\"persons\" \"bob\"] {:age 2})\n\n@ppl\n;;=> {\"persons\" {\"joe\" {:age 1}, \"bob\" {:age 2}}}", :created-at 1378880124000, :updated-at 1625799501437, :_id "542692d2c026201cdc326f4c"} {:editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "clojureman", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1793303?v=3"}], :updated-at 1495693228091, :created-at 1412006606316, :author {:avatar-url "https://avatars.githubusercontent.com/u/453580?v=2", :account-source "github", :login "pmbauer"}, :body ";; be careful with that empty path sequence, it's seldom what you want\n(assoc-in {} [] {:k :v})\n;;=> {nil {:k :v}}\n\n;; In general, you find that for a non-empty path\n;; (get-in (assoc-in m path v) path) \n;; is equal to v.\n;; Surprisingly this does not hold true in case of an empty path.", :_id "542982cee4b09282a148f203"} {:body ";; another example of updating a mutable item.\n;; this time the first key is to a map and the second to a vector.\n(def foo (atom {:users [{:a \"a\"} {:b \"b\"}]}))\n(swap! foo assoc-in [:users 2] {:c \"c\"})\n;;=> {:users [{:a \"a\"} {:b \"b\"} {:c \"c\"}]}\n\n", :author {:login "saiberz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1022999?v=3"}, :created-at 1418344457312, :updated-at 1422566109388, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :_id "548a3809e4b04e93c519ffa4"} {:editors [{:login "coffeefire", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/14366530?v=3"}], :updated-at 1448358381451, :created-at 1433960090535, :author {:avatar-url "https://avatars.githubusercontent.com/u/571777?v=3", :account-source "github", :login "cthulhu-bot"}, :body ";; assoc-in into a nested map structure\n(def foo {:user {:bar \"baz\"}})\n(assoc-in foo [:user :id] \"some-id\")\n;;=> {:user {:bar \"baz\", :id \"some-id\"}}\n", :_id "55787e9ae4b01ad59b65f4ef"} {:editors [{:login "prudentbot", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3210379?v=3"}], :body "(assoc-in {} [:cookie :monster :vocals] \"Finntroll\")\n; => {:cookie {:monster {:vocals \"Finntroll\"}}}\n\n(get-in {:cookie {:monster {:vocals \"Finntroll\"}}} [:cookie :monster])\n; => {:vocals \"Finntroll\"}\n\n(assoc-in {} [1 :connections 4] 2)\n; => {1 {:connections {4 2}}}\n\n;; from http://www.braveclojure.com/functional-programming/", :author {:avatar-url "https://avatars.githubusercontent.com/u/3210379?v=3", :account-source "github", :login "prudentbot"}, :created-at 1438058284679, :updated-at 1438100741796, :_id "55b7072ce4b06a85937088b7"} {:editors [{:login "amirrajan", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/517055?v=3"}], :body ";; assoc-in can be used on vectors too\n\n(def row 0)\n(def col 0)\n\n(assoc-in [[1 1 1]\n [1 1 1]\n [1 1 1]] [row col] 0)\n; => [[0 1 1][1 1 1][1 1 1]]\n\n(get-in [[0 1 1]\n [1 1 1]\n [1 1 1]] [row col])\n; => 0", :author {:avatar-url "https://avatars.githubusercontent.com/u/517055?v=3", :account-source "github", :login "amirrajan"}, :created-at 1445568749511, :updated-at 1445568838675, :_id "5629a0ede4b04b157a6648d8"} {:editors [{:login "gosukiwi", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/161972?v=3"}], :body "; Playing around with assoc-in\n\n(assoc-in {:person {:name \"Mike\"}} [:person :name] \"Violet\")\n; => {:person {:name \"Violet\"}}\n\n(assoc-in {:person {:name \"Mike\"}} [:person] \"Violet\")\n; => {:person \"Violet\"}\n\n(assoc-in [{:person {:name \"Mike\"}}] [0 :person :name] \"Violet\")\n; => [{:person {:name \"Violet\"}}]\n\n(assoc-in [{:person {:name [\"Mike\"]}}] [0 :person :name 1] \"Smith\")\n; => [{:person {:name [\"Mike\" \"Smith\"]}}]\n\n(assoc-in [{:person {:name [\"Mike\"]}}] [0 :person :name 2] \"Smith\")\n; => IndexOutOfBoundsException", :author {:avatar-url "https://avatars.githubusercontent.com/u/161972?v=3", :account-source "github", :login "gosukiwi"}, :created-at 1470551622806, :updated-at 1470551660418, :_id "57a6d646e4b0bafd3e2a04cc"} {:editors [{:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4"}], :body ";; Note that, unlike `assoc`, `assoc-in` cannot be used with multiple values.\n\n(def my-map {})\n\n;; This works\n(assoc my-map :a 1\n :b 2\n :c 3)\n; => {:a 1, :b 2, :c 3}\n\n;; This doesn’t\n(assoc-in my-map [:a :aa] 1\n [:b :bb] 2\n [:c :cc] 3)\n; ArityException Wrong number of args (7) passed to: core/assoc-in\n\n;; This works\n(-> my-map\n (assoc-in [:a :aa] 1)\n (assoc-in [:b :bb] 2)\n (assoc-in [:c :cc] 3))", :author {:avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4", :account-source "github", :login "bfontaine"}, :created-at 1524054770336, :updated-at 1631275246821, :_id "5ad73af2e4b045c27b7fac3f"}], :notes [{:body "Unlike `assoc`, you can only do one kv at a time:\n\n```\n;; Allowed\n(assoc {} :a \"a\" :b \"b\" :c \"c\")\n;; Not allowed:\n(assoc-in {} [:a :b] \"cya\" [:a :d :e] \"f\" [:b :g] \"wow\")\n```", :created-at 1648401233813, :updated-at 1648401332618, :author {:avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4", :account-source "github", :login "Crowbrammer"}, :_id "62409b51e4b0b1e3652d75c2"}], :arglists ["m [k & ks] v"], :doc "Associates a value in a nested associative structure, where ks is a\n sequence of keys and v is the new value and returns a new nested structure.\n If any levels do not exist, hash-maps will be created.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/assoc-in"} {:added "1.0", :ns "clojure.core", :name "char-name-string", :file "clojure/core_print.clj", :type "var", :column 1, :see-alsos [{:created-at 1375209941000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "char-escape-string", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b76"}], :line 342, :examples [{:author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :editors [], :body "user=> (char-name-string \\newline)\n\"newline\"", :created-at 1375209966000, :updated-at 1375209966000, :_id "542692d2c026201cdc326f5f"} {:updated-at 1592040564496, :created-at 1592040564496, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/8271291?v=4"}, :body "(map char-name-string [\\backspace \\tab \\newline \\formfeed \\return \\space])\n;;=> (\"backspace\" \"tab\" \"newline\" \"formfeed\" \"return\" \"space\")", :_id "5ee49c74e4b0b1e3652d7303"}], :notes nil, :tag "java.lang.String", :arglists [], :doc "Returns name string for char or nil if none", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/char-name-string"} {:added "1.0", :ns "clojure.core", :name "bit-test", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1405720487000, :author {:login "phreed", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a0c739cf289be18be932dc3022e6fd3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bit-set", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cac"} {:created-at 1405720498000, :author {:login "phreed", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a0c739cf289be18be932dc3022e6fd3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bit-shift-left", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cad"} {:created-at 1405720509000, :author {:login "phreed", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a0c739cf289be18be932dc3022e6fd3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bit-xor", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cae"}], :line 1349, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(bit-test 2r1001 0) ;;=> true \n(bit-test 2r1001 1) ;;=> false \n(bit-test 2r1001 7) ;;=> false", :created-at 1280338595000, :updated-at 1421943187268, :_id "542692cfc026201cdc326e7c"} {:updated-at 1550024741651, :created-at 1550024741651, :author {:login "pauloaug", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/804447?v=4"}, :body ";; Note that the index starts from the least significant bit (right to left).\n\n(map #(bit-test 2r10011 %) [0 1 2 3 4])\n;;=> (true true false false true) ", :_id "5c638025e4b0ca44402ef682"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; bit-wise powerset (set of all subsets)\n\n(defn powerset [coll]\n (let [cnt (count coll)\n bits (Math/pow 2 cnt)]\n (for [i (range bits)]\n (for [j (range i)\n :while (< j cnt)\n :when (bit-test i j)]\n (nth coll j)))))\n\n(powerset [1 2 3])\n;; (() (1) (2) (1 2) (3) (1 3) (2 3) (1 2 3))", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1564483500939, :updated-at 1564483573152, :_id "5d401face4b0ca44402ef78b"}], :notes nil, :arglists ["x n"], :doc "Test bit at index n", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bit-test"} {:added "1.0", :ns "clojure.core", :name "defmethod", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1285162546000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defmulti", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b40"} {:created-at 1341270386000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "remove-method", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b41"} {:created-at 1341270389000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "remove-all-methods", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b42"} {:created-at 1341270393000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "prefers", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b43"} {:created-at 1341270396000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "methods", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b44"} {:created-at 1341270398000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "get-method", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b45"}], :line 1783, :examples [{:author {:login "Victor", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc41ebab54cc0e0fbe99d753876d45ce?r=PG&default=identicon"}, :editors [], :body "(defmulti service-charge (fn [acct] [(account-level acct) (:tag acct)]))\n(defmethod service-charge [::acc/Basic ::acc/Checking] [_] 25)\n(defmethod service-charge [::acc/Basic ::acc/Savings] [_] 10)\n(defmethod service-charge [::acc/Premium ::acc/Account] [_] 0)", :created-at 1290489730000, :updated-at 1290489730000, :_id "542692c7c026201cdc3269cb"} {:author {:login "Victor", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc41ebab54cc0e0fbe99d753876d45ce?r=PG&default=identicon"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/104014?v=3", :account-source "github", :login "slester"} {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}], :body ";this example illustrates that the dispatch type\n;does not have to be a symbol, but can be anything (in this case, it's a string)\n\n(defmulti greeting\n (fn [x] (get x \"language\")))\n\n;params is not used, so we could have used [_]\n(defmethod greeting \"English\" [params]\n \"Hello!\")\n\n(defmethod greeting \"French\" [params]\n \"Bonjour!\")\n\n;then can use this like this:\n(def english-map {\"id\" \"1\", \"language\" \"English\"})\n(def french-map {\"id\" \"2\", \"language\" \"French\"})\n\n=>(greeting english-map)\n\"Hello!\"\n=>(greeting french-map)\n\"Bonjour!\"\n", :created-at 1290492873000, :updated-at 1572016935512, :_id "542692c7c026201cdc3269cc"} {:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [], :body ";; Methods can be given a name. Very useful in stack traces.\n(defmethod foo \"a\" name-of-method [params] \"was a\")\n", :created-at 1308205150000, :updated-at 1308205150000, :_id "542692c7c026201cdc3269cd"} {:editors [{:login "gariepyalex", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/6105461?v=4"}], :body "(defmulti ticket-price :customer-status)\n\n(defmethod ticket-price :student\n ;; Everything after the dispatch value is passed to fn.\n student-price\n [customer]\n 10.0)\n\n(defmethod ticket-price :professional\n professional-price\n [customer]\n 650.0)", :author {:avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4", :account-source "github", :login "bfontaine"}, :created-at 1572017355964, :updated-at 1596053774142, :_id "5db314cbe4b0ca44402ef7d4"}], :macro true, :notes nil, :arglists ["multifn dispatch-val & fn-tail"], :doc "Creates and installs a new method of multimethod associated with dispatch-value. ", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/defmethod"} {:added "1.10", :ns "clojure.core", :name "requiring-resolve", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1611863381575, :author {:login "nbaumanGR", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/76698379?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "resolve", :ns "clojure.core"}, :_id "60131555e4b0b1e3652d7441"}], :line 6082, :examples [{:editors [{:login "daemianmack", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/24476?v=4"}], :body ";; Resolve a qualified symbol\n(requiring-resolve 'clojure.java.shell/sh)\n\n;; Resolve and evaluate\n((requiring-resolve 'some-ns/some-fn))\n\n;; In deps.edn, replace all spaces with the \"Corfield\" comma, ;)\n((requiring-resolve,'clojure.java.shell/sh))", :author {:avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4", :account-source "github", :login "Hindol"}, :created-at 1583391908395, :updated-at 1605911520381, :_id "5e60a4a4e4b087629b5a18b7"} {:editors [{:login "Folcon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/123055?v=4"}], :body "(defn debug? [] (= (env :debug?) \"true\"))\n\n;; If you need to do conditional requires such as the one below:\n(if (debug?)\n (do\n (require '[nrepl.cmdline :refer [-main] :rename {-main -nrepl-main}])\n (resolve 'nrepl.cmdline))\n (declare -nrepl-main))\n\n(defn -main [& args]\n (when (debug?)\n (future (apply -nrepl-main args))))\n\n;; This is strictly better!\n(defn -main [& args]\n (when (debug?)\n ;; Swap to require and resolve in one step!\n (future (apply (requiring-resolve 'nrepl.cmdline/-main) args))))", :author {:avatar-url "https://avatars.githubusercontent.com/u/123055?v=4", :account-source "github", :login "Folcon"}, :created-at 1643638396360, :updated-at 1643638468576, :_id "61f7ee7ce4b0b1e3652d75a4"}], :notes nil, :arglists ["sym"], :doc "Resolves namespace-qualified sym per 'resolve'. If initial resolve\nfails, attempts to require sym's namespace and retries.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/requiring-resolve"} {:ns "clojure.core", :name "EMPTY-NODE", :file "clojure/gvec.clj", :type "var", :column 1, :see-alsos nil, :line 19, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/EMPTY-NODE"} {:added "1.0", :ns "clojure.core", :name "time", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos nil, :line 3884, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [], :body "user> (time (Thread/sleep 100))\n\"Elapsed time: 100.284772 msecs\"\nnil", :created-at 1286871374000, :updated-at 1286871374000, :_id "542692c6c026201cdc326908"} {:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [], :body ";when working with lazy seqs\n(time (doall (...)))", :created-at 1289011003000, :updated-at 1289011003000, :_id "542692c6c026201cdc326909"} {:author {:login "Omer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/dae0f434afde5246ccb030cdec81fb71?r=PG&default=identicon"}, :editors [{:login "Omer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/dae0f434afde5246ccb030cdec81fb71?r=PG&default=identicon"}], :body ";; Time how long it takes to write a string to a file 100 times\n(defn time-test []\n (with-open [w (writer \"test.txt\" :append false)]\n (dotimes [_ 100]\n (.write w \"I am being written to a file.\"))))\n\n\nuser=> (time (time-test))\n\"Elapsed time: 19.596371 msecs\"", :created-at 1338273583000, :updated-at 1338273812000, :_id "542692d5c026201cdc3270a6"} {:author {:login "micrub", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c649274329369f1a7a4869e29655e058?r=PG&default=identicon"}, :editors [], :body "user=> (time (Thread/sleep 1000))\n\"Elapsed time: 1000.267483 msecs\"\nnil\nuser=> (with-out-str (time (Thread/sleep 1000)))\n\"\\\"Elapsed time: 1010.12942 msecs\\\"\\n\"\n\n", :created-at 1400389644000, :updated-at 1400389644000, :_id "542692d5c026201cdc3270a8"} {:updated-at 1619013512243, :created-at 1619013512243, :author {:login "sFritsch09", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/58191603?v=4"}, :body ";;get elapsed time in seconds:\n\n(defmacro sectime\n [expr]\n `(let [start# (. System (currentTimeMillis))\n ret# ~expr]\n (prn (str \"Elapsed time: \" (/ (double (- (. System (currentTimeMillis)) start#)) 1000.0) \" secs\"))\n ret#))", :_id "60802f88e4b0b1e3652d74cc"}], :macro true, :notes [{:author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}, :updated-at 1646109474809, :created-at 1646109474809, :body "Because the Java JIT compiler compiles code differently after the code has been running for a bit of time, if you want to use `time` for benchmarking, you should at least \"warm up\" your code by running it several times, using the later `time` outputs as the ones that count. A better strategy is to use a benchmarking library such as [Criterium](https://github.com/hugoduncan/criterium), which will do the warmup for you, and much more.", :_id "621da322e4b0b1e3652d75ae"}], :arglists ["expr"], :doc "Evaluates expr and prints the time it took. Returns the value of\n expr.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/time"} {:added "1.0", :ns "clojure.core", :name "memoize", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1358780692000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "delay", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d2a"}], :line 6343, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; First we define a function that presumably have some expensive computation.\nuser=> (defn myfunc[a] (println \"doing some work\") (+ a 10))\n#'user/myfunc\n\n;; Next we create a memoized version of the function.\nuser=> (def myfunc-memo (memoize myfunc))\n#'user/myfunc-memo\n\n\n;; The first time we call the function with a particular argument the\n;; original function is invoked and the value is returned. The next\n;; time the function is called with the same argument the cached result\n;; is returned and the original function is NOT called.\n\nuser=> (myfunc-memo 1)\ndoing some work\n11\nuser=> (myfunc-memo 1)\n11\nuser=> (myfunc-memo 20)\ndoing some work\n30\nuser=> (myfunc-memo 20)\n30\n", :created-at 1280909609000, :updated-at 1285495306000, :_id "542692ccc026201cdc326c75"} {:body "\n;; Fibonacci number with recursion.\n(defn fib [n]\n (condp = n\n 0 1\n 1 1\n (+ (fib (dec n)) (fib (- n 2)))))\n\n(time (fib 30))\n;; \"Elapsed time: 8179.04028 msecs\"\n\n;; Fibonacci number with recursion and memoize.\n(def m-fib\n (memoize (fn [n]\n (condp = n\n 0 1\n 1 1\n (+ (m-fib (dec n)) (m-fib (- n 2)))))))\n\n(time (m-fib 30))\n;; \"Elapsed time: 1.282557 msecs\"\n ", :author {:login "discoverfly", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1535428?v=3"}, :created-at 1429269742396, :updated-at 1429269742396, :_id "5530eceee4b01bb732af0a83"} {:updated-at 1497303795210, :created-at 1497303795210, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/94482?v=3"}, :body ";; It's possible to memoize a function with multiple arguments:\n(def times (memoize (fn [x y] (* x y))))\n\n(times 1 2) ; => 2\n\n(times 2 0) ; => 0", :_id "593f0af3e4b06e730307db31"} {:updated-at 1532276203982, :created-at 1532276203982, :author {:login "comnik", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1313051?v=4"}, :body ";; Memoize is a simple way to make a mapping deterministic.\n(def attribute->id (memoize (fn [attr] (clojure.lang.RT/nextID))))\n\n(attribute->id :name) ; => 16305\n\n(attribute->id :age) ; => 16306\n\n(attribute->id :name) ; => 16305", :_id "5b54adebe4b00ac801ed9e2a"} {:updated-at 1555579882226, :created-at 1555579882226, :author {:login "harununal", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/36730353?v=4"}, :body "; We can take a rand and use it repeatly \n; (Just with same parameter)\n\n(defn only-first-one-rand\n [n]\n (rand n))\n\n(def ofor-memo (memoize only-first-one-rand))\n\n(ofor-memo 10) ;=> 3.683571228686361 \n\n(ofor-memo 10) ;=> 3.683571228686361\n\n;And we can assign a random value to an integer\n\n(ofor-memo 6) ;=> 2.8058589761445867\n\n(ofor-memo 10) ;=> 3.683571228686361", :_id "5cb843eae4b0ca44402ef70d"} {:updated-at 1555580792896, :created-at 1555580792896, :author {:login "harununal", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/36730353?v=4"}, :body "; When we use memoize, we say to Clojure :\n; \" x function returned with y parameters as z value. \n; No need to repeat this process everytimes. \n; Because you has pure functions. \n; Just keep \"z value\" on your mind. \n; Thank you.\" ", :_id "5cb84778e4b0ca44402ef70e"}], :notes [{:author {:login "rquinlivan", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/485844?v=3"}, :updated-at 1480901638909, :created-at 1480901638909, :body "What is the definition of \"often\" for the purposes of caching? Is there a util like this that allows for different cache eviction strategies?", :_id "5844c406e4b0782b632278d2"} {:author {:login "PetrGlad", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/124476?v=3"}, :updated-at 1483028454253, :created-at 1483028454253, :body "@rquinlivan The implementation of clojure.core/memoize is plain straightforward. It should be obvious that computation_cost times number_of_calls should determine whether to use it or not. If you need more control over caching have a look at [clojure.core.cache](https://github.com/clojure/core.cache)", :_id "586537e6e4b0fd5fb1cc964b"} {:author {:login "l3nz", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1101849?v=4"}, :updated-at 1591252941044, :created-at 1591252896617, :body "`memoize` is nice but it may be tricky to use in production, because it just caches everything. Also, the key under which the value is stored are all the parametres you have as input. \n\nIf you need something more flexible, with user-definable keys (eg because you are passing in a database connection) or a flexible eviction policy, see `clojure.core.memoize` that is a wrapper around `clojure.core.cache`.", :_id "5ed897a0e4b087629b5a1922"}], :arglists ["f"], :doc "Returns a memoized version of a referentially transparent function. The\n memoized version of the function keeps a cache of the mapping from arguments\n to results and, when calls with the same arguments are repeated often, has\n higher performance at the expense of higher memory use.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/memoize"} {:added "1.0", :ns "clojure.core", :name "alter-meta!", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1375212992000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vary-meta", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bd0"} {:created-at 1375213001000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-meta", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bd1"} {:created-at 1456685895947, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "meta", :ns "clojure.core"}, :_id "56d34347e4b02a6769b5a4bc"} {:created-at 1458508939384, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reset-meta!", :ns "clojure.core"}, :_id "56ef148be4b09295d75dbf30"}], :line 2406, :examples [{:updated-at 1456685878779, :created-at 1456685878779, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :body "(def ^{:version 1} document \"This is text\")\n;;=> #'user/document\n\n(meta #'document)\n;;=> {:version 1}\n\n(alter-meta! #'document #(update-in % [:version] inc)) ;increase version\n;;=> {:version 2}\n\n(meta #'document) ;metadata of var was changed\n;;=> {:version 2}\n\n(alter-meta! #'document update-in [:version] inc) ;same as above but shorter\n;;=> {:version 3}\n\n(meta #'document) ;metadata of var was changed again\n;;=> {:version 3}\n", :_id "56d34336e4b0b41f39d96cda"}], :notes nil, :arglists ["iref f & args"], :doc "Atomically sets the metadata for a namespace/var/ref/agent/atom to be:\n\n (apply f its-current-meta args)\n\n f must be free of side-effects", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/alter-meta!"} {:added "1.1", :ns "clojure.core", :name "future?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "future", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1339251269000, :_id "542692ebf6e94c6970521ef5"}], :line 6530, :examples [{:author {:login "BertrandDechoux", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/528360?v=3"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}], :body "user=> (def f (future (inc 0)))\n#'user/f\n\nuser=> (future? f)\ntrue\n\nuser=> (future? 1)\nfalse\n", :created-at 1339251424000, :updated-at 1339251441000, :_id "542692d3c026201cdc326fb9"}], :notes nil, :arglists ["x"], :doc "Returns true if x is a future", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/future_q"} {:added "1.0", :ns "clojure.core", :name "zero?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1400618891000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pos?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dde"} {:created-at 1400618896000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "neg?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ddf"} {:created-at 1605573252870, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "=", :ns "clojure.core"}, :_id "5fb31a84e4b0b1e3652d7406"}], :line 867, :examples [{:updated-at 1423525588057, :created-at 1279075455000, :body "(zero? 0) ;;=> true\n(zero? 0.0) ;;=> true\n(zero? 2r000) ;;=> true\n(zero? 0x0) ;;=> true\n\n(zero? 1) ;;=> false\n(zero? 3.14159265358M) ;;=> false\n(zero? (/ 1 2)) ;;=> false\n\n(zero? nil) ;;=> NullPointerException", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/147981?v=3", :account-source "github", :login "dpritchett"}, :_id "542692c8c026201cdc326a6d"}], :notes [{:author {:login "chbrown", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/360279?v=3"}, :updated-at 1499457802441, :created-at 1499457802441, :body "`(zero? x)` calls `(clojure.lang.Numbers/isZero x)`, which will throw a `ClassCastException ... cannot be cast to java.lang.Number` or `NullPointerException` if `x` is anything but a number.", :_id "595fe90ae4b06e730307db50"}], :arglists ["num"], :doc "Returns true if num is zero, else false", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/zero_q"} {:added "1.9", :ns "clojure.core", :name "simple-keyword?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495715327644, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "keyword?", :ns "clojure.core"}, :_id "5926cdffe4b093ada4d4d764"} {:created-at 1495715337823, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "qualified-keyword?", :ns "clojure.core"}, :_id "5926ce09e4b093ada4d4d765"}], :line 1637, :examples [{:updated-at 1495722311941, :created-at 1495722311941, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body "(simple-keyword? :keyword)\n;;=> true\n\n(simple-keyword? :user/:keyword)\n;;=> false\n(simple-keyword? ::keyword)\n;;=> false\n\n(simple-keyword? \"string\")\n;;=> false\n(simple-keyword? 42)\n;;=> false\n(simple-keyword? nil)\n;;=> false", :_id "5926e947e4b093ada4d4d769"}], :notes nil, :arglists ["x"], :doc "Return true if x is a keyword without a namespace", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/simple-keyword_q"} {:added "1.0", :ns "clojure.core", :name "require", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1281451664000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "remove-ns", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bf3"} {:created-at 1291628612000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "import", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bf4"} {:created-at 1291628619000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "use", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bf5"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "ns", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :created-at 1358655983000, :_id "542692eaf6e94c6970521bf6"} {:created-at 1423094191542, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "refer", :library-url "https://github.com/clojure/clojure"}, :_id "54d2b1afe4b081e022073c60"} {:created-at 1654081012452, :author {:login "PEZ", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/30010?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "requiring-resolve", :ns "clojure.core"}, :_id "629745f4e4b0b1e3652d75f4"} {:created-at 1654081063935, :author {:login "PEZ", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/30010?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "resolve", :ns "clojure.core"}, :_id "62974627e4b0b1e3652d75f6"}], :line 6007, :examples [{:author {:login "scode", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/87b4fd6e7ac86cbf1f1b683f7856057?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:avatar-url "https://avatars.githubusercontent.com/u/8088318?v=3", :account-source "github", :login "jackyfkc"} {:avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3", :account-source "github", :login "svenschoenung"} {:login "jkxyz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10171367?v=4"}], :body ";; Require clojure.set and call its union function:\n\nuser=> (require 'clojure.set)\nnil\nuser=> (clojure.set/union #{1} #{2})\n#{1 2}\n", :created-at 1279160245000, :updated-at 1667391689806, :_id "542692ccc026201cdc326cb8"} {:updated-at 1461731642529, :created-at 1283923768000, :body ";; alias clojure.java.io as io\nuser=> (require '[clojure.java.io :as io])\nnil\n\nuser=> (io/file \"Filename\")\n#\n\n;; alias clojure.java.io as io using prefixes\nuser=> (require '(clojure.java [io :as io2]))\nnil\n\nuser=> (io2/file \"Filename\")\n#", :editors [{:avatar-url "https://www.gravatar.com/avatar/bd6e62afb4881ab0f617611b8b65d003?r=PG&default=identicon", :account-source "clojuredocs", :login "teyc"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/bc41ebab54cc0e0fbe99d753876d45ce?r=PG&default=identicon", :account-source "clojuredocs", :login "Victor"} {:avatar-url "https://www.gravatar.com/avatar/bc41ebab54cc0e0fbe99d753876d45ce?r=PG&default=identicon", :account-source "clojuredocs", :login "Victor"} {:login "jackyfkc", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8088318?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/bd6e62afb4881ab0f617611b8b65d003?r=PG&default=identicon", :account-source "clojuredocs", :login "teyc"}, :_id "542692ccc026201cdc326cbb"} {:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [], :body "(ns rosettacode.24game\n (:require [clojure.string :as str]))\n\n(defn parse-infix-data\n \"input '1+2+3+4'\n output (1 + 2 + 3 + 4)\n where the numbers are clojure numbers, and the symbols are clojure operators\"\n [string] (map read-string (next (str/split string #\"\"))))", :created-at 1289382235000, :updated-at 1289382235000, :_id "542692ccc026201cdc326cc0"} {:author {:login "lambder", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1c0c20072f52de3a6335cae183b865f6?r=PG&default=identicon"}, :editors [], :body "(require '(clojure.contrib [sql :as sql]))", :created-at 1314991093000, :updated-at 1314991093000, :_id "542692ccc026201cdc326cc1"} {:author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :editors [{:login "nickgieschen", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cbfa20635c9269675d54547c080c9b64?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :body "(ns myproject.core\n (:use [clojure.core] :reload)\n (:require [clojure.string :as str :refer [replace]] :reload-all))\n\n(str/replace \"foo\" #\"o\" \"e\")\n\"fee\"\n\n; similar but using a prefix.\n(ns myproject.core\n (:require (clojure [core]\n [string :as str :refer [replace]] ))) \n\n", :created-at 1358655968000, :updated-at 1507304199209, :_id "542692d5c026201cdc327072"} {:updated-at 1482287160163, :created-at 1482284632050, :author {:login "ichisemasashi", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/679549?v=3"}, :body "; rename a function name (thanks for @noisesmith)\n; rename 'clojure.repl/doc' to 'd'\nuser=> (require '[clojure.repl :as r :refer [doc] :rename {doc d}])\nnil\nuser=> (d doc)\n-------------------------\nclojure.repl/doc\n([name])\nMacro\n Prints documentation for a var or special form given its name\nnil\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/679549?v=3", :account-source "github", :login "ichisemasashi"}], :_id "5859de58e4b004d3a355e2cd"} {:updated-at 1608133142354, :created-at 1608133142354, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :body ";; Note that require is known _not_ to be thread safe in Clojure 1.10.x and\n;; earlier, so avoid calling it concurrently from multiple threads.\n\n;; See https://ask.clojure.org/index.php/9893/require-is-not-thread-safe\n;; for some thoughts on approaches to using require from multiple threads\n;; safely, which today boils down to \"use locks to make all calls to require\n;; guaranteed to execute one at a time\".", :_id "5fda2a16e4b0b1e3652d7419"} {:updated-at 1654081970684, :created-at 1654081970684, :author {:login "PEZ", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/30010?v=4"}, :body ";; Watch out for the Gilardi scenario: https://technomancy.us/143\n;; If you need to refer to the required symbols in the same block\n;; of code as it is being defined, that will only work at top level\n;; and in top-level `do`:\n\n(do\n (require '[clojure.set :as c-set])\n (c-set/union #{1} #{2})) ; => #{\"1\" \"2\"}\n\n;; It won't work here, because the compiler does not know about\n;; `c-set` when it tries to compile the form:\n\n(->> [\"1\" \"2\"]\n (reduce (fn [acc v]\n (require '[clojure.set :as c-set])\n (c-set/union acc #{v}))\n #{})) ; => Syntax error compiling at ...\n ; No such namespace: c-set\n\n;; A solution is to move the use of the required symbol to run-time.\n;; E.g. with `resolve`:\n\n(->> [\"1\" \"2\"]\n (reduce (fn [acc v]\n (require '[clojure.set :as c-set])\n ((resolve 'c-set/union) acc #{v}))\n #{})) ; => #{\"1\" \"2\"}\n\n;; At which point `requiring-resolve` might be clearer:\n\n(->> [\"1\" \"2\"]\n (reduce (fn [acc v]\n ((requiring-resolve 'clojure.set/union) acc #{v}))\n #{})) ; => #{\"1\" \"2\"}", :_id "629749b2e4b0b1e3652d75f7"} {:updated-at 1654162737681, :created-at 1654162737681, :author {:login "imrekoszo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1116295?v=4"}, :body ";; As a follow-up to previous examples, one more reason to prefer using\n;; `requiring-resolve` from within runtime functions when possible, is that it\n;; wraps `require` in a thread-safe way (require itself is not thread-safe as of\n;; 1.11.1 as mentioned in an earlier example).\n;; This is done via the private function `clojure.core/serialized-require`\n;; Some more info can be found in the comment at\n;; https://ask.clojure.org/index.php/9893/require-is-not-thread-safe?show=9902#c9902", :_id "62988531e4b0b1e3652d75f8"}], :notes [{:updated-at 1291628629000, :body "Good description of use/require/import here:\r\n\r\nhttp://blog.8thlight.com/articles/2010/12/6/clojure-libs-and-namespaces-require-use-import-and-ns", :created-at 1291628629000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521faa"}], :arglists ["& args"], :doc "Loads libs, skipping any that are already loaded. Each argument is\n either a libspec that identifies a lib, a prefix list that identifies\n multiple libs whose names share a common prefix, or a flag that modifies\n how all the identified libs are loaded. Use :require in the ns macro\n in preference to calling this directly.\n\n Libs\n\n A 'lib' is a named set of resources in classpath whose contents define a\n library of Clojure code. Lib names are symbols and each lib is associated\n with a Clojure namespace and a Java package that share its name. A lib's\n name also locates its root directory within classpath using Java's\n package name to classpath-relative path mapping. All resources in a lib\n should be contained in the directory structure under its root directory.\n All definitions a lib makes should be in its associated namespace.\n\n 'require loads a lib by loading its root resource. The root resource path\n is derived from the lib name in the following manner:\n Consider a lib named by the symbol 'x.y.z; it has the root directory\n /x/y/, and its root resource is /x/y/z.clj, or\n /x/y/z.cljc if /x/y/z.clj does not exist. The\n root resource should contain code to create the lib's\n namespace (usually by using the ns macro) and load any additional\n lib resources.\n\n Libspecs\n\n A libspec is a lib name or a vector containing a lib name followed by\n options expressed as sequential keywords and arguments.\n\n Recognized options:\n :as takes a symbol as its argument and makes that symbol an alias to the\n lib's namespace in the current namespace.\n :refer takes a list of symbols to refer from the namespace or the :all\n keyword to bring in all public vars.\n\n Prefix Lists\n\n It's common for Clojure code to depend on several libs whose names have\n the same prefix. When specifying libs, prefix lists can be used to reduce\n repetition. A prefix list contains the shared prefix followed by libspecs\n with the shared prefix removed from the lib names. After removing the\n prefix, the names that remain must not contain any periods.\n\n Flags\n\n A flag is a keyword.\n Recognized flags: :reload, :reload-all, :verbose\n :reload forces loading of all the identified libs even if they are\n already loaded\n :reload-all implies :reload and also forces loading of all libs that the\n identified libs directly or indirectly load via require or use\n :verbose triggers printing information about each load, alias, and refer\n\n Example:\n\n The following would load the libraries clojure.zip and clojure.set\n abbreviated as 's'.\n\n (require '(clojure zip [set :as s]))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/require"} {:added "1.0", :ns "clojure.core", :name "unchecked-dec-int", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1678034697354, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unchecked-inc-int", :ns "clojure.core"}, :_id "6404c709e4b08cf8563f4b7a"}], :line 1163, :examples [{:updated-at 1658482155693, :created-at 1658482155693, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body "(unchecked-dec-int 42);; => 41\n(unchecked-dec-int 42.2);; => 41\n(unchecked-dec-int Integer/MIN_VALUE);; => 2147483647", :_id "62da6debe4b0b1e3652d762e"}], :notes nil, :arglists ["x"], :doc "Returns a number one less than x, an int.\n Note - uses a primitive operator subject to overflow.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-dec-int"} {:added "1.1", :ns "clojure.core", :name "persistent!", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1286870194000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "transient", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a86"}], :line 3349, :examples [{:author {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}, :editors [], :body "user> (def foo (transient [1 2 3]))\n#'user/foo\nuser> foo\n#\nuser> (persistent! foo)\n[1 2 3]\nuser> foo\n#\nuser> (conj! foo 4)\n→ ERROR:Transient used after persistent! call\nuser> (persistent! foo)\n→ ERROR: Transient used after persistent! call", :created-at 1307739912000, :updated-at 1307739912000, :_id "542692cdc026201cdc326d20"} {:body ";; Use persistent! to evaluate your object,\n;; once the computation is complete\n\n(loop [large-set (transient #{})\n i 0]\n (if (< i 100000)\n (recur (conj! large-set i) (inc i))\n (persistent! large-set)))\n\n;; Returns a large set *much* faster than its\n;; persistent version. While keeping the same\n;; code structure\n", :author {:login "mattvvhat", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/367789?v=3"}, :created-at 1428551188131, :updated-at 1428551188131, :_id "5525f614e4b01bb732af0a7c"}], :notes nil, :arglists ["coll"], :doc "Returns a new, persistent version of the transient collection, in\n constant time. The transient collection cannot be used after this\n call, any such use will throw an exception.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/persistent!"} {:added "1.0", :ns "clojure.core", :name "nnext", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1482183664107, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "next", :ns "clojure.core"}, :_id "585853f0e4b004d3a355e2bb"} {:created-at 1482183673811, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "fnext", :ns "clojure.core"}, :_id "585853f9e4b004d3a355e2bc"} {:created-at 1482183802054, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ffirst", :ns "clojure.core"}, :_id "5858547ae4b004d3a355e2c0"} {:created-at 1482183808882, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nfirst", :ns "clojure.core"}, :_id "58585480e4b004d3a355e2c1"}], :line 119, :examples [{:updated-at 1672789836612, :created-at 1281033362000, :body "user=> (nnext '(1 2 3))\n(3)\n\nuser=> (nnext [])\nnil \n\nuser=> (nnext ['(a b c) '(b a c) '(c b a) '(a c b)])\n((c b a) (a c b)) \n\nuser=> (nnext {:a 1, :b 2, :c 3, :d 4})\n([:c 3] [:d 4]) \n\nuser=> (nnext #{:a :b :c})\n(:c)", :editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon", :account-source "clojuredocs", :login "zmila"}, :_id "542692cbc026201cdc326ba1"}], :notes nil, :arglists ["x"], :doc "Same as (next (next x))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/nnext"} {:added "1.0", :ns "clojure.core", :name "add-watch", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1331138866000, :author {:login "pjlegato", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4ce55cfd8b3ae2f63f5ecbc8fc1c05d4?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "remove-watch", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e04"}], :line 2144, :examples [{:author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :editors [{:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Daniel Brotsky", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/afb394be4b0eb5fc369a2fdbfea0a236?r=PG&default=identicon"}], :body ";; Add useful context to watcher function:\n(defn watch-agent [_agent context]\n (let [watch-fn (fn [_context _key _ref old-value new-value] ;...\n )] \n (add-watch _agent nil (partial watch-fn context))))\n", :created-at 1279390260000, :updated-at 1356749167000, :_id "542692c6c026201cdc326935"} {:updated-at 1507629557002, :created-at 1356749543000, :body "Notice that it is nondeterministic that return happens first\nor the `print` call happens first. (because they are happening in different threads)\n \nuser> (def a (agent 0))\n=> #'user/a\nuser> a\n=> #agent[{:status :ready, :val 0} 0x591e4e8e]\nuser> (add-watch a :key (fn [k r os ns] (print k r os ns)))\n=> #agent[{:status :ready, :val 0} 0x591e4e8e]\nuser> (send a inc)\n=> #agent[{:status :ready, :val 1} 0x591e4e8e]\n:key #agent[{:status :ready, :val 1} 0x591e4e8e] 0 1\nuser> (send a inc)\n:key #agent[{:status :ready, :val 2} 0x591e4e8e] 1 2\n=> #agent[{:status :ready, :val 2} 0x591e4e8e]\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/afb394be4b0eb5fc369a2fdbfea0a236?r=PG&default=identicon", :account-source "clojuredocs", :login "Daniel Brotsky"} {:avatar-url "https://avatars.githubusercontent.com/u/154699?v=3", :account-source "github", :login "avasenin"} {:login "wontheone1", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/11784756?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/afb394be4b0eb5fc369a2fdbfea0a236?r=PG&default=identicon", :account-source "clojuredocs", :login "Daniel Brotsky"}, :_id "542692d1c026201cdc326f45"} {:body "(def a (atom {}))\n\n(add-watch a :watcher\n (fn [key atom old-state new-state]\n (prn \"-- Atom Changed --\")\n (prn \"key\" key)\n (prn \"atom\" atom)\n (prn \"old-state\" old-state)\n (prn \"new-state\" new-state)))\n\n(reset! a {:foo \"bar\"})\n\n;; \"-- Atom Changed --\"\n;; \"key\" :watcher\n;; \"atom\" #\n;; \"old-state\" {}\n;; \"new-state\" {:foo \"bar\"}\n;; {:foo \"bar\"}", :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=3"}, :created-at 1419712448016, :updated-at 1419712448016, :_id "549f17c0e4b09260f767ca7f"} {:body ";; The name of my account can change, and I want to update another atom accordingly.\n;; I just take the fourth argument that contains the new state and I ignore the other arguments.\n\n(let [account (atom {:name \"pending\" \n :funds 100.50 \n :profit-loss 23.45})\n label-account-name (atom \"no-name-yet\")]\n (add-watch account :listener-one #(reset! label-account-name (:name %4)))\n (println \"Before swap:\" @label-account-name)\n (swap! account assoc :name \"CFD\")\n (println \"After swap:\" @label-account-name))\n\n;; Before swap: no-name-yet\n;; After swap: CFD", :author {:login "EfrainBergillos", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/9882960?v=3"}, :created-at 1421365692915, :updated-at 1421365692915, :_id "54b851bce4b081e022073c17"} {:body ";; ClojureScript: Log the new value of the ref to console whenever it changes\n\n(def a (atom nil))\n\n(add-watch a :logger #(-> %4 clj->js js/console.log))\n\n(reset! a (my-app/initial-state))", :author {:login "jkxyz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10171367?v=3"}, :created-at 1434457905527, :updated-at 1434458524720, :editors [{:login "jkxyz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10171367?v=3"}], :_id "55801731e4b01ad59b65f4f7"}], :notes [{:author {:login "hura", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/671872?v=3"}, :updated-at 1438348899904, :created-at 1438348899904, :body "One \"gotcha\" is that atoms `add-watch`es do not always guarantee order semantics. So if you have a watch put `[old-val new-val]` on a channel, and your atom operation is something like `(swap! a inc)`, you may see values in your channel like this:\n\n```\n[0 1]\n[2 3]\n[1 2]\n[3 4]\n[6 7]\n[4 5]\n```\n\nThis is because the watches are dispatched in different threads.\n\n[Source](https://groups.google.com/d/msg/clojure/RI1Pq3E3188/YyqyGq36f1oJ)", :_id "55bb7663e4b03580923b00db"}], :arglists ["reference key fn"], :doc "Adds a watch function to an agent/atom/var/ref reference. The watch\n fn must be a fn of 4 args: a key, the reference, its old-state, its\n new-state. Whenever the reference's state might have been changed,\n any registered watches will have their functions called. The watch fn\n will be called synchronously, on the agent's thread if an agent,\n before any pending sends if agent or ref. Note that an atom's or\n ref's state may have changed again prior to the fn call, so use\n old/new-state rather than derefing the reference. Note also that watch\n fns may be called from multiple threads simultaneously. Var watchers\n are triggered only by root binding changes, not thread-local\n set!s. Keys must be unique per reference, and can be used to remove\n the watch with remove-watch, but are otherwise considered opaque by\n the watch mechanism.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/add-watch"} {:added "1.0", :ns "clojure.core", :name "not-every?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1315793146000, :author {:login "wdkrnls", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/6d08a2f792f289b95fe1d982d4133d71?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "every?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b10"} {:created-at 1315793156000, :author {:login "wdkrnls", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/6d08a2f792f289b95fe1d982d4133d71?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "not-any?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b11"} {:created-at 1315793166000, :author {:login "wdkrnls", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/6d08a2f792f289b95fe1d982d4133d71?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "some", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b12"}], :line 2684, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (not-every? odd? '(1 2 3))\ntrue\nuser=> (not-every? odd? '(1 3))\nfalse", :created-at 1279074566000, :updated-at 1332950344000, :_id "542692ccc026201cdc326c92"}], :notes nil, :tag "java.lang.Boolean", :arglists ["pred coll"], :doc "Returns false if (pred x) is logical true for every x in\n coll, else true.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/not-every_q"} {:added "1.0", :ns "clojure.core", :name "class?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1357883124000, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "class", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f40"}], :line 5443, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [], :body "user=> (class? 1)\nfalse\n\nuser=> (class? java.lang.String)\ntrue\n\nuser=> (class? [])\nfalse", :created-at 1286508711000, :updated-at 1286508711000, :_id "542692cac026201cdc326b16"}], :notes nil, :arglists ["x"], :doc "Returns true if x is an instance of Class", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/class_q"} {:added "1.0", :ns "clojure.core", :name "rem", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1305751179000, :author {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "quot", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521de4"} {:created-at 1305751201000, :author {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "mod", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521de5"}], :line 1269, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (rem 10 9)\n1\nuser=> (rem 2 2)\n0", :created-at 1279071638000, :updated-at 1332952568000, :_id "542692c8c026201cdc3269df"} {:author {:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"}, :editors [{:login "popopome", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f764e6667c2664b9979227fc40be024e?r=PG&default=identicon"} {:login "popopome", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f764e6667c2664b9979227fc40be024e?r=PG&default=identicon"} {:login "zw", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/263299?v=2"} {:login "num1", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/466333?v=3"} {:avatar-url "https://avatars3.githubusercontent.com/u/7660326?v=4", :account-source "github", :login "Shinkenjoe"} {:login "xiechao06", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/2888536?v=4"}], :body ";; rem and mod are commonly used to get the remainder.\n;; mod means Knut's mod (truncating towards negativity). \n;; rem implements ANSI C's % operator\n;; Absolute value stays the same, always the distance\n;; towards zero.\n;; sign depends on dividend. \n\n\nuser=> (rem -10 3)\n-1\nuser=> (rem 10 -3)\n1\nuser=> (rem -10 -3)\n-1\nuser=> (rem 10 3)\n1\n\nuser=> (mod -10 3)\n2\nuser=> (mod 10 -3)\n-2\nuser=> (mod -10 -3)\n-1", :created-at 1314221509000, :updated-at 1562902867081, :_id "542692c8c026201cdc3269e1"}], :notes nil, :arglists ["num div"], :doc "remainder of dividing numerator by denominator.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/rem"} {:added "1.2", :ns "clojure.core", :name "agent-error", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1329375490000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "agent", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e79"} {:created-at 1329375495000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "restart-agent", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e7a"} {:created-at 1329375504000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "set-error-handler!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e7b"}], :line 2169, :examples [{:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [], :body "(def tdate (agent (java.util.Date.)))\n\n@tdate\n=> #\n\n(send tdate inc) ;;this has no meaning, rendering a (silent) error\n\n(agent-error tdate)\n=> #", :created-at 1329375525000, :updated-at 1329375525000, :_id "542692d1c026201cdc326f48"}], :notes nil, :arglists ["a"], :doc "Returns the exception thrown during an asynchronous action of the\n agent if the agent is failed. Returns nil if the agent is not\n failed.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/agent-error"} {:added "1.0", :ns "clojure.core", :name "some", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1302013833000, :author {:login "pauldoo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5cb916d3c8abc9f45a093209e72489fb?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "every?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b19"} {:created-at 1314584649000, :author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "not-any?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b1a"} {:created-at 1333669222000, :author {:login "Radford Smith", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7db5c7bf2289ca4da17da34aef761283?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "keep", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b1b"} {:created-at 1333669233000, :author {:login "Radford Smith", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7db5c7bf2289ca4da17da34aef761283?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "keep-indexed", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b1c"} {:created-at 1374512423000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "some-fn", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b1d"} {:created-at 1436882896023, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "some->", :ns "clojure.core"}, :_id "55a517d0e4b020189d740552"} {:created-at 1550596421868, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "contains?", :ns "clojure.core"}, :_id "5c6c3945e4b0ca44402ef697"} {:created-at 1550597894678, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "some?", :ns "clojure.core"}, :_id "5c6c3f06e4b0ca44402ef698"} {:created-at 1550597965635, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "if-some", :ns "clojure.core"}, :_id "5c6c3f4de4b0ca44402ef699"} {:created-at 1550597978829, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "when-some", :ns "clojure.core"}, :_id "5c6c3f5ae4b0ca44402ef69a"}], :line 2692, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body ";; 2 is even, so `some` stops there, 3 and 4 are never tested\n(some even? '(1 2 3 4))\n;;=> true\n\n;; they are all odd, so not true, i.e. nil\n(some even? '(1 3 5 7))\n;;=> nil", :created-at 1279071879000, :updated-at 1423276722153, :_id "542692c6c026201cdc32693b"} {:author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :body "(some true? [false false false])\n;;=> nil\n\n(some true? [false true false])\n;;=> true\n\n(some true? [true true true])\n;;=> true\n", :created-at 1279402782000, :updated-at 1412977043756, :_id "542692c6c026201cdc32693c"} {:author {:login "MrHus", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"} {:login "Okwori", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/16775439?v=4"}], :body "(some #(= 5 %) [1 2 3 4 5])\n;;=> true\n\n(some #(= 5 %) [6 7 8 9 10])\n;;=> nil\n\n(some #(not= 5 %) [1 2 3 4 5])\n;;=> true\n\n(some #(not= 5 %) [6 7 8 9 10])\n;;=> true", :created-at 1279415908000, :updated-at 1628796580693, :_id "542692c6c026201cdc32693d"} {:author {:login "jamesqiu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc1268deaa7f2e78fe2b5ea76e6481d8?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; the first logical true value is returned, i.e. anything but nil and false\n;; when return nil if its predicate is logical false.\n(some #(when (even? %) %) '(1 2 3 4))\n;;=> 2", :created-at 1297541384000, :updated-at 1421346805315, :_id "542692c6c026201cdc32693e"} {:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:avatar-url "https://avatars1.githubusercontent.com/u/636991?v=4", :account-source "github", :login "edgardini"}], :body ";; a hash acts as a function returning nil when the\n;; key is not present and the key value otherwise.\n(some {2 \"two\" 3 \"three\"} [nil 3 2])\n;;=> \"three\"\n\n;; there is nothing special about the 'nil' in the collection,\n;; it is still being used as a key to find its corresponding value in the hash.\n(some {nil \"nothing\" 2 \"two\" 3 \"three\"} [nil 3 2])\n;;=> \"nothing\"\n\n;; the hash (as function) returns a nil for the key of '3',\n;; therefore 'some' keeps inspecting the collection,\n;; returning the next logical true value.\n(some {2 \"two\" 3 nil} [nil 3 2])\n;;=> \"two\"", :created-at 1310849563000, :updated-at 1587274820037, :_id "542692c6c026201cdc32693f"} {:updated-at 1688285065877, :created-at 1314584832000, :body ";; `some` can be used in place of `(first (filter ...))` in most cases.\n(first (filter even? [1 2 3 4]))\n;;=> 2\n\n;; `some` returns exactly one item or `nil` if nothing is found.\n(some #(when (even? %) %) [1 2 3 4])\n;;=> 2\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "finalfantasia", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2316604?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon", :account-source "clojuredocs", :login "shockbob"}, :_id "542692c6c026201cdc326940"} {:updated-at 1617899114358, :created-at 1314782258000, :body ";; find whether a word is in a list of words.\n(def word \"foo\")\n(def words [\"bar\" \"baz\" \"foo\" \"\"])\n(some (partial = word) words)\n;;=> true", :editors [{:avatar-url "https://www.gravatar.com/avatar/34f159f89cbd1d9beac0276f5a7af552?r=PG&default=identicon", :account-source "clojuredocs", :login "uvtc"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=2", :account-source "github", :login "phreed"} {:login "rsangar1", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10330856?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon", :account-source "clojuredocs", :login "gstamp"}, :_id "542692c6c026201cdc326941"} {:author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:login "rsangar1", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10330856?v=4"}], :body ";; here we see sets being used as a predicate\n;; the first member of the collection that appears in the set is returned\n\n(some #{2} (range 0 10)) ;;=> 2\n(some #{6 2 4} (range 0 10)) ;;=> 2\n(some #{2 4 6} (range 3 10)) ;;=> 4\n(some #{200} (range 0 10)) ;;=> nil\n\n", :created-at 1362705803000, :updated-at 1617899235932, :_id "542692d5c026201cdc32708a"} {:body ";; be careful, 'nil' can occasionally be returned on success.\n(#{nil} nil)\n;;=> nil \n\n;; almost as troublesome is returning a false\n(#{false} false)\n;;=> false", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1421347932889, :updated-at 1421347932889, :_id "54b80c5ce4b0e2ac61831cb9"} {:body ";; if you have a case where the predicate arguments are fixed/known, \n;; but the predicate function isn't:\n;; coll can supply the predicate function instead of the predicate arguments\n\n;; define the function 'not equal' (ne)\n(defn ne [n1 n2] (not= n1 n2))\n;;=> #'user/ne\n\n(some #(% 3 7) (list ne))\n;;=>true\n\n(some #(% 3 3) (list ne))\n;;=>nil\n\n\n", :author {:login "qsys", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2430465?v=3"}, :created-at 1428947077779, :updated-at 1428947719382, :editors [{:login "qsys", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2430465?v=3"}], :_id "552c0085e4b01bb732af0a7d"} {:body ";; extending the previous example: supplying multiple functions.\n(defn ne [n1 n2] (not= n1 n2)) \n;;=> #'user/ne\n\n;; function to check if the sum is less than 'limit'\n(defn sumlt [limit n1 n2] (> limit (+ n1 n2))) \n;;=>'user/sumlt\n\n(some #(% 3 7) (list ne #(sumlt 10 %1 %2))) \n;;=>true\n\n(some #(% 3 3) (list ne #(sumlt 10 %1 %2))) \n;;=>true\n\n(some #(% 7 7) (list ne #(sumlt 10 %1 %2))) \n;;=>nil\n\n;; same, but one of the functions returns a value instead a boolean.\n(some #(% 3 7) (list ne (fn [n1 n2] (+ n1 n2)))) \n;;=>true\n\n(some #(% 7 7) (list ne (fn [n1 n2] (+ n1 n2)))) \n;;=>14\n\n;; the importance of order of the function list.\n(some #(% 7 7) (list ne #(sumlt 10 %1 %2) (fn [n1 n2] (+ n1 n2)))) \n;;=>14\n\n(some #(% 7 7) (list ne (fn [n1 n2] (+ n1 n2)) #(sumlt 10 %1 %2))) \n;;=>14\n\n(some #(% 3 3) (list ne #(sumlt 10 %1 %2) (fn [n1 n2] (+ n1 n2)))) \n;;=>true\n\n(some #(% 3 3) (list ne (fn [n1 n2] (+ n1 n2)) #(sumlt 10 %1 %2))) \n;;=>6\n", :author {:login "qsys", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2430465?v=3"}, :created-at 1428947310117, :updated-at 1428948227036, :editors [{:login "qsys", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2430465?v=3"}], :_id "552c016ee4b033f34014b76d"} {:updated-at 1446612111804, :created-at 1446612111804, :author {:login "Art-B", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1143795?v=3"}, :body ";;if you want to return the element the caused the predicate to return true\n;;use the \"and\" function on the predicate and the argument:\n\n(some #(and (even? %) %) [1 3 5 7 8 2])\n;;=> 8", :_id "56398c8fe4b0290a56055d1b"} {:updated-at 1543509450658, :created-at 1543509450658, :author {:login "aviflax", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/141844?v=4"}, :body ";; As an alternative to the above usage of `and`, I prefer to use `if`\n;; in such cases; I think it’s slightly clearer:\n\n(some #(if (even? %) %) [1 3 5 7 8 2])\n;;=> 8", :_id "5c0015cae4b0ca44402ef5d1"} {:updated-at 1626283719651, :created-at 1626283719651, :author {:login "humorless", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3061798?v=4"}, :body ";; `some` can be an alternative for `apply or`\n(def v [nil false 5 nil 7])\n\n;; (apply or v)\n;; java runtime exception because or is macro\n\n(some identity v)\n;;=> 5\n\n;; Source - lamdaisland episode\n;; https://lambdaisland.com/episodes/clojure-core-some", :_id "60ef1ec7e4b0b1e3652d7517"}], :notes [{:updated-at 1351243602000, :body "Be careful about using sets as predicates if you don't know what is in the set.\r\nIn particular,
    (#{nil} nil)
    is
    nil
    and
    (#{false} false)
    is
    false
    Consider using
    contains?
    instead.", :created-at 1351243602000, :author {:login "Sgeo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bf4e0e4e4f0b1f703b1372a8dd7b0735?r=PG&default=identicon"}, :_id "542692edf6e94c6970521ff3"}], :arglists ["pred coll"], :doc "Returns the first logical true value of (pred x) for any x in coll,\n else nil. One common idiom is to use a set as pred, for example\n this will return :fred if :fred is in the sequence, otherwise nil:\n (some #{:fred} coll)", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/some"} {:added "1.1", :ns "clojure.core", :name "future-cancelled?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "future", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1339251909000, :_id "542692eaf6e94c6970521aa0"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "future?", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1339251915000, :_id "542692eaf6e94c6970521aa1"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "future-cancel", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1339251923000, :_id "542692eaf6e94c6970521aa2"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "future-done?", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1339251931000, :_id "542692eaf6e94c6970521aa3"}], :line 7006, :examples [{:updated-at 1339251900000, :created-at 1339251900000, :body "user=> (def f (future (inc 0))) \n#'user/f\n\nuser=> (future-cancel f) \nfalse\n\nuser=> (future-cancelled? f)\nfalse\n\nuser=> (future-done? f) \ntrue\n\nuser=> @f \n1\n", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :_id "542692d3c026201cdc326fb5"} {:updated-at 1339252110000, :created-at 1339252110000, :body "user=> (def f (future (Thread/sleep 5000) (inc 0)))\n#'user/f\n\nuser=> (future-cancel f) \ntrue\n\nuser=> (future-cancelled? f) \ntrue\n\nuser=> (future-done? f) \ntrue\n\nuser=> @f \njava.util.concurrent.CancellationException (NO_SOURCE_FILE:0)", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :_id "542692d3c026201cdc326fb6"}], :notes nil, :arglists ["f"], :doc "Returns true if future f is cancelled", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/future-cancelled_q"} {:added "1.0", :ns "clojure.core", :name "memfn", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos nil, :line 3871, :examples [{:updated-at 1285500178000, :created-at 1279241437000, :body "user=> (def *files* (file-seq (java.io.File. \"/tmp/\")))\n#'user/*files*\nuser=> (count (filter (memfn isDirectory) *files*))\n68\nuser=> (count (filter #(.isDirectory %) *files*))\n68\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692cac026201cdc326b0d"} {:editors [{:login "bsima", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/200617?v=3"}], :updated-at 1447790514365, :created-at 1434489283413, :author {:avatar-url "https://avatars.githubusercontent.com/u/519370?v=3", :account-source "github", :login "emidln"}, :body "user=> ;; you must pass arguments to your method to add up to the expected arity\n\nuser=> (def starts-with (memfn startsWith prefix))\n#'user/starts-with\nuser=> (starts-with \"pikachu\" \"pika\")\ntrue\nuser=> (starts-with \"pikachu\" \"bulba\")\nfalse", :_id "558091c3e4b03e2132e7d199"} {:updated-at 1532986210979, :created-at 1532986210979, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body "(set! *warn-on-reflection* true)\n\n;; memfn is inherently subject to reflective calls\n\n(time (dotimes [n 100000] (mapv (memfn toLowerCase) [\"A\" \"B\" \"C\"])))\n;; Reflection warning, call to toLowerCase can't be resolved\n;; \"Elapsed time: 794.081758 msecs\"\n\n;; But accepts and propagate type hints to avoid it\n\n(time (dotimes [n 100000] (mapv (memfn ^String toLowerCase) [\"A\" \"B\" \"C\"])))\n;; \"Elapsed time: 33.708462 msecs\"", :_id "5b5f8362e4b00ac801ed9e3d"}], :macro true, :notes nil, :arglists ["name & args"], :doc "Expands into code that creates a fn that expects to be passed an\n object and any args and calls the named instance method on the\n object passing the args. Use when you want to treat a Java method as\n a first-class fn. name may be type-hinted with the method receiver's\n type in order to avoid reflective calls.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/memfn"} {:added "1.9", :ns "clojure.core", :name "neg-int?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495640945095, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pos-int?", :ns "clojure.core"}, :_id "5925ab71e4b093ada4d4d732"} {:created-at 1495640949709, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nat-int?", :ns "clojure.core"}, :_id "5925ab75e4b093ada4d4d733"} {:created-at 1495705357040, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "int?", :ns "clojure.core"}, :_id "5926a70de4b093ada4d4d74f"}], :line 1414, :examples [{:updated-at 1495703597089, :created-at 1495703597089, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body "(neg-int? -1)\n;;=> true\n(neg-int? -9223372036854775808)\n;;=> true\n\n;;;; false for non-negative values\n\n(neg-int? 0)\n;;=> false\n(neg-int? 1)\n;;=> false\n\n;;;; false for decimal values\n\n(neg-int? -1.0)\n;;=> false\n(neg-int? -1/2)\n;;=> false\n\n;;;; false for BigInt values\n\n(neg-int? -1N)\n;;=> false\n(neg-int? -9223372036854775809)\n;;=> false", :_id "5926a02de4b093ada4d4d74a"}], :notes nil, :arglists ["x"], :doc "Return true if x is a negative fixed precision integer", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/neg-int_q"} {:added "1.0", :ns "clojure.core", :name "struct-map", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1283400432000, :author {:login "james", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4b163432c99a124feee4be046a3f9d66?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "struct", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c56"}], :line 4052, :examples [{:author {:login "james", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4b163432c99a124feee4be046a3f9d66?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; create a new struct type\n(defstruct s :1 :2)\n#'user/s\n\nuser=> (type s)\nclojure.lang.PersistentStructMap$Def\n\n;; create an instance of this new struct type\n(def s1 (struct s \"one\" \"two\"))\n#'user/s1\n\nuser=> (println s1)\n{:1 \"one\", :2 \"two\"}\n\nuser=> (type s1)\nclojure.lang.PersistentStructMap\n\n;; create a new struct instance that is based on the previous struct type\n;; with the option of supplying a new key/value pairs\n(def s2 (struct-map s :3 \"three\"))\n#'user/s2\n\nuser=> (println s2)\n{:1 nil, :2 nil, :3 \"three\"}\n\nuser=> (type s2)\nclojure.lang.PersistentStructMap\n", :created-at 1283401838000, :updated-at 1285488890000, :_id "542692ccc026201cdc326c94"} {:updated-at 1473936902003, :created-at 1473936902003, :author {:login "PetrGlad", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/124476?v=3"}, :body ";; Map -> struct\n(defstruct S :db)\n(into (struct-map S) {:db \"db\" :name \"Grut\"})", :_id "57da7e06e4b0709b524f04fa"}], :notes nil, :arglists ["s & inits"], :doc "Returns a new structmap instance with the keys of the\n structure-basis. keyvals may contain all, some or none of the basis\n keys - where values are not supplied they will default to nil.\n keyvals can also contain keys not in the basis.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/struct-map"} {:added "1.0", :ns "clojure.core", :name "drop", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1288872301000, :author {:login "jartur", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8eae7b45fd8d383bc1a49e24bee51c9b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "take", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521c99"} {:created-at 1288872352000, :author {:login "jartur", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8eae7b45fd8d383bc1a49e24bee51c9b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "drop-last", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521c9a"} {:created-at 1288872358000, :author {:login "jartur", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8eae7b45fd8d383bc1a49e24bee51c9b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "drop-while", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521c9b"} {:created-at 1306331554000, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "nthnext", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521c9c"} {:created-at 1356088859000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "nthrest", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521c9d"}], :line 2909, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; although negative (or zero) drop-item-counts are accepted they do nothing\n(drop -1 [1 2 3 4])\n;;=> (1 2 3 4) \n\n(drop 0 [1 2 3 4])\n;;=> (1 2 3 4) \n\n(drop 2 [1 2 3 4])\n;;=> (3 4) \n\n;; dropping more items than are present is allowed, and all items are dropped.\n(drop 5 [1 2 3 4])\n;;=> ()", :created-at 1280344844000, :updated-at 1420736258191, :_id "542692cec026201cdc326da3"} {:body ";; similar to subvec but lazy and with seqs\n(take 3 (drop 5 (range 1 11)))\n;;=> (6 7 8)", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1420736116932, :updated-at 1420736116932, :_id "54aeb674e4b081e022073bf2"}], :notes nil, :arglists ["n" "n coll"], :doc "Returns a lazy sequence of all but the first n items in coll.\n Returns a stateful transducer when no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/drop"} {:added "1.4", :ns "clojure.core", :name "*data-readers*", :file "clojure/core.clj", :type "var", :column 1, :see-alsos [{:created-at 1618154998966, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "print-method", :ns "clojure.core"}, :_id "607315f6e4b0b1e3652d74c2"}], :dynamic true, :line 7758, :examples [{:updated-at 1618154693914, :created-at 1618154693914, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :body "(import '[java.net URL])\n\n;; Teaching Clojure how to read URL objects from a string\n\n(binding [*data-readers* {'url #(URL. %)}] \n (read-string \"#url \\\"file:/etc/hosts\\\"\"))\n\n;; #object[java.net.URL 0x64a8c844 \"file:/etc/hosts\"]", :_id "607314c5e4b0b1e3652d74c1"}], :notes [{:author {:login "rmoehn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/311879?v=3"}, :updated-at 1436316512612, :created-at 1436316512612, :body "`clojure.edn/read` and `clojure.edn/read-string` don't look into\n`*data-readers*` in order to find the reader functions for a reader tag.\nThat's why they won't get the mappings from `data_readers.clj` either.\nSee the [note on `clojure.edn/read`](https://clojuredocs.org/clojure.edn/read)\nfor more information and a warning.", :_id "559c7360e4b00f9508fd66fa"} {:author {:login "raxod502", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6559064?v=3"}, :updated-at 1483727344008, :created-at 1483727344008, :body "Note that if you're using `clojure.reader/read` instead of `clojure.core/read`, you have to bind `clojure.reader/*data-readers*` rather than `clojure.core/*data-readers*`.", :_id "586fe1f0e4b09108c8545a4a"}], :arglists [], :doc "Map from reader tag symbols to data reader Vars.\n\n When Clojure starts, it searches for files named 'data_readers.clj'\n and 'data_readers.cljc' at the root of the classpath. Each such file\n must contain a literal map of symbols, like this:\n\n {foo/bar my.project.foo/bar\n foo/baz my.project/baz}\n\n The first symbol in each pair is a tag that will be recognized by\n the Clojure reader. The second symbol in the pair is the\n fully-qualified name of a Var which will be invoked by the reader to\n parse the form following the tag. For example, given the\n data_readers.clj file above, the Clojure reader would parse this\n form:\n\n #foo/bar [1 2 3]\n\n by invoking the Var #'my.project.foo/bar on the vector [1 2 3]. The\n data reader function is invoked on the form AFTER it has been read\n as a normal Clojure data structure by the reader.\n\n Reader tags without namespace qualifiers are reserved for\n Clojure. Default reader tags are defined in\n clojure.core/default-data-readers but may be overridden in\n data_readers.clj, data_readers.cljc, or by rebinding this Var.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*data-readers*"} {:added "1.0", :ns "clojure.core", :name "nth", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1303125578000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "first", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d83"} {:created-at 1303125582000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "second", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d84"} {:created-at 1303125660000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "nthnext", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d85"} {:created-at 1389744320000, :author {:login "jw0", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ca45063da41a9f3aa9028295d8b66d89?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "get", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d86"} {:created-at 1544035070645, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "take-nth", :ns "clojure.core"}, :_id "5c081afee4b0ca44402ef5dd"} {:created-at 1544035081114, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nthrest", :ns "clojure.core"}, :_id "5c081b09e4b0ca44402ef5de"} {:created-at 1544035090445, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "rand-nth", :ns "clojure.core"}, :_id "5c081b12e4b0ca44402ef5df"}], :line 889, :examples [{:updated-at 1433457696443, :created-at 1279417427000, :body "; Note that nth uses zero-based indexing, so that\n; (first my-seq) <=> (nth my-seq 0)\n(def my-seq [\"a\" \"b\" \"c\" \"d\"])\n(nth my-seq 0)\n; => \"a\"\n(nth my-seq 1)\n; => \"b\"\n(nth [] 0)\n; => IndexOutOfBoundsException ...\n(nth [] 0 \"nothing found\")\n; => \"nothing found\"\n(nth [0 1 2] 77 1337)\n; => 1337", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/3272?v=3", :account-source "github", :login "morty"} {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"} {:avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3", :account-source "github", :login "cloojure"}], :author {:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"}, :_id "542692cbc026201cdc326c10"} {:updated-at 1473696117507, :created-at 1473696117507, :author {:login "st-keller", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/476463?v=3"}, :body "(nth [\"last\"] -1 \"this is not perl\")\n; => \"this is not perl\"", :_id "57d6d175e4b0709b524f04f5"}], :notes [{:author {:login "pesterhazy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/106328?v=3"}, :updated-at 1475067300924, :created-at 1475067300924, :body "Rather than throwing an exception, `(nth nil n)` returns `nil` for any number `n`.", :_id "57ebbda4e4b0709b524f050f"} {:author {:login "beoliver", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1413969?v=4"}, :updated-at 1558362123119, :created-at 1558362123119, :body "Floats are treated as indexes `(nth [0 1] 1.9)` returns the element at index `1`. At first glance it may seem as though they are always rounded down. However due to floating point precision `(nth [0 1] 1.9999999999999999)` will raise an `IndexOutOfBoundsException`.", :_id "5ce2b80be4b0ca44402ef727"}], :arglists ["coll index" "coll index not-found"], :doc "Returns the value at the index. get returns nil if index out of\n bounds, nth throws an exception unless not-found is supplied. nth\n also works for strings, Java arrays, regex Matchers and Lists, and,\n in O(n) time, for sequences.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/nth"} {:added "1.0", :ns "clojure.core", :name "sorted?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1281961844000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sorted-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521af9"} {:created-at 1281961850000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sorted-set", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521afa"}], :line 6256, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (sorted? (sorted-set 5 3 1 2 4))\ntrue\nuser=> (sorted? (sorted-map :a 1 :c 3 :b 2))\ntrue\n\n;; Note you can't just pass in a collection that happens to be sorted.\nuser=> (sorted? [1 2 3 4 5])\nfalse\n", :created-at 1281961832000, :updated-at 1285494525000, :_id "542692c7c026201cdc326985"} {:author {:login "Alexey Tarasevich", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/43e0398b89022d32b43de4c968069312?r=PG&default=identicon"}, :editors [{:login "Alexey Tarasevich", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/43e0398b89022d32b43de4c968069312?r=PG&default=identicon"}], :body "=> (sorted? (sort [1 2]))\nfalse", :created-at 1385847625000, :updated-at 1385847666000, :_id "542692d5c026201cdc327097"}], :notes nil, :arglists ["coll"], :doc "Returns true if coll implements Sorted", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/sorted_q"} {:added "1.0", :ns "clojure.core", :name "nil?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1365638069000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "identity", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c87"} {:created-at 1431460678381, :author {:login "mmavko", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1064539?v=3"}, :to-var {:ns "clojure.core", :name "some?", :library-url "https://github.com/clojure/clojure"}, :_id "55525b46e4b01ad59b65f4ce"}], :line 436, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user=> (nil? nil)\ntrue\nuser=> (nil? 0)\nfalse\nuser=> (nil? false)\nfalse\nuser=> (nil? '())\nfalse", :created-at 1279074467000, :updated-at 1423017086496, :_id "542692c6c026201cdc326943"} {:updated-at 1514329022413, :created-at 1509054633215, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body ";; as nil? is defined as \"Returns true if x is nil, false otherwise.\"\n;; and some? is defined as \"Returns true if x is not nil, false otherwise.\"\n\n;; (some? x) is just shorthand for (not (nil? x))\n;; this also means that nil? is the same as (not (some? x)) as this\n;; just expands into (not (not (nil? x))).\n\n(def nil?? (complement some?))\n;;#'user/nil??\n\n(for [x [nil 0 false [] '()]]\n (= (nil? x) (nil?? x)))\n;;=> (true true true true true)", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/1413969?v=4", :account-source "github", :login "beoliver"} {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :_id "59f258a9e4b0a08026c48c78"}], :notes nil, :tag "java.lang.Boolean", :arglists ["x"], :doc "Returns true if x is nil, false otherwise.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/nil_q"} {:added "1.2", :ns "clojure.core", :name "extend-protocol", :file "clojure/core_deftype.clj", :type "macro", :column 1, :see-alsos [{:created-at 1336670528000, :author {:login "Cosmi", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10f2eae92de67116fa98d06ec55fcf29?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "extend", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b0a"} {:created-at 1336670535000, :author {:login "Cosmi", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10f2eae92de67116fa98d06ec55fcf29?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "extend-type", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b0b"} {:created-at 1351471414000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defprotocol", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b0c"}], :line 868, :examples [{:updated-at 1489086655613, :created-at 1298553541000, :body "(defprotocol XmlNode\n (as-xml [this]))\n\n(defrecord User [^Integer id ^String name ^java.util.Date dob])\n\n;; Protocols can be extended to existing types and user defined types\n(extend-protocol XmlNode\n Integer\n (as-xml [this] (str this))\n String\n (as-xml [this] (identity this))\n java.util.Date\n (as-xml [this] (-> (java.text.SimpleDateFormat. \"yyyy-MM-dd HH:mm:ss\")\n (.format this)))\n User\n (as-xml [this] (str \"\"\n \"\" (as-xml (:id this)) \"\"\n \"\" (as-xml (:name this)) \"\"\n \"\" (as-xml (:dob this)) \"\"\n \"\")))", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/1837?v=2", :account-source "github", :login "bmabey"} {:login "Akeboshiwind", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/8889986?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/696a8f13a7fcf0b4265fe801f18ba7b5?r=PG&default=identicon", :account-source "clojuredocs", :login "kevinjqiu"}, :_id "542692cdc026201cdc326d08"}], :macro true, :notes nil, :arglists ["p & specs"], :doc "Useful when you want to provide several implementations of the same\n protocol all at once. Takes a single protocol and the implementation\n of that protocol for one or more types. Expands into calls to\n extend-type:\n\n (extend-protocol Protocol\n AType\n (foo [x] ...)\n (bar [x y] ...)\n BType\n (foo [x] ...)\n (bar [x y] ...)\n AClass\n (foo [x] ...)\n (bar [x y] ...)\n nil\n (foo [x] ...)\n (bar [x y] ...))\n\n expands into:\n\n (do\n (clojure.core/extend-type AType Protocol \n (foo [x] ...) \n (bar [x y] ...))\n (clojure.core/extend-type BType Protocol \n (foo [x] ...) \n (bar [x y] ...))\n (clojure.core/extend-type AClass Protocol \n (foo [x] ...) \n (bar [x y] ...))\n (clojure.core/extend-type nil Protocol \n (foo [x] ...) \n (bar [x y] ...)))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/extend-protocol"} {:added "1.0", :ns "clojure.core", :name "split-at", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1314290653000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "split-with", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f61"} {:created-at 1314291163000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "split", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f62"} {:created-at 1665533548834, :author {:login "mdave16", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/15642321?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "subvec", :ns "clojure.core"}, :_id "6346066ce4b0b1e3652d7677"}], :line 2985, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user=> (split-at 2 [1 2 3 4 5])\n[(1 2) (3 4 5)]\n\nuser=> (split-at 3 [1 2])\n[(1 2) ()]", :created-at 1281512425000, :updated-at 1423277558140, :_id "542692c9c026201cdc326af7"} {:editors [{:login "calebwebster", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/61309806?v=4"}], :body "user=> (let [[first-half second-half] (split-at 3 [1 2 3 4 5 6])] first-half)\n(1 2 3)", :author {:avatar-url "https://avatars.githubusercontent.com/u/61309806?v=4", :account-source "github", :login "calebwebster"}, :created-at 1682641999924, :updated-at 1682642529546, :_id "644b144fe4b08cf8563f4ba3"} {:updated-at 1689932824742, :created-at 1689932824742, :author {:login "flipsi", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6862899?v=4"}, :body "user=> (split-at 2 [:a :b :c :d])\n[(:a :b) (:c :d)]\n", :_id "64ba5418e4b08cf8563f4bd5"}], :notes nil, :arglists ["n coll"], :doc "Returns a vector of [(take n coll) (drop n coll)]", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/split-at"} {:added "1.0", :ns "clojure.core", :name "*e", :file "clojure/core.clj", :type "var", :column 1, :see-alsos [{:created-at 1334156010000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.repl", :name "pst", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ad3"}], :dynamic true, :line 6294, :examples [{:updated-at 1423525828173, :created-at 1281462019000, :body "user=> (ns-refers) ;;Oops! we missed a namespace (ns-refers 'user)\n; Evaluation aborted.\n\nuser=> *e\n#", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692c9c026201cdc326af2"}], :notes nil, :arglists [], :doc "bound in a repl thread to the most recent exception caught by the repl", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*e"} {:added "1.0", :ns "clojure.core", :name "load-reader", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1350072969000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "load-file", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bb9"}], :line 4082, :examples [{:author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :editors [], :body "(load-reader (java.io.FileReader. \"filename.clj\"))", :created-at 1350072954000, :updated-at 1350072954000, :_id "542692d4c026201cdc326ff5"}], :notes nil, :arglists ["rdr"], :doc "Sequentially read and evaluate the set of forms contained in the\n stream/file", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/load-reader"} {:added "1.7", :ns "clojure.core", :name "random-sample", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1554235214583, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "rand", :ns "clojure.core"}, :_id "5ca3bf4ee4b0ca44402ef6f8"} {:created-at 1554235230102, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "shuffle", :ns "clojure.core"}, :_id "5ca3bf5ee4b0ca44402ef6f9"} {:created-at 1579868288317, :author {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "rand-nth", :ns "clojure.core"}, :_id "5e2ae080e4b0ca44402ef821"} {:created-at 1579868294562, :author {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "rand-int", :ns "clojure.core"}, :_id "5e2ae086e4b0ca44402ef822"}], :line 7673, :examples [{:updated-at 1452115466344, :created-at 1452115466344, :author {:login "DanBurton", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/713692?v=3"}, :body ";; The output of random-sample is a sequence.\n;; Each element of the original collection has probability \"prob\"\n;; of being included in the output sequence.\n\n(random-sample 0.5 [1 2 3 4 5])\n;;=> (1 2 4)\n\n\n;; random-sample can operate on an infinite sequence,\n;; producing an infinite sequence.\n\n(take 10 (random-sample 0.1 (repeat :foo)))\n;;=> (:foo :foo :foo :foo :foo :foo :foo :foo :foo :foo)\n\n(take 10 (random-sample 0.01 (range)))\n;;=> (57 113 281 286 352 497 727 768 957 960)", :_id "568d860ae4b0e0706e05bd9d"}], :notes nil, :arglists ["prob" "prob coll"], :doc "Returns items from coll with random probability of prob (0.0 -\n 1.0). Returns a transducer when no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/random-sample"} {:added "1.5", :ns "clojure.core", :name "cond->", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1411998595433, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "cond->>", :library-url "https://github.com/clojure/clojure"}, :_id "54296383e4b09282a148f1f5"} {:created-at 1411998602440, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "->", :library-url "https://github.com/clojure/clojure"}, :_id "5429638ae4b09282a148f1f6"} {:created-at 1411998615269, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "->>", :library-url "https://github.com/clojure/clojure"}, :_id "54296397e4b09282a148f1f8"} {:created-at 1411998624770, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "as->", :library-url "https://github.com/clojure/clojure"}, :_id "542963a0e4b09282a148f1f9"} {:created-at 1411998631299, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "some->", :library-url "https://github.com/clojure/clojure"}, :_id "542963a7e4b09282a148f1fa"} {:created-at 1411998638842, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "some->>", :library-url "https://github.com/clojure/clojure"}, :_id "542963aee4b09282a148f1fb"} {:created-at 1411998676919, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "cond", :library-url "https://github.com/clojure/clojure"}, :_id "542963d4e4b09282a148f1fc"} {:created-at 1541446172443, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "if", :ns "clojure.core"}, :_id "5be09a1ce4b00ac801ed9eed"}], :line 7538, :examples [{:editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=2", :account-source "github", :login "phreed"} {:login "blue0513", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8979468?v=4"}], :updated-at 1614926804893, :created-at 1413201278329, :author {:avatar-url "https://avatars.githubusercontent.com/u/154699?v=2", :account-source "github", :login "avasenin"}, :body "\n(cond-> 1 ; we start with 1\n true inc ; the condition is true so (inc 1) => 2\n false (* 42) ; the condition is false so the operation is skipped\n (= 2 2) (* 3)) ; (= 2 2) is true so (* 2 3) => 6 \n;;=> 6\n;; notice that the threaded value gets used in \n;; only the form and not the test part of the clause.", :_id "543bbd7ee4b0e1a656a1ce56"} {:editors [{:login "bkovitz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/200617?v=3", :account-source "github", :login "bsima"}], :updated-at 1478639146955, :created-at 1414318380459, :author {:avatar-url "https://avatars.githubusercontent.com/u/1724788?v=2", :account-source "github", :login "arichiardi"}, :body ";; Useful when you want to conditionally evaluate expressions and thread them \n;; together. For instance, the following returns a vector containing the names \n;; (as symbols) of the implementing classes of obj.\n\n=> (defn instance->types\n [obj]\n (cond-> [] \n (instance? java.util.SortedMap obj) (conj 'SortedMap)\n (instance? java.util.AbstractMap obj) (conj 'AbstractMap)))\n#'user/instance->types\n\n=> (def hm (java.util.HashMap.))\n#'user/hm\n\n=> (instance->types hm)\n[AbstractMap]\n\n=> (def tm (java.util.TreeMap.))\n#'user/tm\n\n=> (instance->types tm)\n[SortedMap AbstractMap]", :_id "544cc92ce4b03d20a102427b"} {:updated-at 1460811298414, :created-at 1460416087314, :author {:login "trikitrok", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2502164?v=3"}, :body "=> (defn divisible-by? [divisor number] \n (zero? (mod number divisor)))\n#'user/divisible-by?\n\n=> (defn say [n]\n (cond-> nil\n (divisible-by? 3 n) (str \"Fizz\")\n (divisible-by? 5 n) (str \"Buzz\")\n :always (or (str n))))\n#'user/say\n\n=> (say 1)\n\"1\"\n\n=> (say 3)\n\"Fizz\"\n\n=> (say 5)\n\"Buzz\"\n\n=> (say 15)\n\"FizzBuzz\"", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/5594302?v=3", :account-source "github", :login "jwatki06"}], :_id "570c2e57e4b0fc95a97eab4a"} {:editors [{:login "mhmdsalem1993", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10787314?v=3"}], :body "(let [x 1 y 2]\n (cond-> []\n (odd? x) (conj \"x is odd\")\n (zero? (rem y 3)) (conj \"y is divisible by 3\")\n (even? y) (conj \"y is even\")))\n;=> [\"x is odd\" \"y is even\"]\n\n;;; IS Equivalent to \n\n(let [x 1 y 2]\n (as-> [] <>\n (if (odd? x)\n (conj <> \"x is odd\")\n <>)\n (if (zero? (rem y 3)) \n (conj <> \"y is divisible by 3\") \n <>)\n (if (even? y)\n (conj <> \"y is even\")\n <>)))\n;=> [\"x is odd\" \"y is even\"] ", :author {:avatar-url "https://avatars.githubusercontent.com/u/10787314?v=3", :account-source "github", :login "mhmdsalem1993"}, :created-at 1482844255361, :updated-at 1482844441856, :_id "5862685fe4b0123d4c9dfa36"} {:updated-at 1602284044262, :created-at 1542058214210, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body "; Consider a code snippet that coerces any string to an integer, else noop:\n(let [x \"123\"] \n (if (string? x) \n (Integer. x) \n x))\n\n; We can reduce the repetition of `x` by using `cond->`\n(let [x \"123\"] \n (cond-> x \n (string? x) (Integer.))) ", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/7083783?v=4", :account-source "github", :login "cloojure"}], :_id "5be9f0e6e4b00ac801ed9ef2"} {:updated-at 1658894505969, :created-at 1658894505969, :author {:login "rainbyte", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/749068?v=4"}, :body ";; always returns 1\n(defn f [x] 1)\n\n;; cond-> doesn't short circuit on nil\n(cond-> nil\n true f\n false inc\n true inc)\n;=> 2", :_id "62e0b8a9e4b0b1e3652d7630"} {:editors [{:login "daveliepmann", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/974443?v=4"}], :body ";; If most of a -> is unconditional but one step is conditional, cond-> is useful:\n\n(-> {}\n (assoc :foo \"foo\")\n (cond-> false\n (assoc :truthy true))\n (assoc :bar \"bar\"))\n;; => {:foo \"foo\", :bar \"bar\"}\n\n\n(-> {}\n (assoc :foo \"foo\")\n (cond-> true ; this is the only change from above\n (assoc :truthy true))\n (assoc :bar \"bar\"))\n;; => {:foo \"foo\", :truthy true, :bar \"bar\"}", :author {:avatar-url "https://avatars.githubusercontent.com/u/974443?v=4", :account-source "github", :login "daveliepmann"}, :created-at 1682519506133, :updated-at 1682519612025, :_id "644935d2e4b08cf8563f4b9a"}], :macro true, :notes nil, :arglists ["expr & clauses"], :doc "Takes an expression and a set of test/form pairs. Threads expr (via ->)\n through each form for which the corresponding test\n expression is true. Note that, unlike cond branching, cond-> threading does\n not short circuit after the first true test expression.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/cond->"} {:added "1.0", :ns "clojure.core", :name "dotimes", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1327501844000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "repeat", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c5f"} {:created-at 1338272081000, :author {:login "Omer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/dae0f434afde5246ccb030cdec81fb71?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "for", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c60"} {:created-at 1340037835000, :author {:login "Parijat Mishra", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e3aba44539a78ea92373418456f090e3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "doseq", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c61"}], :line 3313, :examples [{:author {:login "Brian Marick", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (dotimes [n 5] (println \"n is\" n))\nn is 0\nn is 1\nn is 2\nn is 3\nn is 4\nnil", :created-at 1278822115000, :updated-at 1332952709000, :_id "542692c7c026201cdc3269c5"} {:author {:login "GyrosOfWar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8abc292bf5d9e88cfcbcfbe492774a38?r=PG&default=identicon"}, :editors [{:login "GyrosOfWar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8abc292bf5d9e88cfcbcfbe492774a38?r=PG&default=identicon"} {:login "GyrosOfWar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8abc292bf5d9e88cfcbcfbe492774a38?r=PG&default=identicon"} {:login "GyrosOfWar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8abc292bf5d9e88cfcbcfbe492774a38?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (dotimes [n 10] \n (println (map #(* % (inc n)) (range 1 11))))\n\n(1 2 3 4 5 6 7 8 9 10)\n(2 4 6 8 10 12 14 16 18 20)\n(3 6 9 12 15 18 21 24 27 30)\n(4 8 12 16 20 24 28 32 36 40)\n(5 10 15 20 25 30 35 40 45 50)\n(6 12 18 24 30 36 42 48 54 60)\n(7 14 21 28 35 42 49 56 63 70)\n(8 16 24 32 40 48 56 64 72 80)\n(9 18 27 36 45 54 63 72 81 90)\n(10 20 30 40 50 60 70 80 90 100)\nnil", :created-at 1388454361000, :updated-at 1412833684226, :_id "542692d2c026201cdc326f94"} {:updated-at 1546681637583, :created-at 1546679853153, :author {:login "akhuramazda", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/46395055?v=4"}, :body "user=> (dotimes [x 8] (print x) \n (dotimes [y x] (print (get (vec \"Clojure\") y))) \n (newline))\n0\n1C\n2Cl\n3Clo\n4Cloj\n5Cloju\n6Clojur\n7Clojure\nnil\n\n;ranges with dotimes\n\n(dotimes [y 5] \n (println (map #(inc %) (range (inc y)))))\n\n(1)\n(1 2)\n(1 2 3)\n(1 2 3 4)\n(1 2 3 4 5)\nnil\n\n;factorials using ranges by dotimes\n\n(dotimes [y 5] \n (println \"factorial\" (inc y) \" = \" (apply * (map #(inc %) (range (inc y))))))\n\nfactorial 1 = 1\nfactorial 2 = 2\nfactorial 3 = 6\nfactorial 4 = 24\nfactorial 5 = 120\nnil\n", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/46395055?v=4", :account-source "github", :login "akhuramazda"}], :_id "5c30762de4b0ca44402ef60e"}], :macro true, :notes [{:author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}, :updated-at 1653798508777, :created-at 1653798508777, :body "`dotimes` always returns `nil` no matter what is returned by the body the last time through the loop.", :_id "6292f66ce4b0b1e3652d75f3"}], :arglists ["bindings & body"], :doc "bindings => name n\n\n Repeatedly executes body (presumably for side-effects) with name\n bound to integers from 0 through n-1.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/dotimes"} {:added "1.0", :ns "clojure.core", :name "select-keys", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1416824728916, :author {:login "alilee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/16739?v=3"}, :to-var {:ns "clojure.core", :name "get", :library-url "https://github.com/clojure/clojure"}, :_id "54730798e4b0dc573b892fde"} {:created-at 1470768451052, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "keys", :ns "clojure.core"}, :_id "57aa2543e4b0bafd3e2a04d2"} {:created-at 1485972364767, :author {:login "yochannah", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/9271438?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "dissoc", :ns "clojure.core"}, :_id "5892238ce4b01f4add58fe36"} {:created-at 1518043231143, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "hash-map", :ns "clojure.core"}, :_id "5a7b805fe4b0316c0f44f8b0"}], :line 1540, :examples [{:author {:login "Brian Marick", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon"}, :editors [{:login "Brian Marick", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon"} {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"} {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=2"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:avatar-url "https://avatars3.githubusercontent.com/u/11671382?v=4", :account-source "github", :login "dominem"}], :body "(select-keys {:a 1 :b 2} [:a])\n;;=> {:a 1}\n\n(select-keys {:a 1 :b 2} [:a :c])\n;;=> {:a 1}\n\n(select-keys {:a 1 :b 2 :c 3} [:a :c])\n;;=> {:c 3, :a 1}", :created-at 1278823330000, :updated-at 1565345504857, :_id "542692c8c026201cdc326a0a"} {:updated-at 1445936137205, :created-at 1445936137205, :author {:login "nzl-nott", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/458621?v=3"}, :body "user=> (select-keys [1 2 3] [0 0 2])\n{0 1, 2 3}", :_id "562f3c09e4b04b157a6648db"} {:updated-at 1528821523346, :created-at 1528821523346, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Extract letters at even indexes from a word into a map:\n(let [word \"hello\"] \n (select-keys (vec word) (filter even? (range (count word)))))\n;; {0 \\h, 2 \\l, 4 \\o}", :_id "5b1ff713e4b00ac801ed9e11"} {:updated-at 1596746741144, :created-at 1596746741144, :author {:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}, :body ";; select-keys can be useful for grabbing environment variables.\n;; it will not error or set a key to nil if some are missing.\n\n;; in the shell/terminal\nexport HTTP_PORT=8000\nexport HTTP_HOST=localhost\n\n;; in the clojure source code\n(ns myapp.core\n (:require [environ.core :as environ]))\n \n(def config (select-keys environ/env [:http-port\n :http-host\n :http-timeout]))\n\n;; notice http-timeout is omitted from the map\n(println config)\n;;=> {:http-port 8000, :http-host localhost}", :_id "5f2c6bf5e4b0b1e3652d7375"}], :notes [{:body "Why does `select-keys` return a map with keys in reverse order of the keyseq vector?\n\nJay Fields has a [good blog post](http://blog.jayfields.com/2011/01/clojure-select-keys-select-values-and.html) on `select-keys` with implementations of `select-values` (which is what I was really after).", :created-at 1425399933187, :updated-at 1425401550961, :author {:login "gknapp", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/143027?v=3"}, :_id "54f5e07de4b01ed96c93c881"} {:author {:login "TheSeldonPlan", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3837766?v=3"}, :updated-at 1444496540091, :created-at 1444496500482, :body "I think @gknapp is correct. `select-keys` returns a map with keys in the order of the keyseq vector. Perhaps this has changed since his comment, and the documentation needs to be updated. \n \n```clojure\nuser=> (select-keys {:a 1 :b 2 :c 3} [:a :c])\n{:a 1, :c 3}\nuser=> (select-keys {:a 1 :b 2 :c 3} [:c :a])\n{:c 3, :a 1}\n```\n\n", :_id "56194474e4b084e61c76ecc2"} {:author {:login "mlanza", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/39192?v=3"}, :updated-at 1448375423888, :created-at 1448375423888, :body "Wouldn't the following signature be better for partial application? \n\n (select-keys keyseq map)\n\n (def stooges [{:name \"Larry\" :birthday \"Oct 05\"} \n {:name \"Curly\" :birthday \"Jun 19\"} \n {:name \"Moe\" :birthday \"Oct 22\"}])\n\nTacit style is about consistent order (general to specific), not concision:\n\n (map (partial select-keys [:name]) stooges) ;tacit\n (map #(select-keys % [:name]) stooges)", :_id "5654747fe4b0be225c0c479d"} {:body "If you are looking for a `select-vals` or `select-values` alternative of this function, you can do the following:\n\n
    \n(map {:a 1 :b 2 :c 3 :d 4} [:a :d])\n;;=> (1 4)\n
    ", :created-at 1506607739129, :updated-at 1506607752839, :author {:avatar-url "https://avatars2.githubusercontent.com/u/76983?v=4", :account-source "github", :login "raszi"}, :_id "59cd027be4b03026fe14ea4c"} {:author {:login "hkjels", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/339547?v=4"}, :updated-at 1508228053028, :created-at 1508228053028, :body "`select-keys` will return in the order provided for `array-maps`. However, `array-maps` turn into `hash-maps` at a certain threshold, which are un-ordered. So generally, when you need certain ordering, use a sequence instead.", :_id "59e5bbd5e4b03026fe14ea92"} {:body "VERY IMPORTANT!!!\n\n`select-keys` returns a map. Maps DO NOT guarantee ordering of their key/value pairs. If you depend on order, do not rely on `select-keys`.\n\nYou might think the order is preserved, only because maps of 8 elements or less in Clojure are implemented with an `array-map` which preserves insertion order, but maps beyond that will use a `hash-map` which does not guarantee ordering. And this is an implementation details, in future release of Clojure, the threshold or type of implementation for maps could change to any other which could even break the ordering for small maps.", :created-at 1571861481277, :updated-at 1571861546570, :author {:avatar-url "https://avatars3.githubusercontent.com/u/601540?v=4", :account-source "github", :login "didibus"}, :_id "5db0b3e9e4b0ca44402ef7d2"}], :arglists ["map keyseq"], :doc "Returns a map containing only those entries in map whose key is in keys", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/select-keys"} {:added "1.0", :ns "clojure.core", :name "bit-and", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1414514292247, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "bit-or", :library-url "https://github.com/clojure/clojure"}, :_id "544fc674e4b03d20a102428f"}], :line 1293, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :body ";; bits can be entered using radix notation\n;; but they are long integers so by default they\n;; display in decimal.\n(bit-and 2r1100 2r1001)\n;;=> 8\n;; 8 = 2r1000\n\n;; here we see the same bits entered in decimal\n(bit-and 12 9)\n;;=> 8", :created-at 1280337486000, :updated-at 1414514260267, :_id "542692c8c026201cdc326a70"} {:author {:login "Pierre", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/dc0590890ca22fee047f8e2598c2568d?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :body ";; bits can be entered in hexidecimal\n(bit-and 0x08 0xFF)\n;;=> 8\n\n;; bits can be show with Integer/toHexString\n(Integer/toHexString (bit-and 0x0108 0xFFFF))\n;;=> \"108\"", :created-at 1332068603000, :updated-at 1414513918522, :_id "542692d2c026201cdc326f57"} {:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :body ";; bits can also be shown with Integer/toBinaryString\n\n(Integer/toBinaryString 235)\n;;=> \"11101011\"\n\n(Integer/toBinaryString 199)\n;;=> \"11000111\"\n\n(bit-and 235 199)\n;;=> 195\n\n(Integer/toBinaryString 195)\n;;=> \"11000011\"\n\n;; 11101011 = 235\n;;& 11000111 = 199\n;;==========\n;; 11000011 = 195", :created-at 1345828834000, :updated-at 1414513960925, :_id "542692d2c026201cdc326f58"} {:body ";; here is the truth table for AND \n(Integer/toBinaryString (bit-and 2r1100 2r1010) )\n;;=> \"1000\"\n;; or 2r1000", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1414514718289, :updated-at 1414514718289, :_id "544fc81ee4b03d20a1024295"}], :notes nil, :arglists ["x y" "x y & more"], :doc "Bitwise and", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bit-and"} {:added "1.9", :ns "clojure.core", :name "bounded-count", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495640661107, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "counted?", :ns "clojure.core"}, :_id "5925aa55e4b093ada4d4d72b"}], :line 7384, :examples [{:updated-at 1495640638447, :created-at 1495640638447, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body ";;;; Length of a vector can be determined in constant time\n;;;; so this always returns the actual length of the vector\n\n(bounded-count 5 [1 2 3 4])\n;;=> 4\n(bounded-count 5 [1 2 3 4 5])\n;;=> 5\n(bounded-count 5 [1 2 3 4 5 6])\n;;=> 6\n\n;;;; Length of a lazy seq cannot be determined in constant time\n;;;; so this counts at most the first 5 elements\n\n(bounded-count 5 (map identity [1 2 3 4]))\n;;=> 4\n(bounded-count 5 (map identity [1 2 3 4 5]))\n;;=> 5\n(bounded-count 5 (map identity [1 2 3 4 5 6]))\n;;=> 5", :_id "5925aa3ee4b093ada4d4d72a"} {:updated-at 1495640775383, :created-at 1495640775383, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body ";;;; This would run forever\n\n(count (range))\n\n;;;; But this doesn't\n\n(bounded-count 10000 (range))\n;;=> 10000\n", :_id "5925aac7e4b093ada4d4d72d"}], :notes nil, :arglists ["n coll"], :doc "If coll is counted? returns its count, else will count at most the first n\n elements of coll using its seq", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bounded-count"} {:added "1.7", :ns "clojure.core", :name "update", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1441163795513, :author {:login "brunchboy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2228869?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "update-in", :ns "clojure.core"}, :_id "55e66a13e4b0efbd681fbb91"} {:created-at 1441163918027, :author {:login "brunchboy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2228869?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "fnil", :ns "clojure.core"}, :_id "55e66a8ee4b072d7f27980f8"} {:created-at 1449608873882, :author {:login "Chort409", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1062637?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "assoc", :ns "clojure.core"}, :_id "566746a9e4b0f47c7ec61146"} {:created-at 1570520722969, :author {:login "xmo-odoo", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/7571158?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "associative?", :ns "clojure.core"}, :_id "5d9c3e92e4b0ca44402ef7cb"}], :line 6188, :examples [{:editors [{:login "hiteki", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2091138?v=3"} {:avatar-url "https://avatars3.githubusercontent.com/u/11671382?v=4", :account-source "github", :login "dominem"} {:login "dijonkitchen", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4"}], :body "(def p {:name \"James\" :age 26})\n;;=> #'user/p\n\n(update p :age inc)\n;;=> {:name \"James\", :age 27}\n\n;; remember, the value of p hasn't changed because it is immutable!\np\n;; {:name \"James\", :age 26}\n(update p :age + 10)\n;;=> {:name \"James\", :age 36}\n\n;; Here we see that the keyed object is \n;; the first argument in the function call.\n;; i.e. :age (- 26 10) => 16\n(update p :age - 10)\n;;=> {:name \"James\", :age 16}\n\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/2091138?v=3", :account-source "github", :login "hiteki"}, :created-at 1437170219147, :updated-at 1587790479572, :_id "55a97a2be4b0080a1b79cda8"} {:updated-at 1448421903787, :created-at 1448421903787, :author {:login "egracer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4086884?v=3"}, :body ";; the map in update can be nil, and f will still be applied to nil and \n;; return a value\n\n(def empty-map nil)\n#'user/empty-map\n\n(update empty-map :some-key #(str \"foo\" %))\n;;=> {:some-key \"foo\"}\n", :_id "56552a0fe4b053844439827b"} {:updated-at 1476877532228, :created-at 1476877532228, :author {:login "G1enY0ung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/15034155?v=3"}, :body ";; can also use in []\n\nuser=> (update [1 2 3] 0 inc)\n;;=> [2 2 3]\n\nuser=> (update [] 0 #(str \"foo\" %))\n;;=> [\"foo\"]", :_id "58075cdce4b001179b66bdcf"} {:updated-at 1524433722089, :created-at 1524433722089, :author {:login "statcompute", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/4590938?v=4"}, :body "(def ds [{:id 1.0 :name \"name1\"}\n {:id 2.0 :name \"name2\"}\n {:id 3.0 :name \"name3\"}])\n\n(map (fn [x] (update x :name #(if (= \"name2\" %) % \"not 2\"))) ds)\n\n;; ({:id 1.0, :name \"not 2\"} {:id 2.0, :name \"name2\"} {:id 3.0, :name \"not 2\"})", :_id "5add033ae4b045c27b7fac4d"} {:editors [{:login "elken", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2872862?v=4"}], :body ";; From string to boolean\n\n(def answer {:answer \"France\" :correct \"true\" :age 11})\n(update answer :correct #(= % \"true\"))\n\n;; {:answer \"France\", :correct true, :age 11}", :author {:avatar-url "https://avatars1.githubusercontent.com/u/226965?v=4", :account-source "github", :login "aarkerio"}, :created-at 1535749324652, :updated-at 1688394857769, :_id "5b89accce4b00ac801ed9e7c"} {:updated-at 1601184024906, :created-at 1601184024906, :author {:login "gloorfindel", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/49351337?v=4"}, :body ";; Applying a function to the same key in a sequence of arrays\n\n(def dates [{:date \"20200430\",:time \"08:35\"}\n {:date \"20200430\",:time \"09:15\"}]\n\n;; Takes the current time value in the array, and reduces it to the hour by \n;; calling the reduce-to-hour function (not included here)\n\n(map #(update % :time (constantly (reduce-to-hour (:time %)))) dates)\n=> ({:date \"20200430\", :time \"08\"} {:date \"20200430\", :time \"09\"})", :_id "5f702118e4b0b1e3652d73c2"} {:editors [{:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=4"}], :body ";; Very common, update a vector inside a map\n(def little-schemer {:authors [{:birth-year 1944, :name \"Daniel Friedman\"}\n {:name \"Matthias Felleisen\"}]\n :title \"The Little Schemer\"})\n\n(update little-schemer :authors conj {:name \"Gerald J. Sussman\"})\n;;=> \n{:authors [{:birth-year 1944, :name \"Daniel Friedman\"}\n {:name \"Matthias Felleisen\"}\n {:name \"Gerald J. Sussman\"}]\n :title \"The Little Schemer\"}", :author {:avatar-url "https://avatars.githubusercontent.com/u/889685?v=4", :account-source "github", :login "huahaiy"}, :created-at 1613242096574, :updated-at 1613242234272, :_id "60281ef0e4b0b1e3652d744f"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}], :body ";; For a simple change of value we can use constantly\n(def hm {:banana 1, :apple 2, :orange 3})\n\n(update hm :banana (constantly 6))\n;;=> {:banana 6 :apple 2 :orange 3}\n\n;; Which is equivalent to using \"assoc\"\n(assoc hm :banana 6)\n;;=> {:banana 6 :apple 2 :orange 3}", :author {:avatar-url "https://avatars.githubusercontent.com/u/8339935?v=4", :account-source "github", :login "rogefm"}, :created-at 1614089059545, :updated-at 1614426803060, :_id "60350b63e4b0b1e3652d7466"} {:updated-at 1623859525031, :created-at 1623859525031, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}, :body ";; A quirk in use with vectors (tested with 1.10.3)\n;; If you throw away the argument to the function, you can add a value to\n;; the end of the vector: \n\n;; Normal, expected behavior:\n(update [1 2 3] 2 (fn [_] 42))\n;;=> [1 2 42]\n\n;; If the index is just past the end, you can append to the vector:\n(update [1 2 3] 3 (fn [_] 42))\n;;=> [1 2 3 42]\n\n;; More than one past end won't work\n(update [1 2 3] 4 (fn [_] 42))\n;;=> Execution error (IndexOutOfBoundsException) at user/eval2049 (form-init3979469036338260438.clj:1).\n\n;; If you don't throw away the argument, and your index is one past\n;; the end of the vector, you'll still get an error:\n\n;; Normal, expected behavior:\n(update [1 2 3] 2 inc)\n;;=> [1 2 4]\n\n;; Here the trick fails:\n(update [1 2 3] 3 inc)\n;;=> Execution error (NullPointerException) at user/eval1985 (form-init8618353961027343980.clj:1).", :_id "60ca2145e4b0b1e3652d750a"}], :notes [{:author {:login "alper", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/72429?v=4"}, :updated-at 1576842276976, :created-at 1576842276976, :body "But how do you do a pure update idiomatically? So update one value for another?", :_id "5dfcb424e4b0ca44402ef7fc"} {:author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :updated-at 1633061790090, :created-at 1633061790090, :body "To the previous note (alper), you are looking for `assoc`. ", :_id "61568b9ee4b0b1e3652d754d"} {:author {:login "earthfail", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/21296448?v=4"}, :updated-at 1661097969047, :created-at 1661097969047, :body "in clojure 1.11 there is an [update-vals](https://github.com/clojure/clojure/blob/5ffe3833508495ca7c635d47ad7a1c8b820eab76/src/clj/clojure/core.clj#L8061) and [update-keys](https://github.com/clojure/clojure/blob/5ffe3833508495ca7c635d47ad7a1c8b820eab76/src/clj/clojure/core.clj#L8077) to apply function for all values or all keys respectively", :_id "630257f1e4b0b1e3652d7646"}], :arglists ["m k f" "m k f x" "m k f x y" "m k f x y z" "m k f x y z & more"], :doc "'Updates' a value in an associative structure, where k is a\n key and f is a function that will take the old value\n and any supplied args and return the new value, and returns a new\n structure. If the key does not exist, nil is passed as the old value.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/update"} {:added "1.0", :ns "clojure.core", :name "list*", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 648, :examples [{:author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body ";; `list*` function:\nuser=> (list* 1 [2 3])\n(1 2 3)\nuser=> (list* 1 2 [3 4])\n(1 2 3 4)\n\n;; compared to regular `list` function:\nuser=> (list 1 [2 3])\n(1 [2 3])\nuser=> (list 1 2 [3 4])\n(1 2 [3 4])\n\n;; Corner cases:\nuser=> (list* nil [1 2])\n(nil 1 2)\nuser=> (list* 1 nil)\n(1)\nuser=> (list* () [1 2])\n(() 1 2)\nuser=> (list* 1 ())\n(1)\n", :created-at 1280721203000, :updated-at 1306322562000, :_id "542692c6c026201cdc3268d5"} {:updated-at 1474307619700, :created-at 1474307619700, :author {:login "Manishapillai", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20270279?v=3"}, :body ";;Prepend a map to a list\nuser=> (list* {:name \"Anne\"} [{:city \"NJ\"}]) \n({:name \"Anne\"} {:city \"NJ\"})", :_id "57e02623e4b0709b524f0501"} {:updated-at 1541543275442, :created-at 1496358734409, :author {:login "smnplk", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/380618?v=3"}, :body ";; Useful if you want to get all the arguments of a function into a list (actually a seq, but that is not important)\n(defn args-to-list [a b c & args]\n (list* a b c args))\n\nuser=> (args-to-list 1 2 3 4 5 6)\n(1 2 3 4 5 6)\n\n;; same as list, but it expects the last element to be a sequence which is then unpacked \n\n;; Example usage in the wild\n(defn my-max\n ([a] a)\n ([a b] (if (> a b) a b))\n ([a b & args] (reduce my-max (list* a b args))))\n\n", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/380618?v=4", :account-source "github", :login "smnplk"}], :_id "59309f4ee4b06e730307db20"} {:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; `list*` function:\nuser=> (list* 1 '(2 3))\n(1 2 3)\n\nuser=> (list* 1 2 '(3 4))\n(1 2 3 4)", :author {:avatar-url "https://avatars3.githubusercontent.com/u/153773?v=4", :account-source "github", :login "arlicle"}, :created-at 1536069875312, :updated-at 1656675472111, :_id "5b8e90f3e4b00ac801ed9e86"} {:updated-at 1673074886220, :created-at 1673074886220, :author {:login "Chandrama1", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/78619926?v=4"}, :body ";; `list*` function:\n(list* \"Superman\" '(\"Batman\" \"Ironman\"))\n=> (\"Superman\" \"Batman\" \"Ironman\")\n\n(list* '(\"Batman\" \"Ironman\") '(\"Superman\" \"Hulk\"))\n=> ((\"Batman\" \"Ironman\") \"Superman\" \"Hulk\")\n\n(list* '(\"Batman\" \"Ironman\") \"Superman\")\n=> ((\"Batman\" \"Ironman\") \\S \\u \\p \\e \\r \\m \\a \\n)", :_id "63b918c6e4b08cf8563f4b5d"}], :notes [{:body "The doc string mentions returning a new list, but it should say a new sequence. Surprisingly, `list*` typically does not return an actual list. Instead, it usually returns a Cons, which works as a seq, but is not strictly a list. \n\n```\n(list? (list* 1 '(2 3)))\n;=> false\n\n(type (list* 1 '(2 3)))\n;=> clojure.lang.Cons\n\n(first (list* 1 '(2 3)))\n;=> 1\n\n(peek (list* 1 '(2 3)))\nClassCastException clojure.lang.Cons cannot be cast to clojure.lang.IPersistentStack\n\n(list? (list* '(2 3)))\n;=> true\n\n(list? (into () (list* 1 '(2 3))))\n;=> true\n```\n\nI think `seq*` would have been a better name for this function.", :created-at 1425311436162, :updated-at 1425311436162, :author {:login "miner", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25400?v=3"}, :_id "54f486cce4b0b716de7a652e"}], :arglists ["args" "a args" "a b args" "a b c args" "a b c d & more"], :doc "Creates a new seq containing the items prepended to the rest, the\n last of which will be treated as a sequence.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/list*"} {:added "1.2", :ns "clojure.core", :name "reify", :file "clojure/core_deftype.clj", :type "macro", :column 1, :see-alsos [{:created-at 1323993523000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "proxy", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ef4"}], :line 70, :examples [{:updated-at 1458043116563, :created-at 1315673869000, :body "(ns foo)\n\n;;; This is a library for the shopping result.\n\n(defrecord Banana [qty])\n(defrecord Grape [qty])\n(defrecord Orange [qty])\n\n;;; 'subtotal' differs from each fruit.\n\n(defprotocol Fruit\n (subtotal [item]))\n\n(extend-type Banana\n Fruit\n (subtotal [item]\n (* 158 (:qty item))))\n\n(extend-type Grape\n Fruit\n (subtotal [item]\n (* 178 (:qty item))))\n\n(extend-type Orange\n Fruit\n (subtotal [item]\n (* 98 (:qty item))))\n\n;;; 'coupon' is the function returing a 'reify' of subtotal. This is\n;;; when someone uses a coupon ticket, the price of some fruits is \n;;; taken off 25%.\n\n(defn coupon [item]\n (reify Fruit\n (subtotal [_]\n (int (* 0.75 (subtotal item))))))\n\n;;; Example: To compute the total when someone bought 10 oranges,\n;;; 15 bananas and 10 grapes, using a coupon for the grapes.\n(apply + (map subtotal [(Orange. 10) (Banana. 15) (coupon (Grape. 10))]))\n;;; 4685 ; (apply + '(980 2370 1335))", :editors [{:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"} {:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"} {:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"} {:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"} {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"} {:login "antonaut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/513311?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"}, :_id "542692cdc026201cdc326d5d"} {:author {:login "number23", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/89e8dc9231de751fd558d5784406cc5e?r=PG&default=identicon"}, :editors [], :body ";; Using a reified FileFilter implementation to obtain only directory files\n(.listFiles (java.io.File. \".\")\n (reify\n java.io.FileFilter\n (accept [this f]\n (.isDirectory f))))\n", :created-at 1339172939000, :updated-at 1339172939000, :_id "542692d5c026201cdc32706f"} {:author {:login "puredanger", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/89c8afd032c7b3473f67c9b00d3acd5a?r=PG&default=identicon"}, :editors [], :body ";;;; This example shows how to reify a multi-arity protocol function\n;;;; (note the different style in defprotocol vs reify)\n\n;; define a multi-arity protocol function blah\n(defprotocol Foo\n (blah\n [this x]\n [this x y]))\n\n;; define an anonymous extension via reify\n(def r (reify Foo \n (blah [_ x] x)\n (blah [_ x y] y)))\n\n;; invoke blah via the r instance\n(blah r 1) ;; => 1\n(blah r 1 2) ;; => 2\n\n\n", :created-at 1355788930000, :updated-at 1355788930000, :_id "542692d5c026201cdc327070"} {:body ";; Note that nested class is referred via '$' \n;; and 'this' is always present in parameters (see underscore in parameters list):\n(Thread/setDefaultUncaughtExceptionHandler\n (reify java.lang.Thread$UncaughtExceptionHandler\n (uncaughtException [_ thread throwable]\n (println (str throwable)))))", :author {:login "PetrGlad", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/124476?v=3"}, :created-at 1420462447425, :updated-at 1420462470195, :editors [{:login "PetrGlad", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/124476?v=3"}], :_id "54aa896fe4b04e93c519ffb3"} {:updated-at 1440403056415, :created-at 1440377269300, :author {:login "yubrshen", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2638417?v=3"}, :body ";;; This example is inspired by the above one and simplified\n;;; to highlight reify's returning a value/\"object\" \n;;; with protocol realization for just this one piece of value/\"object\".\n\n(ns foo)\n\n(defrecord Grape [qty])\n\n(defprotocol Fruit\n (subtotal [item]))\n\n(extend-type Grape\n Fruit\n (subtotal [item]\n (* 178 (:qty item))))\n\n;;; 'discounted' is the function returning a 'reify' instance of fruit with modified \n;;; implementation of subtotal (with discount). That is, \n;;; when someone uses a discounted coupon, the price of the fruits is taken off 25%.\n\n(defn discounted [item]\n (reify Fruit\n (subtotal [_]\n (println \"modifying subtotal with discount:\")\n (int (* 0.75 (subtotal item))))))\n\n;;; Example:\n;;; There is 10 pieces of Grape, and the subtotal before discount is\n;;; (subtotal (Grape. 10))\n;;; => 1780\n\n;;; With discount, then\n;;; (subtotal (discounted (Grape. 10)))\n;;; => modifying subtotal with discount:\n;;; => 1335\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/2638417?v=3", :account-source "github", :login "yubrshen"}], :_id "55da69b5e4b0831e02cddf1e"} {:editors [{:login "Aljendro", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/7899307?v=3"}], :body "(comment\n \"reify\n\n verb | re·ify | \\\\ˈrā-ə-ˌfī, ˈrē-\\\\\n\n : to regard (something abstract) as a material or concrete thing\")\n\n(defprotocol shape\n \"A geometric shape.\"\n\n (area [this]\n \"Calculates the area of the shape.\n\n The first argument is required and corresponds to the implicit target\n object ('this' in Java parlance).\"))\n\n\n(defn make-circle\n \"Creates a circle (a geometric shape) object.\"\n [radius]\n\n (reify shape\n (area [_]\n (* Math/PI radius radius))))\n\n(. (make-circle 8) area)\n;;=> 201.06192982974676\n\n(def circle (make-circle 8))\n\n(satisfies? shape circle)\n;;=> true\n\n(. circle area)\n;;=> 201.06192982974676\n\n\n(defn make-triangle\n \"Creates a triangle (a geometric shape) object.\"\n [base height]\n\n (reify shape\n (area [_]\n (* 0.5 base height))))\n\n(def triangle (make-triangle 8 8))\n\n(. triangle area)\n;;=> 32.0\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/19507371?v=3", :account-source "github", :login "clojureling"}, :created-at 1463855829138, :updated-at 1493672301532, :_id "5740aad5e4b00a9b70be566c"} {:updated-at 1613046786005, :created-at 1613046786005, :author {:login "RokLenarcic", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3322433?v=4"}, :body ";; Attaching metadata to reify object creates a new instance\n;; Reify call itself attaches metadata of (reify ...) form to the object\n;; so effectively it always creates two objects but return one of them.\n\n;; This matters when you use finalize\n\n(defn create []\n (reify Object\n (finalize [this] (println \"GCing\" this) nil)))\n\n(do (create)\n (System/gc))\n\n;;GCing #object[.$create$reify__7691 0x3b287fd2 .$create$reify__7691@3b287fd2]\n;;GCing #object[.$create$reify__7691 0x38249fdc .$create$reify__7691@38249fdc]\n;;=> nil", :_id "60252402e4b0b1e3652d744c"} {:updated-at 1669428148216, :created-at 1669428148216, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=4"}, :body "(defprotocol Foo (foo-f [this]))\n(defprotocol Bar (bar-f [this]))\n\n;; It is fine to reify multiple protocol/interfaces\n(def foo-bar\n (reify\n Foo\n (foo-f [_] :foo)\n Bar\n (bar-f [_] :bar)))\n\n(foo-f foo-bar) ;;=>:foo\n(bar-f foo-bar) ;;=>:bar\n", :_id "638173b4e4b0b1e3652d7691"}], :macro true, :notes [{:author {:login "ieugen", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1050920?v=4"}, :updated-at 1680326363601, :created-at 1680326363601, :body "reify can implement multiple interfaces:\n\n```clojure\n(let [a (reify\n java.lang.AutoCloseable\n (close [_this]\n (println \"aaa\"))\n java.lang.Runnable\n (run [_this]\n (println \"Run\")))]\n (.close a)\n (.run a))\n```\n\nNote that methods in reify DO NOT accept docstrings like clojure defn's , although they look very similar. You will get compilation error with method not found if you use a docstring. \n\nSomething like this\n```\n; Evaluating file: java_map.clj\n; Syntax error (IllegalArgumentException) compiling reify* at (src/java_map.clj:27:5).\n; Can't define method not in interfaces: close\n; Evaluation of file java_map.clj failed: class clojure.lang.Compiler$CompilerException\n```", :_id "6427bedbe4b08cf8563f4b8b"} {:author {:login "ieugen", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1050920?v=4"}, :updated-at 1684257603676, :created-at 1684257154747, :body "Sometimes you will need to add type hints.\nThis is mandatory if there are overloaded methods. \n\nOne such case is when implementing `java.util.Collection` `toArray` .\n\nWithout type hints, you will get \n\n```\nMismatched return type: toArray, expected: [Ljava.lang.Object;, had: java.lang.Object\n```\n\nA correct way to handle this is like bellow.\n\nNote: when you add one type hint, you need to add for all methods in reify. \nSee docs above.\n```\n(reify java.util.Collection\n (^boolean containsAll [_this ^java.util.Collection c])\n (^objects toArray [_this]\n (throw (UnsupportedOperationException.)))\n (^objects toArray [_this ^objects objects]\n (throw (UnsupportedOperationException.))))\n```\n\nhttps://github.com/clojure/data.avl/commit/03f32144951ab7b50b8a74ea5e8c22629e7fbde0\n", :_id "6463b982e4b08cf8563f4bbc"}], :arglists ["& opts+specs"], :doc "reify is a macro with the following structure:\n\n (reify options* specs*)\n \n Currently there are no options.\n\n Each spec consists of the protocol or interface name followed by zero\n or more method bodies:\n\n protocol-or-interface-or-Object\n (methodName [args+] body)*\n\n Methods should be supplied for all methods of the desired\n protocol(s) and interface(s). You can also define overrides for\n methods of Object. Note that the first parameter must be supplied to\n correspond to the target object ('this' in Java parlance). Thus\n methods for interfaces will take one more argument than do the\n interface declarations. Note also that recur calls to the method\n head should *not* pass the target object, it will be supplied\n automatically and can not be substituted.\n\n The return type can be indicated by a type hint on the method name,\n and arg types can be indicated by a type hint on arg names. If you\n leave out all hints, reify will try to match on same name/arity\n method in the protocol(s)/interface(s) - this is preferred. If you\n supply any hints at all, no inference is done, so all hints (or\n default of Object) must be correct, for both arguments and return\n type. If a method is overloaded in a protocol/interface, multiple\n independent method definitions must be supplied. If overloaded with\n same arity in an interface you must specify complete hints to\n disambiguate - a missing hint implies Object.\n\n recur works to method heads The method bodies of reify are lexical\n closures, and can refer to the surrounding local scope:\n \n (str (let [f \"foo\"] \n (reify Object \n (toString [this] f))))\n == \"foo\"\n\n (seq (let [f \"foo\"] \n (reify clojure.lang.Seqable \n (seq [this] (seq f)))))\n == (\\f \\o \\o))\n \n reify always implements clojure.lang.IObj and transfers meta\n data of the form to the created object.\n \n (meta ^{:k :v} (reify Object (toString [this] \"foo\")))\n == {:k :v}", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/reify"} {:added "1.0", :ns "clojure.core", :name "update-in", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1302248534000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "assoc-in", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c66"} {:created-at 1318010541000, :author {:login "jks", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/de50bee3396570d25f900873303c98f1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "get-in", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c67"} {:created-at 1348895075000, :author {:login "eric", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2b0c9ae6f1da9716451e7c86bc87230b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "fnil", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c68"} {:created-at 1441163870973, :author {:login "brunchboy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2228869?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "update", :ns "clojure.core"}, :_id "55e66a5ee4b072d7f27980f7"} {:created-at 1570520733044, :author {:login "xmo-odoo", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/7571158?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "associative?", :ns "clojure.core"}, :_id "5d9c3e9de4b0ca44402ef7cc"}], :line 6172, :examples [{:updated-at 1565345379991, :created-at 1280322066000, :body "(def users [{:name \"James\" :age 26} {:name \"John\" :age 43}])\n;;=> #'user/users\n\n;; similar to assoc-in but does not simply replace the item.\n;; the specified function is performed on the matching item.\n;; here the age of the second (index 1) user is incremented.\n(update-in users [1 :age] inc)\n;;=> [{:name \"James\", :age 26} {:name \"John\", :age 44}]\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "dominem", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11671382?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon", :account-source "clojuredocs", :login "gstamp"}, :_id "542692c9c026201cdc326a9e"} {:author {:login "gregg-williams", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/58610a64fc8638eec8d2239d80d4046f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Jeff N", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a9dd2ab880632b999aaeff00fc0d8e2?r=PG&default=identicon"} {:login "Jeff N", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a9dd2ab880632b999aaeff00fc0d8e2?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/2091138?v=3", :account-source "github", :login "hiteki"} {:login "dominem", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11671382?v=4"}], :body "(def p {:name \"James\" :age 26})\n;;=> #'user/p\n\n(update-in p [:age] inc)\n;;=> {:name \"James\", :age 27}\n\n;; remember, the value of p hasn't changed!\n(update-in p [:age] + 10)\n;;=> {:name \"James\", :age 36}\n\n;; Here we see that the keyed object is \n;; the first argument in the function call.\n;; i.e. :age (- 26 10) => 16\n(update-in p [:age] - 10)\n;;=> {:name \"James\", :age 16}", :created-at 1283780561000, :updated-at 1565345395993, :_id "542692c9c026201cdc326aa0"} {:updated-at 1447712876892, :created-at 1305018966000, :body "(defn char-cnt [s]\n \"Counts occurence of each character in s\"\n (reduce\n (fn [m k]\n (update-in m [k] (fnil inc 0)))\n {}\n s))\n;; Note use of fnil above \n;; - returns 0 if nil is passed to inc (avoids null pointer exception)\n\n(char-cnt \"foo-bar\")\n;;=> {\\r 1, \\a 1, \\b 1, \\- 1, \\o 2, \\f 1}\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/d1906fc5df2c8ce5b2d58cc6ea855aab?r=PG&default=identicon", :account-source "clojuredocs", :login "shuaybi"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "ghiden", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/17842?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/d1906fc5df2c8ce5b2d58cc6ea855aab?r=PG&default=identicon", :account-source "clojuredocs", :login "shuaybi"}, :_id "542692c9c026201cdc326aa4"} {:author {:login "jamesqiu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc1268deaa7f2e78fe2b5ea76e6481d8?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; f has args\n;; The keyed value is placed as the first argument\n;; :a (/ 3 4 5) => 3/20 \n(update-in {:a 3} [:a] / 4 5)\n;;=> {:a 3/20}", :created-at 1349714558000, :updated-at 1422566857659, :_id "542692d5c026201cdc3270b1"} {:editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "clojureman", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1793303?v=3"}], :updated-at 1495693819157, :created-at 1412006537832, :author {:avatar-url "https://avatars.githubusercontent.com/u/453580?v=2", :account-source "github", :login "pmbauer"}, :body ";; be careful with that empty path sequence, it's seldom what you want\n(update-in {} [] (constantly {:k :v}))\n;;=> {nil {:k :v}}\n\n;; In general, you find that for a non-empty path\n;; (get-in (update-in m path (constantly v)) path) \n;; is equal to v.\n;; Surprisingly this does not hold true in case of an empty path.", :_id "54298289e4b09282a148f202"} {:editors [{:login "bkovitz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3"}], :body ";;You can use update-in in a nested map too, in order to update more than\n;;one value:\n\n(def m {:1 {:value 0, :active false}, :2 {:value 0, :active false}})\n\n(update-in m [:1] assoc :value 1 :active true)\n;;=>{:1 {:value 1, :active true}, :2 {:value 0, :active false}}", :author {:avatar-url "https://avatars.githubusercontent.com/u/50778?v=3", :account-source "github", :login "edipofederle"}, :created-at 1442182854368, :updated-at 1460718796470, :_id "55f5f6c6e4b05246bdf20a90"} {:editors [{:login "gnperdue", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1294053?v=3"}], :body ";; We may dig into multiple levels with `update-in`:\n(def player1 {:name \"Player 1\" :attribs {:str 10 :int 11 :wis 9}})\n\n(update-in player1 [:attribs :str] inc)\n;; {:name \"Player 1\", :attribs {:str 11, :int 11, :wis 9}}\n\n(update-in player1 [:attribs :str] * 2)\n;; {:name \"Player 1\", :attribs {:str 20, :int 11, :wis 9}}\n\n;; We can see one level via `update`...\n\n(update player1 :attribs #(update % :str inc))\n;; {:name \"Player 1\", :attribs {:str 11, :int 11, :wis 9}}", :author {:avatar-url "https://avatars.githubusercontent.com/u/1294053?v=3", :account-source "github", :login "gnperdue"}, :created-at 1451965282908, :updated-at 1451965612224, :_id "568b3b62e4b0e0706e05bd9b"} {:updated-at 1459182480723, :created-at 1459182480723, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body "user=> (update-in {:a {:b 3}} [:a :b] inc)\n\n;;=> {:a {:b 4}}", :_id "56f95b90e4b09295d75dbf42"} {:updated-at 1476877648099, :created-at 1476877648099, :author {:login "G1enY0ung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/15034155?v=3"}, :body ";; can also use in []\n\nuser=> (update-in [1 2 [1 2 3]] [2 0] inc)\n;;=> [1 2 [2 2 3]]", :_id "58075d50e4b001179b66bdd0"} {:updated-at 1514472378082, :created-at 1514472169736, :author {:login "jcburley", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/430319?v=4"}, :body ";; can mix associative types as well\n\nuser=> (update-in [1 {:a 2 :b 3 :c 4}] [1 :c] (fnil inc 5))\n;; => [1 {:a 2, :b 3, :c 5}]\nuser=> (update-in [1 {:a 2 :b 3 :c 4}] [1 :d] (fnil inc 5))\n;; => [1 {:a 2, :b 3, :c 4, :d 6}]\n\n;; but of course vector indices must be appropriate types\n\nuser=> (update-in [1 {:a 2 :b 3 :c 4}] [:b :c] (fnil inc 5))\nIllegalArgumentException Key must be integer clojure.lang.APersistentVector.assoc (APersistentVector.java:345)", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/430319?v=4", :account-source "github", :login "jcburley"}], :_id "5a4502e9e4b0a08026c48ce4"} {:updated-at 1524434442870, :created-at 1524434442870, :author {:login "statcompute", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/4590938?v=4"}, :body "(def ds [{:id 1.0 :name \"name1\"}\n {:id 2.0 :name \"name2\"}\n {:id 3.0 :name \"name3\"}])\n\n(map (fn [x] (update-in x [:name] #(if (= \"name2\" %) % \"not 2\"))) ds)\n\n;; | :id | :name |\n;; |-----+-------|\n;; | 1.0 | not 2 |\n;; | 2.0 | name2 |\n;; | 3.0 | not 2 |\n", :_id "5add060ae4b045c27b7fac4e"}], :notes nil, :arglists ["m ks f & args"], :doc "'Updates' a value in a nested associative structure, where ks is a\n sequence of keys and f is a function that will take the old value\n and any supplied args and return the new value, and returns a new\n nested structure. If any levels do not exist, hash-maps will be\n created.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/update-in"} {:added "1.0", :ns "clojure.core", :name "prefer-method", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1337584953000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "prefers", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e0f"} {:created-at 1337584964000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "get-method", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e10"} {:created-at 1337584977000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "methods", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e11"}], :line 1803, :examples [{:editors [{:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}], :body "(def m {:os ::osx})\n\n(defmulti ex :os)\n\n(defmethod ex ::unix\n [_]\n \"unix\")\n\n(derive ::osx ::unix)\n\n(ex m)\n;;=> \"unix\"\n\n(defmethod ex ::bsd\n [_]\n \"bsd\")\n\n(derive ::osx ::bsd)\n\n;; which one to choose ::unix or ::bsd ?? -> Conflict!!!\n(ex m)\n;;=> IllegalArgumentException Multiple methods in multimethod 'ex' match...\n\n(prefer-method ex ::unix ::bsd)\n\n(ex m)\n;;=> \"unix\"\n\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3", :account-source "github", :login "ertugrulcetin"}, :created-at 1475488456319, :updated-at 1475488811909, :_id "57f22ac8e4b0709b524f0514"}], :notes nil, :arglists ["multifn dispatch-val-x dispatch-val-y"], :doc "Causes the multimethod to prefer matches of dispatch-val-x over dispatch-val-y \n when there is a conflict", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/prefer-method"} {:added "1.0", :ns "clojure.core", :name "aset-int", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 3946, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; create an array of 10 ints and set one of the values to 31415\n\nuser=> (def is (int-array 10))\n#'user/is\nuser=> (vec is)\n[0 0 0 0 0 0 0 0 0 0]\nuser=> (aset-int is 3 31415)\n31415\nuser=> (vec is)\n[0 0 0 31415 0 0 0 0 0 0]\nuser=>", :created-at 1313915065000, :updated-at 1313915065000, :_id "542692cdc026201cdc326d37"}], :notes [{:body "See [aset](http://clojuredocs.org/clojure.core/aset) for illustrations of multi-dimensional syntax.", :created-at 1432829144129, :updated-at 1432829144129, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :_id "55673cd8e4b03e2132e7d173"}], :arglists ["array idx val" "array idx idx2 & idxv"], :doc "Sets the value at the index/indices. Works on arrays of int. Returns val.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/aset-int"} {:added "1.0", :ns "clojure.core", :name "*clojure-version*", :file "clojure/core.clj", :type "var", :column 3, :see-alsos [{:created-at 1328398023000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "clojure-version", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aa6"}], :dynamic true, :line 7069, :examples [{:updated-at 1493242329065, :created-at 1280322760000, :body "user=> *clojure-version*\n{:interim true, :major 1, :minor 2, :incremental 0, :qualifier \"master\"}", :editors [{:login "chbrown", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/360279?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/ee24aacb65359196b0a1bad050f9a62f?r=PG&default=identicon", :account-source "clojuredocs", :login "mattdw"}, :_id "542692cac026201cdc326b62"}], :notes nil, :arglists [], :doc "The version info for Clojure core, as a map containing :major :minor \n :incremental and :qualifier keys. Feature releases may increment \n :minor and/or :major, bugfix releases will increment :incremental. \n Possible values of :qualifier include \"GA\", \"SNAPSHOT\", \"RC-x\" \"BETA-x\"", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*clojure-version*"} {:added "1.7", :ns "clojure.core", :name "ensure-reduced", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1464286337203, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reduced", :ns "clojure.core"}, :_id "57473c81e4b0af2c9436d1ef"} {:created-at 1464286352101, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reduced?", :ns "clojure.core"}, :_id "57473c90e4b0bafd3e2a045d"} {:created-at 1464286361977, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unreduced", :ns "clojure.core"}, :_id "57473c99e4b0af2c9436d1f0"} {:created-at 1464286386482, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reduce", :ns "clojure.core"}, :_id "57473cb2e4b0af2c9436d1f1"}], :line 2849, :examples [{:updated-at 1464286295227, :created-at 1464286295227, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :body "(ensure-reduced :foo)\n;;=> object[clojure.lang.Reduced 0x7dc19a70 {:status :ready, :val :foo}]\n\n(ensure-reduced (reduced :foo))\n;;=> object[clojure.lang.Reduced 0x45385f75 {:status :ready, :val :foo}]", :_id "57473c57e4b0bafd3e2a045c"} {:updated-at 1682279619055, :created-at 1682279619055, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; If our reducing function's short-circuit coincides with our transducer's\n;; short-circuit, `reduced` could lead to the reduction returning a Reduced:\n\n(defn conj-till-neg\n ([coll] coll)\n ([coll x] (cond-> (conj coll x) (neg? x) reduced)))\n\n(defn take-till-odd [rf]\n (fn new-rf\n ([result] (rf result))\n ([result x] (cond-> (rf result x) (odd? x) reduced))))\n\n(transduce take-till-odd conj-till-neg [] [6 4 2 -1 -2])\n;; => #\n\n;; So we can change `reduced` to `ensure-reduced` to avoid doubling up:\n(defn take-till-odd [rf]\n (fn new-rf\n ([result] (rf result))\n ([result x] (cond-> (rf result x) (odd? x) ensure-reduced))))\n\n(transduce take-till-odd conj-till-neg [] [6 4 2 -1 -2])\n;; => [6 4 2 -1]\n", :_id "64458cc3e4b08cf8563f4b95"}], :notes nil, :arglists ["x"], :doc "If x is already reduced?, returns it, else returns (reduced x)", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ensure-reduced"} {:added "1.0", :ns "clojure.core", :name "*'", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1412880795489, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "*", :library-url "https://github.com/clojure/clojure"}, :_id "5436d99be4b0ae7956031574"}], :line 996, :examples [{:body ";; there is an implicit 1\n(*')\n;;=> 1 \n\n;; the implicit 1 comes into play\n(*' 6)\n;;=> 6\n\n(*' 2 3)\n;;=> 6\n\n(*' 2 3 4)\n;;=> 24\n\n(*' 0.5 200)\n;;=> 100.0\n\n;; great so it gives the same results as *.\n;; not quite check this out\n(* 1234567890 9876543210)\n;; ArithmeticException integer overflow\n(*' 1234567890 9876543210)\n;;=> 12193263111263526900N", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1412880775853, :updated-at 1412880775853, :_id "5436d987e4b0ae7956031573"}], :notes nil, :arglists ["" "x" "x y" "x y & more"], :doc "Returns the product of nums. (*') returns 1. Supports arbitrary precision.\n See also: *", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*'"} {:added "1.0", :ns "clojure.core", :name "instance?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1285513897000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "type", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e9d"} {:created-at 1285513925000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "supers", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e9e"} {:created-at 1341631058000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "doto", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e9f"} {:created-at 1341631065000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "class", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ea0"} {:created-at 1432578737325, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "satisfies?", :library-url "https://github.com/clojure/clojure"}, :_id "55636ab1e4b03e2132e7d16d"} {:created-at 1482897919586, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "isa?", :ns "clojure.core"}, :_id "586339ffe4b0fd5fb1cc9642"}], :line 139, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"} {:login "steloflute", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fc0969cd0910a427052f0f6281967392?r=PG&default=identicon"} {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"} {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"} {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"} {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"} {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"} {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"}], :body "user=> (instance? Long 1)\ntrue\nuser=> (instance? Integer 1)\nfalse\nuser=> (instance? Number 1)\ntrue\nuser=> (instance? String 1)\nfalse\nuser=> (instance? String \"1\")\ntrue\n", :created-at 1282289726000, :updated-at 1358905451000, :_id "542692c6c026201cdc3268e1"} {:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"} {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"} {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"}], :body "user=> (def al (new java.util.ArrayList))\n#'user/al\nuser=> (instance? java.util.Collection al)\ntrue\nuser=> (instance? java.util.RandomAccess al)\ntrue\nuser=> (instance? java.lang.String al)\nfalse", :created-at 1313989675000, :updated-at 1358543212000, :_id "542692c6c026201cdc3268eb"} {:author {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"}, :editors [{:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"}], :body ";; Some things are more than what they seem to be at first glance\nuser=> (instance? clojure.lang.IFn +)\ntrue\nuser=> (instance? clojure.lang.Keyword :a)\ntrue\nuser=> (instance? clojure.lang.IFn :a)\ntrue\nuser=> (instance? clojure.lang.IFn {:a 1})\ntrue\n", :created-at 1358905444000, :updated-at 1358905610000, :_id "542692d3c026201cdc326fcf"} {:editors [{:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}], :body ";; If `c` is specified with a literal class name, this is a Java\n;; class name. If any of the namespace components of the class\n;; include dashes, the dashes have to be replaced with underscores:\n\n(ns foo-bar)\n(defrecord Box [x])\n(def box (Box. 42))\n\n(instance? foo-bar.Box box)\n;=> CompilerException java.lang.ClassNotFoundException: foo-bar.Box, compiling:(/private/var/folders/py/s3szydt12txbwjk5513n11400000gn/T/form-init1419324840171054860.clj:1:1)\n(instance? foo_bar.Box box)\n;=> true\n\n;; This rule doesn't apply to the last component of the class name:\n\n(defrecord My-Box [x]) ; not an idiomatic choice\n(def mybox (My-Box. 42))\n\n(instance? foo_bar.My-Box mybox)\n;=> true\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3", :account-source "github", :login "mars0i"}, :created-at 1482898746157, :updated-at 1482898800493, :_id "58633d3ae4b0fd5fb1cc9643"}], :notes nil, :arglists ["c x"], :doc "Evaluates x and tests if it is an instance of the class\n c. Returns true or false", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/instance_q"} {:added "1.0", :ns "clojure.core", :name "with-open", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1496906064866, :author {:login "fhur", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/6452323?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "slurp", :ns "clojure.core"}, :_id "5938f950e4b06e730307db30"} {:created-at 1507926365257, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "input-stream", :ns "clojure.java.io"}, :_id "59e1215de4b03026fe14ea7f"}], :line 3831, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "benmoss", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/239754?v=3"} {:login "PetrGlad", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/124476?v=3"}], :body ";; Opens the file 'myfile.txt' and prints out the contents. The \n;; 'with-open' ensures that the reader is closed at the end of the \n;; form. \n;; \n;; Please note that reading a file a character at a time is not \n;; very efficient.\n\nuser=> (with-open [r (clojure.java.io/input-stream \"myfile.txt\")] \n (loop [c (.read r)] \n (if (not= c -1)\n (do \n (print (char c)) \n (recur (.read r))))))\n", :created-at 1281949367000, :updated-at 1420810336807, :_id "542692c7c026201cdc32699a"} {:author {:login "octopusgrabbus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon"}, :editors [], :body "(defn write-csv-file\n \"Writes a csv file using a key and an s-o-s (sequence of sequences)\"\n [out-sos out-file]\n\n (spit out-file \"\" :append false)\n (with-open [out-data (io/writer out-file)]\n (csv/write-csv out-data out-sos)))\n\n", :created-at 1352321815000, :updated-at 1352321815000, :_id "542692d6c026201cdc3270bb"} {:updated-at 1522741647810, :created-at 1522741647810, :author {:login "jcburley", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/430319?v=4"}, :body ";; Try to read 3 lines of text from a test file and return them (to the REPL)\n;; as a list:\n(with-open [r (clojure.java.io/reader \"test-0.txt\")]\n (binding [*in* r] (repeatedly 3 read-line)))\n\n;; The above returns a lazy seq without reading any lines while *in* is bound\n;; to the file, resulting in the original *in* (usually stdin) being read.\n;; To fix, wrap the body within the *in* binding in (doall ...):\n(with-open [r (clojure.java.io/reader \"test-0.txt\")]\n (binding [*in* r] (doall (repeatedly 3 read-line))))\n\n;; That ensures the sequence will be fully realized with the binding of *in*\n;; still in effect, thus reading all 3 lines from the test file.", :_id "5ac3318fe4b045c27b7fac2f"} {:editors [{:login "NielsvanKlaveren", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/43436964?v=4"}], :body ";Process multiple files with a transducer as if it's one file\n;Not lazy, but processes a line at a time\n\n(defn process-file\n [t file]\n (with-open [rdr (io/reader file)]\n (into []\n t\n (line-seq rdr))))\n\n(defn process-files\n [t files]\n (into []\n (comp (mapcat (fn [file] (process-file t file))))\n files))\n\n(apply + (process-files (comp (map count))\n [\"test-0.txt\" \"test-1.txt\" \"test-2.txt\"]))", :author {:avatar-url "https://avatars0.githubusercontent.com/u/43436964?v=4", :account-source "github", :login "NielsvanKlaveren"}, :created-at 1544177851915, :updated-at 1544184780984, :_id "5c0a48bbe4b0ca44402ef5e2"}], :macro true, :notes nil, :arglists ["bindings & body"], :doc "bindings => [name init ...]\n\n Evaluates body in a try expression with names bound to the values\n of the inits, and a finally clause that calls (.close name) on each\n name in reverse order.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/with-open"} {:added "1.6", :ns "clojure.core", :name "mix-collection-hash", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 5175, :examples nil, :notes nil, :arglists ["hash-basis count"], :doc "Mix final collection hash for ordered or unordered collections.\n hash-basis is the combined collection hash, count is the number\n of elements included in the basis. Note this is the hash code\n consistent with =, different from .hashCode.\n See http://clojure.org/data_structures#hash for full algorithms.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/mix-collection-hash"} {:added "1.0", :ns "clojure.core", :name "re-find", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1282039272000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "re-groups", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bfe"} {:created-at 1282039314000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "re-matcher", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bff"} {:created-at 1282039324000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "re-pattern", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c00"} {:created-at 1282039359000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "re-seq", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c01"} {:created-at 1324028214000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "re-matches", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c02"} {:created-at 1379040124000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "subs", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c03"} {:created-at 1412843259867, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.string", :name "replace", :library-url "https://github.com/clojure/clojure"}, :_id "543646fbe4b0ae795603156f"}], :line 4898, :examples [{:author {:login "nipra", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/142529?v=3"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jwatki06", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5594302?v=3"}], :body "user=> (def matcher (re-matcher #\"\\d+\" \"abc12345def\"))\n#'user/matcher\n\nuser=> (re-find matcher)\n\"12345\"\n\n;; If you only want the first match, it is shorter to call re-find with the\n;; pattern and the string to search, rather than explicitly creating a matcher\n;; as above.\nuser=> (re-find #\"\\d+\" \"abc12345def\")\n\"12345\"\n\n;; If you want all matches as a sequence, use re-seq. Creating a matcher\n;; explicitly with re-matcher and passing it to re-find is only the best way\n;; if you want to write a loop that iterates through all matches, and do not\n;; want to use re-seq for some reason.\n", :created-at 1279049854000, :updated-at 1465229780990, :_id "542692cac026201cdc326b4c"} {:author {:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"}, :editors [], :body ";; re-find can be used to iterate through re matches in the string\n\nuser=> (def phone-number \"672-345-456-3212\")\n#'user/phone-number\n\nuser=> (def matcher (re-matcher #\"\\d+\" phone-number))\n#'user/matcher\n\nuser=> (re-find matcher)\n\"672\"\n\nuser=> (re-find matcher)\n\"345\"\n\nuser=> (re-find matcher)\n\"456\"\n\nuser=> (re-find matcher)\n\"3212\"\n\n;; when there's no more valid matches, nil is returned\nuser=> (re-find matcher)\nnil", :created-at 1312373129000, :updated-at 1312373129000, :_id "542692cac026201cdc326b4f"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; When there are parenthesized groups in the pattern and re-find\n;; finds a match, it returns a vector. The first item is the part of\n;; the string that matches the entire pattern, and each successive\n;; item are the parts of the string that matched the 1st, 2nd,\n;; etc. parenthesized groups. Groups are numbered by the order in\n;; which their left parenthesis occurs in the string, from left to\n;; right.\nuser=> (def line \" RX packets:1871074138 errors:5 dropped:48 overruns:9\")\n#'user/line\n\nuser=> (re-find #\"(\\S+):(\\d+)\" line)\n[\"packets:1871074138\" \"packets\" \"1871074138\"]\n\n;; groups can nest\nuser=> (re-find #\"(\\S+:(\\d+)) \\S+:\\d+\" line)\n[\"packets:1871074138 errors:5\" \"packets:1871074138\" \"1871074138\"]\n\n;; If there is no match, re-find always returns nil, whether there are\n;; parenthesized groups or not.\nuser=> (re-find #\"(\\S+):(\\d+)\" \":2 numbers but not 1 word-and-colon: before\")\nnil\n\n;; A parenthesized group can have nil as its result if it is part of\n;; an 'or' (separated by | in the regex), and another alternative is\n;; the one that matches.\nuser=> (re-find #\"(\\D+)|(\\d+)\" \"word then number 57\")\n[\"word then number \" \"word then number \" nil]\n\nuser=> (re-find #\"(\\D+)|(\\d+)\" \"57 number then word\")\n[\"57\" nil \"57\"]\n\n;; It is also possible for a group to match the empty string.\nuser=> (re-find #\"(\\d*)(\\S)\\S+\" \"lots o' digits 123456789\")\n[\"lots\" \"\" \"l\"]\n\n;; If you want to use parentheses to group a part of the regex, but\n;; have no interest in capturing the string it matches, you can follow\n;; the left paren with ?: to prevent capturing.\nuser=> (re-find #\"(?:\\S+):(\\d+)\" line)\n[\"packets:1871074138\" \"1871074138\"]\n\n;; re-matches also behaves this way, and re-seq returns a sequence of\n;; matches, where each one can be a vector like re-find returns.\n", :created-at 1324028180000, :updated-at 1324028180000, :_id "542692d4c026201cdc32704a"} {:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [], :body ";;It's possible to get variables out of your string with regexp\n\nuser=> (re-find #\"(\\d\\d\\d) (USD)\" \"450 USD\")\n[\"450 USD\" \"450\" \"USD\"]\nuser=> (nth *1 1)\n\"450\"\n\n;;thanks kotarak @ stackoverflow.com for this one", :created-at 1326426979000, :updated-at 1326426979000, :_id "542692d4c026201cdc32704b"} {:author {:login "Pete Mancini", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/19c72d50850490b8dea594fe3eb04437?r=PG&default=identicon"}, :editors [{:login "Pete Mancini", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/19c72d50850490b8dea594fe3eb04437?r=PG&default=identicon"}], :body ";; If your input has line delimiters you can switch on multiline with (?m)\n\nuser=> (def testcase \"Line 1\\nLine 2\\nTarget Line\\nLine 4\\nNot a target line\")\nuser=>(re-find #\"(?im)^target.*$\" testcase)\n\"Target Line\"", :created-at 1369872025000, :updated-at 1369872064000, :_id "542692d4c026201cdc32704c"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; Note: See clojure.core/subs for discussion of behavior of substrings\n;; holding onto references of the original strings, which can\n;; significantly affect your memory usage in some cases.", :created-at 1379040119000, :updated-at 1379040119000, :_id "542692d4c026201cdc32704e"} {:updated-at 1598128246429, :created-at 1598128036322, :author {:login "jgomo3", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1125678?v=4"}, :body ";; Use it as a simple predicate based on regexp,\n;; since it returns nil if `re` and `s` do not match.\n\nuser=> (def text-with-blank-lines [\"En un lugar de la Mancha,\"\n \"\"\n \" \"\n \"de cuyo nombre no quiero acordarme\"\n \" \"])\n\n;; Let's count how many non-blank lines are there:\nuser=> (count (filter #(re-find #\"\\S\" %) text-with-blank-lines))\n2\n\n;; Example inspired in 'Programming Clojure 3rd Ed.' 'Seq-in Stream'.", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/1125678?v=4", :account-source "github", :login "jgomo3"}], :_id "5f417fa4e4b0b1e3652d7386"}], :notes [{:body "the regex can't be a var?\n\n```clojure\n(let [regex \"abc\"] (re-find #a \"abc\"))\n```\nthis will get an error!", :created-at 1419230605090, :updated-at 1419230605090, :author {:login "paomian", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2999156?v=3"}, :_id "5497bd8de4b09260f767ca7d"} {:author {:login "blx", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/887504?v=3"}, :updated-at 1447600673577, :created-at 1447600673577, :body "@paomian: The regex *can* be a variable, but the variable needs to be a regex.\n\nThis works fine:\n
    \n(let [regex #\"abc\"] (re-find regex \"abc\"))\n
    \n\nbecause the **#** reader macro for declaring regexes applies to the string right after it -- without doing any kind of substitution.\n\nYou could also do\n
    \n(let [regex \"abc\"] (re-find (re-pattern regex) \"abc\"))\n
    ", :_id "5648a221e4b053844439826f"}], :arglists ["m" "re s"], :doc "Returns the next regex match, if any, of string to pattern, using\n java.util.regex.Matcher.find(). Uses re-groups to return the\n groups.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/re-find"} {:added "1.7", :ns "clojure.core", :name "run!", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1502125415874, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "doseq", :ns "clojure.core"}, :_id "59889d67e4b0d19c2ce9d70d"} {:created-at 1502125443214, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "map", :ns "clojure.core"}, :_id "59889d83e4b0d19c2ce9d70e"} {:created-at 1502125454691, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "mapv", :ns "clojure.core"}, :_id "59889d8ee4b0d19c2ce9d70f"}], :line 7710, :examples [{:updated-at 1451663711803, :created-at 1451663490717, :author {:login "s-mage", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2388396?v=3"}, :body "(run! prn (range 5))\n; 0\n; 1\n; 2\n; 3\n; 4\n; returns nil\n\n; compared to mapv\n(mapv prn (range 5))\n; 0 \n; 1 \n; 2 \n; 3 \n; 4 \n; returns [nil nil nil nil nil] ", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/2388396?v=3", :account-source "github", :login "s-mage"}], :_id "5686a082e4b0e0706e05bd96"} {:editors [{:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}], :body "(run! #(http-out-create-person! %) [{:name \"alex\" :country :peru} \n {:name \"eddu\" :country :peru}])\n\n; (http-out-create-person! {:name \"alex\" :country :peru})\n; (http-out-create-person! {:name \"eddu\" :country :peru})\n; nil", :author {:avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4", :account-source "github", :login "berczeck"}, :created-at 1598157184683, :updated-at 1598157582001, :_id "5f41f180e4b0b1e3652d7394"}], :notes nil, :arglists ["proc coll"], :doc "Runs the supplied procedure (via reduce), for purposes of side\n effects, on successive items in the collection. Returns nil", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/run!"} {:added "1.0", :ns "clojure.core", :name "val", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1318590007000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vals", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521efb"} {:created-at 1423522665421, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "key", :library-url "https://github.com/clojure/clojure"}, :_id "54d93b69e4b0e2ac61831d35"} {:created-at 1423522670342, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "keys", :library-url "https://github.com/clojure/clojure"}, :_id "54d93b6ee4b0e2ac61831d36"}], :line 1574, :examples [{:updated-at 1434396569392, :created-at 1280777702000, :body ";; emulate 'vals'\n(map val {:a 1 :b 2})\n;;=> (1 2)\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692c6c026201cdc3268cd"} {:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(val (first {:one :two}))\n;;=> :two", :created-at 1288970694000, :updated-at 1434396586900, :_id "542692c6c026201cdc3268cf"} {:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [], :body ";syntactic sugar for (val)\n(:doc (meta #'meta))", :created-at 1288970885000, :updated-at 1288970885000, :_id "542692c6c026201cdc3268d0"} {:body ";; extracts the key of a map entry\n(val (clojure.lang.MapEntry. :a :b))\n;;=> :b", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1434396268230, :updated-at 1434396268230, :_id "557f266ce4b03e2132e7d193"}], :notes [{:updated-at 1345454203000, :body "This is my first attempt at using this site to gain an understanding of a closure function. Two of the examples above seem incorrect. \r\n\r\nExample 3(?) seems to have nothing to do with val \r\n\r\n(notice the lack of example identifiers)\r\n", :created-at 1344320583000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fe6"}], :arglists ["e"], :doc "Returns the value in the map entry.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/val"} {:added "1.0", :ns "clojure.core", :name "defonce", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1421928745226, :author {:login "Gitward", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8510849?v=3"}, :to-var {:ns "clojure.core", :name "def", :library-url "https://github.com/clojure/clojure"}, :_id "54c0e929e4b081e022073c21"}], :line 5828, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [], :body "user> (defonce foo 5)\n#'user/foo\n\nuser> foo\n5\n\n;; defonce does nothing the second time\nuser> (defonce foo 10)\nnil\n\nuser> foo\n5", :created-at 1293672804000, :updated-at 1293672804000, :_id "542692cec026201cdc326dba"} {:updated-at 1468533299702, :created-at 1468533299702, :author {:login "DanBurton", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/713692?v=3"}, :body ";; Supports ^:private\nuser=> (defonce ^:private foo 3)\n#'user/foo\nuser=> foo\n3\nuser=> (in-ns 'user2)\nuser2=> user/foo\n java.lang.IllegalStateException: var: user/foo is not public\n", :_id "57880a33e4b0bafd3e2a04a1"} {:updated-at 1599762924778, :created-at 1599762924778, :author {:login "luiszambon", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/41161270?v=4"}, :body "user> (def code {:clojure \"Yes\"})\n#'user/code\n\nuser> code\n{:clojure \"Yes\"}\n\n;; defonce will not be evaluated\nuser> (defonce code (+ 10 10))\nnil\n\nuser> code\n{:clojure \"Yes\"}", :_id "5f5a71ece4b0b1e3652d73b7"}], :macro true, :notes [{:updated-at 1385014731000, :body "Note that this isn't thread safe. I.e. EXPR for the same NAME can be evaluated more than once.", :created-at 1385014731000, :author {:login "lnostdal", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a539e214c9980ff4b53ad5ca9347aa91?r=PG&default=identicon"}, :_id "542692edf6e94c697052200d"}], :arglists ["name expr"], :doc "defs name to have the root value of the expr iff the named var has no root value,\n else expr is unevaluated", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/defonce"} {:added "1.0", :ns "clojure.core", :name "unchecked-add", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1289215695000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-dec", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b8a"} {:created-at 1289215703000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-inc", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b8b"} {:created-at 1289215708000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-negate", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b8c"} {:created-at 1289215717000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-divide", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b8d"} {:created-at 1289215722000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-subtract", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b8e"} {:created-at 1289215736000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-multiply", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b8f"} {:created-at 1289215741000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-remainder", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b90"} {:created-at 1423522050658, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "+", :library-url "https://github.com/clojure/clojure"}, :_id "54d93902e4b0e2ac61831d2b"} {:created-at 1423522057832, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "+'", :library-url "https://github.com/clojure/clojure"}, :_id "54d93909e4b0e2ac61831d2c"}], :line 1198, :examples [{:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; can't interchange INTs with LONGs, only F(int, int) or F(long, long)\n;; F is a function, not an operator.\n;; overflow very easily as shown below.\n\nuser=> (unchecked-add Integer/MAX_VALUE 0)\n2147483647\n\nuser=> (unchecked-add Integer/MAX_VALUE 1)\n-2147483648\n\nuser=> (unchecked-add Integer/MAX_VALUE Integer/MAX_VALUE)\n-2\n\nuser=> (unchecked-add Integer/MAX_VALUE Long/MAX_VALUE)\njava.lang.IllegalArgumentException: No matching method found: unchecked_add (NO_SOURCE_FILE:0)\n\nuser=> (unchecked-add Integer/MAX_VALUE Long/MAX_VALUE)\njava.lang.IllegalArgumentException: No matching method found: unchecked_add (NO_SOURCE_FILE:0)\n\nuser=> (unchecked-add Long/MAX_VALUE Long/MAX_VALUE)\n-2\n\nuser=> (unchecked-add 5 Long/MAX_VALUE)\njava.lang.IllegalArgumentException: No matching method found: unchecked_add (NO_SOURCE_FILE:0)\n\nuser=> (unchecked-add 5555555555 Long/MAX_VALUE)\n-9223372031299220254", :created-at 1289215507000, :updated-at 1289267828000, :_id "542692c9c026201cdc326ac9"}], :notes nil, :arglists ["x y"], :doc "Returns the sum of x and y, both long.\n Note - uses a primitive operator subject to overflow.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-add"} {:added "1.0", :ns "clojure.core", :name "loaded-libs", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 6104, :examples [{:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; Show the list of loaded libs (files named after the \"ns\"\n;; declaration they contain) and created namespaces (\"ns\" only). \n;; \"ns\" side effects into loaded-libs, \"create-ns\" (or \"in-ns\") does not:\n\n(ns a)\n(ns b) \n(every? (loaded-libs) ['a 'b])\n;; true\n\n(create-ns 'x)\n(create-ns 'y)\n(not-every? (loaded-libs) ['x 'y])\n;; true", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1546097021308, :updated-at 1546097304134, :_id "5c27917de4b0ca44402ef604"}], :notes [{:author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :updated-at 1546099777305, :created-at 1546099777305, :body "Trivia: the concept of \"library\" goes all the way back to Clojure contrib and was initially inspired by other packaging systems (it was even named \"Jewels\" at some point, possibly inspired by Ruby Gems). Check the following:\n\n* https://groups.google.com/d/msg/clojure/fjDJfAsxwRo/-5hE4yDMVTQJ\n* https://github.com/clojure/clojure-contrib/blob/da367723d33b20cb89e4aac7dc4221a0138c2f8f/jewel.clj", :_id "5c279c41e4b0ca44402ef606"}], :arglists [""], :doc "Returns a sorted set of symbols naming the currently loaded libs", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/loaded-libs"} {:ns "clojure.core", :name "->Vec", :file "clojure/gvec.clj", :type "function", :column 1, :see-alsos nil, :line 131, :examples nil, :notes nil, :arglists ["am cnt shift root tail _meta"], :doc "Positional factory function for class clojure.core.Vec.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/->Vec"} {:added "1.9", :ns "clojure.core", :name "bytes?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495728541051, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "byte-array", :ns "clojure.core"}, :_id "5927019de4b093ada4d4d76d"} {:created-at 1495728555435, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "bytes", :ns "clojure.core"}, :_id "592701abe4b093ada4d4d76e"}], :line 5388, :examples [{:updated-at 1495728500906, :created-at 1495728500906, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body ";;;; Returns true for byte[] arrays:\n\n(bytes? (.getBytes \"foo\"))\n;;=> true\n(bytes? (byte-array [102 111 111]))\n;;=> true\n\n;;;; Returns false for Byte[] arrays:\n\n(bytes? (to-array (map byte [102 111 111])))\n;;=> false", :_id "59270174e4b093ada4d4d76c"}], :notes nil, :arglists ["x"], :doc "Return true if x is a byte array", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bytes_q"} {:added "1.0", :ns "clojure.core", :name "not", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1301366612000, :author {:login "pauldoo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5cb916d3c8abc9f45a093209e72489fb?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "complement", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dd8"} {:created-at 1375213332000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "false?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dd9"}], :line 524, :examples [{:author {:login "mattdw", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ee24aacb65359196b0a1bad050f9a62f?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user=> (not true)\nfalse\nuser=> (not false)\ntrue\nuser=> (not nil)\ntrue\n\n;; acts as complement of `boolean`\nuser=> (boolean \"a string\")\ntrue\nuser=> (not \"a string\")\nfalse\nuser=> (boolean 1)\ntrue\nuser=> (not 1)\nfalse", :created-at 1280323469000, :updated-at 1422932403041, :_id "542692cfc026201cdc326e64"} {:updated-at 1475631952638, :created-at 1475631952638, :author {:login "aakoch", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/137713?v=3"}, :body "user=> (not (= \"a\" \"b\"))\ntrue", :_id "57f45b50e4b0709b524f0520"}], :notes nil, :tag "java.lang.Boolean", :arglists ["x"], :doc "Returns true if x is logical false, false otherwise.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/not"} {:added "1.0", :ns "clojure.core", :name "with-meta", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1301486163000, :author {:login "ninjudd", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7ced25585a7556e9b9b975c1f9e136e3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vary-meta", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d5e"} {:created-at 1341551175000, :author {:login "jgauthier", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e8668403f9cac4041a106e57e8037dff?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "meta", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d5f"} {:created-at 1374315863000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "alter-meta!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d60"}], :line 211, :examples [{:updated-at 1285495834000, :created-at 1280776037000, :body "user=> (with-meta [1 2 3] {:my \"meta\"})\n[1 2 3]\n\nuser=> (meta (with-meta [1 2 3] {:my \"meta\"}))\n{:my \"meta\"}\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692c8c026201cdc326a41"} {:author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :editors [], :body ";; the same example above in a simplified way\nuser=> (def wm (with-meta [1 2 3] {:my \"meta\"}))\n#'user/wm\n\nuser=> wm\n[1 2 3]\n\nuser=> (meta wm)\n{:my \"meta\"}", :created-at 1359717828000, :updated-at 1359717828000, :_id "542692d6c026201cdc3270ba"} {:editors [{:login "Rovanion", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/632775?v=4"}], :body ";; Trying to attach meta data to nil with throw an exception\n(with-meta nil {:my \"meta\"})\n;; Unhandled java.lang.NullPointerException\n\n;; It also only works for Clojure data types implementing clojure.lang.IObj\n(require '[clojure.java.io :as io])\n(with-meta (io/file \".\") {:my \"meta\"})\n;; Unhandled java.lang.ClassCastException\n;; java.io.File cannot be cast to clojure.lang.IObj\n", :author {:avatar-url "https://avatars2.githubusercontent.com/u/632775?v=4", :account-source "github", :login "Rovanion"}, :created-at 1546960387304, :updated-at 1546960610725, :_id "5c34be03e4b0ca44402ef616"} {:updated-at 1603447088199, :created-at 1603446774741, :author {:login "jimka2001", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/6414129?v=4"}, :body ";; The meta data notation `^:dynamic` can be used to force a variable to be dynamic.\n\n(def ^:dynamic *my-dynamic-variable* \"my doc string\" the-initial-value)\n\n;; However, using this notation within a macro does not have the same semantics.\n;; For example the following macro *will not* expand to a definition of a \n;; dynamic variable whose value is a function.\n\n(defmacro dyn-fun [name lambda-list & body] ;; WRONG\n `(def ^:dynamic ~name (fn ~lambda-list ~@body)))\n\n;; The macro should be written something like the following.\n\n(defmacro dyn-fun [name lambda-list & body]\n `(def ~(with-meta name {:dynamic true}) (fn ~lambda-list ~@body)))\n", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/6414129?v=4", :account-source "github", :login "jimka2001"}], :_id "5f92a7f6e4b0b1e3652d73e7"}], :notes [{:author {:login "beoliver", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1413969?v=4"}, :updated-at 1558365596405, :created-at 1558365596405, :body "The Clojure documentation states that \"metadata does not impact equality (or hash codes). Two objects that differ only in metadata are equal.\" One should be aware that while a function can be compared to itself:\n```\n(defn foo [x] (+ x x))\n```\ntesting equality\n```\n> (= foo foo)\ntrue\n> (= (with-meta foo {:hello :world}) foo)\nfalse\n> (= (with-meta foo {}) foo)\nfalse\n```\n", :_id "5ce2c59ce4b0ca44402ef728"}], :arglists ["obj m"], :doc "Returns an object of the same type and value as obj, with\n map m as its metadata.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/with-meta"} {:added "1.7", :ns "clojure.core", :name "unreduced", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1456683860012, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reduced?", :ns "clojure.core"}, :_id "56d33b54e4b02a6769b5a4b7"} {:created-at 1456683872206, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reduced", :ns "clojure.core"}, :_id "56d33b60e4b02a6769b5a4b8"} {:created-at 1456683877778, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reduce", :ns "clojure.core"}, :_id "56d33b65e4b02a6769b5a4b9"} {:created-at 1464286441935, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ensure-reduced", :ns "clojure.core"}, :_id "57473ce9e4b0bafd3e2a045e"}], :line 2855, :examples [{:updated-at 1456683816266, :created-at 1456683816266, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :body "(unreduced :foo)\n;;=> :foo\n\n(unreduced (reduced :foo))\n;;=> :foo\n\n(unreduced (clojure.lang.Reduced. :foo))\n;;=> :foo", :_id "56d33b28e4b0b41f39d96cd8"} {:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; Transducers have a \"completing arity\" which is called at the end of the\n;; reduction to finalize the output. This is done outside of the normal\n;; reduction loop, so there is nothing to unwrap a reduced return value, should\n;; the reducing function be called from the completing arity and happen to wrap\n;; the return in a Reduced:\n\n(defn conj-till-odd\n ([coll] coll)\n ([coll x] (cond-> (conj coll x) (odd? x) reduced)))\n\n(defn inc-nums+7 [rf]\n (fn new-rf\n ([result] (rf result 7)) ; A bit contrived, but makes the point\n ([result x] (rf result (inc x)))))\n\n(transduce inc-nums+7 conj-till-odd [] [1 3 5 7 9])\n;; => #\n\n;; So we can wrap the return of the completing arity in `unreduced` to make sure\n;; we don't return a Reduced. After all, it's the end of the reduction anyway:\n\n(defn inc-nums+7 [rf]\n (fn new-rf\n ([result] (unreduced (rf result 7)))\n ([result x] (rf result (inc x)))))\n\n(transduce inc-nums+7 conj-till-odd [] [1 3 5 7 9])\n;; => [2 4 6 8 10 7]", :author {:avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4", :account-source "github", :login "tomdl89"}, :created-at 1682279892453, :updated-at 1682326266615, :_id "64458dd4e4b08cf8563f4b96"}], :notes nil, :arglists ["x"], :doc "If x is reduced?, returns (deref x), else returns x", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unreduced"} {:added "1.0", :ns "clojure.core", :name "the-ns", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1416003694964, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:ns "clojure.core", :name "ns-name", :library-url "https://github.com/clojure/clojure"}, :_id "5466806ee4b03d20a10242a2"} {:created-at 1524168245582, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/10404?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "create-ns", :ns "clojure.core"}, :_id "5ad8f635e4b045c27b7fac46"}], :line 4153, :examples [{:author {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"}, :editors [{:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; Let's play with a namespace by its name and by its symbol \n(def for-later-use (create-ns 'my-namespace))\n;;=> #'user/for-later-use\n\n(the-ns for-later-use)\n;;=> #\n\n(the-ns 'my-namespace)\n;;=> #\n\n;; not going to find anything this way because we just asked the repl\n;; not to perform an evaluate on it and there is not such \n;; namespace with the name \"for-later-use\"\n(the-ns 'for-later-use)\n;; java.lang.Exception: No namespace: for-later-use found (NO_SOURCE_FILE:0)\n\n;; not going to work either because \"my-namespace\" is the name of a namespace\n;; and not a symbol that points to something\n(the-ns my-namespace)\n;; java.lang.Exception: Unable to resolve symbol: my-namespace in this context (NO_SOURCE_FILE:12)\n", :created-at 1285114597000, :updated-at 1416003645892, :_id "542692c6c026201cdc3268d9"}], :notes nil, :arglists ["x"], :doc "If passed a namespace, returns it. Else, when passed a symbol,\n returns the namespace named by it, throwing an exception if not\n found.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/the-ns"} {:added "1.6", :ns "clojure.core", :name "record?", :file "clojure/core_deftype.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 405, :examples [{:body ";; Define a record R\nuser=> (defrecord R [x])\nuser.R\n\n;; Create an instance of R called r\nuser=> (def r (->R 1))\n#'user/r\n\n;; Look at r\nuser=> r\n#user.R{:x 1}\n\n;; Is r a record?\nuser=> (record? r)\ntrue\n\n;; Interestingly adding \"fields\" not defined in R keeps it a record\nuser=> (def r2 (assoc r :y 2))\n#'user/r2\n\nuser=> r2\n#user.R{:x 1, :y 2}\n\n;; r2 is still a record\nuser=> (record? r2)\ntrue\n\n;; But regular map is not a record\nuser=> (record? {:x 1})\nfalse", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423042551694, :updated-at 1423042594636, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :_id "54d1e7f7e4b0e2ac61831d0d"}], :notes nil, :arglists ["x"], :doc "Returns true if x is a record", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/record_q"} {:added "1.0", :ns "clojure.core", :name "type", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1281949423000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "class", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521acb"} {:created-at 1285511147000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "supers", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521acc"} {:created-at 1285513879000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "instance?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521acd"}], :line 3466, :examples [{:author {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "ampleyfly", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d1f7428e063b5d881a2366ee5fd526fd?r=PG&default=identicon"} {:login "categorics", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3de94aa23c7d475ed00b9d32bc35877a?r=PG&default=identicon"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:avatar-url "https://avatars2.githubusercontent.com/u/1665744?v=4", :account-source "github", :login "rleppink"} {:login "seancorfield", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/43875?v=4"}], :body ";; Checking numbers\nuser=> (type 10)\njava.lang.Long\n\nuser=> (type 10.0)\njava.lang.Double\n\nuser=> (type nil)\nnil\n\n;; Checking collections\nuser=> (type [10 20])\nclojure.lang.PersistentVector\n\nuser=> (type '(10 20))\nclojure.lang.PersistentList\n\n\n;; Checking other, but somewhat intuitive, forms\nuser=> (type \"A string\")\njava.lang.String\n\nuser=> (type :a)\nclojure.lang.Keyword\n\nuser=> (type Thread)\njava.lang.Class\n\n\n;; Checking a symbol\nuser=> (type 'whatever)\nclojure.lang.Symbol\n\n;; A surprise attack yields\nuser=> (type clojure.lang.Symbol)\n;; not such a surprising response\njava.lang.Class\n\n\n;; Checking a function\nuser=> (defn foo [] (\"any string\"))\n#'user/foo\nuser=> (type foo)\nuser$foo\n\n\n;; Checking a macro\nuser=> (type clojure.core/fn)\njava.lang.Exception: Can't take value of a macro: #'clojure.core/fn (NO_SOURCE_FILE:94)\n\n", :created-at 1284412202000, :updated-at 1537559961680, :_id "542692cfc026201cdc326e29"} {:updated-at 1551950967539, :created-at 1305510021000, :body ";This example demonstrates how to add type information to regular clojure maps\n(defn purchase-order [id date amount]\n ^{:type ::PurchaseOrder} ;metadata\n {:id id :date date :amount amount})\n\n(def my-order (purchase-order 10 (java.util.Date.) 100.0))\n\nmy-order\n=> {:id 10, :date #, :amount 100.0}\n\n(type my-order)\n=> PurchaseOrder", :editors [{:avatar-url "https://www.gravatar.com/avatar/d1906fc5df2c8ce5b2d58cc6ea855aab?r=PG&default=identicon", :account-source "clojuredocs", :login "shuaybi"} {:login "borkdude", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/284934?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/d1906fc5df2c8ce5b2d58cc6ea855aab?r=PG&default=identicon", :account-source "clojuredocs", :login "shuaybi"}, :_id "542692cfc026201cdc326e2d"}], :notes nil, :arglists ["x"], :doc "Returns the :type metadata of x, or its Class if none", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/type"} {:added "1.0", :ns "clojure.core", :name "identical?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1343319790000, :author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "=", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cc5"} {:created-at 1343319794000, :author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "==", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cc6"}], :line 775, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"} {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}], :body "user=> (def x 1)\n#'user/x\nuser=> (identical? x x)\ntrue\nuser=> (identical? x 1)\ntrue\nuser=> (identical? x 2)\nfalse\nuser=> (identical? x ((constantly 1) 8))\ntrue\nuser=> (identical? 'a 'a)\nfalse", :created-at 1279074018000, :updated-at 1343322315000, :_id "542692c8c026201cdc326a61"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body "user=> (def x {:foo 1, :bar -3})\n#'user/x\nuser=> (def y {:foo 1, :bar -3})\n#'user/y\n;; Values are equal, but different objects were constructed\nuser=> (= x y)\ntrue\nuser=> (identical? x y)\nfalse\n", :created-at 1329874849000, :updated-at 1329874849000, :_id "542692d3c026201cdc326fca"} {:body "; Java wrapper class caching\n; details at: https://www.owasp.org/index.php/Java_gotchas#Immutable_Objects_.2F_Wrapper_Class_Caching\nuser=> (identical? 128 128)\nfalse\nuser=> (identical? 127 127)\ntrue\nuser=> (identical? -127 -127)\ntrue\nuser=> (identical? -128 -128)\ntrue\nuser=> (identical? -130 -130)\nfalse", :author {:login "MPechorin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3315568?v=3"}, :created-at 1431147344205, :updated-at 1431147344205, :_id "554d9350e4b03e2132e7d15e"} {:editors [{:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}], :body "user=> (def a (String. \"abc\"))\n;;=> #'user/a\n\nuser=> (def b (String. \"abc\"))\n;;=> #'user/b\n\n=> (identical? a b)\n;;=> false\n;; initialised 2 new objects\n\nuser=> (def a \"abc\")\n;;=> #'user/a\n\nuser=> (def b \"abc\")\n;;=> #'user/b\n\n=> (identical? a b)\n;;=> true\n;; refers same objects(address), look String pooling\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3", :account-source "github", :login "ertugrulcetin"}, :created-at 1470912975934, :updated-at 1470913004034, :_id "57ac59cfe4b0bafd3e2a04e3"} {:editors [{:login "wontheone1", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/11784756?v=4"}], :body ";; two keywords with the same value are the same object\n\n(= :abc :abc)\n=> true\n\n(identical? :abc :abc)\n=> true\n\n;; two symbols with the same name are different objects\n(= 'abc 'abc)\n=> true\n\n(identical? 'abc 'abc)\n=> false\n\n;; Strings are interned. see https://en.wikipedia.org/wiki/String_interning\n(= \"abc\" \"abc\")\n=> true\n(identical? \"abc\" \"abc\")\n=> true", :author {:avatar-url "https://avatars1.githubusercontent.com/u/11784756?v=4", :account-source "github", :login "wontheone1"}, :created-at 1556561354455, :updated-at 1556562044316, :_id "5cc73dcae4b0ca44402ef714"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; When there is no interning (1000 is outside long range\n;; of automatically interned numbers), autoboxing plays\n;; interesting tricks:\n\n(let [x 1000 y x]\n (identical? x y))\n;; false\n\n;; This is practically equivalent to the following, \n;; which explains what is going on during Clojure evaluation:\n(let [x 1000 y x]\n (identical? (Long/valueOf x) (Long/valueOf y)))\n;; false", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1578397898483, :updated-at 1578426767152, :_id "5e1470cae4b0ca44402ef80f"} {:updated-at 1603680840719, :created-at 1603680840719, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :body ";; In general, other examples where `identical?` returns true are\n;; often implementation-specific optimizations that can change from one\n;; JDK version to another, or one version of Clojure to another.\n;; You should think _very_ carefully before writing code that relies on\n;; `identical?` returning true.\n\n;; One scenario where it is safe to use `identical?` can be seen in the\n;; implementation of Clojure's function `get-in`, where a sentinel object\n;; is freshly constructed, and thus guaranteed to be not identical? to any\n;; other object that existed before the function was called. This new\n;; object is used as a default value in case a lookup of a key in a map fails\n;; to find a matching key. Regardless of what values the map contains, it is\n;; guaranteed that if the return value is `identical?` to this freshly allocated\n;; sentinel object, it could not have been found in the map.", :_id "5f963a48e4b0b1e3652d73f5"}], :notes nil, :arglists ["x y"], :doc "Tests if 2 arguments are the same object", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/identical_q"} {:added "1.0", :ns "clojure.core", :name "unchecked-divide-int", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1435174878967, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:ns "clojure.core", :name "quot", :library-url "https://github.com/clojure/clojure"}, :_id "558b07dee4b0fad27b85f924"}], :line 1233, :examples [{:updated-at 1599829194677, :created-at 1599829194677, :author {:login "fhightower", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/3599813?v=4"}, :body ";; like http://clojuredocs.org/clojure.core/quot, (unchecked-divide-int m n) is the value of m/n, rounded down to the nearest integer.\n\n(unchecked-divide-int 3 2)\n;; => 1\n\n(unchecked-divide-int 2 4)\n;; => 0\n\n(unchecked-divide-int 4 2)\n;; => 2\n\n(unchecked-divide-int 0 4)\n;; => 0\n\n(unchecked-divide-int 1 0)\n;; => ArithmeticException / by zero clojure.lang.Numbers.unchecked_int_divide (Numbers.java:1698)", :_id "5f5b74cae4b0b1e3652d73bb"}], :notes nil, :arglists ["x y"], :doc "Returns the division of x by y, both int.\n Note - uses a primitive operator subject to truncation.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-divide-int"} {:added "1.0", :ns "clojure.core", :name "ns-name", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1416003383632, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:ns "clojure.core", :name "the-ns", :library-url "https://github.com/clojure/clojure"}, :_id "54667f37e4b0dc573b892fc7"}], :line 4164, :examples [{:author {:login "sunng", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4cc03baa6fbb880e246ce5c9c8e247ce?r=PG&default=identicon"}, :editors [{:login "sunng", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4cc03baa6fbb880e246ce5c9c8e247ce?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; get the namespace name as a symbol\n(ns-name (the-ns 'user))\n;;=> user\n\n\n", :created-at 1327579554000, :updated-at 1416003810277, :_id "542692d4c026201cdc32701b"}], :notes nil, :arglists ["ns"], :doc "Returns the name of the namespace, a symbol.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ns-name"} {:added "1.0", :ns "clojure.core", :name "max-key", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1350408889000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "max", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e60"} {:created-at 1371841171000, :author {:login "adereth", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5ad11b4e208a6cdb3bd45fe01dea59b7?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "min-key", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e61"} {:created-at 1459931910164, :author {:login "mhmdsalem1993", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10787314?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "min", :ns "clojure.core"}, :_id "5704cb06e4b0fc95a97eab2d"}], :line 4989, :examples [{:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (max-key count \"asd\" \"bsd\" \"dsd\" \"long word\")\n\"long word\"", :created-at 1282324042000, :updated-at 1332951974000, :_id "542692c6c026201cdc3268d3"} {:body "; find the key that has the highest value in a map\nuser=> (key (apply max-key val {:a 3 :b 7 :c 9}))\n:c", :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=3"}, :created-at 1418724141005, :updated-at 1418724141005, :_id "5490032de4b09260f767ca79"} {:updated-at 1590259945797, :created-at 1590259945797, :author {:login "garaud", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/98194?v=4"}, :body ";; find the index of the highest value. Equivalent to an 'argmax' function\nuser=> (first (apply max-key second (map-indexed vector '(2 1 6 5 4))))\n2", :_id "5ec970e9e4b087629b5a1915"} {:updated-at 1619610212721, :created-at 1617247307182, :author {:login "sova", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/451489?v=4"}, :body ";; find the max :timestamp in a collection of maps.\nuser=> (def mmm [\n {:timestamp 1 :name \"v\"} \n {:timestamp 2 :name \"q\"} \n {:timestamp 3 :name \"r\"}])\n\nuser=> (apply max-key :timestamp mmm)\n{:timestamp 3, :name \"r\"}\n\nuser=> (:timestamp (apply max-key :timestamp mmm))\n3\n\n;;if the map is indexed by item-id, use an anonymous function where the key goes.\n\nuser=> (def map-with-index {\n \"gary\" {:timestamp 1 :name \"v\"} \n \"carl\" {:timestamp 2 :name \"q\"} \n \"lola\" {:timestamp 3 :name \"r\"}})\n\nuser=> (apply max-key #(:timestamp (val %)) map-with-index)\n[\"lola\" {:timestamp 3, :name \"r\"}]\n\n;notice how we replaced :timestamp with #(:timestamp (val %)) \n;to get the inner value [and not the (key %)] of the indexed version.", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/451489?v=4", :account-source "github", :login "sova"} {:avatar-url "https://avatars.githubusercontent.com/u/16775439?v=4", :account-source "github", :login "Okwori"}], :_id "60653c4be4b0b1e3652d74ad"}], :notes nil, :arglists ["k x" "k x y" "k x y & more"], :doc "Returns the x for which (k x), a number, is greatest.\n\n If there are multiple such xs, the last one is returned.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/max-key"} {:added "1.3", :ns "clojure.core", :name "*unchecked-math*", :type "var", :see-alsos [{:created-at 1441815099356, :author {:login "miner", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25400?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "*warn-on-reflection*", :ns "clojure.core"}, :_id "55f05a3be4b05246bdf20a8a"}], :examples [{:body "user=> (unchecked-add Long/MAX_VALUE 1)\n-9223372036854775808\n\nuser=> (+ Long/MAX_VALUE 1)\nArithmeticException integer overflow clojure.lang.Numbers.throwIntOverflow\n\nuser=> (set! *unchecked-math* true)\ntrue\n\nuser=> (+ Long/MAX_VALUE 1)\n-9223372036854775808", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423526557905, :updated-at 1423526557905, :_id "54d94a9de4b081e022073c80"}], :notes [{:updated-at 1339147124000, :body "Note that, even if `*unchecked-math*` is true when compiling, the unchecked operations are used only when both operands are primitive; if either operand is boxed, normal Clojure arithmetic is used (see [this message](http://groups.google.com/group/clojure/msg/532b32950db75f56) from Stuart Sierra on the Clojure Google group). This can be worked around by adding type hints (e.g. `^long`) where necessary.", :created-at 1339147124000, :author {:login "glchapman", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a5176d5d971ba68c15f4afe376aeaf18?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fe3"}], :arglists [], :doc "While bound to true, compilations of +, -, *, inc, dec and the\n coercions will be done without overflow checks. While bound\n to :warn-on-boxed, same behavior as true, and a warning is emitted\n when compilation uses boxed math. Default: false.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*unchecked-math*"} {:added "1.0", :ns "clojure.core", :name "defn-", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1358128693000, :author {:login "juan.facorro", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d6f59d93cc17c698f16e550034a2d1ad?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defn", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d56"}], :line 4925, :examples [{:updated-at 1285500672000, :created-at 1279162183000, :body "\nuser=> (ns test)\nnil\n\ntest=> (defn- foo []\n \"World!\")\n#'test/foo\n\ntest=> (defn bar []\n (str \"Hello \" (foo)))\n#'test/bar\n\ntest=> (foo)\n\"World!\"\ntest=> (bar)\n\"Hello World!\"\ntest=> (ns playground)\nnil\nplayground=> (test/bar)\n\"Hello World!\"\n\n;; Error will be thrown\n;; var: #'test/foo is not public\nplayground=> (test/foo)\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692cac026201cdc326b4a"} {:updated-at 1601478908333, :created-at 1601478908333, :author {:login "jimka2001", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/6414129?v=4"}, :body ";;It is sometimes useful to call a private function from within a test case\n(defn- my-private-fun [x] (+ x 42))\n\n;; in test case file\n(deftest t-testing-my-private-fun\n (testing \"my-private-fun\")\n (is (= 45 (#'my-private-fun 3)) \"didn't get 45 as expected\")))", :_id "5f74a0fce4b0b1e3652d73c7"}], :macro true, :notes nil, :arglists ["name & decls"], :doc "same as defn, yielding non-public def", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/defn-"} {:added "1.0", :ns "clojure.core", :name "*out*", :type "var", :see-alsos [{:created-at 1302912138000, :author {:login "hoornet", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5834f829a9def19620d4014c46642172?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "*in*", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c2b"}], :examples [{:editors [{:login "owenRiddy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8080718?v=4"}], :body ";; One approach to silence printing\n\n(def noop-writer\n ;; *out* needs to be bound to a java.io.writer, so proxy a writer\n ;; https://docs.oracle.com/javase/7/docs/api/java/io/Writer.html\n (proxy [java.io.Writer] []\n (close [] nil)\n (flush [] nil)\n (write\n ;; ... which politely ignores any calls.\n ([cbuf] nil)\n ([cbuf off len] nil))))\n=> #'user/noop-writer\n\n;; Now if we bind *out* to the no-op writer println won't do anything\n(do\n (println \"Hello?\")\n (binding [*out* noop-writer]\n ;; (.write noop-writer) will be used to print this, so nothing will happen.\n (println \"world\")))\n=> Hello?\nnil", :author {:avatar-url "https://avatars.githubusercontent.com/u/8080718?v=4", :account-source "github", :login "owenRiddy"}, :created-at 1645240924505, :updated-at 1645240999533, :_id "6210625ce4b0b1e3652d75a9"}], :notes nil, :tag "java.io.Writer", :arglists [], :doc "A java.io.Writer object representing standard output for print operations.\n\n Defaults to System/out, wrapped in an OutputStreamWriter", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*out*"} {:added "1.0", :ns "clojure.core", :name "file-seq", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1329988618000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "file", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b05"} {:created-at 1329988623000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "delete-file", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b06"}], :line 4948, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"} {:login "KlayKla", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/40676441?v=4"}], :body ";; first create a Java File object using the file function in\n;; the clojure.java.io package and use that object to create a file-seq\n;; then show the first 10 members of that seq\n\n(def f (clojure.java.io/file \"c:\\\\clojure-1.2.0\"))\n;;=> #'user/f\n(def fs (file-seq f))\n;;=> #'user/fs\n(first fs)\n;;=> #\n(clojure.pprint/pprint (take 10 fs))\n;; (#\n;; #\n;; #\n;; #\n;; #\n;; #\n;; #\n;; #\n;; #\n;; #)\n;;=>", :created-at 1313961191000, :updated-at 1625184652730, :_id "542692cbc026201cdc326bf2"} {:updated-at 1509141653447, :created-at 1509135502851, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body ";; Fill an array with the file names in a directory.\n;; Put them in an array.\n(mapv str (filter #(.isFile %) (file-seq (clojure.java.io/file \".\"))))\n\n;; Use the Path utilities to do glob filtering.\n(let [grammar-matcher (.getPathMatcher \n (java.nio.file.FileSystems/getDefault)\n \"glob:*.{g4,md}\")]\n (->> \".\"\n clojure.java.io/file\n file-seq\n (filter #(.isFile %))\n (filter #(.matches grammar-matcher (.getFileName (.toPath %))))\n (mapv #(.getAbsolutePath %))))\n\n;; At that point it may be better to just use the java.nio.file classes.\n;; https://github.com/ajoberstar/ike.cljj has some ideas", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}], :_id "59f3948ee4b0a08026c48c79"}], :notes [{:author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :updated-at 1509135556587, :created-at 1509135556587, :body "The file operations from java are https://docs.oracle.com/javase/8/docs/api/java/io/File.html", :_id "59f394c4e4b0a08026c48c7a"}], :arglists ["dir"], :doc "A tree seq on java.io.Files", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/file-seq"} {:added "1.0", :ns "clojure.core", :name "agent", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1287220581000, :author {:login "hugoduncan", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/80fa2a15219b987664e4d6f5c78b4c27?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "set-error-handler!", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b66"} {:created-at 1332037921000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "send", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b67"} {:created-at 1332037925000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "send-off", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b68"} {:created-at 1332038024000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "release-pending-sends", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b69"} {:created-at 1332038048000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "agent-error", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b6a"} {:created-at 1332038056000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "restart-agent", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b6b"} {:created-at 1349393706000, :author {:login "eric", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2b0c9ae6f1da9716451e7c86bc87230b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "add-watch", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b6c"} {:created-at 1358869462000, :author {:login "avasenin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/154699?v=3"}, :to-var {:ns "clojure.core", :name "set-error-mode!", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b6d"} {:created-at 1364873755000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "set-validator!", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b6e"} {:created-at 1568811536981, :author {:login "witek", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/209520?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "await", :ns "clojure.core"}, :_id "5d822a10e4b0ca44402ef7b7"}], :line 2054, :examples [{:author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :editors [{:login "srid", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd3a68d670372cd09876c26270a4299a?r=PG&default=identicon"} {:login "srid", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd3a68d670372cd09876c26270a4299a?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; Agents provide shared access to mutable state. \n;; They allow non-blocking (asynchronous as opposed \n;; to synchronous atoms) and independent change of \n;; individual locations (unlike coordinated change \n;; of multiple locations through refs).\n\n;; agent creates one:\n(def counter (agent 0))\n;; #'user/counter\n\n;; send requests a change to its value:\n(send counter inc)\n\n; @ or deref provides a snapshot of the current state:\n@counter\n;;=> 1\n\n;; agents can reference any data structure:\n\n(def pulp-fiction (agent {}))\n;; #'user/pulp-fiction\n\n(send pulp-fiction assoc :act-one \"PROLOGUE\")\n@pulp-fiction\n;;=> {:act-one \"PROLOGUE\"}\n\n(send pulp-fiction assoc :act-two \"VINCENT VEGA & MARSELLUS WALLACE'S WIFE\")\n@pulp-fiction\n;;=> {:act-two \"VINCENT VEGA & MARSELLUS WALLACE'S WIFE\", :act-one \"PROLOGUE\"}\n\n; From http://clojure-examples.appspot.com/clojure.core/agent with permission.", :created-at 1278720383000, :updated-at 1434143400277, :_id "542692cfc026201cdc326e6c"}], :notes nil, :arglists ["state & options"], :doc "Creates and returns an agent with an initial value of state and\n zero or more options (in any order):\n\n :meta metadata-map\n\n :validator validate-fn\n\n :error-handler handler-fn\n\n :error-mode mode-keyword\n\n If metadata-map is supplied, it will become the metadata on the\n agent. validate-fn must be nil or a side-effect-free fn of one\n argument, which will be passed the intended new state on any state\n change. If the new state is unacceptable, the validate-fn should\n return false or throw an exception. handler-fn is called if an\n action throws an exception or if validate-fn rejects a new state --\n see set-error-handler! for details. The mode-keyword may be either\n :continue (the default if an error-handler is given) or :fail (the\n default if no error-handler is given) -- see set-error-mode! for\n details.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/agent"} {:added "1.0", :ns "clojure.core", :name "ns-map", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1288055092000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "ns-interns", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bc2"} {:created-at 1288055096000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "ns-publics", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bc3"} {:created-at 1288055105000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "ns-refers", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bc4"} {:created-at 1288055110000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "ns-imports", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bc5"}], :line 4171, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [], :body "(ns-map 'clojure.core)\n{sorted-map #'clojure.core/sorted-map, read-line #'clojure.core/read-line, re-pattern #'clojure.core/re-pattern, keyword? #'clojure.core/keyword?, ClassVisitor clojure.asm.ClassVisitor, asm-type #'clojure.core/asm-type, val #'clojure.core/val, ...chop...}", :created-at 1288074955000, :updated-at 1288074955000, :_id "542692cec026201cdc326d75"} {:author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :editors [], :body ";; See also http://clojure.org/namespaces for information on namespaces in Clojure and how to inspect and manipulate them", :created-at 1348479374000, :updated-at 1348479374000, :_id "542692d4c026201cdc327019"} {:author {:login "xiepan", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c278acb4a5a933c93a68f87cbe95e16c?r=PG&default=identicon"}, :editors [], :body ";; ns-map = ns-refers + ns-interns + ns-imports\nuser=> (count (ns-imports *ns*))\n;;=> 96\n\nuser=> (count (ns-interns *ns*))\n;;=> 2\n\nuser=> (count (ns-refers *ns*))\n;;=> 590\n\nuser=> (+ *1 *2 *3)\n;;=> 688\n\nuser=> (count (ns-map *ns*))\n;;=> 688", :created-at 1356702864000, :updated-at 1356702864000, :_id "542692d4c026201cdc32701a"}], :notes nil, :arglists ["ns"], :doc "Returns a map of all the mappings for the namespace.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ns-map"} {:added "1.0", :ns "clojure.core", :name "set-validator!", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1364873765000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "atom", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ea4"} {:created-at 1364873772000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "agent", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ea5"} {:created-at 1364873776000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ea6"}], :line 2389, :examples [{:updated-at 1575082178619, :created-at 1326874022000, :body "user=> (def atm (atom [2]))\n#'user/atm\n\nuser=> (set-validator! atm #(every? even? %))\nnil\n\nuser=> (swap! atm into [5])\n#\n\nuser=> (set-validator! atm nil)\nnil\n\nuser=> (swap! atm into [5]))\n[2 5]", :editors [{:avatar-url "https://www.gravatar.com/avatar/4b9f5878e727c1bc92648eef74b99c85?r=PG&default=identicon", :account-source "clojuredocs", :login "nickbauman"} {:avatar-url "https://avatars.githubusercontent.com/u/69976?v=2", :account-source "github", :login "abrooks"} {:login "eggsyntax", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1233514?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/4b9f5878e727c1bc92648eef74b99c85?r=PG&default=identicon", :account-source "clojuredocs", :login "nickbauman"}, :_id "542692d5c026201cdc327081"} {:editors [{:login "beoliver", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1413969?v=4"}], :body "user=> (def a 1)\n#'user/a\n\nuser=> (set-validator! (var a) (fn [update-result] (< update-result 3)))\nnil\n\nuser=> (alter-var-root (var a) inc)\n2\n\nuser=> (alter-var-root (var a) inc)\nIllegalStateException Invalid reference state clojure.lang.ARef.validate (ARef.java:33)\n\nuser=> a\n2", :author {:avatar-url "https://avatars2.githubusercontent.com/u/1413969?v=4", :account-source "github", :login "beoliver"}, :created-at 1509261847201, :updated-at 1509262058025, :_id "59f58217e4b0a08026c48c7e"}], :notes [{:updated-at 1330569448000, :body "If you want your validator to throw an exception with a useful message, make sure it is a RuntimeException (or subclass), otherwise ARef#validate will throw an IllegalStateException with a generic message.", :created-at 1330569448000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fd9"}], :arglists ["iref validator-fn"], :doc "Sets the validator-fn for a var/ref/agent/atom. validator-fn must be nil or a\n side-effect-free fn of one argument, which will be passed the intended\n new state on any state change. If the new state is unacceptable, the\n validator-fn should return false or throw an exception. If the current state (root\n value if var) is not acceptable to the new validator, an exception\n will be thrown and the validator will not be changed.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/set-validator!"} {:added "1.9", :ns "clojure.core", :name "ident?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495714949645, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "simple-ident?", :ns "clojure.core"}, :_id "5926cc85e4b093ada4d4d757"} {:created-at 1495714961458, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "qualified-ident?", :ns "clojure.core"}, :_id "5926cc91e4b093ada4d4d758"} {:created-at 1596594971704, :author {:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "keyword?", :ns "clojure.core"}, :_id "5f2a1b1be4b0b1e3652d7369"} {:created-at 1596594982016, :author {:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "symbol?", :ns "clojure.core"}, :_id "5f2a1b26e4b0b1e3652d736a"}], :line 1612, :examples [{:updated-at 1596591509304, :created-at 1596591509304, :author {:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}, :body "(ident? :hello)\n;;=> true\n\n(ident? 'abc)\n;;=> true\n\n(ident? \"hi\")\n;;=> false\n\n(ident? 123)\n;;=> false", :_id "5f2a0d95e4b0b1e3652d7368"}], :notes nil, :arglists ["x"], :doc "Return true if x is a symbol or keyword", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ident_q"} {:added "1.2", :ns "clojure.core", :name "defprotocol", :file "clojure/core_deftype.clj", :type "macro", :column 1, :see-alsos [{:created-at 1289830442000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "reify", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bbd"} {:created-at 1289830461000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "extend-type", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bbe"} {:created-at 1289830466000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "extend-protocol", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bbf"} {:created-at 1302045794000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "extends?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bc0"} {:created-at 1345918777000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "satisfies?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bc1"} {:created-at 1432923297245, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :to-var {:ns "clojure.core", :name "definterface", :library-url "https://github.com/clojure/clojure"}, :_id "5568aca1e4b01ad59b65f4e7"} {:created-at 1432923360775, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :to-var {:ns "clojure.core", :name "gen-interface", :library-url "https://github.com/clojure/clojure"}, :_id "5568ace0e4b03e2132e7d17c"} {:created-at 1432923510740, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :to-var {:ns "clojure.core", :name "defrecord", :library-url "https://github.com/clojure/clojure"}, :_id "5568ad76e4b03e2132e7d17e"} {:created-at 1432923517065, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :to-var {:ns "clojure.core", :name "deftype", :library-url "https://github.com/clojure/clojure"}, :_id "5568ad7de4b03e2132e7d17f"}], :line 704, :examples [{:author {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"}, :editors [{:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"} {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"} {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"} {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"} {:login "maacl", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8ff89765136c38707e0f57cf48679a13?r=PG&default=identicon"} {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"} {:login "pjlegato", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4ce55cfd8b3ae2f63f5ecbc8fc1c05d4?r=PG&default=identicon"}], :body "(defprotocol Fly\n \"A simple protocol for flying\"\n (fly [this] \"Method to fly\"))\n\n(defrecord Bird [name species]\n Fly\n (fly [this] (str (:name this) \" flies...\")))\n\n(extends? Fly Bird)\n-> true\n\n(def crow (Bird. \"Crow\" \"Corvus corax\"))\n\n(fly crow)\n-> \"Crow flies...\"", :created-at 1286490281000, :updated-at 1348996644000, :_id "542692cfc026201cdc326e14"} {:author {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"}, :editors [{:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}], :body ";; from Stuart Halloway's examples:\n\n(defprotocol Player\n (choose [p])\n (update-strategy [p me you]))\n\n(defrecord Stubborn [choice]\n Player\n (choose [_] choice)\n (update-strategy [this _ _] this))\n\n(defrecord Mean [last-winner]\n Player\n (choose [_]\n (if last-winner\n last-winner\n (random-choice)))\n (update-strategy [_ me you]\n (->Mean (when (iwon? me you) me))))\n", :created-at 1286490493000, :updated-at 1358536428000, :_id "542692cfc026201cdc326e1c"} {:author {:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"}, :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4", :account-source "github", :login "huahaiy"}], :body ";; defprotocol does NOT support interfaces with variable argument lists, \n;; like [this & args]\n;; (this is not documented anywhere... )\n\n;; The error message encountered will be something like \"No single method: \n;; x_y_z of interface: ns.Foo found for function: x-y-z of protocol: Foo\"\n\n;; The workaround is to define the interface with the variable arg list in a fn\n;; separately outside of the protocol, which then calls the protocol interface\n;; with a slightly different name and an array in place of the variable list,\n;; like:\n\n(defprotocol MyProtocol\n (-my-fn [this args]))\n\n(defn my-fn [this & args] (-my-fn this args))", :created-at 1358608093000, :updated-at 1593221853032, :_id "542692d2c026201cdc326f80"} {:author {:login "bmabey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b966e0fe46246f9a0641fa2e322fec38?r=PG&default=identicon"}, :editors [], :body ";; Protocols allow you to add new abstractions to existing types in a clean way.\n;; Polymorphic functions are created in namespaces as opposed to\n;; having the polymorphism live on Classes as typically done in OO.\n\n;; example from: \n;; https://speakerdeck.com/bmabey/clojure-plain-and-simple?slide=230\n(ns abstraction-a)\n\n(defprotocol AbstractionA\n (foo [obj]))\n\n(extend-protocol AbstractionA\n nil\n (foo [s] (str \"foo-A!\"))\n String\n (foo [s] (str \"foo-A-\" (.toUpperCase s))))\n\n(ns abstraction-b)\n\n(defprotocol AbstractionB\n (foo [obj]))\n\n(extend-protocol AbstractionB\n nil\n (foo [s] (str \"foo-B!\"))\n String\n (foo [s] (str \"foo-B-\" (.toLowerCase s))))\n\n\nuser=> (require '[abstraction-a :as a])\n\nuser=> (require '[abstraction-b :as b])\n\nuser=> (a/foo \"Bar\")\n\"foo-A-BAR\"\n\nuser=> (b/foo \"Bar\")\n\"foo-B-bar\"\n\nuser=> (a/foo nil)\n\"foo-A!\"\n\nuser=> (b/foo nil)\n\"foo-B!\"\n", :created-at 1380075979000, :updated-at 1380075979000, :_id "542692d2c026201cdc326f81"} {:body ";; Note these differences between defprotocol and definterface:\n\n;; defprotocol requires that methods specify a first parameter, which \n;; will be the record object, while definterface requires that this\n;; parameter be left out:\n(definterface I (fooey []))\n;=> user.I\n(defprotocol P (fooey []))\n;=> IllegalArgumentException Definition of function fooey in protocol P must take at least one arg. clojure.core/emit-protocol/fn--5964 (core_deftype.clj:612)\n(defprotocol P (fooey [this]))\n;=> P\n\n;; However, defrecord requires that a parameter for the record object\n;; be used, even with interfaces. (A similar point applies to deftype.)\n(defrecord Irec [stuff] I (fooey [] \"foo\"))\n;=> CompilerException java.lang.IllegalArgumentException: Must supply at least one argument for 'this' in: fooey, compiling:(NO_SOURCE_PATH:1:1) \n(defrecord Irec [stuff] I (fooey [this] \"foo\"))\n;=> user.Irec\n(defrecord Prec [stuff] P (fooey [this] \"foo\"))\n;=> user.Prec\n\n;; Using an interface, only the dot form of the method is available with \n;; defrecord, while the protocol also allows use of normal Clojure function\n;; syntax. (Similar points apply to deftype.)\n(.fooey (Irec. 42))\n;=> \"foo\"\n(fooey (Irec. 42))\n;=> IllegalArgumentException No implementation of method: :fooey of protocol: #'user/P found for class: user.Irec clojure.core/-cache-protocol-fn (core_deftype.clj:544)\n(.fooey (Prec. 42))\n;=> \"foo\"\n(fooey (Prec. 42))\n;=> \"foo\"\n", :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :created-at 1432923158804, :updated-at 1432923158804, :_id "5568ac16e4b03e2132e7d17a"}], :macro true, :notes nil, :arglists ["name & opts+sigs"], :doc "A protocol is a named set of named methods and their signatures:\n (defprotocol AProtocolName\n\n ;optional doc string\n \"A doc string for AProtocol abstraction\"\n\n ;options\n :extend-via-metadata true\n\n ;method signatures\n (bar [this a b] \"bar docs\")\n (baz [this a] [this a b] [this a b c] \"baz docs\"))\n\n No implementations are provided. Docs can be specified for the\n protocol overall and for each method. The above yields a set of\n polymorphic functions and a protocol object. All are\n namespace-qualified by the ns enclosing the definition The resulting\n functions dispatch on the type of their first argument, which is\n required and corresponds to the implicit target object ('this' in \n Java parlance). defprotocol is dynamic, has no special compile-time \n effect, and defines no new types or classes. Implementations of \n the protocol methods can be provided using extend.\n\n When :extend-via-metadata is true, values can extend protocols by\n adding metadata where keys are fully-qualified protocol function\n symbols and values are function implementations. Protocol\n implementations are checked first for direct definitions (defrecord,\n deftype, reify), then metadata definitions, then external\n extensions (extend, extend-type, extend-protocol)\n\n defprotocol will automatically generate a corresponding interface,\n with the same name as the protocol, i.e. given a protocol:\n my.ns/Protocol, an interface: my.ns.Protocol. The interface will\n have methods corresponding to the protocol functions, and the\n protocol will automatically work with instances of the interface.\n\n Note that you should not use this interface with deftype or\n reify, as they support the protocol directly:\n\n (defprotocol P \n (foo [this]) \n (bar-me [this] [this y]))\n\n (deftype Foo [a b c] \n P\n (foo [this] a)\n (bar-me [this] b)\n (bar-me [this y] (+ c y)))\n \n (bar-me (Foo. 1 2 3) 42)\n => 45\n\n (foo \n (let [x 42]\n (reify P \n (foo [this] 17)\n (bar-me [this] x)\n (bar-me [this y] x))))\n => 17", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/defprotocol"} {:added "1.0", :ns "clojure.core", :name "swap!", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1285759338000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "atom", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e05"} {:created-at 1289908501000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "reset!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e06"} {:created-at 1416850487272, :author {:login "kumarshantanu", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109792?v=3"}, :to-var {:ns "clojure.core", :name "compare-and-set!", :library-url "https://github.com/clojure/clojure"}, :_id "54736c37e4b03d20a10242b4"} {:created-at 1527704983219, :author {:login "agarman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/138454?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "swap-vals!", :ns "clojure.core"}, :_id "5b0eed97e4b045c27b7fac7c"}], :line 2345, :examples [{:author {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"}, :editors [{:login "jamieorc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ad647269ea91f1d48b3e76624d89f1d0?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; make an atomic list\n(def players (atom ()))\n;; #'user/players\n\n;; conjoin a keyword into that list\n(swap! players conj :player1)\n;;=> (:player1)\n\n;; conjoin a second keyword into the list\n(swap! players conj :player2)\n;;=> (:player2 :player1)\n\n;; take a look at what is in the list\n(deref players)\n;;=> (:player2 :player1)", :created-at 1286491687000, :updated-at 1420734256040, :_id "542692cdc026201cdc326d54"} {:author {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"}, :editors [{:login "jamieorc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ad647269ea91f1d48b3e76624d89f1d0?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; how to: atomic counter \n(def counter (atom 0))\n;; #'user/counter\n\n(swap! counter inc)\n;;=> 1\n\n(swap! counter inc)\n;;=> 2", :created-at 1286491725000, :updated-at 1420734313570, :_id "542692cdc026201cdc326d56"} {:author {:login "esumitra", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d3df4ff6342ed6fba898021bf2d19a6d?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; swap map values\n(def m1 (atom {:a \"A\" :b \"B\"}))\n;; atom\n\n;; dereference the atom\n@m1\n;;=> {:a \"A\", :b \"B\"}\n\n;; notice that the value swapped in, is part of the returned value\n(swap! m1 assoc :a \"Aaay\")\n;;=> {:a \"Aaay\", :b \"B\"}", :created-at 1408514586000, :updated-at 1420734414461, :_id "542692d5c026201cdc32709f"} {:editors [{:login "sj4", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8431449?v=3"}], :body ";; increment a map value\n(def m1 (atom {:a \"A\" :b \"B\" :n 0}))\n;; atom\n\n;; dereference the atom\n@m1\n;;=> {:a \"A\", :b \"B\", :n 0}\n\n;; notice that the value swapped in, is part of the returned value\n(swap! m1 update-in [:n] inc)\n;;=> {:a \"A\", :b \"B\", :n 1}", :author {:avatar-url "https://avatars.githubusercontent.com/u/17842?v=3", :account-source "github", :login "ghiden"}, :created-at 1447720194998, :updated-at 1477140034391, :_id "564a7502e4b0be225c0c4794"} {:updated-at 1518531750651, :created-at 1518531750651, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body "(def car\n (atom {:make \"Audi\"\n :model \"Q3\"}))\n\n@car\n;;{:make \"Audi\", :model \"Q3\"}\n\n(swap!\n car\n assoc :model \"Q5\")\n;;{:make \"Audi\", :model \"Q5\"}\n\n(swap!\n car\n update-in [:model] str \" Sport\")\n;;{:make \"Audi\", :model \"Q5 Sport\"}", :_id "5a82f4a6e4b0316c0f44f8bb"} {:updated-at 1648892616887, :created-at 1648892539184, :author {:login "Kaspazza", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/36607370?v=4"}, :body ";; Update vector inside map\n(def data (atom {:name \"hello\" :nums []}))\n\n@data\n;; {:name \"hello\" :nums []}\n\n(swap! data update :nums conj {:first 1 :second 2})\n;; {:name \"hello\" :nums [{:first 1 :second 2}]}\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/36607370?v=4", :account-source "github", :login "Kaspazza"}], :_id "62481a7be4b0b1e3652d75c7"}], :notes [{:author {:login "amirrajan", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/517055?v=3"}, :updated-at 1466249130785, :created-at 1466249130785, :body "If you want to swap the entire atom, user `reset!`.", :_id "57652faae4b0bafd3e2a0489"} {:author {:login "KyleErhabor", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/40676441?v=4"}, :updated-at 1655085693891, :created-at 1655085693891, :body "When using `swap!`, it's important you're *only* taking into consideration the\nvalue of the atom *inside* `f`. See https://ericnormand.me/mini-guide/atom-code-explanation for more information.", :_id "62a69a7de4b0b1e3652d75fe"}], :arglists ["atom f" "atom f x" "atom f x y" "atom f x y & args"], :doc "Atomically swaps the value of atom to be:\n (apply f current-value-of-atom args). Note that f may be called\n multiple times, and thus should be free of side effects. Returns\n the value that was swapped in.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/swap!"} {:added "1.0", :ns "clojure.core", :name "vals", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1318590020000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "val", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aa9"} {:created-at 1359517156000, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "keys", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aaa"} {:created-at 1423522691570, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "key", :library-url "https://github.com/clojure/clojure"}, :_id "54d93b83e4b0e2ac61831d37"} {:created-at 1517623064066, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "hash-map", :ns "clojure.core"}, :_id "5a751718e4b0e2d9c35f7415"}], :line 1561, :examples [{:updated-at 1431626759785, :created-at 1280776235000, :body "(vals {:a \"foo\", :b \"bar\"})\n;;=> (\"foo\" \"bar\")\n\n(vals {})\n;;=> nil\n\n(vals nil)\n;;=> nil", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=2", :account-source "github", :login "phreed"} {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"} {:avatar-url "https://avatars.githubusercontent.com/u/6926?v=3", :account-source "github", :login "aleksandersumowski"} {:avatar-url "https://avatars.githubusercontent.com/u/1033604?v=3", :account-source "github", :login "fourq"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692c8c026201cdc326a08"} {:updated-at 1471129931147, :created-at 1471129931147, :author {:login "sleyzerzon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/528932?v=3"}, :body "(defn flatten-a-map [dpdnts-map]\n (apply set/union (vals dpdnts-map)))\n\n(flatten-a-map {:e #{:m :f}, :c #{:f}, :b #{:c :f}, :d #{:m :f}, :a #{:c :f}}\n\n;;=> #{:m :c :f}", :_id "57afa94be4b02d8da95c26f7"}], :notes [{:updated-at 1385457081000, :body "Functions keys and vals return sequences such that\r\n
    \r\n(= (zipmap (keys m) (vals m)) m)\r\n
    ", :created-at 1385457081000, :author {:login "akhudek", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/aaf21f137b69cc5154c8afb29b793e18?r=PG&default=identicon"}, :_id "542692edf6e94c6970522011"}], :arglists ["map"], :doc "Returns a sequence of the map's values, in the same order as (seq map).", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/vals"} {:added "1.0", :ns "clojure.core", :name "unchecked-subtract", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1289216526000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-add", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b98"} {:created-at 1289216530000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-dec", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b99"} {:created-at 1289216535000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-inc", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b9a"} {:created-at 1289216540000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-negate", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b9b"} {:created-at 1289216544000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-divide", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b9c"} {:created-at 1289216549000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-subtract", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b9d"} {:created-at 1289216555000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-multiply", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b9e"} {:created-at 1289216559000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-remainder", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b9f"} {:created-at 1423522496433, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "-", :library-url "https://github.com/clojure/clojure"}, :_id "54d93ac0e4b0e2ac61831d33"} {:created-at 1423522501593, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "-'", :library-url "https://github.com/clojure/clojure"}, :_id "54d93ac5e4b081e022073c77"}], :line 1212, :examples [{:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=3"}], :body ";; can't interchange INTs with LONGs, only F(int, int) or F(long, long)\n;; F is a function, not an\n;; overflow very easily as shown below.\n\n(unchecked-subtract Long/MIN_VALUE 5555555554)\nuser=> 9223372031299220254\n\n;; it promotes to long\n(unchecked-subtract Long/MIN_VALUE (int 1))\nuser=> 9223372036854775807\n\n(unchecked-subtract Integer/MIN_VALUE Long/MIN_VALUE)\nuser=> 9223372034707292160\n\n(unchecked-subtract Long/MIN_VALUE Long/MIN_VALUE)\nuser=> 0\n\n(unchecked-subtract Integer/MIN_VALUE Integer/MIN_VALUE)\nuser=> 0\n\n(unchecked-subtract Integer/MIN_VALUE 0)\nuser=> -2147483648\n\n;; Again, promote to long\n(unchecked-subtract Integer/MIN_VALUE 1)\nuser=> -2147483649\n\n;; To prevent long promotion, see unchecked-subtract-int ", :created-at 1289216520000, :updated-at 1418679203559, :_id "542692cac026201cdc326b46"}], :notes nil, :arglists ["x y"], :doc "Returns the difference of x and y, both long.\n Note - uses a primitive operator subject to overflow.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-subtract"} {:added "1.10", :ns "clojure.core", :name "tap>", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1590688347515, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "add-tap", :ns "clojure.core"}, :_id "5ecffa5be4b087629b5a1917"} {:created-at 1590688354528, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "remove-tap", :ns "clojure.core"}, :_id "5ecffa62e4b087629b5a1918"}], :line 7886, :examples [{:updated-at 1590688330192, :created-at 1590688330192, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :body ";; For a bit more documentation, see Clojure 1.10.0 release notes regarding\n;; tap> here:\n\n;; https://github.com/clojure/clojure/blob/master/changes.md#23-tap", :_id "5ecffa4ae4b087629b5a1916"} {:editors [{:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=4"}], :body ";; Register a tap handler\n\n(add-tap (bound-fn* clojure.pprint/pprint))\n\n;; Log using the above handler\n\n(tap> \"Hello world\")", :author {:avatar-url "https://avatars.githubusercontent.com/u/1250807?v=4", :account-source "github", :login "maxthoursie"}, :created-at 1630499566267, :updated-at 1638836325268, :_id "612f72eee4b0b1e3652d7538"} {:updated-at 1685388563826, :created-at 1685388468155, :author {:login "cloped", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25209410?v=4"}, :body ";; Using tap but returning initial content\n(defn major-champs [] [{:team-name \"SK\"}\n {:team-name \"LG\"}])\n\n(doto (major-champs)\n (tap>))\n;;=> [{:team-name \"SK\"} {:team-name \"LG\"}]", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/25209410?v=4", :account-source "github", :login "cloped"}], :_id "6474fcb4e4b08cf8563f4bc4"}], :notes [{:author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :updated-at 1651676980432, :created-at 1651676980432, :body "`tap>` is a primary tool in the [Portal](https://github.com/djblue/portal) library. ", :_id "62729734e4b0b1e3652d75e6"}], :arglists ["x"], :doc "sends x to any taps. Will not block. Returns true if there was room in the queue,\n false if not (dropped).", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/tap>"} {:added "1.0", :ns "clojure.core", :name "*warn-on-reflection*", :type "var", :see-alsos [{:created-at 1441815046413, :author {:login "miner", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25400?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "*unchecked-math*", :ns "clojure.core"}, :_id "55f05a06e4b06a9ffaad4fb9"}], :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body ";; define two variables then set *warn-on-reflection* to true and try to call\n;; one of their Java methods. Warnings are generated in both cases\n;; set *warn-on-reflection* to false and note that you can call both functions\n;; without a warning\n\nuser=> (def i 23)\n#'user/i\nuser=> (def s \"123\")\n#'user/s\nuser=> (set! *warn-on-reflection* true)\ntrue\nuser=> (.toString i)\nReflection warning, NO_SOURCE_PATH:4 - reference to field toString can't be resolved.\n\"23\"\nuser=> (.toString s)\nReflection warning, NO_SOURCE_PATH:5 - reference to field toString can't be resolved.\n\"123\"\n\n;; Reflection (and hence reflection warnings) could be removed by giving type hints:\nuser=> (.toString ^String s)\n\"123\"\n\nuser=> (set! *warn-on-reflection* false)\nfalse\nuser=> (.toString i)\n\"23\"\nuser=> (.toString s)\n\"123\"\nuser=>", :created-at 1313969775000, :updated-at 1423526770411, :_id "542692c9c026201cdc326a80"} {:updated-at 1672450302873, :created-at 1672450302873, :author {:login "randomizedthinking", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5283430?v=4"}, :body "(set! *warn-on-reflection* true) ;; turn on *warn-on-reflection*\n(def s \"abc\") ;; define s\n(.toString s) ;; => \"abc\"; WARN: type of s is unknown\n(.toString ^String s) ;; => \"abc\"; no warn given the type hint\n(let [s \"abc\"] (.toString s)) ;; => \"abc\"; no warn since Clojure can infer\n ;; type for the local binding\n(set! *warn-on-reflection* false) ;; turn off *warn-on-reflection*\n", :_id "63af90fee4b08cf8563f4b57"} {:updated-at 1672450954887, :created-at 1672450954887, :author {:login "randomizedthinking", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5283430?v=4"}, :body ";; Important to note *warn-on-reflection* take its effect at compile time,\n;; so binding the option won't work... even with a set! inside.\n;; - binding creates a new env to evaluate subsequent statements\n;; - yet, compiler still lives in the current env, so it won't see the value\n\n(binding [*warn-on-reflection* true]\n (set! *warn-on-reflection* true)\n (def s \"abc\")\n (.toString s)) ;; => \"abc\", no warning\n(println *warn-on-reflection*) ;; => false\n", :_id "63af938ae4b08cf8563f4b58"}], :notes nil, :arglists [], :doc "When set to true, the compiler will emit warnings when reflection is\n needed to resolve Java method calls or field accesses.\n\n Defaults to false.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*warn-on-reflection*"} {:added "1.1", :ns "clojure.core", :name "sorted-set-by", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1317095652000, :author {:login "pauldoo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5cb916d3c8abc9f45a093209e72489fb?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sorted-set", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e50"} {:created-at 1353458232000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "sorted-map-by", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e51"} {:created-at 1353822010000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "compare", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e52"}], :line 425, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [], :body "user> (sorted-set-by > 3 5 8 2 1)\n#{8 5 3 2 1}", :created-at 1286955847000, :updated-at 1286955847000, :_id "542692cdc026201cdc326ccc"} {:updated-at 1548548862480, :created-at 1353462397000, :body ";; Be cautious about comparison functions that only compare part of\n;; the objects:\nuser=> (defn second-< [x y]\n (< (second x) (second y)))\nuser=> (sorted-set-by second-< [:a 1] [:b 1] [:c 1])\n#{[:a 1]}\n\n;; Where did the other elements go?\n\n;; Replacing < with <= might look like a fix, but doesn't work,\n;; either:\nuser=> (defn second-<= [x y]\n (<= (second x) (second y)))\nuser=> (def s2 (sorted-set-by second-<= [:a 1] [:b 1] [:c 1]))\n#'user/s2\nuser=> s2\n#{[:c 1] [:b 1] [:a 1]}\n;; So far, so good, but set membership tests can't find the elements.\nuser=> (contains? s2 [:b 1])\nfalse\nuser=> (s2 [:c 1])\nnil\n\n;; Here is one way to write a good comparison function. When the two\n;; objects are equal in the parts we care about, use the tie-breaker\n;; 'compare' on the whole values to give them a consistent order that\n;; is only equal if the entire values are equal.\nuser=> (defn second-<-with-tie-break [x y]\n (let [c (compare (second x) (second y))]\n (if (not= c 0)\n c\n ;; Otherwise we don't care as long as ties are broken\n ;; consistently.\n (compare x y))))\nuser=> (def s3 (sorted-set-by second-<-with-tie-break [:a 1] [:b 1] [:c 1]))\n#'user/s3\nuser=> s3\n#{[:a 1] [:b 1] [:c 1]}\nuser=> (contains? s3 [:b 1])\ntrue\nuser=> (s3 [:c 1])\n[:c 1]\n;; All good now!\n\n;; See this article for more details: https://clojure.org/guides/comparators", :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}, :_id "542692d5c026201cdc327096"} {:updated-at 1533310624576, :created-at 1533310624576, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Another custom comparator example.\n;; sorted-set of colls by size descending, then normal coll equality:\n\n(sorted-set-by \n (fn [x y] (compare [(count y) x] [(count x) y]))\n [3 :a] [:b] [1 :c] [:v] [:a])\n\n;; #{[1 :c] [3 :a] [:a] [:b] [:v]}", :_id "5b6476a0e4b00ac801ed9e47"}], :notes nil, :arglists ["comparator & keys"], :doc "Returns a new sorted set with supplied keys, using the supplied\n comparator. Any equal keys are handled as if by repeated uses of\n conj.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/sorted-set-by"} {:added "1.0", :ns "clojure.core", :name "sync", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1285922313000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "dosync", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c4a"}], :line 2498, :examples nil, :macro true, :notes [{:updated-at 1285922372000, :body "Same as dosync but allows for extra options (which are not currently supported). Probably best to use dosync instead at the moment.", :created-at 1285922372000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f97"}], :arglists ["flags-ignored-for-now & body"], :doc "transaction-flags => TBD, pass nil for now\n\n Runs the exprs (in an implicit do) in a transaction that encompasses\n exprs and any nested calls. Starts a transaction if none is already\n running on this thread. Any uncaught exception will abort the\n transaction and flow out of sync. The exprs may be run more than\n once, but any effects on Refs will be atomic.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/sync"} {:added "1.9", :ns "clojure.core", :name "qualified-ident?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495714973950, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ident?", :ns "clojure.core"}, :_id "5926cc9de4b093ada4d4d759"} {:created-at 1495714979401, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "simple-ident?", :ns "clojure.core"}, :_id "5926cca3e4b093ada4d4d75a"} {:created-at 1596595698804, :author {:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "qualified-symbol?", :ns "clojure.core"}, :_id "5f2a1df2e4b0b1e3652d736e"} {:created-at 1596595706676, :author {:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "qualified-keyword?", :ns "clojure.core"}, :_id "5f2a1dfae4b0b1e3652d736f"}], :line 1622, :examples [{:updated-at 1596596073730, :created-at 1596596073730, :author {:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}, :body "(qualified-ident? 'clojure.core/asymbol)\n;;=> true\n\n(qualified-ident? ::akeyword)\n;;=> true\n\n(qualified-ident? 'asymbol)\n;;=> false\n\n(qualified-ident? :akeyword)\n;;=> false\n\n(qualified-ident? \"hello\")\n;;=> false\n\n(qualified-ident? 7)\n;;=> false\n\n(qualified-ident? nil)\n;;=> false", :_id "5f2a1f69e4b0b1e3652d7370"}], :notes nil, :arglists ["x"], :doc "Return true if x is a symbol or keyword with a namespace", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/qualified-ident_q"} {:added "1.0", :ns "clojure.core", :name "assert", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1538056745370, :author {:login "witek", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/209520?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "assert", :ns "clojure.spec.alpha"}, :_id "5bace229e4b00ac801ed9eaa"}], :line 4816, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (assert true)\nnil\n\nuser=> (assert false)\njava.lang.AssertionError: Assert failed: false (NO_SOURCE_FILE:0)\n\nuser=> (assert nil)\njava.lang.AssertionError: Assert failed: nil (NO_SOURCE_FILE:0)\n\nuser=> (assert 0)\nnil\n\nuser=> (assert [1 2 3])\nnil\n\nuser=> (assert \"foo\")\nnil", :created-at 1280547946000, :updated-at 1285496150000, :_id "542692cac026201cdc326aff"} {:body ";; Messages can help you track down what went wrong.\nuser=> (assert (= 5 (+ 2 2)) \"There are four lights!\")\n\nAssertionError Assert failed: There are four lights!", :author {:login "jakebasile", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/766907?v=2"}, :created-at 1412964928037, :updated-at 1412964928037, :_id "54382240e4b0ae7956031582"}], :macro true, :notes [{:updated-at 1372297439000, :body "The documentation (\"... and throws an exception if ...\") is incorrect. It throws AssertionError which an Error and not an Exception. They both extend Throwable but Error is not an Exception.", :created-at 1372297439000, :author {:login "Steve Kuo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/160d6580f280b5e9e5a1188b32c4ef2d?r=PG&default=identicon"}, :_id "542692edf6e94c6970522007"} {:body "By default, assertions are turned on, since the value of `*assert*` defaults to true in Clojure.", :created-at 1571604965857, :updated-at 1571606716980, :author {:avatar-url "https://avatars3.githubusercontent.com/u/601540?v=4", :account-source "github", :login "didibus"}, :_id "5dacc9e5e4b0ca44402ef7cf"}], :arglists ["x" "x message"], :doc "Evaluates expr and throws an exception if it does not evaluate to\n logical true.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/assert"} {:added "1.0", :ns "clojure.core", :name "*compile-path*", :type "var", :see-alsos nil, :examples [{:updated-at 1615140201244, :created-at 1613936568196, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :body ";; Assuming \"mypath\" exists on disk, the following AOT-compiles any form\n;; inside \"eval\" into the folder specified by \"*compile-path*\".\n\n(binding [*compile-files* true \n *compile-path* \"mypath\"]\n (eval '(+ 1 1)))\n;; 2", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "6032b7b8e4b0b1e3652d7461"}], :notes nil, :arglists [], :doc "Specifies the directory where 'compile' will write out .class\n files. This directory must be in the classpath for 'compile' to\n work.\n\n Defaults to \"classes\"", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*compile-path*"} {:added "1.0", :ns "clojure.core", :name "true?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1303250769000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "false?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521da5"} {:created-at 1420558589659, :author {:login "kappa", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/47310?v=3"}, :to-var {:ns "clojure.core", :name "boolean", :library-url "https://github.com/clojure/clojure"}, :_id "54ac00fde4b04e93c519ffb5"}], :line 512, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (true? true)\ntrue\nuser=> (true? 1)\nfalse\nuser=> (true? (= 1 1))\ntrue", :created-at 1279075280000, :updated-at 1332951307000, :_id "542692c7c026201cdc32699f"} {:updated-at 1651781147567, :created-at 1651781147567, :author {:login "starain31", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6347630?v=4"}, :body "user=> (true? false)\nfalse", :_id "62742e1be4b0b1e3652d75e7"}], :notes nil, :tag "java.lang.Boolean", :arglists ["x"], :doc "Returns true if x is the value true, false otherwise.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/true_q"} {:added "1.0", :ns "clojure.core", :name "release-pending-sends", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 2133, :examples [{:updated-at 1553649905128, :created-at 1553649905128, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; release-pending-sends makes sense when an agent produces\n;; additional actions and there is no need to wait for the update\n;; of the current agent's state.\n\n(require '[clojure.string :refer [split]])\n(def alpha (mapv agent (repeat 26 0))) ; one for each letter of the alphabet\n(def others (agent 0))\n(def words (agent {}))\n\n(def war-and-peace \"http://www.gutenberg.org/files/2600/2600-0.txt\")\n(def book (slurp war-and-peace)) ; a large book\n\n(send-off words\n (fn [state]\n (doseq [letter book\n :let [l (Character/toLowerCase letter)\n idx (- (int l) (int \\a))]] ; get the index of the correct agent\n (send (get alpha idx others) inc)) ; send an increment for each letter\n (release-pending-sends) ; release those sends\n (merge-with + state ; move on to calculate word frequencies\n (frequencies (split book #\"\\s+\")))))\n\n(apply await alpha) ; give it some time\n(map deref alpha) ; see each letter frequency in the book\n;; (202719 34657 61621 118297 313572\n;; 54901 51327 167415 172257 2575 20432\n;; 96530 61648 184185 190083 45533 2331\n;; 148431 162897 226414 64400 27087\n;; 59209 4384 46236 2388)\n", :_id "5c9ad0f1e4b0ca44402ef6e0"}], :notes nil, :arglists [""], :doc "Normally, actions sent directly or indirectly during another action\n are held until the action completes (changes the agent's\n state). This function can be used to dispatch any pending sent\n actions immediately. This has no impact on actions sent during a\n transaction, which are still held until commit. If no action is\n occurring, does nothing. Returns the number of actions dispatched.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/release-pending-sends"} {:added "1.0", :ns "clojure.core", :name "print", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1290672979000, :author {:login "dale", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a7a1eca257c6cea943fea41e5cc3e9a3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pr", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ca4"} {:created-at 1374264324000, :author {:login "lbeschastny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/416170465e4045f810f09a9300dda4dd?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "println", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ca5"} {:created-at 1374264330000, :author {:login "lbeschastny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/416170465e4045f810f09a9300dda4dd?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "print-str", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ca6"} {:created-at 1518042801277, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pprint", :ns "clojure.pprint"}, :_id "5a7b7eb1e4b0316c0f44f8ab"} {:created-at 1565163732742, :author {:login "bbatsov", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/103882?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "printf", :ns "clojure.core"}, :_id "5d4a80d4e4b0ca44402ef792"} {:created-at 1565163762897, :author {:login "bbatsov", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/103882?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "println-str", :ns "clojure.core"}, :_id "5d4a80f2e4b0ca44402ef793"}], :line 3724, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [], :body ";; same as println, but without a newline\nuser> (print \"foo\") (print \"foo\")\nfoofoo", :created-at 1293674014000, :updated-at 1293674014000, :_id "542692c8c026201cdc326a67"} {:updated-at 1638001638376, :created-at 1638001638376, :author {:login "owenRiddy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8080718?v=4"}, :body ";; Output only flushes when there is a newline. It is likely that (print)\n;; will be seen in the company of (flush).\n\n;; Buggy case. Wants to print a prompt character, but it doesn't appear.\n(print \"> \") ;; This doesn't work,\n(readline)\n\n;; Working case. The output can be flushed this way.\n(print \"> \")\n(flush)\n(readline)", :_id "61a1ebe6e4b0b1e3652d757b"} {:updated-at 1668538912352, :created-at 1668538912352, :author {:login "slk500", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/13615024?v=4"}, :body "(print \"foo\" \"foo\")\n;; => foo foo", :_id "6373e220e4b0b1e3652d7682"}], :notes [{:author {:login "jcburley", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/430319?v=4"}, :updated-at 1514410810601, :created-at 1514410810601, :body "\"Human consumption\" means, for example, that a string is printed as-is -- without surrounding double quotes and without nonprinting characters being escaped.", :_id "5a44133ae4b0a08026c48ce1"}], :arglists ["& more"], :doc "Prints the object(s) to the output stream that is the current value\n of *out*. print and println produce output for human consumption.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/print"} {:added "1.0", :ns "clojure.core", :name "empty", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1311798862000, :author {:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "not-empty", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521caf"} {:created-at 1435246081050, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:ns "clojure.core", :name "empty?", :library-url "https://github.com/clojure/clojure"}, :_id "558c1e01e4b0fad27b85f925"}], :line 5241, :examples [{:updated-at 1422931647361, :created-at 1280319600000, :body "(empty '(1 2)) ;; => ()\n(empty [1 2]) ;; => []\n(empty {1 2}) ;; => {}\n(empty #{1 2}) ;; => #{}\n\n;; Works for PersistentQueue as well, which is slightly harder to see\n(def q (conj clojure.lang.PersistentQueue/EMPTY 1))\n;; => #'user/q\nq\n;; => #\n(seq q)\n;; => (1)\n\n(def empty-q (empty q))\n;; => #'user/empty-q\nempty-q\n;; => #\n(seq empty-q)\n;; => nil\n\n;; returns nil when input is not supported or not a collection\n(empty (int-array [1 2])) ;; => nil\n(empty 1) ;; => nil\n\n(map empty [[\\a \\b] {1 2} (range 4)])\n;; => ([] {} ())\n\n(swap! (atom (range 10)) empty) \n;; => ()\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon", :account-source "clojuredocs", :login "OnesimusUnbound"} {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:avatar-url "https://www.gravatar.com/avatar/fc0969cd0910a427052f0f6281967392?r=PG&default=identicon", :account-source "clojuredocs", :login "steloflute"} {:avatar-url "https://www.gravatar.com/avatar/65f765955a0a25d112d33528ae6f811b?r=PG&default=identicon", :account-source "clojuredocs", :login "pmbauer"} {:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"} {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"}], :author {:avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon", :account-source "clojuredocs", :login "gstamp"}, :_id "542692c6c026201cdc326901"} {:updated-at 1406096618000, :created-at 1349755361000, :body ";; The output will not necessarily be of the same JVM class as the input\nuser=> (class (seq [1]))\nclojure.lang.PersistentVector$ChunkedSeq\n\nuser=> (class (empty (seq [1])))\nclojure.lang.PersistentList$EmptyList\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"}], :author {:avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon", :account-source "clojuredocs", :login "TimMc"}, :_id "542692d2c026201cdc326f9a"} {:updated-at 1438729355156, :created-at 1438729355156, :author {:login "kwladyka", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3903726?v=3"}, :body ";; Create the same data structure with the same metadata, but empty\n(def foo (with-meta #{1 2 3} {:some-meta 1}))\nfoo ;; => #{1 2 3}\n(meta foo) ;; => {:some-meta 1}\n\n(def empty-foo (empty foo))\nempty-foo ;; => #{}\n(meta empty-foo) ;; => {:some-meta 1}", :_id "55c1448be4b0080a1b79cdb6"}], :notes nil, :arglists ["coll"], :doc "Returns an empty collection of the same category as coll, or nil", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/empty"} {:added "1.0", :ns "clojure.core", :name "remove-method", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1337585035000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "get-method", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521abc"} {:created-at 1337585038000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "methods", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521abd"} {:created-at 1337585113000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "remove-all-methods", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521abe"} {:created-at 1341270408000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "prefers", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521abf"} {:created-at 1341270413000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defmulti", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ac0"} {:created-at 1341270415000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defmethod", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ac1"}], :line 1796, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; long example showing setting up a multi-method, then removing one of the \n;; methods, showing the multi-method has been removed\n\nuser=> (defmulti tos :Ob)\nnil\nuser=> (defn line [p1 p2] {:Ob :line :p1 p1 :p2 p2})\n#'user/line\nuser=> (defn circle [cent rad] {:Ob :circle :cent cent :rad rad})\n#'user/circle\nuser=> (defmethod tos :line [l] (str \"Line:\" (l :p1) (l :p2)))\n#\nuser=> (defmethod tos :circle [c] (str \"Circle:\" (c :cent) (c :rad)))\n#\nuser=> (def cc (circle [2 3] 3.3))\n#'user/cc\nuser=> (def ll (line [1 1][0 0]))\n#'user/ll\nuser=> (tos cc)\n\"Circle:[2 3]3.3\"\nuser=> (tos ll)\n\"Line:[1 1][0 0]\"\nuser=> (remove-method tos :line)\n#\nuser=> (tos ll)\njava.lang.IllegalArgumentException: No method in multimethod 'tos' for dispatch\nvalue: :line (NO_SOURCE_FILE:0)\nuser=>\n", :created-at 1313919038000, :updated-at 1313919038000, :_id "542692c6c026201cdc32690a"}], :notes nil, :arglists ["multifn dispatch-val"], :doc "Removes the method of multimethod associated with dispatch-value.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/remove-method"} {:added "1.0", :ns "clojure.core", :name "*in*", :type "var", :see-alsos [{:created-at 1302912160000, :author {:login "hoornet", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5834f829a9def19620d4014c46642172?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "*out*", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f55"}], :examples nil, :notes nil, :arglists [], :doc "A java.io.Reader object representing standard input for read operations.\n\n Defaults to System/in, wrapped in a LineNumberingPushbackReader", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*in*"} {:ns "clojure.core", :name "print-ctor", :file "clojure/core_print.clj", :type "function", :column 1, :see-alsos [{:created-at 1536529682606, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "print-dup", :ns "clojure.core"}, :_id "5b959512e4b00ac801ed9e91"} {:created-at 1536529703992, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "read-string", :ns "clojure.core"}, :_id "5b959527e4b00ac801ed9e92"}], :line 97, :examples [{:updated-at 1536529666220, :created-at 1536529666220, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; print-ctor assembles print-dup suitable constructors.\n;; The construction syntax is later used to initialize the same object type with \n;; read-string. Warning: there are security implications when evaluating untrusted\n;; sources with read-string. Be sure serialized data can't be tampered with.\n\n(defrecord Point [x y])\n;; user.Point\n\n(defmethod print-dup user.Point [o w]\n (print-ctor o (fn [o w] (print-dup (vals o) w)) w))\n;; #object[clojure.lang.MultiFn 0x2409c5d]\n\n(binding [*print-dup* true] (pr-str (Point. 1 2)))\n;; \"#=(user.Point. (1 2))\"\n\n(read-string \"#=(user.Point. (1 2))\")\n;; #user.Point{:x 1, :y 2}", :_id "5b959502e4b00ac801ed9e90"}], :notes nil, :arglists ["o print-args w"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/print-ctor"} {:added "1.0", :ns "clojure.core", :name "letfn", :special-form true, :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1290671346000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "let", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d4f"} {:created-at 1550262321823, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "fn", :ns "clojure.core"}, :_id "5c672031e4b0ca44402ef685"} {:created-at 1593366479574, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "loop", :ns "clojure.core"}, :_id "5ef8d7cfe4b0b1e3652d7318"}], :line 6543, :examples [{:updated-at 1421879657394, :created-at 1279163187000, :body "(letfn [(twice [x]\n (* x 2))\n (six-times [y]\n (* (twice y) 3))]\n (println \"Twice 15 =\" (twice 15))\n (println \"Six times 15 =\" (six-times 15)))\n;; Twice 15 = 30\n;; Six times 15 = 90\n;;=> nil\n\n;; Unable to resolve symbol: twice in this context\n(twice 4)\n;; Evaluation aborted.\n\n;; Unable to resolve symbol: six-times in this context\n(six-times 100)\n;; Evaluation aborted.\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/44d451ffa4fe640f2a0f6ec05bf5d962?r=PG&default=identicon", :account-source "clojuredocs", :login "maciek"} {:avatar-url "https://www.gravatar.com/avatar/44d451ffa4fe640f2a0f6ec05bf5d962?r=PG&default=identicon", :account-source "clojuredocs", :login "maciek"} {:avatar-url "https://www.gravatar.com/avatar/44d451ffa4fe640f2a0f6ec05bf5d962?r=PG&default=identicon", :account-source "clojuredocs", :login "maciek"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692c7c026201cdc32694c"} {:updated-at 1442001785037, :created-at 1442001785037, :author {:login "miner", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25400?v=3"}, :body ";; A contrived example of mutual recursion\n(defn even2? [n]\n (letfn [(neven? [n] (if (zero? n) true (nodd? (dec n))))\n (nodd? [n] (if (zero? n) false (neven? (dec n))))]\n (neven? n)))\n", :_id "55f33379e4b05246bdf20a8b"} {:updated-at 1465311455163, :created-at 1465311354216, :author {:login "sleyzerzon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/528932?v=3"}, :body ";;using to create comparator\n\n(defn compartr [s1 s2]\n (letfn [ (inner-author [author] ((juxt :lname :fname) author))] \n (compare (inner-author s1) (inner-author s2))))\n=> #'user/compartr\n\n(sorted-set-by compartr\n {:fname \"Steve\" :lname \"Smith\"}\n {:fname \"David\" :lname \"Smith\"})\n\n=> #{{:fname \"David\", :lname \"Smith\"} {:fname \"Steve\", :lname \"Smith\"}}", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/528932?v=3", :account-source "github", :login "sleyzerzon"}], :_id "5756e07ae4b0bafd3e2a047c"} {:updated-at 1621331030069, :created-at 1621330967298, :author {:login "green-coder", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/598193?v=4"}, :body ";; letfn can be replaced with let for recursive functions\n;; which are not mutually recursive.\n\n(letfn [(mul-2 [n]\n (if (zero? n)\n 0\n (+ 2 (mul-2 (dec n)))))]\n (mul-2 5))\n=> 10\n\n(let [mul-2 (fn mul-2 [n]\n (if (zero? n)\n 0\n (+ 2 (mul-2 (dec n)))))]\n (mul-2 5))\n=> 10", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/598193?v=4", :account-source "github", :login "green-coder"}], :_id "60a38c17e4b0b1e3652d74fe"}], :macro true, :notes [{:updated-at 1315519060000, :body "Using `letfn` allows you to create local functions that reference each other whereas `(let myfunc #(...)]...)` wouldn't because it executes its bindings serially.", :created-at 1315519060000, :author {:login "Justinus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1d9575e413b2eb108a35552b7cc0b54f?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fca"} {:body "To be more precise (about the note above), letfn allows ahead-of-definition use of functions. The following is ok:\n
    \n(defn testme [] \n  (let [twice (fn [x] (* x 2))\n        six-times (fn [y] (* (twice y) 3))] \n  (println \"15x6=\" (six-times 15))))\n
    \n\nBut this one for instance doesn't compile (and would be ok with letfn):\n\n
    \n(defn testme [] \n  (let [twelve-times (fn [x] (* (six-times x) 2)) \n        six-times (fn [y] (* y 6))] \n  (println \"2x12=\" (twelve-times 2))))\n
    \n", :created-at 1428350072457, :updated-at 1428350719864, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=3"}, :_id "5522e478e4b033f34014b766"} {:body "
    \n(letfn [(six-times [y]\n           (* (twice y) 3))\n        (twice [x]\n           (* x 2))]\n  (println \"Twice 15 =\" (twice 15))\n  (println \"Six times 15 =\" (six-times 15)))\n;; Twice 15 = 30\n;; Six times 15 = 90\n;;=> nil\n
    ", :created-at 1434901354547, :updated-at 1434901354547, :author {:login "muhuk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/40178?v=3"}, :_id "5586db6ae4b0fad27b85f91b"} {:author {:login "mars0i", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1836941?v=4"}, :updated-at 1592847494238, :created-at 1592847494238, :body "And just to clarify further what is already implicit in other remarks, `letfn` allows a definition to refer to itself recursively: \n```\n(letfn [(my-range [n]\n (when (pos? n)\n (cons n (my-range (dec n)))))]\n (my-range 5))\n;;=> (5 4 3 2 1)\n```\nbut `let` doesn't:\n```\n(let [my-range (fn [n]\n (when (pos? n)\n (cons n (my-range (dec n)))))]\n (my-range 5))\nSyntax error compiling at ...\nUnable to resolve symbol: my-range in this context\n```\n", :_id "5ef0ec86e4b0b1e3652d730c"}], :url nil, :arglists ["fnspecs & body"], :doc "fnspec ==> (fname [params*] exprs) or (fname ([params*] exprs)+)\n\n Takes a vector of function specs and a body, and generates a set of\n bindings of functions to their names. All of the names are available\n in all of the definitions of the functions, as well as the body.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/letfn", :forms ["(letfn [fnspecs*] exprs*)"]} {:added "1.7", :ns "clojure.core", :name "volatile!", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1437144380666, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "vswap!", :ns "clojure.core"}, :_id "55a9153ce4b0080a1b79cda2"} {:created-at 1437144392165, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "vreset!", :ns "clojure.core"}, :_id "55a91548e4b0080a1b79cda3"} {:created-at 1437144401502, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "volatile?", :ns "clojure.core"}, :_id "55a91551e4b06a85937088ad"} {:created-at 1437146220915, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "atom", :ns "clojure.core"}, :_id "55a91c6ce4b06a85937088af"}], :line 2525, :examples [{:updated-at 1437146196403, :created-at 1437146196403, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=3"}, :body "(def val (volatile! 0))\n\n@val\n;;=> 0\n\n(vswap! val inc)\n;;=> 1\n\n(vreset! val \"nothing\")\n;;=> \"nothing\"\n\n@val\n;;=> \"nothing\"", :_id "55a91c54e4b06a85937088ae"}], :notes [{:author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=3"}, :updated-at 1437144350368, :created-at 1437144350368, :body "An exhaustive StackOverflow question about volatile!\n\nhttp://stackoverflow.com/questions/31288608/what-is-clojure-volatile#comment50623688_31288608", :_id "55a9151ee4b06a85937088ab"} {:author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=3"}, :updated-at 1437145076111, :created-at 1437144891888, :body "Volatiles are meant to hold state in stateful transducers, since they are more performant (and less capable) than atoms.\n\nVolatiles are just a wrapped Java `volatile Object` reference. The Java `volatile`\nkeyword implies that reading and writing from this variable will not be reordered by JIT or the CPU. It does *not* imply atomicity.\n\nChanges to references made `volatile` are always \"written through\" CPU caches all the way to main memory (which is somewhat expensive), this means changes are guaranteed to propagate to other threads (nescessary in stateful transducers).", :_id "55a9173be4b0080a1b79cda4"}], :tag "clojure.lang.Volatile", :arglists ["val"], :doc "Creates and returns a Volatile with an initial value of val.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/volatile!"} {:added "1.0", :ns "clojure.core", :name "/", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1330259296000, :author {:login "frangio", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/646001f0ba2b7df47a16c0a1d5b62225?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "quot", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dc8"} {:created-at 1423528033194, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "unchecked-divide-int", :library-url "https://github.com/clojure/clojure"}, :_id "54d95061e4b0e2ac61831d45"}], :line 1020, :examples [{:updated-at 1467677691841, :created-at 1279992021000, :body "user=> (/ 6 3)\n2\n\nuser=> (/ 6 3 2)\n1\n\nuser=> (/ 10)\n1/10\n\nuser=> (/ 1 3)\n1/3\n\nuser=> (/)\nArityException Wrong number of args (0) passed to: core$-SLASH-\n\nuser=> (/ 1 0)\njava.lang.ArithmeticException\n\nuser=> (/ 0)\njava.lang.ArithmeticException\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/e7869fe1a48cb1814c657eaca6bea3eb?r=PG&default=identicon", :account-source "clojuredocs", :login "replore"} {:avatar-url "https://www.gravatar.com/avatar/e7869fe1a48cb1814c657eaca6bea3eb?r=PG&default=identicon", :account-source "clojuredocs", :login "replore"} {:avatar-url "https://www.gravatar.com/avatar/67e9a6f766dc4b30bd5e9ff3e77c1777?r=PG&default=identicon", :account-source "clojuredocs", :login "jmglov"} {:login "bkovitz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}, :_id "542692c9c026201cdc326ac5"} {:author {:login "rebcabin", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/880b0bb3a4be9237326dd69565444dee?r=PG&default=identicon"}, :editors [], :body ";;; Automatically handles floating point:\n\nuser=> (/ 43.0 2)\n21.5", :created-at 1387152003000, :updated-at 1387152003000, :_id "542692d1c026201cdc326f44"} {:updated-at 1639061278628, :created-at 1639061278628, :author {:login "idrozd", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/870478?v=4"}, :body "user=> (.numerator (/ 2 6)) \n1\nuser=> (.denominator (/ 2 6)) \n3", :_id "61b2171ee4b0b1e3652d7586"}], :notes nil, :arglists ["x" "x y" "x y & more"], :doc "If no denominators are supplied, returns 1/numerator,\n else returns numerator divided by all of the denominators.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/_fs"} {:added "1.0", :ns "clojure.core", :name "read-line", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1425998580860, :author {:login "kimtg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7685905?v=3"}, :to-var {:ns "clojure.core", :name "flush", :library-url "https://github.com/clojure/clojure"}, :_id "54ff02f4e4b01ed96c93c888"}], :line 3796, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (read-line)\nline to be read ;Type text into console\n\"line to be read\"\n", :created-at 1282634673000, :updated-at 1285494406000, :_id "542692c6c026201cdc3268c5"} {:body ";; (flush) is needed to display print values.\n;; Otherwise the print value stays buffered until you hit enter.\nuser=> (do (print \"What's your name? \") \n (flush) \n (read-line))\nWhat's your name? Clojure\n\"Clojure\"", :author {:login "kimtg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7685905?v=3"}, :created-at 1425998545713, :updated-at 1587658953937, :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/24317401?v=4", :account-source "github", :login "loeschzwerg"} {:login "dijonkitchen", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4"}], :_id "54ff02d1e4b01ed96c93c887"} {:updated-at 1475631664273, :created-at 1475631664273, :author {:login "aakoch", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/137713?v=3"}, :body "(println \"Enter something> \")\n(def x (read-line))\n(println (str \"You typed \\\"\" x \"\\\"\"))", :_id "57f45a30e4b0709b524f051f"} {:editors [{:login "stathissideris", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/162007?v=4"}], :body ";; Example of a tiny menu system. Usage:\n\n(menu {:prompt \"Which database\" \n :options [\"Localhost\" \"Remote\" {:id \"o\" :text \"Other\"}]})\n\n;; Implementation\n(require '[clojure.string :as str])\n\n(defn menu [{:keys [prompt options]}]\n (let [options (map (fn [o idx]\n (if (string? o)\n {:id (str (inc idx)) :text o}\n o)) options (range))\n valid-options (set (map :id options))]\n (loop []\n (when prompt\n (println)\n (println prompt)\n (println))\n (doseq [{:keys [id text]} options]\n (println (str \" [\" id \"]\") text))\n (println)\n (println \"or press to cancel\")\n\n (let [in (str/trim (read-line))]\n (cond (= in \"\")\n :cancelled\n\n (not (valid-options in))\n (do\n (println (format \"\\n-- Invalid option '%s'!\" in))\n (recur))\n\n :else\n (first (filter #(= in (:id %)) options)))))))", :author {:avatar-url "https://avatars2.githubusercontent.com/u/162007?v=4", :account-source "github", :login "stathissideris"}, :created-at 1598028614337, :updated-at 1598028647399, :_id "5f3ffb46e4b0b1e3652d7382"}], :notes [{:author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :updated-at 1506413349250, :created-at 1506413349250, :body "Be aware that `read-line` uses Java’s `BufferedReader`’s `.readLine` method that itself uses an internal buffer of either 4k or 8k. That causes `(read-line)` to return a truncated string if you try to read a large line.", :_id "59ca0b25e4b03026fe14ea4a"}], :arglists [""], :doc "Reads the next line from stream that is the current value of *in* .", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/read-line"} {:added "1.7", :ns "clojure.core", :name "reader-conditional?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495964626662, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reader-conditional", :ns "clojure.core"}, :_id "592a9bd2e4b093ada4d4d77b"} {:created-at 1495964632155, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "read", :ns "clojure.core"}, :_id "592a9bd8e4b093ada4d4d77c"} {:created-at 1495964638029, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "read-string", :ns "clojure.core"}, :_id "592a9bdee4b093ada4d4d77d"}], :line 7732, :examples [{:updated-at 1495963975752, :created-at 1495963975752, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body "(reader-conditional? (read-string {:read-cond :preserve} \"#?(:clj (Math/exp 1))\"))\n;;=> true\n(reader-conditional? (reader-conditional '(:clj (Math/exp 1)) false))\n;;=> true\n\n(reader-conditional? \"#?(:clj (Math/exp 1))\")\n;;=> false\n(reader-conditional? '#?(:clj (Math/exp 1)))\n;;=> false", :_id "592a9947e4b093ada4d4d779"} {:updated-at 1495964618275, :created-at 1495964618275, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body ";;;; Let's say we have the source code for a Clojure program:\n\n(def source-code\n \"(defn str-to [type s]\n (case type\n :int #?(:clj (Integer/parseInt s) :cljs (js/parseInt s))\n #?@(:clj [:long (Long/parseLong s)])\n :float #?(:clj (Float/parseFloat s) :cljs (js/parseFloat s))\n #?@(:clj [:double (Double/parseDouble s)])))\")\n\n;;;; Here's a function that finds all the reader conditionals\n;;;; in a given source code which contain a specific platform tag:\n\n(defn find-reader-conditionals [code tag]\n (->> code\n (read-string {:read-cond :preserve}) ;; read into Clojure data structures\n (tree-seq seqable? identity) ;; lazy seq of all forms\n (filter reader-conditional?) ;; keep only reader conditionals\n (filter #(some #{tag} (:form %))))) ;; keep only reader conds with tag\n\n(pprint (find-reader-conditionals source-code :clj))\n;;=> (#?(:clj (Integer/parseInt s) :cljs (js/parseInt s))\n;; #?@(:clj [:long (Long/parseLong s)])\n;; #?(:clj (Float/parseFloat s) :cljs (js/parseFloat s))\n;; #?@(:clj [:double (Double/parseDouble s)]))\n\n(pprint (find-reader-conditionals source-code :cljs))\n;;=> (#?(:clj (Integer/parseInt s) :cljs (js/parseInt s))\n;; #?(:clj (Float/parseFloat s) :cljs (js/parseFloat s)))", :_id "592a9bcae4b093ada4d4d77a"}], :notes nil, :arglists ["value"], :doc "Return true if the value is the data representation of a reader conditional", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/reader-conditional_q"} {:added "1.0", :ns "clojure.core", :name "bit-or", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1414514313045, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "bit-and", :library-url "https://github.com/clojure/clojure"}, :_id "544fc689e4b03d20a1024290"} {:created-at 1414514340059, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "bit-xor", :library-url "https://github.com/clojure/clojure"}, :_id "544fc6a4e4b03d20a1024291"}], :line 1302, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"} {:login "adeel", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd14b215b86d93682addd69690ece881?r=PG&default=identicon"}], :body "user=> (bit-or 2r1100 2r1001)\n13\n;; 13 = 2r1101\n\n;; the same in decimal\nuser=> (bit-or 12 9)\n13\n", :created-at 1280337691000, :updated-at 1303117577000, :_id "542692c6c026201cdc326929"} {:body ";; here is the truth table for OR\n(Integer/toBinaryString (bit-or 2r1100 2r1010) )\n;;=> \"1110\"\n;; or 2r1110", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1414514761650, :updated-at 1414514761650, :_id "544fc849e4b0dc573b892fb2"}], :notes nil, :arglists ["x y" "x y & more"], :doc "Bitwise or", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bit-or"} {:added "1.0", :ns "clojure.core", :name "clear-agent-errors", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1282643269000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "restart-agent", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f32"}], :line 2246, :examples nil, :deprecated "1.2", :notes nil, :arglists ["a"], :doc "DEPRECATED: Use 'restart-agent' instead.\n Clears any exceptions thrown during asynchronous actions of the\n agent, allowing subsequent actions to occur.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/clear-agent-errors"} {:added "1.0", :ns "clojure.core", :name "vector", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1291953313000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vec", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d25"} {:created-at 1291953319000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vector?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d26"} {:created-at 1291953324000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vector-of", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d27"} {:created-at 1291953354000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pop", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d28"} {:created-at 1343081413000, :author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "into", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d29"}], :line 353, :examples [{:updated-at 1340285477000, :created-at 1281948660000, :body ";; create an empty vector the long way\nuser=> (vector)\n[]\n\n;; create an empty vector the short way\nuser=> []\n[]\n\n;; you can even create vectors with nil values\nuser=> (vector nil)\n[nil]\n\n;; create a vector the long way\nuser=> (vector 1 2 3)\n[1 2 3]\n\n;; create a vector the short way\nuser=> [1 2 3]\n[1 2 3]\n\n;; checking for the 2 results above\nuser=> (class (vector 1 2 3))\nclojure.lang.PersistentVector\n\nuser=> (class [1 2 3])\nclojure.lang.PersistentVector\n\nuser=> (= (vector 1 2 3) [1 2 3])\ntrue\n\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon", :account-source "clojuredocs", :login "belun"} {:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"}], :author {:avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon", :account-source "clojuredocs", :login "gstamp"}, :_id "542692c9c026201cdc326aa6"} {:author {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"}, :editors [{:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Destructuring with a vector, inside a \"let\" form, a simple case (a symbol\n;; for each element):\n\n;; destructuring with an inline vector\nuser=> (let [[first-element second-element third-element fourth-element] \n [10 20 30 40]] \n (str \"first=\" first-element \" second=\" second-element \n \" third=\" third-element \" fourth=\" fourth-element))\n\"first=10 second=20 third=30 fourth=40\"\n;; notice how 4 symbols were created pointing to the scalars 10, 20, 30 and 40\n\n\n;; destructuring with a symbol to a vector\nuser=> (def my-vector [1 2 3 4])\n#'user/my-vector\n\nuser=> (let [[first-element second-element third-element fourth-element] my-vector] \n (str \"first=\" first-element \" second=\" second-element \n \" third=\" third-element \" fourth=\" fourth-element))\n\"first=1 second=2 third=3 fourth=4\"", :created-at 1285529828000, :updated-at 1285725388000, :_id "542692c9c026201cdc326aaa"} {:author {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"}, :editors [{:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; Destructuring with a vector, inside a \"let\" form, more complex cases:\n\nuser=> (let [[first-element second-element & the-rest] my-vector] \n (str \"first=\" first-element \" second=\" second-element \" \n the-rest=\" the-rest))\n\"first=1 second=2 the-rest=(3 4)\"\n;; notice how \"the-rest\" is a sequence\n\nuser=> (let [[first-element second-element third-element fourth-element \n :as everything] \n my-vector] \n (str \"first=\" first-element \" second=\" second-element \" \n third=\" third-element \" fourth=\" fourth-element \" \n everything=\" everything))\n\"first=1 second=2 third=3 fourth=4 everything=[1 2 3 4]\"\n;; notice how \"everything\" is the whole vector", :created-at 1285529834000, :updated-at 1331682689000, :_id "542692c9c026201cdc326ab3"} {:editors [{:login "alvarogarcia7", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4199136?v=3"}], :body ";; Create pairs from a seq\n;; (1 2 3 4) -> ([1 2] [2 3] [3 4])\n\n\n(def inp (list 1 2 3 4))\n;; (1 2 3 4)\n(map vector inp (drop 1 inp))\n;; ([1 2] [2 3] [3 4])", :author {:avatar-url "https://avatars.githubusercontent.com/u/4199136?v=3", :account-source "github", :login "alvarogarcia7"}, :created-at 1456569943409, :updated-at 1456570207244, :_id "56d17e57e4b02a6769b5a4b2"} {:updated-at 1546245875727, :created-at 1546245875727, :author {:login "abhishekamralkar", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/868407?v=4"}, :body ";; Vectors in Clojure are heterogeneous\nuser=> (def my-vector [1 \"a\" :b])\n\nuser=> my-vector\n[1 \"a\" :b]\n", :_id "5c29d6f3e4b0ca44402ef609"} {:updated-at 1587681648212, :created-at 1587681648212, :author {:login "dijonkitchen", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4"}, :body "user=> (vector {:a 1 :b 2 :c 3})\n;; [{:a 1, :b 2, :c 3}]\n\nuser=> (vec {:a 1 :b 2 :c 3})\n;; [[:a 1] [:b 2] [:c 3]]", :_id "5ea21970e4b087629b5a18e2"}], :notes nil, :arglists ["" "a" "a b" "a b c" "a b c d" "a b c d e" "a b c d e f" "a b c d e f & args"], :doc "Creates a new vector containing the args.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/vector"} {:added "1.0", :ns "clojure.core", :name "proxy-super", :file "clojure/core_proxy.clj", :type "macro", :column 1, :see-alsos [{:created-at 1354011410000, :author {:login "juan.facorro", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d6f59d93cc17c698f16e550034a2d1ad?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "proxy", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d30"}], :line 391, :examples [{:author {:login "juan.facorro", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d6f59d93cc17c698f16e550034a2d1ad?r=PG&default=identicon"}, :editors [{:login "juan.facorro", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d6f59d93cc17c698f16e550034a2d1ad?r=PG&default=identicon"} {:login "juan.facorro", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d6f59d93cc17c698f16e550034a2d1ad?r=PG&default=identicon"} {:login "juan.facorro", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d6f59d93cc17c698f16e550034a2d1ad?r=PG&default=identicon"}], :body ";; Create a proxy for java.util.ArrayList that overrides the add() \n;; method and calls the super class implementation using proxy-super.\n(def lst (proxy [java.util.ArrayList] []\n (add [x]\n (println \"Adding some stuff:\" x)\n (proxy-super add x))))\n\nuser=> (.add lst 1)\nAdding some stuff: 1\ntrue\n\nuser=> (.add lst 2)\nAdding some stuff: 2\ntrue\n\nuser=> (.add lst [:this :is :some :other :stuff])\nAdding some stuff: [:this :is :some :other :stuff]\ntrue\n\nuser=> (.size lst)\n3\n\n\n ", :created-at 1354011876000, :updated-at 1354012030000, :_id "542692d4c026201cdc327042"} {:updated-at 1601464064060, :created-at 1601464064060, :author {:login "BrunoBonacci", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1639862?v=4"}, :body ";; WARNING ON REFLECTION:\n;; because `proxy-super` expansion captures 'this without type hint,\n;; it generates a reflection warning\nuser=> (set! *warn-on-reflection* true)\ntrue\n\n(def lst (proxy [java.util.ArrayList] []\n (add [x]\n (println \"Adding some stuff:\" x)\n (proxy-super add x))))\nReflection warning, NO_SOURCE_PATH:4:14 - call to method add can't be resolved (target class is unknown).\n#'user/lst\n\nuser=> (.add lst 1)\nReflection warning, NO_SOURCE_PATH:1:1 - call to method add can't be resolved (target class is unknown).\nAdding some stuff: 1\ntrue\n\n;; In order to avoid the reflection add the type hint to 'this\n;; in the following way. Note no reflection warnings.\n;; add type to the proxy, add let binding on 'this with type\n(def ^java.util.ArrayList lst (proxy [java.util.ArrayList] []\n (add [x]\n (println \"Adding some stuff:\" x)\n (let [^java.util.ArrayList this this] ;; add explicit type to 'this\n (proxy-super add x)))))\n#'user/lst\n\nuser> (.add lst 1)\nAdding some stuff: 1\ntrue", :_id "5f746700e4b0b1e3652d73c5"}], :macro true, :notes [{:updated-at 1401348603000, :body "Note that proxy-super calls are not reentrant. If calling the base method results in another call to the virtual method you are overriding (before the proxy-super call has returned), your proxy's code will not be invoked. Instead, the call will go directly to the base class's method.\r\n", :created-at 1401348603000, :author {:login "glchapman", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a5176d5d971ba68c15f4afe376aeaf18?r=PG&default=identicon"}, :_id "542692edf6e94c6970522027"}], :arglists ["meth & args"], :doc "Use to call a superclass method in the body of a proxy method. \n Note, expansion captures 'this", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/proxy-super"} {:added "1.0", :ns "clojure.core", :name ">=", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1451249634940, :author {:login "justCxx", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6506296?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "<=", :ns "clojure.core"}, :_id "56804fe2e4b0e0706e05bd8f"} {:created-at 1588958557112, :author {:login "alexandreaquiles", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/258331?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name ">", :ns "clojure.core"}, :_id "5eb5955de4b087629b5a1905"} {:created-at 1588958562611, :author {:login "alexandreaquiles", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/258331?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "=", :ns "clojure.core"}, :_id "5eb59562e4b087629b5a1906"}], :line 1085, :examples [{:author {:login "mattdw", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ee24aacb65359196b0a1bad050f9a62f?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (>= 2 1)\ntrue\nuser=> (>= 2 2)\ntrue\nuser=> (>= 1 2)\nfalse\nuser=> (>= 6 5 4 3 2)\ntrue", :created-at 1280321990000, :updated-at 1332950567000, :_id "542692ccc026201cdc326cae"} {:updated-at 1598156842291, :created-at 1598156542824, :author {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}, :body "user=> (>= 1/2 1/3 1/4)\ntrue\n\nuser=> (<= 1/4 1/3 1/4)\nfalse\n\nuser=> (>= 1/2 0.5)\ntrue", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4", :account-source "github", :login "berczeck"}], :_id "5f41eefee4b0b1e3652d7390"}], :notes nil, :arglists ["x" "x y" "x y & more"], :doc "Returns non-nil if nums are in monotonically non-increasing order,\n otherwise false.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/>="} {:added "1.0", :ns "clojure.core", :name "drop-last", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1298747615000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "drop", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f41"} {:created-at 1298747622000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "drop-while", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f42"} {:created-at 1524421874890, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "butlast", :ns "clojure.core"}, :_id "5adcd4f2e4b045c27b7fac4a"} {:created-at 1615942867695, :author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pop", :ns "clojure.core"}, :_id "605154d3e4b0b1e3652d74a0"}], :line 2934, :examples [{:updated-at 1508194130933, :created-at 1280344984000, :body "\n(drop-last [1 2 3 4])\n;=> (1 2 3) \n\n(drop-last -1 [1 2 3 4])\n;=> (1 2 3 4) \n\n(drop-last 0 [1 2 3 4])\n;=> (1 2 3 4) \n\n(drop-last 5 [1 2 3 4])\n;=> ()\n\n;; works differently with any seq.\n;; but with some the last items become ambiguous.\n(drop-last 2 (vector 1 2 3 4))\n;=> (1 2)\n(drop-last 2 (list 1 2 3 4 ))\n;=> (1 2)\n(drop-last 2 {:a 1 :b 2 :c 3 :d 4})\n;=> ([:a 1] [:b 2])", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon", :account-source "clojuredocs", :login "zmila"}, :_id "542692cbc026201cdc326bc8"} {:updated-at 1615942982457, :created-at 1615234915525, :author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :body ";; Using `drop-last` vs. using `butlast`\n\n(def v [1 2 3 4])\n\n(butlast v) ;;=> (1 2 3)\n(drop-last v) ;;=> (1 2 3)\n(drop-last 2 v) ;;=> (1 2) butlast can't do this\n(butlast 2 v) ;;=> ArityException\n(drop-last 0 v) ;;=> (1 2 3 4) \n(drop-last -1 v) ;;=> (1 2 3 4)\n\n;; Performance differences:\n;; - `butlast`, linear time\n;; - `drop-last`, lazy, efficient, more flexible, constant time(?) \n;; - `pop`, constant but requires a vector\n\n(def r (range 10000))\n\n(time (butlast r)) ;;=> \"Elapsed time: 6.379 msecs\"\n(time (drop-last r)) ;;=> \"Elapsed time: 0.0475 msecs\"\n(time (drop-last 2 r)) ;;=> \"Elapsed time: 0.0569 msecs\"\n(time (drop-last 0 r)) ;;=> \"Elapsed time: 0.098 msecs\"\n(time (drop-last -1 r)) ;;=> \"Elapsed time: 0.0615 msecs\"\n\n(def r-vec (vec r)) ;; to work like `butlast` pop needs a vector \n(time (pop r-vec)) ;;=> \"Elapsed time: 0.062 msecs\"", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4", :account-source "github", :login "Crowbrammer"}], :_id "60468763e4b0b1e3652d7474"}], :notes [{:author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :updated-at 1524422027867, :created-at 1524422027867, :body "`drop-last` is lazy and implemented with `map`, whereas `butlast` is not lazy and implemented with `loop` and `recur`. ", :_id "5adcd58be4b045c27b7fac4b"}], :arglists ["coll" "n coll"], :doc "Return a lazy sequence of all but the last n (default 1) items in coll", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/drop-last"} {:added "1.0", :ns "clojure.core", :name "not-empty", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1311798738000, :author {:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "empty", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d87"} {:created-at 1441028012851, :author {:login "BernhardBln", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4759839?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "empty?", :ns "clojure.core"}, :_id "55e457ace4b072d7f27980f4"} {:created-at 1479824393862, :author {:login "jswalens", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/12746328?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "seq", :ns "clojure.core"}, :_id "58345409e4b0782b632278c5"}], :line 5537, :examples [{:updated-at 1484346990250, :created-at 1311798802000, :body "user=> (not-empty [1])\n[1]\nuser=> (not-empty [1 3 5])\n[1 3 5]\nuser=> (not-empty [])\nnil\nuser=> (not-empty '())\nnil\nuser=> (not-empty {})\nnil\nuser=> (not-empty nil)\nnil", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"} {:login "tkocmathla", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/183459?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon", :account-source "clojuredocs", :login "OnesimusUnbound"}, :_id "542692cfc026201cdc326e48"} {:updated-at 1480975247792, :created-at 1480975247792, :author {:login "joshdegagne", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3721599?v=3"}, :body ";; Same behaviour for strings\n\nuser> (not-empty \"hello\")\n\"hello\"\n\nuser> (not-empty \"\")\nnil", :_id "5845e38fe4b0782b632278d6"} {:editors [{:login "kopos", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/655969?v=4"}], :body ";; if-let can now work with colls also, not being limited to scalar values alone\nuser> (if-let [valid (not-empty (filter even? [2 4 6]))] valid)\n(2 4 6)\n\n;; if-let helps avoid another nested if check\nuser> (if-let [valid (not-empty (filter even? [1 3 5]))] valid)\nnil\n\n;; without not-empty we would have to work with another if conditional\nuser> (if-let [valid (filter even? [1 3 5])] valid)\n()", :author {:avatar-url "https://avatars0.githubusercontent.com/u/655969?v=4", :account-source "github", :login "kopos"}, :created-at 1586364994600, :updated-at 1586365117971, :_id "5e8e0242e4b087629b5a18d0"}], :notes nil, :arglists ["coll"], :doc "If coll is empty, returns nil, else coll", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/not-empty"} {:added "1.0", :ns "clojure.core", :name "distinct", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1396938593000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "distinct?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c04"} {:created-at 1440188357188, :author {:login "blx", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/887504?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "dedupe", :ns "clojure.core"}, :_id "55d787c5e4b0831e02cddf19"} {:created-at 1440188421908, :author {:login "blx", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/887504?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "set", :ns "clojure.core"}, :_id "55d78805e4b072d7f27980eb"}], :line 5029, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (distinct [1 2 1 3 1 4 1 5])\n(1 2 3 4 5)", :created-at 1280343931000, :updated-at 1332949923000, :_id "542692c7c026201cdc3269aa"} {:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (def fractions \n (for [n (range 1 100) d (range (inc n) 100)] \n (let [gcd (clojure.contrib.math/gcd n d)] \n (/ (/ n gcd) (/ d gcd)))))\n;; all irreducible fractions with denominator < 100\n;; (1/2 1/3 ... 1/99 2/3 1/2 2/5 1/3 ...)\n\nuser=> (count fractions)\n4851\n\nuser=> (count (distinct fractions))\n3003\n", :created-at 1280343971000, :updated-at 1285496532000, :_id "542692c7c026201cdc3269ad"} {:updated-at 1607179413496, :created-at 1607179413496, :author {:login "siddharthjain-in", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/6537820?v=4"}, :body "user=> (distinct [1/2 2/4])\n(1/2)\n\nuser=> (distinct [1/2 0.5])\n(1/2 0.5)", :_id "5fcb9c95e4b0b1e3652d7415"} {:updated-at 1654971641960, :created-at 1654971641960, :author {:login "clojer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/107184681?v=4"}, :body "user=> (apply str (distinct \"tattoo\"))\n\"tao\"", :_id "62a4dcf9e4b0b1e3652d75fc"}], :notes [{:updated-at 1285266859000, :body "If you do not need the lazyness of distinct, set can be faster. Like: (count (set some-coll)).", :created-at 1285266859000, :author {:login "morphling", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/90ffa70a579c3e0c398b7523ecdc6a87?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f96"} {:updated-at 1389130101000, :body "Use this function if you want to remove only consequtive duplicates\r\n\r\n (defn distinct-consequtive [sequence] (map first (partition-by identity sequence)))\r\n\r\n (distinct-consequtive [1 1 2 3 3 2 2 3])\r\n ;=> (1 2 3 2 3)", :created-at 1389130101000, :author {:login "vshatsky", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/20b6441a990cf524f4ce73f67f3a56d8?r=PG&default=identicon"}, :_id "542692edf6e94c6970522018"} {:author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1334295?v=3"}, :updated-at 1463670462203, :created-at 1463670462203, :body "Use [`dedupe`](https://clojuredocs.org/clojure.core/dedupe) if you want to remove consecutive duplicates, available since Clojure 1.7.", :_id "573dd6bee4b05c05173143fd"}], :arglists ["" "coll"], :doc "Returns a lazy sequence of the elements of coll with duplicates removed.\n Returns a stateful transducer when no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/distinct"} {:added "1.0", :ns "clojure.core", :name "partition", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1297761042000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "partition-all", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521da0"} {:created-at 1314290633000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "split-at", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521da1"} {:created-at 1324097144000, :author {:login "rjack", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a561494c10e6fd3367f7a0bbc18da27?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "partition-by", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521da2"} {:created-at 1526479435653, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "cycle", :ns "clojure.core"}, :_id "5afc3a4be4b045c27b7fac68"}], :line 3184, :examples [{:updated-at 1421743255734, :created-at 1279644356000, :body ";; partition a list of 20 items into 5 (20/4) lists of 4 items\n(partition 4 (range 20))\n;;=> ((0 1 2 3) (4 5 6 7) (8 9 10 11) (12 13 14 15) (16 17 18 19))\n\n;; partition a list of 22 items into 5 (20/4) lists of 4 items \n;; the last two items do not make a complete partition and are dropped.\n(partition 4 (range 22))\n;;=> ((0 1 2 3) (4 5 6 7) (8 9 10 11) (12 13 14 15) (16 17 18 19))\n\n;; uses the step to select the starting point for each partition\n(partition 4 6 (range 20))\n;;=> ((0 1 2 3) (6 7 8 9) (12 13 14 15))\n\n;; if the step is smaller than the partition size, items will be reused\n(partition 4 3 (range 20))\n;;=> ((0 1 2 3) (3 4 5 6) (6 7 8 9) (9 10 11 12) (12 13 14 15) (15 16 17 18))\n\n;; when there are not enough items to fill the last partition, a pad can be supplied.\n(partition 3 6 [\"a\"] (range 20))\n;;=> ((0 1 2) (6 7 8) (12 13 14) (18 19 \"a\"))\n\n;; when a pad is supplied, the last partition may not be of the same size as the rest\n(partition 4 6 [\"a\"] (range 20))\n;;=> ((0 1 2 3) (6 7 8 9) (12 13 14 15) (18 19 \"a\"))\n\n;; but only as many pad elements are used as necessary to fill the final partition.\n(partition 4 6 [\"a\" \"b\" \"c\" \"d\"] (range 20))\n;;=> ((0 1 2 3) (6 7 8 9) (12 13 14 15) (18 19 \"a\" \"b\"))\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:avatar-url "https://avatars.githubusercontent.com/u/59250?v=3", :account-source "github", :login "jayp"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692cdc026201cdc326d23"} {:author {:login "uvtc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/34f159f89cbd1d9beac0276f5a7af552?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; a step smaller than the partition-size results in reuse.\n(partition 3 1 [:a :b :c :d :e :f])\n;;=> ((:a :b :c) (:b :c :d) (:c :d :e) (:d :e :f))\n", :created-at 1340078697000, :updated-at 1420738171371, :_id "542692d4c026201cdc327027"} {:author {:login "Parijat Mishra", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e3aba44539a78ea92373418456f090e3?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; When there are less than n items in the coll, partition's behaviour\n;; depends on whether there is a pad or not\n\n;; without pad\n(partition 10 [1 2 3 4])\n;;=> ()\n\n;; again, without pad\n(partition 10 10 [1 2 3 4])\n;;=> ()\n\n;; with a pad this time (note: the pad is an empty sequence)\n(partition 10 10 nil [1 2 3 4])\n;;=> ((1 2 3 4))\n\n;; or, explicit empty sequence instead of nil\n(partition 10 10 [] [1 2 3 4])\n;;=> ((1 2 3 4))\n", :created-at 1340625444000, :updated-at 1420738216041, :_id "542692d4c026201cdc327028"} {:updated-at 1470789114426, :created-at 1470789114426, :author {:login "porglezomp", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1690225?v=3"}, :body ";; Partitioning 0 elements will produce an infinite seq of empty sequences\n(partition 0 [1 2 3])\n;; *hangs*\n\n(take 5 (partition 0 [1 2 3]))\n;; => (() () () () ())", :_id "57aa75fae4b0bafd3e2a04d3"} {:updated-at 1651461824771, :created-at 1520841935104, :author {:login "luciancrasovan", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/6660425?v=4"}, :body ";; Using nil as a pad will let the incomplete partition in the result\n;; Here we use it to drop every fourth emlement in an array\n(partition 3 4 nil [1 2 3 4 5 6 7 8 9])\n;;((1 2 3) (5 6 7) (9))", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/6660425?v=4", :account-source "github", :login "luciancrasovan"} {:login "siddharthjain-in", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6537820?v=4"}], :_id "5aa634cfe4b0316c0f44f91f"} {:updated-at 1526479384489, :created-at 1525990704985, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body ";; Here is a nice little trick to make a ring.\n(def foo [5 6 7 8])\n\n(partition 2 1 foo foo)\n;;=> ((5 6) (6 7) (7 8) (8 5))\n\n;; This will produce a part for each element of foo.\n;; Without the pad stops sooner.\n(partition 2 1 foo)\n;;=> ((5 6) (6 7) (7 8))\n\n;; Just how crazy can this get?\n(partition 4 1 foo foo)\n;;=> ((5 6 7 8) (6 7 8 5))\n;; Not too crazy, this illustrates the \n;; fact that the first use of the pad halts the partitioning.\n;; To my way of thinking this is not what I expected.\n\n;; The following alternative implementation continues \n;; until the coll has been consumed once completely.\n(defn spiral\n ([n step coll]\n (spiral n step coll coll))\n ([n step pad coll]\n (lazy-seq\n (when-let [s (seq coll)]\n (let [p (doall (take n s))\n item (take n (apply concat p (repeat pad)))]\n (if (< 1 (count p))\n (cons item (spiral n step pad (nthrest s step)))\n (list item)))))))\n(spiral 4 1 foo)\n;;=> ((5 6 7 8) (6 7 8 5) (7 8 5 6) (8 5 6 7))\n\n(spiral 4 2 foo)\n;;=> ((5 6 7 8) (7 8 5 6))\n\n(spiral 6 1 foo)\n;;=> ((5 6 7 8 5 6) (6 7 8 5 6 7) (7 8 5 6 7 8) (8 5 6 7 8 5))\n\n(def bar [:a :b :c])\n(spiral 6 2 bar foo)\n;;=> ((5 6 7 8 :a :b) (7 8 :a :b :c :a))\n\n;; Note that if you don’t need the padding, the function above can be\n;; simplified a lot by using cycle:\n(defn spiral\n [n offset coll]\n (take (/ (count coll) offset) (partition n offset (cycle coll))))", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"} {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}], :_id "5af4c530e4b045c27b7fac60"} {:updated-at 1545833930836, :created-at 1533240763986, :author {:login "anpr", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1492772?v=4"}, :body ";; In case you want behaviour similar to Ruby's each_slice, \n;; where the last sequence doesn't necessarily have the same \n;; size as the others, you can just provide an empty or nil pad value.\n(partition 3 3 nil (range 11))\n;;=> ((0 1 2) (3 4 5) (6 7 8) (9 10)))\n\n;; This is the default behavior of partition-all\n(partition-all 3 3 (range 11))\n;;=> ((0 1 2) (3 4 5) (6 7 8) (9 10))) \n", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/1492772?v=4", :account-source "github", :login "anpr"} {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}], :_id "5b6365bbe4b00ac801ed9e44"} {:updated-at 1566230801010, :created-at 1566230801010, :author {:login "malloryerik", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10395849?v=4"}, :body "user=> (partition 5 \"superfragilistic\")\n((\\s \\u \\p \\e \\r) (\\f \\r \\a \\g \\i) (\\l \\i \\s \\t \\i))", :_id "5d5ac911e4b0ca44402ef7a7"} {:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; There's no transducer arity for partition, but there is for partition-all\n;; To enforce full partitions only, we can provide our own reducing function…\n(let [rf (completing (fn [acc x] (cond-> acc (= 3 (count x)) (conj x))))]\n (transduce (partition-all 3) rf [] '[a b c d e f g]))\n;; => [[a b c] [d e f]]\n\n;; Or we can add a take-while transducer…\n(into [] (comp (partition-all 3) (take-while #(= 3 (count %)))) '[a b c d e f g])\n;; => [[a b c] [d e f]]", :author {:avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4", :account-source "github", :login "tomdl89"}, :created-at 1678019636162, :updated-at 1678019921400, :_id "64048c34e4b08cf8563f4b76"}], :notes nil, :arglists ["n coll" "n step coll" "n step pad coll"], :doc "Returns a lazy sequence of lists of n items each, at offsets step\n apart. If step is not supplied, defaults to n, i.e. the partitions\n do not overlap. If a pad collection is supplied, use its elements as\n necessary to complete last partition upto n items. In case there are\n not enough padding elements, return a partition with less than n items.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/partition"} {:added "1.0", :ns "clojure.core", :name "loop", :special-form true, :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1289617722000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "recur", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d7a"} {:created-at 1289618043000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "trampoline", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d7b"} {:created-at 1342652485000, :author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "when", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d7c"} {:created-at 1360216647000, :author {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "while", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d7d"} {:created-at 1551989726895, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "for", :ns "clojure.core"}, :_id "5c817bdee4b0ca44402ef6ae"} {:created-at 1551989770924, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "doseq", :ns "clojure.core"}, :_id "5c817c0ae4b0ca44402ef6af"} {:created-at 1551989783076, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reduce", :ns "clojure.core"}, :_id "5c817c17e4b0ca44402ef6b0"} {:created-at 1551989793853, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "dotimes", :ns "clojure.core"}, :_id "5c817c21e4b0ca44402ef6b1"}], :line 4575, :examples [{:author {:login "nipra", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/142529?v=3"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}], :body ";; looping is recursive in Clojure, the loop construct is a hack so that\n;; something like tail-recursive-optimization works in clojure.\n\nuser=> (defn my-re-seq [re string]\n \"Something like re-seq\"\n (let [matcher (re-matcher re string)]\n\n (loop [match (re-find matcher) ;loop starts with 2 set arguments\n result []]\n (if-not match\n result\n (recur (re-find matcher) ;loop with 2 new arguments\n (conj result match))))))\n\n#'user/my-re-seq\n\nuser=> (my-re-seq #\"\\d\" \"0123456789\")\n[\"0\" \"1\" \"2\" \"3\" \"4\" \"5\" \"6\" \"7\" \"8\" \"9\"]\n\n", :created-at 1279054191000, :updated-at 1412840234228, :_id "542692c8c026201cdc3269f4"} {:author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :editors [{:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Read decoded MP3 data in loop (requires mp3plugin.jar on class path)\n;; http://java.sun.com/javase/technologies/desktop/media/jmf/mp3/download.html \n\n(import '(javax.sound.sampled AudioSystem AudioFormat$Encoding))\n\n(let [mp3-file (java.io.File. \"tryout.mp3\")\n audio-in (AudioSystem/getAudioInputStream mp3-file)\n audio-decoded-in (AudioSystem/getAudioInputStream AudioFormat$Encoding/PCM_SIGNED audio-in)\n buffer (make-array Byte/TYPE 1024)]\n (loop []\n (let [size (.read audio-decoded-in buffer)]\n (when (> size 0)\n ;do something with PCM data\n\t(recur)))))\n", :created-at 1279556129000, :updated-at 1285499929000, :_id "542692c8c026201cdc3269f8"} {:updated-at 1436709203928, :created-at 1342652380000, :body "(loop [x 10]\n (when (> x 1)\n (println x)\n (recur (- x 2))))\n\n;;=> 10 8 6 4 2", :editors [{:login "Miloas", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/11530682?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon", :account-source "clojuredocs", :login "john.r.woodward"}, :_id "542692d4c026201cdc326ff6"} {:author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :editors [], :body "(defn find-needle [needle haystack]\n ;loop binds initial values once,\n ;then binds values from each recursion call\n (loop [needle needle\n maybe-here haystack\n not-here '()]\n\n (let [needle? (first maybe-here)]\n\n ;test for return or recur\n (if (or (= (str needle?) (str needle))\n (empty? maybe-here))\n\n ;return results\n [needle? maybe-here not-here]\n\n ;recur calls loop with new values\n (recur needle\n (rest maybe-here)\n (concat not-here (list (first maybe-here))))))))\n\nuser=>(find-needle \"|\" \"hay|stack\")\n[\\| (\\| \\s \\t \\a \\c \\k) (\\h \\a \\y)]", :created-at 1345453816000, :updated-at 1345453816000, :_id "542692d4c026201cdc326ff7"} {:author {:login "bartq", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b434a6540e72bcb335a026eb370da200?r=PG&default=identicon"}, :editors [], :body "; makes a simple template function that can be used in mustache way: http://mustache.github.com/\n(defn template [tpl env]\n (loop [tpl tpl\n env env]\n (cond (empty? env)\n tpl\n :else\n (let [[key value] (first env)]\n (recur (try (clojure.string/replace tpl \n (re-pattern (str \"\\\\{\\\\{\" (name key) \"\\\\}\\\\}\")) \n value)\n (catch Exception e tpl)) \n (rest env))))))", :created-at 1363378523000, :updated-at 1363378523000, :_id "542692d4c026201cdc326ff8"} {:updated-at 1436760791903, :created-at 1436760791903, :author {:login "Miloas", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/11530682?v=3"}, :body "(loop [iter 1\n acc 0]\n (if (> iter 10)\n (println acc)\n (recur (inc iter) (+ acc iter))))\n\n;; => 55\n;; sum from 1 to 10", :_id "55a33ad7e4b020189d740551"} {:editors [{:login "rauhs", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/11081351?v=3"}], :body ";; loop is the recursion point for recur. The symbols in loop's \n;; binding-forms are bound to their respective init-exprs and \n;; rebound to the values of recur's exprs before the next execution \n;; of loop's body.\n\n;; calculate the factorial of n\n\n(loop [n (bigint 5), accumulator 1]\n (if (zero? n)\n accumulator ; we're done\n (recur (dec n) (* accumulator n))))\n\n;;=> 120N\n\n\n;; square each number in the vector\n\n(loop [xs (seq [1 2 3 4 5])\n result []]\n (if xs\n (let [x (first xs)]\n (recur (next xs) (conj result (* x x))))\n result))\n\n;; => [1 4 9 16 25]", :author {:avatar-url "https://avatars.githubusercontent.com/u/19415437?v=3", :account-source "github", :login "clojurianix"}, :created-at 1463831813152, :updated-at 1511862332210, :_id "57404d05e4b0a1a06bdee497"} {:editors [{:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}], :body ";; A loop that sums the numbers 10 + 9 + 8 + ...\n\n;; Set initial values count (cnt) from 10 and down\n(loop [sum 0 cnt 10]\n ;; If count reaches 0 then exit the loop and return sum\n (if (= cnt 0)\n sum\n ;; Otherwise add count to sum, decrease count and \n ;; use recur to feed the new values back into the loop\n (recur (+ cnt sum) (dec cnt))))", :author {:avatar-url "https://avatars3.githubusercontent.com/u/745748?v=4", :account-source "github", :login "RobinNagpal"}, :created-at 1501353444891, :updated-at 1608672429068, :_id "597cd5e4e4b0d19c2ce9d703"} {:editors [{:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}], :body "(loop [i 0] \n (when (< i 5) \n (println i) \n (recur (inc i)))) ; loop i will take this value", :author {:avatar-url "https://avatars3.githubusercontent.com/u/745748?v=4", :account-source "github", :login "RobinNagpal"}, :created-at 1501353818637, :updated-at 1608672449492, :_id "597cd75ae4b0d19c2ce9d704"} {:updated-at 1511910753719, :created-at 1511908503199, :author {:login "phronmophobic", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/156241?v=4"}, :body ";; Iterating over a collection using loop\n\n;; 1. First call (seq xs) on the given argument and then check for nil \n;; 2. Then call next/first and use these.\n\n(loop [xs (seq [1 2 3 4 5])\n result []]\n (if xs\n (let [x (first xs)]\n (recur (next xs) (conj result (* x x))))\n result))\n\n;; the same loop can be written using destructing,\n;; but the compiler will generate two consecutive\n;; seq calls and is slightly less efficient.\n\n(loop [[x & r :as xs] (seq [])\n result []]\n (if xs\n (recur r (conj result (* x x)))\n result))", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/156241?v=4", :account-source "github", :login "phronmophobic"}], :_id "5a1de497e4b0a08026c48cc4"} {:editors [{:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}], :body ";;basic loop example #1\n\n(loop [x 0\n result []]\n (if (< x 10)\n (recur\n (inc x)\n (conj result x)) result))\n;;[0 1 2 3 4 5 6 7 8 9]\n\n;;basic loop example #2\n(def citrus-list [\"lemon\" \"orange\" \"grapefruit\"])\n\n(defn display-citrus [citruses]\n (loop [[citrus & citruses] citruses]\n (println citrus)\n (if citrus (recur citruses))))\n\n(display-citrus citrus-list)", :author {:avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4", :account-source "github", :login "ibercode"}, :created-at 1513260380816, :updated-at 1513946984454, :_id "5a32855ce4b0a08026c48cd6"} {:editors [{:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}], :body ";;loop general strategy\n;;given a collection of numbers [1 2 3 4 5],\n;;return a new collection [10 20 30 40 50]\n\n\n(def my-vector [1 2 3 4 5])\n\n(defn my-new-vector\n [coll]\n (loop [remain coll\n final-vec []]\n (if (empty? remain)\n final-vec\n (let [[unit & remaining] remain]\n (recur remaining\n (into final-vec [(* 10 unit)]))))))\n\n(my-new-vector my-vector)\n;;[10 20 30 40 50]\n\n;;to sum all the elements from the newly created collection:\n\n(reduce + (my-new-vector my-vector))\n;;150", :author {:avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4", :account-source "github", :login "ibercode"}, :created-at 1515925474334, :updated-at 1515927057530, :_id "5a5b2fe2e4b0a08026c48cf3"} {:updated-at 1542302761051, :created-at 1542302489864, :author {:login "jiro4989", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/13825004?v=4"}, :body ";; loop -> recur sample with fizzbuzz code.\n\n(defn fizzbuzz\n [n]\n (loop [f []\n i 1]\n (if (< n i)\n f\n (recur (conj f (cond\n (zero? (mod i 15)) \"fizzbuzz\"\n (zero? (mod i 3)) \"fizz\"\n (zero? (mod i 5)) \"buzz\"\n :else i))\n (inc i)))))\n\n(println (fizzbuzz 100))\n;; output is \n;; [1 2 fizz 4 buzz fizz 7 8 fizz buzz 11 fizz 13 14 fizzbuzz 16 17 fizz 19 buzz fizz 22 23 fizz buzz 26 fizz 28 29 fizzbuzz 31 32 fizz 34 buzz fizz 37 38 fizz buzz 41 fizz 43 44 fizzbuzz 46 47 fizz 49 buzz fizz 52 53 fizz buzz 56 fizz 58 59 fizzbuzz 61 62 fizz 64 buzz fizz 67 68 fizz buzz 71 fizz 73 74 fizzbuzz 76 77 fizz 79 buzz fizz 82 83 fizz buzz 86 fizz 88 89 fizzbuzz 91 92 fizz 94 buzz fizz 97 98 fizz buzz]\n", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/13825004?v=4", :account-source "github", :login "jiro4989"}], :_id "5bedab19e4b00ac801ed9efb"}], :macro true, :notes [{:updated-at 1279842159000, :body "\"Acts as a recur target.\"\r\n\r\nWhat's a recur target? A recurring target? A recursive target? I'm not a big fan of abbreviations or ambiguous terms.\r\n\r\nWouldn't it be awesome if a script could annotate all occurrences of glossary terms? Or automatically wrap glossary terms in anchor tags linking to their definition?", :created-at 1279842116000, :author {:login "Jacolyte", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon"}, :_id "542692ebf6e94c6970521f83"} {:updated-at 1279870294000, :body "The problem `loop` is trying to solve is that recursively calling the same function on the JVM is expensive and doesn't scale. It might work if your data structure is a thousand levels deep but it will fail badly with a depth of millions of levels.\r\n\r\nWhat is not possible on the JVM is what is called \"tail-call optimization\". `loop` is like a `while` loop in java, except that if you don't call `recur` (with the correct number of arguments) the loop will exit. In while-loop terms, `recur` avoids that a `break` statement is executed.\r\n\r\n
    int counter = 0;\r\nwhile (true) {\r\n   if (counter < 10) {\r\n      // recur\r\n      counter = inc(counter);\r\n   } else {\r\n      break;\r\n   }\r\n}\r\n
    \r\n\r\nIn that sense `loop` is a recur target as in \"target for recursion\".", :created-at 1279847110000, :author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :_id "542692ebf6e94c6970521f84"} {:updated-at 1279866045000, :body "I wish the word recur in this document linked to the recur function. That'd be... awesome.", :created-at 1279866045000, :author {:login "Jacolyte", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon"}, :_id "542692ebf6e94c6970521f85"} {:updated-at 1279892164000, :body "It really should (and will) show up in the 'vars in' section. \r\n\r\nThe problem is that recur is a special form, and is not parsed out correctly like other vars. This will be fixed in the future.", :created-at 1279892142000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :_id "542692ebf6e94c6970521f86"} {:body "Majority of `loop`s that novices write can be expressed more elegantly using 3 fundamental functions `map`, `filter` and `reduce`. Or using list comprehension `for`.", :created-at 1423042890947, :updated-at 1423043065278, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :_id "54d1e94ae4b0e2ac61831d0e"} {:body "To be clear, there's no *technical* reason the JVM can't support tail recursion (despite some complications to do with call stacks and security) - it just doesn't happen to support them currently.\n\nPeople have been requesting this enhancement for at least a decade - [here's one proposal](https://blogs.oracle.com/jrose/entry/tail_calls_in_the_vm), for example.", :created-at 1430499038628, :updated-at 1430499038628, :author {:login "pmonks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/54865?v=3"}, :_id "5543aedee4b06eaacc9cda86"}], :arglists ["bindings & body"], :doc "Evaluates the exprs in a lexical context in which the symbols in\n the binding-forms are bound to their respective init-exprs or parts\n therein. Acts as a recur target.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/loop", :forms ["(loop [bindings*] exprs*)"]} {:added "1.0", :ns "clojure.core", :name "add-classpath", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 5152, :examples [{:updated-at 1507317464731, :created-at 1507317464731, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body ";; There are alternatives\n\n;; https://github.com/cemerick/pomegranate\n\n;; http://grokbase.com/p/gg/clojure/12bnhbvmpy/how-to-add-an-url-into-the-classpath\n", :_id "59d7d6d8e4b03026fe14ea57"}], :deprecated "1.1", :notes nil, :arglists ["url"], :doc "DEPRECATED \n\n Adds the url (String or URL object) to the classpath per\n URLClassLoader.addURL", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/add-classpath"} {:added "1.0", :ns "clojure.core", :name "bit-flip", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 1343, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (bit-flip 2r1011 2)\n15 \n;; 15 = 2r1111\n\n(bit-flip 2r1111 2)\n11 \n;; 11 = 2r1011", :created-at 1280339556000, :updated-at 1332952408000, :_id "542692c8c026201cdc326a6b"}], :notes nil, :arglists ["x n"], :doc "Flip bit at index n", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bit-flip"} {:added "1.0", :ns "clojure.core", :name "long-array", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "longs", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917397000, :_id "542692ebf6e94c6970521ea2"} {:created-at 1581624427170, :author {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "int-array", :ns "clojure.core"}, :_id "5e45ac6be4b0ca44402ef834"} {:created-at 1581624433858, :author {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "float-array", :ns "clojure.core"}, :_id "5e45ac71e4b0ca44402ef835"} {:created-at 1581624442586, :author {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "double-array", :ns "clojure.core"}, :_id "5e45ac7ae4b0ca44402ef836"} {:created-at 1581624451957, :author {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "boolean-array", :ns "clojure.core"}, :_id "5e45ac83e4b0ca44402ef837"}], :line 5340, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"} {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"} {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}], :body ";; create a long array using long-array and show it can be used\n;; with the standard Java Arrays functions binarySearch and fill\n;; note the needed coercions\n\nuser=> (def is (long-array (range 3 20)))\n#'user/is\nuser=> (vec is)\n[3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]\nuser=> (java.util.Arrays/binarySearch is (long 10))\n7\nuser=> (java.util.Arrays/fill is 3 8 (long 99))\nnil\nuser=> (vec is)\n[3 4 5 99 99 99 99 99 11 12 13 14 15 16 17 18 19]\nuser=>", :created-at 1313907019000, :updated-at 1313963219000, :_id "542692c7c026201cdc326962"}], :notes nil, :arglists ["size-or-seq" "size init-val-or-seq"], :doc "Creates an array of longs", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/long-array"} {:added "1.0", :ns "clojure.core", :name "descendants", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1400492134000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ancestors", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ead"}], :line 5614, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; simple example a toy poodle is a poodle is a dog is an animal\n\nuser=> (derive ::dog ::animal)\nnil\nuser=> (derive ::poodle ::dog)\nnil\nuser=> (derive ::toy_poodle ::poodle)\nnil\nuser=> (descendants ::animal)\n#{:user/toy_poodle :user/poodle :user/dog}\nuser=>", :created-at 1313968073000, :updated-at 1313968073000, :_id "542692c8c026201cdc326a24"} {:updated-at 1597842188323, :created-at 1597842188323, :author {:login "uosl", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/3865590?v=4"}, :body ";; You can combine `descendants` with `parents` to only get the immediate children.\n\n(filter #(contains? (parents h %) tag)\n (descendants h tag))", :_id "5f3d230ce4b0b1e3652d7381"}], :notes nil, :arglists ["tag" "h tag"], :doc "Returns the immediate and indirect children of tag, through a\n relationship established via derive. h must be a hierarchy obtained\n from make-hierarchy, if not supplied defaults to the global\n hierarchy. Note: does not work on Java type inheritance\n relationships.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/descendants"} {:added "1.0", :ns "clojure.core", :name "merge", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1294676416000, :author {:login "Nebulus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/61aa4140c24b0cded6b20d88200e7f16?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "merge-with", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ad7"} {:created-at 1317787765000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "hash-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ad8"} {:created-at 1536776434976, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "assoc", :ns "clojure.core"}, :_id "5b9958f2e4b00ac801ed9e95"}], :line 3041, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "srid", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd3a68d670372cd09876c26270a4299a?r=PG&default=identicon"} {:login "srid", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd3a68d670372cd09876c26270a4299a?r=PG&default=identicon"} {:login "srid", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd3a68d670372cd09876c26270a4299a?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(merge {:a 1 :b 2 :c 3} {:b 9 :d 4})\n;;=> {:d 4, :a 1, :b 9, :c 3}", :created-at 1279071769000, :updated-at 1422374016946, :_id "542692cfc026201cdc326e73"} {:author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :editors [{:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"} {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(merge {:a 1} nil) ;=> {:a 1}\n(merge nil {:a 1}) ;=> {:a 1}\n(merge nil nil) ;=> nil\n", :created-at 1401310493000, :updated-at 1422374049474, :_id "542692d4c026201cdc32700c"} {:body ";; `merge` can be used to support the setting of default values\n(merge {:foo \"foo-default\" :bar \"bar-default\"} \n {:foo \"custom-value\"})\n;;=> {:foo \"custom-value\" :bar \"bar-default\"}\n\n;; This is useful when a function has a number of options\n;; with default values.\n(defn baz [& options]\n (let [options (merge {:opt1 \"default-1\" :opt2 \"default-2\"} \n (first options))]\n options))\n\n(baz {:opt1 \"custom-1\" :opt3 \"custom-3\"})\n;;=> {:opt3 \"custom-3\" :opt1 \"custom-1 :opt2 \"default-2\"}\n", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1422375001817, :updated-at 1422375001817, :_id "54c7b859e4b0e2ac61831cdf"} {:editors [{:login "dijonkitchen", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4"}], :body ";; For recursively merging deeply-nested maps:\n\n(defn deep-merge [v & vs]\n (letfn [(rec-merge [v1 v2]\n (if (and (map? v1) (map? v2))\n (merge-with deep-merge v1 v2)\n v2))]\n (if (some identity vs)\n (reduce #(rec-merge %1 %2) v vs)\n (last vs))))\n\n(deep-merge {:a {:b true}} {:a {:b false}} {:a {:b nil}})\n;; {:a {:b nil}}\n\n(deep-merge {:a 1} nil)\n;; nil ;; note that this isn't consistent with the regular merge function\n\n;; Source: https://gist.github.com/danielpcox/c70a8aa2c36766200a95#gistcomment-2677502", :author {:avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4", :account-source "github", :login "dijonkitchen"}, :created-at 1535149214818, :updated-at 1536856542156, :_id "5b80849ee4b00ac801ed9e75"} {:updated-at 1548252366101, :created-at 1548252366101, :author {:login "genmeblog", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/38646601?v=4"}, :body ";; latest comment under above gist provides another\n;; simpler and more consistent version of deep-merge\n;; Source: https://gist.github.com/danielpcox/c70a8aa2c36766200a95#gistcomment-2759497\n\n(defn deep-merge [a & maps]\n (if (map? a)\n (apply merge-with deep-merge a maps)\n (apply merge-with deep-merge maps)))\n\n(deep-merge {:a {:b true}} {:a {:b false}} {:a {:b nil}})\n;; => {:a {:b nil}}\n\n(deep-merge {:a 1} nil)\n;; => {:a 1}\n", :_id "5c4874cee4b0ca44402ef622"} {:updated-at 1566278942641, :created-at 1566278942641, :author {:login "liuchong", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/236058?v=4"}, :body "(merge {:x 1 :y 2} {:y 3 :z 4})\n;; => {:x 1, :y 3, :z 4}", :_id "5d5b851ee4b0ca44402ef7a8"} {:editors [{:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/19522656?v=4"}], :body ";; Looking at the source code, merge starts with the \n;; original collection and uses conj which adds elements \n;; as is into the collection, so merge can be used\n;; with more than just maps--i.e. using a vector returns a vector.\n\n(merge [:a \"Whoa\"] [:c \"Crash Bandicoot\"])\n;; => [:a \"Whoa\" [:c \"Crash Bandicoot\"]]\n(merge [:a \"Whoa\"] \"Crash Bandicoot\")\n;; => [:a \"Whoa\" \"Crash Bandicoot\"]", :author {:avatar-url "https://avatars0.githubusercontent.com/u/19522656?v=4", :account-source "github", :login "Crowbrammer"}, :created-at 1610333321854, :updated-at 1610333698491, :_id "5ffbbc89e4b0b1e3652d7429"}], :notes [{:body "### When to use assoc, conj, merge\n\n`assoc`, `conj` & `merge` behave very differently for different data structures\n\nIf you are writing a function that can handle multiple kinds of collections, then your choice will make a big difference.\n\nTreat merge as a maps-only function (its similar to conj for other collections).\n\nMy opinion:\n\n* `assoc` - use when you are 'changing' existing key/value pairs\n* `conj` - use when you are 'adding' new key/value pairs\n* `merge` - use when you are combining two or more maps\n\nRef : https://stackoverflow.com/a/3204346", :created-at 1620798989281, :updated-at 1620799011530, :author {:avatar-url "https://avatars.githubusercontent.com/u/1042312?v=4", :account-source "github", :login "udkl"}, :_id "609b6e0de4b0b1e3652d74f9"}], :arglists ["& maps"], :doc "Returns a map that consists of the rest of the maps conj-ed onto\n the first. If a key occurs in more than one map, the mapping from\n the latter (left-to-right) will be the mapping in the result.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/merge"} {:added "1.0", :ns "clojure.core", :name "accessor", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1412886553460, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "get", :library-url "https://github.com/clojure/clojure"}, :_id "5436f019e4b0ae795603157e"}], :line 4071, :examples [{:author {:login "tormaroe", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8bc7bb10bee96efb190053fe92ffd250?r=PG&default=identicon"}, :editors [], :body "(defstruct car-struct :make :model :year :color)\n\n(def car (struct car-struct \"Toyota\" \"Prius\" 2010))\n\n(def make (accessor car-struct :make))\n\nuser=> (make car) ; Same as both (car :make) and (:make car)\n\"Toyota\" \n\n", :created-at 1289603045000, :updated-at 1289603045000, :_id "542692cac026201cdc326b11"}], :notes nil, :arglists ["s key"], :doc "Returns a fn that, given an instance of a structmap with the basis,\n returns the value at the key. The key must be in the basis. The\n returned function should be (slightly) more efficient than using\n get, but such use of accessors should be limited to known\n performance-critical areas.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/accessor"} {:added "1.0", :ns "clojure.core", :name "integer?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1440146014714, :author {:login "muhuk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/40178?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "number?", :ns "clojure.core"}, :_id "55d6e25ee4b0831e02cddf15"} {:created-at 1495654427514, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "int?", :ns "clojure.core"}, :_id "5925e01be4b093ada4d4d73b"}], :line 1374, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (integer? 1)\ntrue\nuser=> (integer? 1.0)\nfalse", :created-at 1279074074000, :updated-at 1332950732000, :_id "542692c8c026201cdc326a30"} {:updated-at 1487037245803, :created-at 1487037245803, :author {:login "jungziege", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/405465?v=3"}, :body ";; Note: tests if it's a math integer, not a Java Integer\nuser=> (integer? (inc Integer/MAX_VALUE))\ntrue", :_id "58a2633de4b01f4add58fe53"} {:updated-at 1495656170180, :created-at 1495656170180, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :body ";; integer? returns true for BigInts. If you don't want this behavior, you can \n;; use the int? predicate instead in Clojure 1.9 or later:\n\n(integer? 13N)\n;; => true\n\n(int? 13N)\n;; => false", :_id "5925e6eae4b093ada4d4d742"}], :notes nil, :arglists ["n"], :doc "Returns true if n is an integer", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/integer_q"} {:added "1.4", :ns "clojure.core", :name "mapv", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1413326056085, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "map", :library-url "https://github.com/clojure/clojure"}, :_id "543da4e8e4b02688d208b1b8"} {:created-at 1507137288794, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "vec", :ns "clojure.core"}, :_id "59d51708e4b03026fe14ea4f"} {:created-at 1516208408133, :author {:login "jcburley", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/430319?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reduce", :ns "clojure.core"}, :_id "5a5f8118e4b0a08026c48cfa"} {:created-at 1516208418039, :author {:login "jcburley", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/430319?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pmap", :ns "clojure.core"}, :_id "5a5f8122e4b0a08026c48cfb"}], :line 6903, :examples [{:editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "totorigolo", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1183296?v=4"}], :updated-at 1542244482242, :created-at 1421096939041, :author {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}, :body "(mapv inc [1 2 3 4 5])\n;;=> [2 3 4 5 6]\n\n\n;; mapv can be used with multiple collections. Collections will be consumed\n;; and passed to the mapping function in parallel:\n(mapv + [1 2 3] [4 5 6])\n;;=> [5 7 9]\n\n\n;; When mapv is passed more than one collection, the mapping function will\n;; be applied until one of the collections runs out:\n(mapv + [1 2 3] (iterate inc 1))\n;;=> [2 4 6]\n\n\n\n;; mapv is often used in conjunction with the # reader macro:\n(mapv #(str \"Hello \" % \"!\" ) [\"Ford\" \"Arthur\" \"Tricia\"])\n;;=> [\"Hello Ford!\" \"Hello Arthur!\" \"Hello Tricia!\"]\n\n;; A useful idiom to pull \"columns\" out of a collection of collections. \n;; Note, it is equivalent to:\n;; (mapv vector [:a :b :c] [:d :e :f] [:g :h :i])\n\n(apply mapv vector [[:a :b :c]\n [:d :e :f]\n [:g :h :i]])\n;;=> [[:a :d :g] [:b :e :h] [:c :f :i]]", :_id "54b437ebe4b081e022073c02"} {:updated-at 1584701507565, :created-at 1573719104514, :author {:login "kangbb", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/15232085?v=4"}, :body ";; The difference between `map` and `mapv` is that:\n;; `map` return a lazy sequence,\n;; `mapv` return a sequence.\n(def result (map println [1 2 3]))\n;;=> #'user/result\nresult\n;;=> 1\n;; 2\n;; 3\n;; (nil nil nil)\n\n(def result (mapv println [1 2 3]))\n;;=> 1\n;; 2\n;; 3\n;; #'user/result\nresult\n;;=> [nil nil nil]\n\n;; So, we can use it when we want to get a side effect immediately.\n", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/15232085?v=4", :account-source "github", :login "kangbb"} {:login "graycodes", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1530754?v=4"}], :_id "5dcd0c40e4b0ca44402ef7de"} {:updated-at 1619002206128, :created-at 1619001516133, :author {:login "sFritsch09", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/58191603?v=4"}, :body ";; convert number to vector:\n; numb = 210\n\n((fn [numb] (mapv #(Character/digit % 10) (str numb))) 210)\n;;=> [2 1 0]\n\n;; and the other way around:\n\n(read-string (reduce str [2 1 0]))\n;;=> 210", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/58191603?v=4", :account-source "github", :login "sFritsch09"}], :_id "608000ace4b0b1e3652d74c9"}], :notes [{:body "Like `map` but returns a vector. In most cases equivalent to calling `(into [] (map f c1 c2 ...))`. Is much faster than map (but is not lazy!) in the `(mapv f coll)` case.", :created-at 1430433040188, :updated-at 1430433049879, :author {:login "num1", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/466333?v=3"}, :_id "5542ad10e4b06eaacc9cda82"} {:author {:login "KingMob", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/946421?v=4"}, :updated-at 1596048409289, :created-at 1596048409289, :body "It's not necessarily true at all that `mapv` will be faster than `map`. `mapv` (and related fns like `filterv`) have increased memory needs (creating unused values, realizing intermediate sequences, etc) that hurt it.\n\nHere's a simple example showing how `mapv`/`filterv` can be slower. (Benchmarked with criterium.)\n\n```\n(let [nums (range 10000000)]\n (bench\n (reduce +' 0 (filter even? (map #(* % %) nums))))\n\n (bench\n (reduce +' 0 (filterv even? (mapv #(* % %) nums)))))\n```\nand the results, showing `map` is actually a little faster than `mapv`:\n\n```\nEvaluation count : 120 in 60 samples of 2 calls.\n Execution time mean : 768.870217 ms\n Execution time std-deviation : 21.043586 ms\n Execution time lower quantile : 756.049838 ms ( 2.5%)\n Execution time upper quantile : 835.719808 ms (97.5%)\n Overhead used : 1.805367 ns\n\nFound 9 outliers in 60 samples (15.0000 %)\n\tlow-severe\t 3 (5.0000 %)\n\tlow-mild\t 6 (10.0000 %)\n Variance from outliers : 14.2178 % Variance is moderately inflated by outliers\n\n\n\nEvaluation count : 120 in 60 samples of 2 calls.\n Execution time mean : 800.356084 ms\n Execution time std-deviation : 49.667013 ms\n Execution time lower quantile : 756.382597 ms ( 2.5%)\n Execution time upper quantile : 883.471627 ms (97.5%)\n Overhead used : 1.805367 ns\n\nFound 12 outliers in 60 samples (20.0000 %)\n\tlow-severe\t 5 (8.3333 %)\n\tlow-mild\t 1 (1.6667 %)\n\thigh-mild\t 6 (10.0000 %)\n Variance from outliers : 46.7536 % Variance is moderately inflated by outliers\n```\n\nThe takeaway is, don't pick `mapv` just for speed reasons.", :_id "5f21c419e4b0b1e3652d7327"}], :arglists ["f coll" "f c1 c2" "f c1 c2 c3" "f c1 c2 c3 & colls"], :doc "Returns a vector consisting of the result of applying f to the\n set of first items of each coll, followed by applying f to the set\n of second items in each coll, until any one of the colls is\n exhausted. Any remaining items in other colls are ignored. Function\n f should accept number-of-colls arguments.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/mapv"} {:added "1.2", :ns "clojure.core", :name "partition-all", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1313710375000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "partition", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c74"} {:created-at 1313710383000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "partition-by", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c75"}], :line 7240, :examples [{:updated-at 1420742107199, :created-at 1279643883000, :body "(partition 4 [0 1 2 3 4 5 6 7 8 9])\n;;=> ((0 1 2 3) (4 5 6 7))\n\n(partition-all 4 [0 1 2 3 4 5 6 7 8 9])\n;;=> ((0 1 2 3) (4 5 6 7) (8 9))\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692ccc026201cdc326c8e"} {:author {:login "Tap", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/925c5d43b739098e6f16f804f5dc4868?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(partition-all 2 4 [0 1 2 3 4 5 6 7 8 9])\n;;=> ((0 1) (4 5) (8 9))", :created-at 1349617127000, :updated-at 1420742136613, :_id "542692d4c026201cdc327029"} {:updated-at 1599548333018, :created-at 1373311985000, :body ";; Caution: Partitioning lazy sequence code freeze\n;; Edit: Only because (rdr l) is buggy and returns an infinite sequence!\n\n(def l [1 2 3 4 5])\n;create a simple lazy sequence function testing only\n;(rdr l) returns a lazy sequence from l\n(def rdr (fn reader[x] (cons (first x) (lazy-seq (reader (rest x))))))\n\n;the line below will freeze\n(doall (partition-all 2 (rdr l)) )\n\n;add-in a take-while statement do exit the lazy sequence on nil\n(doall (partition-all 2 (take-while (complement nil?) (rdr l))))", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "rbuchmann", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/611792?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/ee33873c26c4a6b7e1daa3ebb777d58c?r=PG&default=identicon", :account-source "clojuredocs", :login "gerritjvv"}, :_id "542692d4c026201cdc32702a"} {:updated-at 1561100812644, :created-at 1561100482422, :author {:login "ningDr", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/38251752?v=4"}, :body ";; When the step parameter is provided, the starting index value of the first item in the \n;; next group steps relative to the current index value\n;; 提供step参数时,下一个分组的第一项的起始索引值相对于当前索引值的步进(+ pre-index step)\n(println (partition-all 2 3 '(0 1 2 3 4 5 6 7 8 9)))\n;; => ((0 1) (3 4) (6 7) (9))\n(println (partition-all 4 3 '(0 1 2 3 4 5 6 7 8 9)))\n;; => ((0 1 2 3) (3 4 5 6) (6 7 8 9) (9))\n;; When n is equal to step, it is equivalent to no step parameter\n;; 当n与step相等,相当于无step参数\n(println (partition-all 3 3 '(0 1 2 3 4 5 6 7 8 9)))\n;; => ((0 1 2) (3 4 5) (6 7 8) (9))", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/38251752?v=4", :account-source "github", :login "ningDr"}], :_id "5d0c80c2e4b0ca44402ef75b"}], :notes nil, :arglists ["n" "n coll" "n step coll"], :doc "Returns a lazy sequence of lists like partition, but may include\n partitions with fewer than n items at the end. Returns a stateful\n transducer when no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/partition-all"} {:added "1.2", :ns "clojure.core", :name "partition-by", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1313710412000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "partition", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ee1"} {:created-at 1313710420000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "partition-all", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ee2"} {:created-at 1331014947000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "group-by", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ee3"} {:created-at 1496446489487, :author {:login "stellingsimon", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/7038847?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "dedupe", :ns "clojure.core"}, :_id "5931f619e4b06e730307db21"} {:created-at 1553712274503, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "sort", :ns "clojure.core"}, :_id "5c9bc492e4b0ca44402ef6ea"} {:created-at 1659193765852, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "split-with", :ns "clojure.core"}, :_id "62e549a5e4b0b1e3652d7634"}], :line 7160, :examples [{:author {:login "wilkes", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/20a7eb5b792999d37386ddf622543c71?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (partition-by #(= 3 %) [1 2 3 4 5])\n((1 2) (3) (4 5))", :created-at 1279936678000, :updated-at 1332949621000, :_id "542692c7c026201cdc3269da"} {:author {:login "wilkes", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/20a7eb5b792999d37386ddf622543c71?r=PG&default=identicon"}, :editors [{:login "wilkes", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/20a7eb5b792999d37386ddf622543c71?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (partition-by odd? [1 1 1 2 2 3 3])\n((1 1 1) (2 2) (3 3))\n\nuser=> (partition-by even? [1 1 1 2 2 3 3])\n((1 1 1) (2 2) (3 3))\n", :created-at 1279936736000, :updated-at 1285497469000, :_id "542692c7c026201cdc3269dc"} {:updated-at 1597775773722, :created-at 1318525613000, :body ";; (this is part of a solution from 4clojure.com/problem 30)\nuser=> (partition-by identity \"Leeeeeerrroyyy\")\n((\\L) (\\e \\e \\e \\e \\e \\e) (\\r \\r \\r) (\\o) (\\y \\y \\y))", :editors [{:avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon", :account-source "clojuredocs", :login "belun"} {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "rfemygdio", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/26044589?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon", :account-source "clojuredocs", :login "belun"}, :_id "542692d4c026201cdc32702b"} {:editors [{:login "smnplk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/380618?v=3"}], :updated-at 1466670505123, :created-at 1412082807145, :author {:avatar-url "https://avatars.githubusercontent.com/u/1698238?v=2", :account-source "github", :login "martinhynar"}, :body ";; Note that previously created 'bins' are not used when same value is seen again\nuser=> (partition-by identity \"ABBA\")\n((\\A) (\\B \\B) (\\A))\n\n;; That is why you use group-by function if you want all the the same values in the same 'bins' :) \n;; Which gives you a hash, but you can extract values from that if you need.\n\n(group-by identity \"ABBA\")\n=> {\\A [\\A \\A], \\B [\\B \\B]}", :_id "542aac77e4b0df9bb778a599"} {:body ";; Arbitrary partitioning\n(let [seen (atom true)]\n (partition-by #(cond\n (#{1} %) (reset! seen (not @seen))\n (or (and (string? %)\n (< (count %) 2))\n (char? %)) \"letter\"\n (string? %) \"string\"\n (#{0} %) 0\n (vector? %) (count %)\n :else \"rest\")\n [1 1 1 2 3 nil \"a\" \\l 0 4 5 {:a 1} \"bc\" \"aa\" \"k\" [0] [1 1] [2 2]]))\n;;=> ((1) (1) (1) (2 3 nil) (\"a\" \\l) (0) (4 5 {:a 1}) (\"bc\" \"aa\") (\"k\") ([0]) ([1 1] [2 2]))", :author {:login "vede1", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8151095?v=2"}, :created-at 1414773403982, :updated-at 1415348351870, :editors [{:login "vede1", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8151095?v=2"}], :_id "5453ba9be4b0dc573b892fb5"} {:updated-at 1458482052841, :created-at 1458482052841, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body "user=> (partition-by count [\"a\" \"b\" \"ab\" \"ac\" \"c\"])\n\n;;=> ((\"a\" \"b\") (\"ab\" \"ac\") (\"c\"))", :_id "56eeab84e4b0b41f39d96cea"} {:updated-at 1557411490030, :created-at 1557411490030, :author {:login "artemiy312", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/13870342?v=4"}, :body "user=> (partition-by identity [1 1 1 1 2 2 3])\n;;=> ((1 1 1 1) (2 2) (3))\n", :_id "5cd436a2e4b0ca44402ef71e"} {:editors [{:login "johanatan", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/583903?v=4"}], :body "I think this is a better (more agnostic & more declarative/functional)\narbitrary partitioning. The ratio of true:false can be tweaked for longer\naverage sequence length.\n\n(defn arbitrarily-partition [coll]\n (let [signals (take (count coll) (cycle [true false]))\n shuffled (shuffle signals)\n zipped (map vector shuffled coll)\n partitioned (partition-by first zipped)]\n (for [c partitioned]\n (map second c))))\n\n;;=> (arbitrarily-partition (range 100))\n((0 1) (2) (3) (4 5) (6 7) (8 9 10) (11) (12) (13 14 15) (16) (17 18) (19) (20) (21) (22 23 24 25 26) (27 28) (29) (30 31) (32) (33 34 35 36 37 38) (39 40 41) (42) (43 44 45 46 47) (48 49) (50) (51 52 53) (54) (55 56) (57 58) (59 60 61) (62) (63) (64) (65 66) (67 68) (69) (70) (71) (72 73 74 75) (76) (77 78) (79) (80) (81 82) (83 84 85) (86) (87 88) (89 90 91 92 93) (94) (95 96 97) (98) (99))", :author {:avatar-url "https://avatars3.githubusercontent.com/u/583903?v=4", :account-source "github", :login "johanatan"}, :created-at 1597704699181, :updated-at 1597724481351, :_id "5f3b09fbe4b0b1e3652d737a"}], :notes [{:updated-at 1338786617000, :body "It's worth mentioning that `(partition-by identity …)` is equivalent to the `Data.List.group` function in Haskell:\r\n\r\n
     \r\n(defn group [coll]\r\n  (partition-by identity coll))\r\n
    \r\n\r\nWhich proves to be an interesting idiom:\r\n\r\n
    user=> (apply str \r\n         (for [ch (group \"fffffffuuuuuuuuuuuu\")] \r\n           (str (first ch) (count ch))))\r\n⇒ \"f7u12\"\r\n
    ", :created-at 1338782914000, :author {:login "Iceland_jack", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c889e0a95a3bb07f90ab28ad442f1127?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fe1"} {:author {:login "rauhs", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/11081351?v=3"}, :updated-at 1511875643591, :created-at 1511875643591, :body "Many other programming languages like Kotlin or Haskell define `partition` slightly different. They partition the given collection into two collections, the first containing all truthy values and the second elements all falsy elements. This function does it:\n\n```\n(defn partition-2\n \"Partitions the collection into exactly two [[all-truthy] [all-falsy]]\n collection.\"\n [pred coll]\n (mapv persistent!\n (reduce\n (fn [[t f] x]\n (if (pred x)\n [(conj! t x) f]\n [t (conj! f x)]))\n [(transient []) (transient [])]\n coll)))\n(partition-2 odd? (range 5))\n\n```", :_id "5a1d643be4b0a08026c48cc3"} {:author {:login "jcburley", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/430319?v=4"}, :updated-at 1516207930627, :created-at 1516207930627, :body "I tried this implementation of your Kotlin/Haskell `partition`, which is simpler but somewhat slower (less than 2x):\n\n```\n(defn partition-3\n \"Partitions the collection into exactly two [[all-truthy] [all-falsy]]\n collection.\"\n [pred coll]\n (let [m (group-by pred coll)]\n [(m true) (m false)]))\n```", :_id "5a5f7f3ae4b0a08026c48cf9"} {:body "A third implementation which in my limited testing in cljs is the fastest so far:\n```\n(defn split-by\n \"Effectively though non-lazily splits the `coll`ection using `pred`,\n essentially like `[(filter coll pred) (remove coll pred)]`\"\n [pred coll]\n (let [match (transient [])\n no-match (transient [])]\n (doseq [v coll]\n (if (pred v)\n (conj! match v)\n (conj! no-match v)))\n [(persistent! match) (persistent! no-match)]))\n```\n\nUsing `simple-benchmark` in cljs, these are the results:\n```\n[r (range 1000)], (partition-2 odd? r), 1000 runs, 167 msecs\n[r (range 1000)], (partition-3 odd? r), 1000 runs, 364 msecs\n[r (range 1000)], (split-by odd? r), 1000 runs, 60 msecs\n```\n\nIt's worth noting that all implementations of the java-esque `partition` in this thread are non-lazy.\n\nOn big collections where you don't want to realize the whole list, this is the fastest:\n```\n[(filter odd? r) (filter (complement odd?) r)]\n```\n\nCan also be written as:\n\n```\n((juxt filter remove) odd? r)\n```\n\n(taken from: http://blog.jayfields.com/2011/08/clojure-partition-by-split-with-group.html)", :created-at 1576139342503, :updated-at 1576139618518, :author {:avatar-url "https://avatars0.githubusercontent.com/u/2477927?v=4", :account-source "github", :login "Saikyun"}, :_id "5df1fa4ee4b0ca44402ef7f6"} {:author {:login "zackteo", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/7510179?v=4"}, :updated-at 1620302811324, :created-at 1620302811324, :body "Perhaps this will be of help someone trying to find the regions denoted by partitions\n```\n(defn partition-at\n \"Like partition-by but will start a new run when f returns true\"\n [f coll]\n (lazy-seq\n (when-let [s (seq coll)]\n (let [run (cons (first s) (take-while #(not (f %)) (rest s)))]\n (cons run (partition-at f (drop (count run) s)))))))\n```\n(taken from: http://cninja.blogspot.com/2011/02/clojure-partition-at.html#comments)", :_id "6093dbdbe4b0b1e3652d74f4"}], :arglists ["f" "f coll"], :doc "Applies f to each value in coll, splitting it each time f returns a\n new value. Returns a lazy seq of partitions. Returns a stateful\n transducer when no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/partition-by"} {:added "1.2", :ns "clojure.core", :name "numerator", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1314000040000, :author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "denominator", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c62"}], :line 3582, :examples [{:updated-at 1596571068249, :created-at 1313999955000, :body ";; note that the function always returns the numerator of the reduced fraction\n\n(numerator (/ 2 3))\n;;=> 2\n\nuser=> (map numerator [(/ 2 4) (/ 4 6) (/ 6 8)])\n(1 2 3)\n", :editors [{:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon", :account-source "clojuredocs", :login "shockbob"}, :_id "542692cbc026201cdc326be1"}], :notes nil, :tag "java.math.BigInteger", :arglists ["r"], :doc "Returns the numerator part of a Ratio.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/numerator"} {:added "1.2", :ns "clojure.core", :name "object-array", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 5325, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; create an array of Java Objects using object-array\n;; and demonstrate that it can be used with the Java fill function\n\nuser=> (def os (object-array [nil 23.2 \"abc\" 33]))\n#'user/os\nuser=> (vec os)\n[nil 23.2 \"abc\" 33]\nuser=> (java.util.Arrays/fill os 31415)\nnil\nuser=> (vec os)\n[31415 31415 31415 31415]\nuser=>", :created-at 1313961890000, :updated-at 1313961890000, :_id "542692c6c026201cdc3268d2"}], :notes nil, :arglists ["size-or-seq"], :doc "Creates an array of objects", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/object-array"} {:added "1.0", :ns "clojure.core", :name "with-out-str", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1398723561000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-in-str", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e63"}], :line 4716, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3", :account-source "github", :login "bkovitz"}], :body ";; Instead of printing, the following will place the output normally\n;; sent to stdout into a string.\n\nuser=> (with-out-str (println \"this should return as a string\"))\n\"this should return as a string\\n\"\n", :created-at 1280928491000, :updated-at 1461945233822, :_id "542692c8c026201cdc326a43"} {:editors [{:login "viebel", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/955710?v=3"} {:login "bkovitz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3"}], :body ";; `time` prints the elapsed time. `with-out-str` can put it into a variable.\n\n(def elapsed\n (with-out-str\n (time (last (range 10000)))))\n\nelapsed\n;=> \"\\\"Elapsed time: 49.363055 msecs\\\"\\n\"\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/955710?v=3", :account-source "github", :login "viebel"}, :created-at 1458892903287, :updated-at 1461945165867, :_id "56f4f067e4b07ac9eeceed16"} {:updated-at 1493591261548, :created-at 1493591261548, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/8271291?v=3"}, :body "(defmacro with-out-str-data-map\n [& body]\n `(let [s# (new java.io.StringWriter)]\n (binding [*out* s#]\n (let [r# ~@body]\n {:result r#\n :str (str s#)}))))\n\n(with-out-str-data-map (do\n (println \"Clojure is the best!\")\n 2))\n\n;;=> {:str \"Clojure is the best!\\n\", :result 2}", :_id "590664dde4b01f4add58fe9f"} {:updated-at 1504610437254, :created-at 1504610437254, :author {:login "yogsototh", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/93899?v=4"}, :body "(defn pp-str [x]\n (with-out-str (clojure.pprint/pprint x))\n\n\n(pp-str {:foo \"foo\" :bar \"bar\"})\n;;=> \"{:foo \\\"foo\\\", :bar \\\"bar\\\"}\\n\"\n", :_id "59ae8885e4b09f63b945ac5f"}], :macro true, :notes nil, :arglists ["& body"], :doc "Evaluates exprs in a context in which *out* is bound to a fresh\n StringWriter. Returns the string created by any nested printing\n calls.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/with-out-str"} {:added "1.0", :ns "clojure.core", :name "condp", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1289183336000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "cond", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b46"} {:created-at 1334294023000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "if", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b47"} {:created-at 1470961020992, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "case", :ns "clojure.core"}, :_id "57ad157ce4b0bafd3e2a04e5"}], :line 6359, :examples [{:author {:login "jneira", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2c8ecc24181d171df85a26458b9cd5f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:login "kimtg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7685905?v=3"}], :body ";; Taken from the excellent clojure tutorial:\n;; http://java.ociweb.com/mark/clojure/article.html\n\n(print \"Enter a number: \")\n(flush) ; stays in a buffer otherwise\n(let [line (read-line)\n value (try\n (Integer/parseInt line)\n (catch NumberFormatException e line))] ; use string val if not int\n (println\n (condp = value\n 1 \"one\"\n 2 \"two\"\n 3 \"three\"\n (str \"unexpected value, \\\"\" value \\\")))\n (println\n (condp instance? value\n Number (* value 2)\n String (* (count value) 2))))\n", :created-at 1278989834000, :updated-at 1425998195013, :_id "542692cbc026201cdc326be2"} {:updated-at 1494204573950, :created-at 1279027225000, :body ";; (some #{4 5 9} [1 2 3 4]) \n;; is the first matching clause, \n;; the match value is 4 which is decremented\n(condp some [1 2 3 4]\n #{0 6 7} :>> inc\n #{4 5 9} :>> dec\n #{1 2 3} :>> #(+ % 3))\n;;=> 3", :editors [{:avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon", :account-source "clojuredocs", :login "kotarak"} {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "adamdavislee", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/8780347?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon", :account-source "clojuredocs", :login "kotarak"}, :_id "542692cbc026201cdc326be4"} {:author {:login "kotarak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon"}, :editors [{:login "kotarak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; in this case there is no matching clause\n;; so an exception is raised.\n(condp some [1 2 3 4]\n #{0 6 7} :>> inc\n #{5 9} :>> dec)\n\n;; java.lang.IllegalArgumentException: No matching clause: [1 2 3 4]", :created-at 1279027251000, :updated-at 1421191702604, :_id "542692cbc026201cdc326be7"} {:author {:login "kotarak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; a composite predicate which parses a string with \"re-seq\" \n;; producing a list which is made into a \"seq\".\n(condp (comp seq re-seq) \"foo=bar\"\n #\"[+](\\w+)\" :>> #(vector (-> % first (nth 1) keyword) true)\n #\"[-](\\w+)\" :>> #(vector (-> % first (nth 1) keyword) false)\n #\"(\\w+)=(\\S+)\" :>> #(let [x (first %)]\n [(keyword (nth x 1)) (nth x 2)]))\n;;=> [:foo \"bar\"]", :created-at 1279027512000, :updated-at 1421192246892, :_id "542692cbc026201cdc326bea"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; See examples for \"if\" explaining Clojure's idea of logical true\n;; and logical false.", :created-at 1334294027000, :updated-at 1334294027000, :_id "542692d2c026201cdc326f69"} {:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [], :body ";;this is with liberator\n;;branching on request method\n(defresource my-resource\n :exists? (fn [{:keys [db] {query-params :query-params \n body :body \n method :request-method} \n :request}]\n \n (condp = method\n :get (my-get-exists-fn)\n :post (my-post-exists-fn))))", :created-at 1367366404000, :updated-at 1367366404000, :_id "542692d2c026201cdc326f6a"} {:author {:login "leesper", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f150e0f851c74d1b9c001b901b29a287?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; a recursive function to calculate length\n;; same as 'count'\n(defn length [lst]\n (condp = lst\n (list) 0 ; if empty list result 0\n (+ 1 (length (rest lst))))) ; default expression\n\n(length '(1 2 3))\n;;=> 3", :created-at 1375971960000, :updated-at 1421192464881, :_id "542692d2c026201cdc326f6b"} {:updated-at 1598097023549, :created-at 1402793361000, :body ";; test arguments against various binary predicates\n(condp apply [2 3]\n = \"eq\"\n < \"lt\"\n > \"gt\")\n;;=> \"lt\"\n\n;; test argument against various unary predicates\n(condp apply [:foo]\n string? \"it's a string\"\n keyword? \"it's a keyword\"\n symbol? \"it's a symbol\"\n fn? \"it's a function\"\n \"something else!\")\n;;=> \"it's a keyword\"", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:avatar-url "https://avatars.githubusercontent.com/u/1195619?v=3", :account-source "github", :login "jeffi"} {:login "titogarcia", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/699549?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/f2fad9c9c81cfdf191f10265371f1d72?r=PG&default=identicon", :account-source "clojuredocs", :login "vee"}, :_id "542692d2c026201cdc326f6c"} {:body "; This function is part of a great solution to the \"fizzbuzz\" interview question.\n; Let's review \n; Players take turns to count incrementally, \n; replacing any number divisible by three with the word \"fizz\", \n; any number divisible by five with the word \"buzz\", and \n; any number divisible by both three and five with the word \"fizzbuzz\".\n(defn fizz-buzz [n]\n (condp #(zero? (mod %2 %1)) n\n 15 \"fizzbuzz\"\n 3 \"fizz\"\n 5 \"buzz\"\n n))\n\n(into [] (map fizz-buzz) (range 1 20))\n;;=> [1 2 \"fizz\" 4 \"buzz\" \"fizz\" 7 8 \"fizz\" \"buzz\" \n;; 11 \"fizz\" 13 14 \"fizzbuzz\" 16 17 \"fizz\" 19]", :author {:login "dfletcher", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/189317?v=3"}, :created-at 1433388096371, :updated-at 1510263672104, :editors [{:login "dfletcher", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/189317?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/200617?v=3", :account-source "github", :login "bsima"} {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :_id "556fc440e4b03e2132e7d185"} {:updated-at 1506692074248, :created-at 1506692074248, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :body ";; Test a string against multiple regexps, and do something different\n;; with the match each time. \n(condp re-matches \"17->42\"\n #\"(\\w+)->(\\w+)\" :>> (fn [[_ p1 p2]]\n {:start p1 :end p2})\n\n #\"(\\w+)->$\" :>> (fn [[_ p1]]\n {:start p1})\n\n #\"\\w+\" :>> (fn [[p]]\n {:fixed p})\n\n nil)\n; => {:start \"17\" :end \"42\"}", :_id "59ce4beae4b03026fe14ea4d"} {:updated-at 1534346599711, :created-at 1534346599711, :author {:login "ernstroux", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/20518350?v=4"}, :body ";if you are using the function literal already and can't nest\n\n(#(condp (fn [clause expr] (clojure.string/includes? expr clause)) \"transaction-result-kafka\"\n \"transaction-result\" 1\n \"transaction-failure\" 4\n (do\n (str \"got message with nil topic\")\n nil)))\n;=> 1", :_id "5b744567e4b00ac801ed9e5b"} {:editors [{:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}], :body ";; We can use symbols in the test-expression; this isn't possible with 'case'\n(defn id-resolver\n [id]\n (let [id-a \"a\"\n id-b \"b\"\n\t id-c \"c\"]\n (condp = id\n\t id-a {:response-a \"id-a\"}\n\t id-b {:response-b \"id-b\"}\n\t id-c {:response-c \"id-c\"})))\n\n(id-resolver \"a\")\n;; => {:response-a \"id-a\"}", :author {:avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4", :account-source "github", :login "berczeck"}, :created-at 1598155978713, :updated-at 1598156087855, :_id "5f41eccae4b0b1e3652d738d"} {:editors [{:login "Rovanion", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/632775?v=4"}], :body ";; Want to apply multiple predicates to the same expr? \n;; Not saying you should, but here is how you could.\n\n(def events [{:timestamp \"2021-01-01\" :source nil :destination 1 :litres 1 :price-per-litres 1}\n {:timestamp \"2021-01-02\" :source 1 :destination 2 :litres 0.5 :price-per-litres nil}\n {:timestamp \"2021-01-02\" :source nil :destination 1 :litres 1 :price-per-litres 2}\n {:timestamp \"2021-01-02\" :source 2 :destination nil :litres 0.25 :price-per-litres nil}])\n\n(map (fn [event]\n (condp (fn [preds e] ((apply every-pred preds) e)) event\n [:price-per-litres :destination] :insert\n [:source :destination] :transfer\n [:source (complement :destination)] :withdrawal))\n events)\n;; => (:insert :transfer :insert :withdrawal)\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/632775?v=4", :account-source "github", :login "Rovanion"}, :created-at 1655813285477, :updated-at 1655813318085, :_id "62b1b4a5e4b0b1e3652d760c"}], :macro true, :notes [{:author {:login "bsima", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/200617?v=3"}, :updated-at 1470339463090, :created-at 1470339463090, :body "A lot of these examples show the pattern:\n\n```\n(condp = value\n :a \"a\"\n :b \"b\"\n ...)\n```\n\nWhich is the same as:\n\n```\n(case value\n :a \"a\"\n :b \"b\"\n ...)\n```", :_id "57a39987e4b0bafd3e2a04c7"}], :arglists ["pred expr & clauses"], :doc "Takes a binary predicate, an expression, and a set of clauses.\n Each clause can take the form of either:\n\n test-expr result-expr\n\n test-expr :>> result-fn\n\n Note :>> is an ordinary keyword.\n\n For each clause, (pred test-expr expr) is evaluated. If it returns\n logical true, the clause is a match. If a binary clause matches, the\n result-expr is returned, if a ternary clause matches, its result-fn,\n which must be a unary function, is called with the result of the\n predicate as its argument, the result of that call being the return\n value of condp. A single default expression can follow the clauses,\n and its value will be returned if no clause matches. If no default\n expression is provided and no clause matches, an\n IllegalArgumentException is thrown.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/condp"} {:added "1.0", :ns "clojure.core", :name "derive", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1308310489000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "parents", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c78"} {:created-at 1308310496000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ancestors", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c79"} {:created-at 1308310502000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "descendants", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c7a"} {:created-at 1308310508000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "isa?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c7b"} {:created-at 1332885397000, :author {:login "luskwater", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f3b2650c3d4aa47c9e22bf9ba5596a9f?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "make-hierarchy", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c7c"} {:created-at 1341101591000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "underive", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c7d"}], :line 5626, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [], :body ";; derive let you build a hierarchy but parents/ancestors/descendants and isa? let you query the hierarchy\n(derive ::rect ::shape)\n(derive ::square ::rect)\n", :created-at 1308310469000, :updated-at 1308310469000, :_id "542692c7c026201cdc3269d0"} {:author {:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"}, :editors [], :body "user=> (derive ::Cat ::Feline)\nnil\n\nuser=> (derive ::Lion ::Feline)\nnil\n\nuser=> (isa? ::Lion ::Feline)\ntrue\n\nuser=> (isa? ::Tuna ::Feline)\nfalse", :created-at 1313009794000, :updated-at 1313009794000, :_id "542692c7c026201cdc3269d1"} {:updated-at 1503164433228, :created-at 1503164433228, :author {:login "mhmdsalem1993", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10787314?v=4"}, :body "(derive java.util.Map ::collection)\n(derive java.util.Collection ::collection)\n\n(isa? java.util.HashMap ::collection)\n-> true", :_id "59987811e4b09f63b945ac51"} {:editors [{:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}], :body ";; (derive) can be handy in multimethods that switch on field values:\n\n(def data [{:record/type :types/integer :record/number 123}\n {:record/type :types/float :record/number 123.45}\n {:record/type :types/text :record/text \"hello\"}])\n\n(derive :types/float ::number)\n(derive :types/integer ::number)\n(derive :types/text ::text)\n\n(defmulti record-str :record/type)\n\n(defmethod record-str ::number [r] (str \"Number: \" (:record/number r)))\n(defmethod record-str ::text [r] (str \"Text: \" (:record/text r)))\n\n(map record-str data)\n;; => (\"Number: 123\" \"Number: 123.45\" \"Text: hello\")\n", :author {:avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4", :account-source "github", :login "timgilbert"}, :created-at 1551112001815, :updated-at 1551112172422, :_id "5c741741e4b0ca44402ef6a3"}], :notes nil, :arglists ["tag parent" "h tag parent"], :doc "Establishes a parent/child relationship between parent and\n tag. Parent must be a namespace-qualified symbol or keyword and\n child can be either a namespace-qualified symbol or keyword or a\n class. h must be a hierarchy obtained from make-hierarchy, if not\n supplied defaults to, and modifies, the global hierarchy.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/derive"} {:added "1.0", :ns "clojure.core", :name "load-string", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1334883949000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "read-string", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f04"} {:created-at 1519290621337, :author {:login "witek", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/209520?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "load-file", :ns "clojure.core"}, :_id "5a8e88fde4b0316c0f44f8e7"} {:created-at 1519290634633, :author {:login "witek", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/209520?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "load", :ns "clojure.core"}, :_id "5a8e890ae4b0316c0f44f8e8"}], :line 4089, :examples [{:body "(load-string \"(def x 1)\")\n;; => #'user/x\nx\n;; => 1", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423012385897, :updated-at 1423012385897, :_id "54d17221e4b0e2ac61831d00"} {:updated-at 1522768122029, :created-at 1522768122029, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :body ";; Don’t use this function on untrusted input; it can have unpleasant\n;; side-effects.\n(load-string \"(clojure.java.io/delete-file \\\"my-important-file\\\")\")\n;; => true", :_id "5ac398fae4b045c27b7fac35"} {:updated-at 1546454837037, :created-at 1546454837037, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Differently from the equivalent \"(eval (read-string x))\", \"load-string\" keeps\n;; track of line numbers:\n\n(def s \"\\n\\n\\n(def c :line4)\")\n(:line (meta (load-string s)))\n;; 4\n(:line (meta (eval (read-string s))))\n;; 1", :_id "5c2d0735e4b0ca44402ef60c"}], :notes nil, :arglists ["s"], :doc "Sequentially read and evaluate the set of forms contained in the\n string", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/load-string"} {:added "1.0", :ns "clojure.core", :name "special-symbol?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 4968, :examples [{:author {:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"}, :editors [{:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"}], :body "user=> (clojure-version)\n\"1.4.0\"\n;; the set of special symbols for this clojure-version are the following:\nuser=> (keys (. clojure.lang.Compiler specials))\n(deftype* new quote & var set! monitor-enter recur . case* clojure.core/import* reify* do fn* throw monitor-exit letfn* finally let* loop* try catch if def)\n\n;; for example, \"def\" is not a function, not a macro, not even a var, but a special form:\nuser=> (fn? 'def)\nfalse\nuser=> (:macro (meta (find-var 'clojure.core/def)))\nnil\nuser=> (find-var 'clojure.core/def)\nnil\nuser=> (special-symbol? 'def)\ntrue\n\n;; while \"defn\" is not a special form but a macro:\nuser=> (special-symbol? 'defn)\nfalse\nuser=> (:macro (meta (find-var 'clojure.core/defn)))\ntrue\n", :created-at 1353815386000, :updated-at 1353815535000, :_id "542692d5c026201cdc327099"}], :notes nil, :arglists ["s"], :doc "Returns true if s names a special form", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/special-symbol_q"} {:added "1.0", :ns "clojure.core", :name "ancestors", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1341101490000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "parents", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cd2"} {:created-at 1341101493000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "derive", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cd3"} {:created-at 1341101496000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "underive", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cd4"} {:created-at 1341101502000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "descendants", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cd5"} {:created-at 1341101507000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "make-hierarchy", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cd6"} {:created-at 1341101672000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "isa?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cd7"} {:created-at 1374150921000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "supers", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cd8"}], :line 5598, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}], :body ";; make up a hierarchy a beagle is a sporting breed is a dog is a quadraped is an \n;; animal\n\nuser=> (derive ::quadruped ::animal)\nnil\nuser=> (derive ::dog ::quadruped)\nnil\nuser=> (derive ::sporting_breed ::dog)\nnil\nuser=> (derive ::beagle ::sporting_breed)\nnil\nuser=> (ancestors ::beagle)\n#{:user/dog :user/sporting_breed :user/animal :user/quadruped}\nuser=>", :created-at 1313896987000, :updated-at 1313968195000, :_id "542692cdc026201cdc326d1b"} {:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; use ancestors to show which classes ArrayList derives from and which\n;; interfaces it implements\n\nuser=> (ancestors java.util.ArrayList)\n#{java.util.Collection java.util.AbstractList java.io.Serializable java.lang.Cloneable java.util.List java.lang.Object java.util.AbstractCollection java.util.RandomAccess java.lang.Iterable}\nuser=>", :created-at 1313968946000, :updated-at 1313968946000, :_id "542692cdc026201cdc326d1d"} {:updated-at 1598158917882, :created-at 1598158880926, :author {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}, :body ";; use ancestors in defrecords to show which defprotocols implements\nuser=> (defprotocol Fly\n (fly [this]))\n\nuser=> (defrecord Bird [name] Fly\n (fly [this] (str (:name this) \" flies....\")))\n\nuser=> (ancestors Bird)\n;; #{clojure.lang.IPersistentCollection \n;; user.Fly \n;; clojure.lang.IHashEq clojure.lang.ILookup \n;; java.util.Map java.lang.Iterable \n;; java.io.Serializable \n;; java.lang.Object \n;; clojure.lang.IMeta \n;; clojure.lang.Seqable \n;; clojure.lang.IRecord \n;; clojure.lang.IObj \n;; clojure.lang.Associative \n;; clojure.lang.Counted \n;; clojure.lang.IKeywordLookup \n;; clojure.lang.IPersistentMap}", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4", :account-source "github", :login "berczeck"}], :_id "5f41f820e4b0b1e3652d7398"}], :notes nil, :arglists ["tag" "h tag"], :doc "Returns the immediate and indirect parents of tag, either via a Java type\n inheritance relationship or a relationship established via derive. h\n must be a hierarchy obtained from make-hierarchy, if not supplied\n defaults to the global hierarchy", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ancestors"} {:added "1.0", :ns "clojure.core", :name "subseq", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1330671591000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rsubseq", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e25"} {:created-at 1330671627000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "sorted-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e26"} {:created-at 1330671638000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "sorted-set", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e27"} {:created-at 1330671646000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "sorted-map-by", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e28"} {:created-at 1330671652000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "sorted-set-by", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e29"} {:created-at 1423278345112, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "subvec", :library-url "https://github.com/clojure/clojure"}, :_id "54d58109e4b0e2ac61831d29"}], :line 5109, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Note, that collection passed to subseq must implement Sorted. \n;; Just passing a collection that has been sorted is not enough.\n\nuser=> (subseq [1 2 3 4] > 2)\njava.lang.ClassCastException: clojure.lang.PersistentVector cannot be cast to clojure.lang.Sorted (NO_SOURCE_FILE:0)\n\nuser=> (subseq (sorted-set 1 2 3 4) > 2)\n(3 4)\n", :created-at 1281618432000, :updated-at 1285494695000, :_id "542692cfc026201cdc326e78"} {:body ";; Example of getting a subsequence of hashmaps sorted by key :a and\n;; secondarily :b.\n\n(defn compare-ab [x y]\n (compare [(get x :a) (get x :b)]\n [(get y :a) (get y :b)]))\n \n(def ss-ab (apply sorted-set-by compare-ab\n [{:a 42 :b 5000}\n {:a 1 :b 2}\n {:a 99 :b -1000}\n {:a -1 :b 7}]))\nuser=> ss-ab\n#{{:a -1, :b 7} {:a 1, :b 2} {:a 42, :b 5000} {:a 99, :b -1000}}\n\n;; Select all maps whose key :a is greater than 5. \nuser=> (subseq ss-ab > {:a 5})\n({:a 42, :b 5000} {:a 99, :b -1000})\n\n\n", :author {:login "thirdreplicator", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/90335?v=2"}, :created-at 1413610885024, :updated-at 1413610885024, :_id "5441fd85e4b049fc676849cd"} {:updated-at 1463327979493, :created-at 1463327979493, :author {:login "TradeIdeasPhilip", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/18409827?v=3"}, :body ";; If you use the 6 input form of this function, start-test should be > or\n;; >= and the end-test should be < or <=. The other forms don't give you\n;; an error, but don't give you what you expect, either. This is all based\n;; on experimentation. I don't see this documented.\n\n;; This suggests that there are no items in my set between 9 and 2.\nuser=> (subseq (sorted-set 1 2 3 4 5 6 7 8 9 0) < 9 > 2)\n;; => ()\n\n;; This correctly lists all items in my set between 2 and 9.\nuser=> (subseq (sorted-set 1 2 3 4 5 6 7 8 9 0) > 2 < 9)\n;; => (3 4 5 6 7 8)\n\n;; Again, this is not just the \"and\" of the two conditions. Lots of items\n;; in my set are #(and (% > 2) (% > 6)) but this returns nothing. \"> 2\"\n;; means skip to the first item that is #(% > 2). So we jump directly to 3.\n;; \"> 6\" means to stop looking as soon as we find an item where #(% > 6) is\n;; false. 3 <= 6, so we get the empty sequence.\nuser=> (subseq (sorted-set 1 2 3 4 5 6 7 8 9 0) > 2 > 6)\n;; => ()\n\n;; This works as expected, returning everything where #(and (% >= 2) (% <= 4)).\n;; That is to say it returns everything between 2 and 4, inclusive.\nuser=> (subseq (sorted-set 1 2 3 4 5 6 7 8 9 0) >= 2 <= 4)\n;; => (2 3 4)\n\n;; Naïvely you might expect this to give you the same results as the previous\n;; statement. Clearly the result is not the same. I'm not sure what's going\n;; on under the hood here. It's jumping directly to 4 as if I'd said \">= 4\"\n;; rather than \"<= 4\". (Looks like a bug in Clojure to me!) Then it\n;; continued to the end because all of the remaining items were #(% >= 2).\nuser=> (subseq (sorted-set 1 2 3 4 5 6 7 8 9 0) <= 4 >= 2)\n;; => (4 5 6 7 8 9)\nuser=> *clojure-version*\n;; => {:major 1, :minor 8, :incremental 0, :qualifier nil}\n\n;; This one at least makes sense. It jumps directly to the first item that\n;; satisfies the first test and continues until the second item is false.\nuser=> (subseq (sorted-set 1 2 3 4 5 6 7 8 9 0) >= 4 >= 2)\n;; => (4 5 6 7 8 9)\n", :_id "57389cebe4b071da7d6cfd0a"} {:updated-at 1522434900617, :created-at 1522434900617, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Autocomplete using local Unix dictionary.\n(require '[clojure.string :refer [split]])\n\n(def dict\n (into (sorted-set)\n (split (slurp \"/usr/share/dict/words\") #\"\\s+\")))\n\n;; The vector contains a few simulated keystrokes.\n(map #(take 4 (subseq dict >= %)) [\"c\" \"cl\" \"clo\" \"clos\" \"closu\"])\n;; ((\"c\" \"ca\" \"caam\" \"caama\")\n;; (\"clabber\" \"clabbery\" \"clachan\" \"clack\")\n;; (\"cloaca\" \"cloacal\" \"cloacaline\" \"cloacean\")\n;; (\"closable\" \"close\" \"closecross\" \"closed\")\n;; (\"closure\" \"clot\" \"clotbur\" \"clote\"))", :_id "5abe8354e4b045c27b7fac2a"}], :notes nil, :arglists ["sc test key" "sc start-test start-key end-test end-key"], :doc "sc must be a sorted collection, test(s) one of <, <=, > or\n >=. Returns a seq of those entries with keys ek for\n which (test (.. sc comparator (compare ek key)) 0) is true", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/subseq"} {:added "1.2", :ns "clojure.core", :name "error-handler", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1443938208744, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "set-error-handler!", :ns "clojure.core"}, :_id "5610bfa0e4b0686557fcbd54"} {:created-at 1443938218045, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "agent", :ns "clojure.core"}, :_id "5610bfaae4b08e404b6c1ca5"}], :line 2204, :examples [{:editors [{:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}], :body "(def error-atom (atom []))\n\n(def a (agent \"\"\n :validator string?\n :error-handler (fn [agnt ex]\n (swap! error-atom\n conj\n {:agent agnt\n :exception (.getMessage ex)}))))\n\n(send a 1) ;; will fail validation\n\n@error-atom\n[{:agent #,\n :exception \"java.lang.Long cannot be cast to clojure.lang.IFn\"}]\n\n(error-handler a)\n#", :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :created-at 1443938199376, :updated-at 1443938238017, :_id "5610bf97e4b0686557fcbd53"}], :notes nil, :arglists ["a"], :doc "Returns the error-handler of agent a, or nil if there is none.\n See set-error-handler!", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/error-handler"} {:added "1.0", :ns "clojure.core", :name "gensym", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 604, :examples [{:updated-at 1285495689000, :created-at 1280776789000, :body "user=> (gensym \"foo\")\nfoo2020\n\nuser=> (gensym \"foo\")\nfoo2027\n\nuser=> (gensym \"foo\")\n;; ...\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692c6c026201cdc32690b"} {:updated-at 1285495715000, :created-at 1280776909000, :body "user=> (gensym)\nG__2034\n\nuser=> (let [my-unique-sym (gensym)]\n my-unique-sym)\nG__2075\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692c6c026201cdc32690d"} {:author {:login "gdavis", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ae253eacd4cab9fb2580b8192351b641?r=PG&default=identicon"}, :editors [], :body ";; syntax-reader uses gensym for non-namespace-qualified symbols ending with '#'\n;; http://clojure.org/reader\n\nuser=> `(name0#) ; gensym, form is useful in defmacro\n(name0__1206__auto__)\n\nuser=> `(user/name1#) ; no gensym, namespace-qualified\n(user/name1#)\n\nuser=> `(:key0#) ; no gensym, keyword\n(:key0#)\n\nuser=> `(::key1#) ; no gensym, keyword\n(:user/key1#)\n", :created-at 1394152357000, :updated-at 1394152357000, :_id "542692d3c026201cdc326fbc"} {:updated-at 1656609206311, :created-at 1656609206311, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; syntax-reader gensyms are only generated once, at read time\n;; so recursive macros get the same generated symbol for all levels of recursion\n\n(defmacro reader-gensym-macro [[x & more :as xs] acc]\n (if (seq xs)\n `(let [x# ~x]\n (reader-gensym-macro ~more (conj ~acc x#)))\n acc))\n\n(reader-gensym-macro [1 2] []) ;; => [2 2]\n\n;; using the function `gensym` can overcome this problem\n;; so recursive macros get a different generated symbol for each level of recursion\n\n(defmacro function-gensym-macro [[x & more :as xs] acc]\n (if (seq xs)\n (let [gx (gensym 'x)]\n `(let [~gx ~x]\n (function-gensym-macro ~more (conj ~acc ~gx))))\n acc))\n\n(function-gensym-macro [1 2] []) ;; => [1 2]", :_id "62bdd9b6e4b0b1e3652d760f"}], :notes [{:updated-at 1383198787000, :body "The
    (. clojure.lang.RT (nextID))
    present gensym's source code (https://github.com/clojure/clojure/blob/clojure-1.5.1/src/jvm/clojure/lang/RT.java#L468) uses java.util.concurrent.atomic.AtomicInteger (and has for the past 6 years, if you trust the Git history).", :created-at 1383198787000, :author {:login "mlb", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/11104d872c2bae6e0e98b7533818530a?r=PG&default=identicon"}, :_id "542692edf6e94c697052200c"}], :arglists ["" "prefix-string"], :doc "Returns a new symbol with a unique name. If a prefix string is\n supplied, the name is prefix# where # is some unique number. If\n prefix is not supplied, the prefix is 'G__'.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/gensym"} {:added "1.0", :ns "clojure.core", :name "cond", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1289183323000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "condp", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ee8"} {:created-at 1290574959000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "case", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ee9"} {:created-at 1302510857000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "if", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eea"} {:created-at 1459890885195, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "cond->", :ns "clojure.core"}, :_id "57042ac5e4b075f5b2c864ce"}], :line 574, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"} {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"} {:login "bhenry", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4bc423f6653d93f9185a5cdc9f5cd84f?r=PG&default=identicon"} {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "(defn pos-neg-or-zero\n \"Determines whether or not n is positive, negative, or zero\"\n [n]\n (cond\n (< n 0) \"negative\"\n (> n 0) \"positive\"\n :else \"zero\"))\n\nuser=> (pos-neg-or-zero 5)\n\"positive\"\nuser=> (pos-neg-or-zero -1)\n\"negative\"\nuser=> (pos-neg-or-zero 0)\n\"zero\"\n", :created-at 1279070736000, :updated-at 1285501471000, :_id "542692c7c026201cdc326966"} {:author {:login "bhenry", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4bc423f6653d93f9185a5cdc9f5cd84f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "TheJoe", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2789ff7d993fbf621e86768b3cce19d4?r=PG&default=identicon"}], :body "user=> (let [grade 85]\n (cond\n (>= grade 90) \"A\"\n (>= grade 80) \"B\"\n (>= grade 70) \"C\"\n (>= grade 60) \"D\"\n :else \"F\"))\n\"B\"", :created-at 1279071870000, :updated-at 1365525514000, :_id "542692c7c026201cdc32696c"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; See examples for \"if\" explaining Clojure's idea of logical true\n;; and logical false.", :created-at 1334293315000, :updated-at 1334293315000, :_id "542692d2c026201cdc326f67"} {:author {:login "Omer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/dae0f434afde5246ccb030cdec81fb71?r=PG&default=identicon"}, :editors [], :body ";; Generates a random number compares it to user input\n(let [rnd (rand-int 10)\n guess (Integer/parseInt (read-line))]\n (cond\n (= rnd guess) (println \"You got my guess right!\")\n :else (println \"Sorry... guess again!\")))", :created-at 1338273335000, :updated-at 1338273335000, :_id "542692d2c026201cdc326f68"} {:updated-at 1459931468351, :created-at 1459931468351, :author {:login "mhmdsalem1993", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10787314?v=3"}, :body ";; Simple Condition Example \n\n(defn test-x [x]\n\t(cond\n\t\t(< x 10) \"less than\"\n\t\t(> x 20) \"greater than\"\n\t)\n)\n\n============test============\n(test-x 9)\n\n=> \"less than\"", :_id "5704c94ce4b0fc95a97eab2c"} {:updated-at 1502632735612, :created-at 1502632735612, :author {:login "RobinNagpal", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/745748?v=4"}, :body "(defn print-cond [xx] \n (cond \n (< xx 6) \"less than 6\"\n (< xx 8) \"less than 8\"\n :else \"Greater than 8\"))\n=> #'aurora.system/print-cond\n(print-cond 5)\n=> \"less than 6\"\n(print-cond 7)\n=> \"less than 8\"\n(print-cond 8)\n=> \"Greater than 8\"\n(print-cond 10)\n=> \"Greater than 8\"\n", :_id "59905b1fe4b0d19c2ce9d716"} {:updated-at 1504194292107, :created-at 1504194292107, :author {:login "chrismurrph", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/10278575?v=4"}, :body ";; If a condition is not matched `nil` will be returned\n(cond\n false \"sumfin\")\n;;=> nil", :_id "59a82ef4e4b09f63b945ac5b"} {:updated-at 1598227713206, :created-at 1598227713206, :author {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}, :body ";; Instead of use the :else keyword as the default path you can use \n;; whatever that gives meaning to the code\n\nuser=> (cond \n :whatever \"You can use any default keyword\")\n;; You can use any default keyword", :_id "5f430501e4b0b1e3652d73a9"} {:updated-at 1613750506091, :created-at 1613750506091, :author {:login "digash", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/30662?v=4"}, :body ";; cond is a macro the easiest way to understand how it works is to macroexpand it\nuser=> (clojure.walk/macroexpand-all\n '(let [n 3] \n (cond\n (odd? n) \"odd\"\n (even? n) \"even\"\n (< n 0) \"negitive\"\n (< 0 n) \"positive\"\n :else \"zero\")))\n\n(let [n 3]\n (if (odd? n)\n \"odd\"\n (if (even? n)\n \"even\"\n (if (< n 0)\n \"negitive\"\n (if (< 0 n)\n \"positive\"\n (if :else\n \"zero\"\n nil))))))", :_id "602fe0eae4b0b1e3652d745e"}], :macro true, :notes [{:updated-at 1288294778000, :body "We should add a comment in the docstring for the final usage of :else.", :created-at 1288294778000, :author {:login "blais", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9142fc3ffa18ebeddbb03fe575199742?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fa0"} {:author {:login "kimtg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7685905?v=3"}, :updated-at 1441172051574, :created-at 1441172051574, :body "`:else` is not special. Any keyword will do.", :_id "55e68a53e4b072d7f27980f9"} {:author {:login "seltzer1717", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1911117?v=3"}, :updated-at 1445308247668, :created-at 1445308247668, :body "Actually any non-nil or true will work. I prefer to use :default. :else implies truthiness in evaluation rather what it really is which is a 'default' value.", :_id "5625a757e4b04b157a6648d7"} {:author {:login "yubrshen", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/2638417?v=3"}, :updated-at 1494713707387, :created-at 1494713707387, :body "It seems the documentation is not accurate. From my experiment, it seems the function decscription should be like the following:\n\nTakes a set of test/expr pairs. It evaluates each test one at a time. \nIf a test returns logical true, cond evaluates the corresponding expr and\ncontinue to evaluate the next test/expr, until a test fails or \nno more pair of test(:else)/expr to evaluate,\nand returns the last evaluation value of the expr \nthat its corresponding test evaluated to truthy.\nIf there is no test evaluated to truthy, \nreturn the evaluation of :else clause.\nIf there is no :else clause return nil.\n\nThe above description can be supported by the following example:\n\n
    \n(defn pos-neg-or-zero\n  \"Determines whether or not n is positive, negative, or zero\"\n  [n]\n  (cond\n    (odd? n) \"odd\"\n    (even? n) \"even\"\n    (< n 0) \"negitive\"\n    (< 0 n) \"positive\"\n    :else \"zero\"))\n\n(odd? 3)                                ; => true\n(pos-neg-or-zero 3)                     ;=> \"positive\"\n(even? 0)                               ; => true\n(pos-neg-or-zero 0)                     ;=> \"zero\"\n(even? 4)                               ; => true\n(pos-neg-or-zero 4)                     ;=> \"positive\"\n\n", :_id "5917856be4b01920063ee05d"} {:author {:login "maruks", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/433989?v=3"}, :updated-at 1499359558730, :created-at 1499359558730, :body "yubrshen,   \n\n(pos-neg-or-zero 3) => \"odd\"", :_id "595e6946e4b06e730307db4f"} {:author {:login "dan-mcdonald", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/8184051?v=4"}, :updated-at 1592425332445, :created-at 1592425332445, :body "`:else` is just a convention. It works because\n\n
    \n=> (boolean :else)\ntrue\n
    \n\nIn fact anything except for `false` and `nil` will evaluate to `true` (see [boolean](https://clojuredocs.org/clojure.core/boolean)).", :_id "5eea7b74e4b0b1e3652d7306"}], :arglists ["& clauses"], :doc "Takes a set of test/expr pairs. It evaluates each test one at a\n time. If a test returns logical true, cond evaluates and returns\n the value of the corresponding expr and doesn't evaluate any of the\n other tests or exprs. (cond) returns nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/cond"} {:added "1.0", :ns "clojure.core", :name "ratio?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 3576, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "(ratio? 22/7)\n;; => true\n\n(ratio? 22)\n;; => false\n\n(ratio? 2.2)\n;; => false\n", :created-at 1279074828000, :updated-at 1423040912016, :_id "542692c9c026201cdc326a96"} {:updated-at 1463237750174, :created-at 1463237750174, :author {:login "TradeIdeasPhilip", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/18409827?v=3"}, :body ";; Both True\nuser=> (ratio? 22/7) \n;; => true\nuser=> (rational? 22/7)\n;; => true\n\n;; Different\nuser=> (ratio? 22)\n;; => false\nuser=> (rational? 22)\n;; => true\n\n;; Both False\nuser=> (ratio? 0.5)\n;; => false\nuser=> (rational? 0.5)\n;; => false", :_id "57373c76e4b05449374f52ee"}], :notes nil, :arglists ["n"], :doc "Returns true if n is a Ratio", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ratio_q"} {:added "1.0", :ns "clojure.core", :name "delay?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1325375628000, :author {:login "moumar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8fae5b9c9ffd332a24ff71a339fa6310?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "delay", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ca7"}], :line 755, :examples [{:author {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}, :editors [{:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}], :body "user=> (def v (delay (do (println \"start sleeping\") \n (Thread/sleep 1000) \n 10)))\n#'user/v\nuser=> (delay? v)\ntrue\nuser=> (force v)\nstart sleeping\n10\nuser=> (delay? v)\ntrue\nuser=> (force v)\n10\nuser=> ", :created-at 1308628940000, :updated-at 1308629066000, :_id "542692cec026201cdc326dc1"}], :notes nil, :arglists ["x"], :doc "returns true if x is a Delay created with delay", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/delay_q"} {:added "1.0", :ns "clojure.core", :name "intern", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1360641943000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "alter-var-root", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b72"} {:created-at 1484214992310, :author {:login "rauhs", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/11081351?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ns-unmap", :ns "clojure.core"}, :_id "587752d0e4b09108c8545a56"} {:created-at 1649576842844, :author {:login "jungwookim", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/50188177?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "create-ns", :ns "clojure.core"}, :_id "62528b8ae4b0b1e3652d75cf"}], :line 6317, :examples [{:author {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}], :body "user=> (intern 'user 'x \"Foobar\")\n#'user/x\n\nuser=> x\n\"Foobar\"\n", :created-at 1283820694000, :updated-at 1287791800000, :_id "542692cac026201cdc326b56"} {:updated-at 1649576567141, :created-at 1649576567141, :author {:login "jungwookim", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/50188177?v=4"}, :body ";; being able to define fn as a val\nuser=> (intern 'user 'sum (fn [a b c]\n (+ a b c)))\n#'user/sum\n\nuser=> (sum 1 2 3)\n6", :_id "62528a77e4b0b1e3652d75ce"} {:updated-at 1649578114784, :created-at 1649577871265, :author {:login "jungwookim", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/50188177?v=4"}, :body ";; you can defind defmethod as well by using intern.\n;; firstly, define defmulti so that upper-case can convert string and keyword into upper-case, respectively.\nuser=> (defmulti upper-case [this]\n (type this))\n\n;; defmethods can be created as a var by clojure.core/intern\nuser=> (intern 'user 'upper-case (defmethod upper-case java.lang.String [this]\n (clojure.string/upper-case this)))\n\nuser=> (intern 'user 'upper-case (defmethod upper-case clojure.lang.Keyword [this]\n (-> this name clojure.string/upper-case keyword)))\n\nuser=> (upper-case \"abc\")\n\"ABC\"\n\nuser=> (upper-case :abc)\n:ABC", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/50188177?v=4", :account-source "github", :login "jungwookim"}], :_id "62528f8fe4b0b1e3652d75d0"}], :notes [{:author {:login "phreed", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/211644?v=3"}, :updated-at 1490886217995, :created-at 1490886217995, :body "\"The Namespace system maintains global maps of symbols to Var objects (see Namespaces). If a def expression does not find an interned entry in the current namespace for the symbol being def-ed, it creates one, otherwise it uses the existing Var. This find-or-create process is called interning. This means that, unless they have been unmap-ed, Var objects are stable references and need not be looked up every time. It also means that namespaces constitute a global environment in which, as described in Evaluation, the compiler attempts to resolve all free symbols as Vars.\n\n\"The var special form or the #' reader macro (see Reader) can be used to get an interned Var object instead of its current value.\"\n\n-- [https://clojure.org/reference/vars]", :_id "58dd1e49e4b01f4add58fe81"}], :arglists ["ns name" "ns name val"], :doc "Finds or creates a var named by the symbol name in the namespace\n ns (which can be a symbol or a namespace), setting its root binding\n to val if supplied. The namespace must exist. The var will adopt any\n metadata from the name symbol. Returns the var.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/intern"} {:ns "clojure.core", :name "print-simple", :file "clojure/core_print.clj", :type "function", :column 1, :see-alsos nil, :line 83, :examples [{:updated-at 1656622812157, :created-at 1656622812157, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; where o is an object to be printed, and w is a java.io.Writer\n;; prints metadata if *print-dup* or *print-meta* & *print-readably* are truthy\n;; stringifies and writes the object to the writer\n\n;; We can bind *out* to a writer and return that\n(let [s (java.io.StringWriter.)]\n (binding [*out* s]\n (print \"Hello!\")\n (str s)))\n;; => \"Hello!\"\n\n;; Or we can use print-simple with no binding necessary\n(let [s (java.io.StringWriter.)]\n (print-simple \"Hello!\" s)\n (str s))\n;; => \"Hello!\"\n", :_id "62be0edce4b0b1e3652d7610"}], :notes nil, :arglists ["o w"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/print-simple"} {:added "1.2", :ns "clojure.core", :name "flatten", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1489089374653, :author {:login "miner", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/25400?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "flatten", :ns "clojure.core.reducers"}, :_id "58c1b35ee4b01f4add58fe74"} {:created-at 1519124274538, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "tree-seq", :ns "clojure.core"}, :_id "5a8bff32e4b0316c0f44f8d6"} {:created-at 1550854184577, :author {:login "finalfantasia", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/2316604?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "sequential?", :ns "clojure.core"}, :_id "5c702828e4b0ca44402ef69f"} {:created-at 1580338242571, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "mapcat", :ns "clojure.core"}, :_id "5e320c42e4b0ca44402ef826"}], :line 7136, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [{:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"} {:login "tonsky", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4188c62c28a196e3e82363217c56fca5?r=PG&default=identicon"}], :body "user=> (flatten [1 [2 3]])\n(1 2 3)\n\nuser=> (flatten '(1 2 3))\n(1 2 3)\n\nuser=> (flatten '(1 2 [3 (4 5)])) \n(1 2 3 4 5)\n\nuser=> (flatten nil)\n()\n\n; Attention with stuff which is not a sequence\n\nuser=> (flatten 5)\n()\n\nuser=> (flatten {:name \"Hubert\" :age 23})\n()\n\n; Workaround for maps\n\nuser=> (flatten (seq {:name \"Hubert\" :age 23}))\n(:name \"Hubert\" :age 23)", :created-at 1279274687000, :updated-at 1341327489000, :_id "542692cfc026201cdc326e49"} {:editors [{:login "bsima", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/200617?v=3"}], :body ";; Useful snippet: \"merge\" two or more vectors with `(comp vec flatten vector)`\n(let [a [{:a \"hi\"} {:b \"hey\"}]\n b [{:c \"yo\"} {:d \"hiya\"}]\n c {:e [\"hola\" \"bonjour\"]}]\n ((comp vec flatten vector) a b c))\n;;=> [{:a \"hi\"} {:b \"hey\"} {:c \"yo\"} {:d \"hiya\"} {:e [\"hola\" \"bonjour\"]}]", :author {:avatar-url "https://avatars.githubusercontent.com/u/200617?v=3", :account-source "github", :login "bsima"}, :created-at 1453767790696, :updated-at 1453767826738, :_id "56a6bc6ee4b015010896bd6e"}], :notes [{:updated-at 1335141716000, :body "(flatten nil) actually returns an empty sequence, not nil. The doc string is fixed in 1.4.", :created-at 1335141716000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fde"} {:updated-at 1336946114000, :body "As shown in the example, flatten will return an empty sequence when given any non-sequential thing. That can sometimes hide a bug. \r\n\r\nHere's another version that doesn't have that problem, and is faster as well.\r\n\r\n\r\n (defn flatten2\r\n \"Like `clojure.core/flatten` but better, stronger, faster.\r\n Takes any nested combination of sequential things (lists, vectors,\r\n etc.) and returns their contents as a single, flat, lazy sequence.\r\n If the argument is non-sequential (numbers, maps, strings, nil, \r\n etc.), returns the original argument.\"\r\n {:static true}\r\n [x]\r\n (letfn [(flat [coll] \r\n (lazy-seq \r\n (when-let [c (seq coll)] \r\n (let [x (first c)] \r\n (if (sequential? x) \r\n (concat (flat x) (flat (rest c))) \r\n (cons x (flat (rest c))))))))]\r\n (if (sequential? x) (flat x) x)))\r\n", :created-at 1335142077000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fdf"} {:updated-at 1341327474000, :body "Actually, flatten on a vector returns list, not a collection:\r\n\r\n user=> (flatten [1 [2 3]])\r\n (1 2 3)\r\n", :created-at 1341327474000, :author {:login "tonsky", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4188c62c28a196e3e82363217c56fca5?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fe4"} {:updated-at 1398620003000, :body "lazy version is much slower than this one:\r\n\r\n
    (defn my-flatten [l] \r\n  \"free of StackOverflow problem, not lazy and much faster version of flatten.\"\r\n(loop [l1 l, l2 `()]\r\n  (cond\r\n    (sequential? (first l1)) (recur (concat (first l1) (rest l1)) l2)\r\n    (empty? l1) (reverse l2)\r\n    :else (recur (rest l1) (cons (first l1) l2)))))\r\n
    \r\n\r\nfor complicated construction genereted by:\r\n
    (defn gen-list-wird [c] (reduce (fn [a b] (list a b)) (map vector (range c) (map str (range c (* 2 c))))))
    \r\ntimes are:\r\ncore/flatten (260 msec)\r\nsteveminer/flatten (135 msec)\r\nmy-flatten (2 msec). This version is slower than steveminder`s version for flat and very nested structures with small number of items.", :created-at 1398617756000, :author {:login "slovic", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b39b58f117a52d4f8ef3f388afb4554a?r=PG&default=identicon"}, :_id "542692edf6e94c6970522025"} {:author {:login "miner", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25400?v=3"}, :updated-at 1442172372482, :created-at 1442172372482, :body "For a much faster implementation, use `clojure.core.reducers/flatten` (introduced in Clojure 1.5).", :_id "55f5cdd4e4b06a9ffaad4fc0"} {:author {:login "afhammad", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147120?v=3"}, :updated-at 1459255941235, :created-at 1459255941235, :body "To only flatten one level, you can use (mapcat identity coll)\n\nWith flatten:\n
    \nuser=> (flatten [[[1]] [[2 3]]])\n(1 2 3)\n
    \n\nWith mapcat identity:\n
    \nuser=> (mapcat identity [[[1]] [[2 3]]])\n([1] [2 3])\n
    \n", :_id "56fa7a85e4b09295d75dbf43"} {:body "afhammad, i think to flatten one level it may be useful
    (apply concat coll)
    ", :created-at 1470329093649, :updated-at 1470329117379, :author {:avatar-url "https://avatars.githubusercontent.com/u/834990?v=3", :account-source "github", :login "moskvo"}, :_id "57a37105e4b0bafd3e2a04c6"} {:author {:login "beluchin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6383047?v=4"}, :updated-at 1613909662567, :created-at 1613909662567, :body "does not flatten sets:\n\n user=> (flatten [#{1}])\n (#{1})", :_id "60324e9ee4b0b1e3652d7460"}], :arglists ["x"], :doc "Takes any nested combination of sequential things (lists, vectors,\n etc.) and returns their contents as a single, flat lazy sequence.\n (flatten nil) returns an empty sequence.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/flatten"} {:added "1.0", :ns "clojure.core", :name "doubles", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1656679496626, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "double-array", :ns "clojure.core"}, :_id "62beec48e4b0b1e3652d761b"}], :line 5378, :examples [{:updated-at 1656673535693, :created-at 1656673535693, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; double-array will convert where possible\n(double-array [1 2 3]);; => [1.0, 2.0, 3.0]\n\n;; doubles will not\n(try (doubles [1 2 3])\n (catch ClassCastException e (ex-message e)))\n;; => \"clojure.lang.PersistentVector cannot be cast to [D\"", :_id "62bed4ffe4b0b1e3652d7616"} {:updated-at 1682271447230, :created-at 1682271447230, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; Casting avoids expensive reflection, so to see the benefit, enable warning:\n(set! *warn-on-reflection* true)\n\n;; We'll def a double-array but won't type-hint the var:\n(def my-array (double-array [10.0 20.0 30.0 40.0 50.0 60.0]))\n\n;; and try to amap over it without using `doubles` or type hinting amap's args:\n(amap my-array i _ (unchecked-inc ^double (aget my-array i)))\n;; Reflection warning… call to static method alength on clojure.lang.RT can't be resolved (argument types: unknown).\n;; Reflection warning… call to static method aclone on clojure.lang.RT can't be resolved (argument types: unknown).\n;; Reflection warning… call to static method aget on clojure.lang.RT can't be resolved (argument types: unknown, int).\n;; Reflection warning… call to static method aset on clojure.lang.RT can't be resolved (argument types: unknown, int, double).\n;; => [11.0, 21.0, 31.0, 41.0, 51.0, 61.0]\n\n;; We can use `doubles` to avoid reflection:\n(amap (doubles my-array) i _ (unchecked-inc ^double (aget (doubles my-array) i)))\n;; => [11.0, 21.0, 31.0, 41.0, 51.0, 61.0]\n\n;; Just as we can type hint in place:\n(amap ^doubles my-array i _ (unchecked-inc ^double (aget ^doubles my-array i)))\n;; => [11.0, 21.0, 31.0, 41.0, 51.0, 61.0]\n\n;; Or type hint the var:\n(def ^\"[D\" my-array (double-array [10 20 30 40 50 60]))\n(amap my-array i _ (unchecked-inc ^double (aget my-array i)))\n;; => [11.0, 21.0, 31.0, 41.0, 51.0, 61.0]\n", :_id "64456cd7e4b08cf8563f4b92"}], :notes [{:updated-at 1313877730000, :body "Anybody know what this is used for?\r\nAll I could find is that you can cast an existing double-array to another \r\ndouble-array???\r\n\r\n
    user=> (doubles [1 2 3 4 5])\r\njava.lang.ClassCastException: clojure.lang.PersistentVector cannot be cast to [D (NO_SOURCE_FILE:0)\r\nuser=> (doubles (int-array [2 3 2]))\r\njava.lang.ClassCastException: [I cannot be cast to [D (NO_SOURCE_FILE:0)\r\nuser=> (doubles (float-array [2 3 2]))\r\njava.lang.ClassCastException: [F cannot be cast to [D (NO_SOURCE_FILE:0)\r\nuser=> (doubles (double-array [2 3 2]))\r\n#\r\nuser=> (type (double-array [2 3 2]))\r\n[D\r\nuser=> (type (doubles (double-array [2 3 2])))\r\n[D\r\nuser=>\r\n
    \r\n", :created-at 1313877675000, :author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fc6"}], :arglists ["xs"], :doc "Casts to double[]", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/doubles"} {:added "1.9", :ns "clojure.core", :name "halt-when", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1658332219541, :author {:login "crimeminister", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/29072?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "transduce", :ns "clojure.core"}, :_id "62d8243be4b0b1e3652d762a"}], :line 7631, :examples [{:updated-at 1520773717746, :created-at 1520773717746, :author {:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}, :body "(def letters (set \"abcdefghijklmnopqrstuvwxyz\"))\n(def vowels (set \"aeiou\"))\n\n;; Remove the vowels from a string.\n(transduce (remove vowels) str \"hello\")\n;;=> \"hll\"\n\n;; Same, but halt when seeing a non-letter (and return that non-letter).\n(transduce (comp (remove vowels) (halt-when (complement letters)))\n str \"hello\")\n;;=> \"hll\"\n(transduce (comp (remove vowels) (halt-when (complement letters)))\n str \"hello world\")\n;;=> \\space\n", :_id "5aa52a55e4b0316c0f44f91c"} {:editors [{:login "seancorfield", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/43875?v=4"}], :body ";; \"halt-when\" can only really be used with \"transduce\", but not with other\n;; functions that support transducers like \"into\" or \"sequence\".\n\n(def v (vec (concat (range 5) [:x])))\n(def xf (comp (take 10) (halt-when keyword?) (map inc)))\n\n(transduce xf conj [] v)\n;;=> :x\n\n(into [] xf v)\n;;=> ClassCastException!\n;; Clojure 1.11.0 Alpha 4 updates \"into\" so that this works and produces:\n;;=> :x\n\n(sequence xf v)\n;;=> (1 2 3 4 5), wrong result!\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4", :account-source "github", :login "glts"}, :created-at 1520774510308, :updated-at 1642119482857, :_id "5aa52d6ee4b0316c0f44f91d"} {:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; Using the second argument in halt-when\n\n(transduce\n (comp (halt-when #{30} ;; stop at 30th item\n (fn [acc itm] acc))) ;; return all items so far\n (completing conj #(reduce + %)) ;; sums items on exit\n (range))\n;; 435", :author {:avatar-url "https://avatars.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1642611299179, :updated-at 1656671302936, :_id "61e84263e4b0b1e3652d75a0"} {:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; Like `take-while`'s complement when we return the completed result so far\n(transduce (take-while #(< % 10)) + (range));; => 45\n(transduce (halt-when #(>= % 10) (fn [acc _] acc)) + (range));; => 45\n\n;; So it's similar to medley's `take-upto` when `retf` = transduce's `f`\n(transduce (medley.core/take-upto #(>= % 10)) conj (range))\n;; => [0 1 2 3 4 5 6 7 8 9 10]\n(transduce (halt-when #(>= % 10) conj) conj (range))\n;; => [0 1 2 3 4 5 6 7 8 9 10]", :author {:avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4", :account-source "github", :login "tomdl89"}, :created-at 1658423818398, :updated-at 1658425450347, :_id "62d98a0ae4b0b1e3652d762b"} {:updated-at 1685471418885, :created-at 1685471418885, :author {:login "holyjak", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/624958?v=4"}, :body ";; Since Clojure 1.11 we can also use this with e.g. into:\n(into {}\n (comp\n (map (juxt :l :n))\n (halt-when (comp (complement number?) second) \n (constantly ::invalid)))\n [{:l \"A\" :n 1}\n {:l \"B\" :n \"not a number!\"}\n {:l \"C\" :n 3}])\n;; => ::invalid\n;; (remove the B entry to get `=> {\"A\" 1, \"C\" 3}`)", :_id "647640bae4b08cf8563f4bc7"}], :notes [{:author {:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}, :updated-at 1520774998468, :created-at 1520774998468, :body "`halt-when` is an odd transducer in that it is supposed to be used with `transduce`, but not in other transducible contexts like `sequence` or `into`.\n\nSays Alex Miller at https://dev.clojure.org/jira/browse/CLJ-1451: ‘Yeah, halt-when is a little tricky to use in transducible contexts other than transduce.’ Some more discussion at https://groups.google.com/d/msg/clojure/6HvmJIUsXKk/gLqUsfcnAwAJ.\n", :_id "5aa52f56e4b0316c0f44f91e"} {:author {:login "holyjak", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/624958?v=4"}, :updated-at 1685471806059, :created-at 1685471806059, :body "Not anymore, as pointed out above, at least `into` works fine under Clojure 1.11", :_id "6476423ee4b08cf8563f4bc8"}], :arglists ["pred" "pred retf"], :doc "Returns a transducer that ends transduction when pred returns true\n for an input. When retf is supplied it must be a fn of 2 arguments -\n it will be passed the (completed) result so far and the input that\n triggered the predicate, and its return value (if it does not throw\n an exception) will be the return value of the transducer. If retf\n is not supplied, the input that triggered the predicate will be\n returned. If the predicate never returns true the transduction is\n unaffected.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/halt-when"} {:added "1.0", :ns "clojure.core", :name "with-in-str", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1398723552000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-out-str", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f33"}], :line 4727, :examples [{:author {:login "tormaroe", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8bc7bb10bee96efb190053fe92ffd250?r=PG&default=identicon"}, :editors [{:login "tormaroe", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8bc7bb10bee96efb190053fe92ffd250?r=PG&default=identicon"}], :body ";; Given you have a function that will read from *in*\n(defn prompt [question]\n (println question)\n (read-line))\n\nuser=> (prompt \"How old are you?\")\nHow old are you?\n34 ; <== This is what you enter\n\"34\" ; <== This is returned by the function\n\n;; You can now simulate entering your age at the prompt by using with-in-str\n\nuser=> (with-in-str \"34\" (prompt \"How old are you?\"))\nHow old are you?\n\"34\" ; <== The function now returns immediately \n", :created-at 1289600189000, :updated-at 1289600648000, :_id "542692c7c026201cdc3269d8"}], :macro true, :notes nil, :arglists ["s & body"], :doc "Evaluates body in a context in which *in* is bound to a fresh\n StringReader initialized with the string s.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/with-in-str"} {:added "1.0", :ns "clojure.core", :name "remove-watch", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1331136355000, :author {:login "pjlegato", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4ce55cfd8b3ae2f63f5ecbc8fc1c05d4?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "add-watch", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c2f"} {:created-at 1498791146039, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/10404?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "atom", :ns "clojure.core"}, :_id "5955bceae4b06e730307db49"} {:created-at 1498791163420, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/10404?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "var", :ns "clojure.core"}, :_id "5955bcfbe4b06e730307db4a"} {:created-at 1498791180171, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/10404?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ref", :ns "clojure.core"}, :_id "5955bd0ce4b06e730307db4b"} {:created-at 1661778678117, :author {:login "wactbprot", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/113518?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "agent", :ns "clojure.core"}, :_id "630cbaf6e4b0b1e3652d765e"}], :line 2162, :examples [{:body "(def a (atom nil))\n\n;; The key of the watch is `:logger`\n(add-watch a :logger #(println %4))\n\n(reset! a [1 2 3])\n\n;; Deactivate the watch by its assigned key\n(remove-watch a :logger)", :author {:login "jkxyz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10171367?v=3"}, :created-at 1434458463428, :updated-at 1434458576224, :editors [{:login "jkxyz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10171367?v=3"}], :_id "5580195fe4b03e2132e7d197"}], :notes nil, :arglists ["reference key"], :doc "Removes a watch (set by add-watch) from a reference", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/remove-watch"} {:added "1.4", :ns "clojure.core", :name "ex-info", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1414982233911, :author {:login "also", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/15624?v=2"}, :to-var {:ns "clojure.core", :name "ex-data", :library-url "https://github.com/clojure/clojure"}, :_id "5456ea59e4b03d20a102429b"} {:created-at 1504289816491, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "throw", :ns "clojure.core"}, :_id "59a9a418e4b09f63b945ac5e"} {:created-at 1517620449117, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "try", :ns "clojure.core"}, :_id "5a750ce1e4b0e2d9c35f7407"} {:created-at 1517620458546, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "catch", :ns "clojure.core"}, :_id "5a750ceae4b0e2d9c35f7408"} {:created-at 1517620910204, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "finally", :ns "clojure.core"}, :_id "5a750eaee4b0e2d9c35f740f"} {:created-at 1518042214699, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "print-stack-trace", :ns "clojure.stacktrace"}, :_id "5a7b7c66e4b0316c0f44f8a4"}], :line 4783, :examples [{:body "(try\n (throw \n (ex-info \"The ice cream has melted!\" \n {:causes #{:fridge-door-open :dangerously-high-temperature} \n :current-temperature {:value 25 :unit :celsius}}))\n (catch Exception e (ex-data e)))\n\n;;=> {:causes #{:fridge-door-open :dangerously-high-temperature} \n;; :current-temperature {:value 25 :unit :celsius}}))\n\n", :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=3"}, :created-at 1424029233597, :updated-at 1457501094130, :editors [{:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/5733420?v=3", :account-source "github", :login "trimtab613"} {:login "snufkon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/490414?v=3"}], :_id "54e0f631e4b01ed96c93c87a"} {:updated-at 1561362532798, :created-at 1561362532798, :author {:login "humorless", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/3061798?v=4"}, :body ";; From https://stackoverflow.com/questions/25211457/\n;; Catching ExceptionInfo will only catch throwables created with ex-info:\n(try\n (throw (ex-info \"bad\" {:a 1 :b 2}))\n (catch clojure.lang.ExceptionInfo e\n (prn \"caught\" e)))\n;; => \"caught\" #", :_id "5d108064e4b0ca44402ef761"} {:updated-at 1680871851550, :created-at 1580222636013, :author {:login "daemianmack", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/24476?v=4"}, :body ";; The 3-arg arity is for linking exceptions in accordance with Java convention.\n;; For example you could write an exception wrapper:\n\n(ns clojure.example)\n\n(defn exception-wrapper\n \"Wrap exceptions to embed `:event` information from the `request` such\n that we preserve the `Caused by` convention.\"\n [request exception]\n (let [event (:event request)\n exc (ex-info (.getMessage ^Throwable exception)\n {:event event}\n exception)]\n (throw exc)))\n\nclojure.example> (exception-wrapper {:event \"some-event-info\"}\n (ex-info \"Dang.\" {:trilobites :everywhere}))\n\n;; => Execution error (ExceptionInfo) at clojure.example/eval5596 (REPL:26).\n;; => Dang.\n\nclojure.example> (clojure.repl/pst *e)\n;; => ExceptionInfo Dang. {:event \"some-event-info\"}\n;; => \tclojure.example/exception-wrapper (NO_SOURCE_FILE:7)\n;; => [...]\n;; => \tclojure.main/repl (main.clj:458)\n;; => Caused by:\n;; => ExceptionInfo Dang. {:trilobites :everywhere}\n\n\n\n;; Like in Java, you should chain exceptions (ex-cause). \n;; This lets you rank the exception in context.\n;; An exception chain is like an interrogation \n;; -> Who are you? (type e) => clojure.lang.ExceptionInfo\n;; -> What is your meaning? (ex-message e) => Divide by Zero\n;; -> Why did you behave badly? (ex-data e) => :divisor was 0\n;; -> Who else was involved? (ex-cause e) => #ArithmeticException{}\n;; --> Who are you? (-> e ex-cause type) => ArithmeticException\n;; ---> Who are you? (-> e ex-cause ex-cause type) => ...\n(def a 1)\n(def b 0)\n\n(try (/ a b)\n (catch ArithmeticException ae ;; <-- \"defuse\" Throwable\n (throw ;; <-- re-throw exception\n (ex-info ;; <-- contextualize ae\n (ex-message ae) ;; <-- chain exception message\n {:divisor b :dividend a} ;; <-- give your new ex-info context\n ae)))) ;; <-- chain ae as cause\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4", :account-source "github", :login "loeschzwerg"} {:login "daemianmack", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/24476?v=4"}], :_id "5e3048ace4b0ca44402ef823"} {:editors [{:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4"}], :body ";; Be careful that when thrown in a future\n;; exceptions are cast into an ExecutionException\n(ns clojure.example)\n\n(try\n @(future \n (throw \n (ex-info \"This exception is not caught\" \n {:useless :data})))\n (catch clojure.lang.ExceptionInfo e \n (println \"Is not executed\"))\n (catch java.util.concurrent.ExecutionException e \n (println \"This one is executed\")))\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/11491686?v=4", :account-source "github", :login "caumond"}, :created-at 1590830551261, :updated-at 1636722156357, :_id "5ed225d7e4b087629b5a1920"}], :notes nil, :arglists ["msg map" "msg map cause"], :doc "Create an instance of ExceptionInfo, a RuntimeException subclass\n that carries a map of additional data.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ex-info"} {:added "1.0", :ns "clojure.core", :name "ifn?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1321052090000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "fn?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c09"}], :line 6230, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; An anonymous function is a function as you'd expect\nuser=> (ifn? #(\"my anonymous function\"))\ntrue\n\n;; Is a vector a function?\nuser=> (ifn? [1 2 3])\ntrue\n\n;; Sure is, lets call it.\nuser=> ([1 2 3] 0)\n1\n\n;; Maps and sets are functions, too.\n\n;; a number is definitely not a function\nuser=> (ifn? 1)\nfalse\n\n;; but a symbol is\nuser=> (ifn? 'foo)\ntrue\n\n;; and so is a keyword\nuser=> (ifn? :foo)\ntrue", :created-at 1281077011000, :updated-at 1329991142000, :_id "542692cdc026201cdc326d38"}], :notes nil, :arglists ["x"], :doc "Returns true if x implements IFn. Note that many data structures\n (e.g. sets and maps) implement IFn", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ifn_q"} {:added "1.5", :ns "clojure.core", :name "some->", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1412083935441, :author {:login "jw-00000", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2936?v=2"}, :to-var {:ns "clojure.core", :name "some->>", :library-url "https://github.com/clojure/clojure"}, :_id "542ab0dfe4b0df9bb778a59b"} {:created-at 1412083945874, :author {:login "jw-00000", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2936?v=2"}, :to-var {:ns "clojure.core", :name "->", :library-url "https://github.com/clojure/clojure"}, :_id "542ab0e9e4b0df9bb778a59c"} {:created-at 1412268640070, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "cond->", :library-url "https://github.com/clojure/clojure"}, :_id "542d8260e4b05f4d257a298e"} {:created-at 1412268648681, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "cond->>", :library-url "https://github.com/clojure/clojure"}, :_id "542d8268e4b05f4d257a298f"} {:created-at 1412268658944, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "as->", :library-url "https://github.com/clojure/clojure"}, :_id "542d8272e4b05f4d257a2990"} {:created-at 1412268673788, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "->>", :library-url "https://github.com/clojure/clojure"}, :_id "542d8281e4b05f4d257a2991"}], :line 7584, :examples [{:body "user=> (-> {:a 1} :b inc)\n;; NullPointerException clojure.lang.Numbers.ops (Numbers.java:942)\n\nuser=> (some-> {:a 1} :b inc)\n;; nil\n", :author {:login "boxp", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1819576?v=2"}, :created-at 1412868850592, :updated-at 1412868897594, :editors [{:login "boxp", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1819576?v=2"}], :_id "5436aaf2e4b06dbffbbb00bd"} {:updated-at 1444741522705, :created-at 1444741522705, :author {:login "marick", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/71909?v=3"}, :body ";; Often used to \"short-circuit out\" of a series of steps:\n\n(some-> val\n step1\n step2\n step3)\n\n;; When nil is returned by any step, the further steps are not executed. Thus\n;; the nil case need be handled only once, at the end.", :_id "561d0192e4b084e61c76ecc3"}], :macro true, :notes nil, :arglists ["expr & forms"], :doc "When expr is not nil, threads it into the first form (via ->),\n and when that result is not nil, through the next etc", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/some->"} {:added "1.9", :ns "clojure.core", :name "nat-int?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495640911419, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pos-int?", :ns "clojure.core"}, :_id "5925ab4fe4b093ada4d4d72e"} {:created-at 1495640921991, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "neg-int?", :ns "clojure.core"}, :_id "5925ab59e4b093ada4d4d72f"} {:created-at 1495705366734, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "int?", :ns "clojure.core"}, :_id "5926a716e4b093ada4d4d750"}], :line 1420, :examples [{:updated-at 1495030925280, :created-at 1495030925280, :author {:login "larrychristensen", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/2092583?v=3"}, :body "user> (nat-int? 0)\ntrue\nuser> (nat-int? 1)\ntrue\nuser> (nat-int? -1)\nfalse\n;; especially useful for specs\nuser> (require '[clojure.spec :as spec])\nnil\nuser> (spec/def quantity nat-int?)\nuser/quantity\nuser> (spec/def ::quantity nat-int?)\n:user/quantity\nuser> (spec/valid? ::quantity -1)\nfalse", :_id "591c5c8de4b01920063ee060"} {:updated-at 1495703903990, :created-at 1495703903990, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body "(nat-int? 0)\n;;=> true\n(nat-int? 1)\n;;=> true\n(nat-int? 9223372036854775807)\n;;=> true\n\n;;;; false for negative values\n\n(nat-int? -1)\n;;=> false\n\n;;;; false for decimal values\n\n(nat-int? 0.0)\n;;=> false\n(nat-int? 1.0)\n;;=> false\n(nat-int? 1/2)\n;;=> false\n\n;;;; false for BigInt values\n\n(nat-int? 0N)\n;;=> false\n(nat-int? 1N)\n;;=> false\n(nat-int? 9223372036854775808)\n;;=> false", :_id "5926a15fe4b093ada4d4d74d"}], :notes nil, :arglists ["x"], :doc "Return true if x is a non-negative fixed precision integer", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/nat-int_q"} {:ns "clojure.core", :name "proxy-name", :file "clojure/core_proxy.clj", :type "function", :column 1, :see-alsos nil, :line 37, :examples nil, :notes nil, :tag "java.lang.String", :arglists ["super interfaces"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/proxy-name"} {:added "1.0", :ns "clojure.core", :name "ns-interns", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1288055138000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "ns-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ae9"} {:created-at 1298556643000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "ns-publics", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aea"} {:created-at 1348479295000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ns-aliases", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aeb"} {:created-at 1348479323000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ns-refers", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aec"}], :line 4207, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body "user=> (take 2 (ns-interns `clojure.core))\n([sorted-map #'clojure.core/sorted-map] [read-line #'clojure.core/read-line])\n\nuser=> (take 5 (sort (keys (ns-interns `clojure.java.io))))\n(Coercions IOFactory append? as-file as-relative-path)\n\nuser=> (count (ns-interns `clojure.core)) ; only 621 functions to learn :-)\n621\nuser=>", :created-at 1313988495000, :updated-at 1313988495000, :_id "542692c8c026201cdc3269ea"} {:author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :editors [], :body ";; See also http://clojure.org/namespaces for information on namespaces in Clojure and how to inspect and manipulate them", :created-at 1348479359000, :updated-at 1348479359000, :_id "542692d4c026201cdc327018"}], :notes nil, :arglists ["ns"], :doc "Returns a map of the intern mappings for the namespace.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ns-interns"} {:added "1.0", :ns "clojure.core", :name "all-ns", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1516472495588, :author {:login "bkovitz", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/4142015?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ns-name", :ns "clojure.core"}, :_id "5a6388afe4b093a19c35dc09"}], :line 4147, :examples [{:updated-at 1332953063000, :created-at 1281460579000, :body "user=> (all-ns)\n(# # # # # # # # # # # # # # # # # # # # # # # # #)", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692c7c026201cdc326990"} {:updated-at 1516472462629, :created-at 1516472462629, :author {:login "bkovitz", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/4142015?v=4"}, :body ";; The names of all your current namespaces that end in \"-test\":\n\n(->> (all-ns)\n (map ns-name)\n (map name)\n (filter #(clojure.string/ends-with? % \"-test\")))\n;;=> (\"core-test\" \"farg.pmatch-test\")", :_id "5a63888ee4b093a19c35dc08"}], :notes nil, :arglists [""], :doc "Returns a sequence of all namespaces.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/all-ns"} {:ns "clojure.core", :name "find-protocol-method", :file "clojure/core_deftype.clj", :type "function", :column 1, :see-alsos nil, :line 546, :examples nil, :notes nil, :arglists ["protocol methodk x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/find-protocol-method"} {:added "1.0", :ns "clojure.core", :name "subvec", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1291975197000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vector", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dee"} {:created-at 1291975205000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vector?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521def"}], :line 3818, :examples [{:updated-at 1423278293433, :created-at 1281558954000, :body ";; not supplying 'end' returns vector from 'start' to (count vector)\nuser=> (subvec [1 2 3 4 5 6 7] 2)\n[3 4 5 6 7]\n\n;; supplying 'end' returns vector from 'start' to element (- end 1)\nuser=> (subvec [1 2 3 4 5 6 7] 2 4)\n[3 4]", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"} {:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"} {:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"} {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"}], :author {:avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon", :account-source "clojuredocs", :login "zmila"}, :_id "542692cec026201cdc326d62"} {:editors [{:login "burnall", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1253998?v=3"}], :body ";; Remove one item by index\n\n(let [coll [0 1 2 3 4 5]\n i 3]\n (concat (subvec coll 0 i)\n (subvec coll (inc i))))\n;; => (0 1 2 4 5)", :author {:avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3", :account-source "github", :login "freckletonj"}, :created-at 1476828499701, :updated-at 1485765017826, :_id "58069d53e4b001179b66bdcd"} {:updated-at 1504176183534, :created-at 1503932170688, :author {:login "Sophia-Gold", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/19278114?v=4"}, :body ";; To query the indices of a subvec:\n(def foo (vec (range 10)))\n(def bar (subvec foo 3 7)) \n=> (.start bar)\n3\n=> (.end bar)\n7\n\n;; Increments with repeated slicing:\n(def baz (subvec bar 2))\n=> (.start baz)\n5\n\n;; Return the original vector:\n=> (.v bar)\n[0 1 2 3 4 5 6 7 8 9]\n=> (.v baz)\n[0 1 2 3 4 5 6 7 8 9]", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/19278114?v=4", :account-source "github", :login "Sophia-Gold"}], :_id "59a42f0ae4b09f63b945ac58"} {:updated-at 1573491889014, :created-at 1573491506809, :author {:login "jonathan-chen-tda", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/17070766?v=4"}, :body ";; IndexOutOfBoundsException for bad indices\n=> (subvec [0 1 2 3 4 5] 8 9)\nExecution error (IndexOutOfBoundsException) at ...", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/17070766?v=4", :account-source "github", :login "jonathan-chen-tda"}], :_id "5dc99332e4b0ca44402ef7d7"}], :notes [{:author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :updated-at 1522075347012, :created-at 1522075347012, :body "
    \n;; Note that subvec holds a reference to the original vector. If you plan \n;; to split a large vector and never using it again, consider freeing up\n;; the reference.\n\n(let [v1 (subvec (vec (range 1e7)) 0 5)\n      v2 (subvec (vec (range 1e7)) 5 10)]\n      (into v1 v2))\n;; OutOfMem\n\n(let [v1 (into [] (subvec (vec (range 1e7)) 0 5))\n      v2 (into [] (subvec (vec (range 1e7)) 5 10))]\n      (into v1 v2))\n;; [0 1 2 3 4 5 6 7 8 9]\n
    ", :_id "5ab906d3e4b045c27b7fac25"}], :arglists ["v start" "v start end"], :doc "Returns a persistent vector of the items in vector from\n start (inclusive) to end (exclusive). If end is not supplied,\n defaults to (count vector). This operation is O(1) and very fast, as\n the resulting vector shares structure with the original and no\n trimming is done.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/subvec"} {:added "1.0", :ns "clojure.core", :name "for", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1318594692000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "doseq", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c7f"} {:created-at 1338714786000, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "doall", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c80"} {:created-at 1360362825000, :author {:login "ViljamiPeltola", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1535c08820796d57a212a46a6bdd4cca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "recur", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c81"} {:created-at 1484942509711, :author {:login "bheesham", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/171007?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "range", :ns "clojure.core"}, :_id "58826cade4b09108c8545a5c"} {:created-at 1602104691947, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "let", :ns "clojure.core"}, :_id "5f7e2d73e4b0b1e3652d73cc"} {:created-at 1602104699060, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "when", :ns "clojure.core"}, :_id "5f7e2d7be4b0b1e3652d73cd"}], :line 4624, :examples [{:updated-at 1421257348418, :created-at 1279388402000, :body ";; prepare a seq of the even values \n;; from the first six multiples of three\n(for [x [0 1 2 3 4 5]\n :let [y (* x 3)]\n :when (even? y)]\n y)\n;;=> (0 6 12)\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692c7c026201cdc326952"} {:updated-at 1588419699839, :created-at 1279947290000, :body "(def digits [1 2 3])\n\n(for [x1 digits\n x2 digits]\n (* x1 x2))\n;;=> (1 2 3 2 4 6 3 6 9)", :editors [{:avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon", :account-source "clojuredocs", :login "Jacolyte"} {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "YizhePKU", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/42838469?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon", :account-source "clojuredocs", :login "Jacolyte"}, :_id "542692c7c026201cdc326954"} {:updated-at 1588419818008, :created-at 1283713265000, :body ";; produce a seq of all pairs drawn from two vectors\n(for [x ['a 'b 'c] \n y [1 2 3]]\n [x y])\n;;=> ([a 1] [a 2] [a 3] [b 1] [b 2] [b 3] [c 1] [c 2] [c 3])\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "SubhaSingh", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/12873392?v=3"} {:login "YizhePKU", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/42838469?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/4b163432c99a124feee4be046a3f9d66?r=PG&default=identicon", :account-source "clojuredocs", :login "james"}, :_id "542692c7c026201cdc326957"} {:author {:login "james", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4b163432c99a124feee4be046a3f9d66?r=PG&default=identicon"}, :editors [{:login "james", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4b163432c99a124feee4be046a3f9d66?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; produce a seq of the first three powers for a range of integers\n(for [x (range 1 6) \n :let [y (* x x) \n z (* x x x)]] \n [x y z])\n;;=> ([1 1 1] [2 4 8] [3 9 27] [4 16 64] [5 25 125])\n", :created-at 1283713566000, :updated-at 1421257621209, :_id "542692c7c026201cdc326959"} {:updated-at 1588419920709, :created-at 1292101988000, :body ";; produce a seq of squares\n(for [x (range 6)] \n (* x x))\n;;=> (0 1 4 9 16 25)", :editors [{:avatar-url "https://www.gravatar.com/avatar/6ff7e838d2c47adf942be6df4d22b452?r=PG&default=identicon", :account-source "clojuredocs", :login "pashields"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "YizhePKU", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/42838469?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon", :account-source "clojuredocs", :login "alimoeeny"}, :_id "542692c7c026201cdc32695d"} {:author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=2"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; prepare a seq of all keys from entries whose values are 0\n(for [[x y] '([:a 1] [:b 2] [:c 0]) :when (= y 0)] x)\n;;=> (:c)\n", :created-at 1305076075000, :updated-at 1421257745017, :_id "542692c7c026201cdc32695f"} {:author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; Demonstrating performance difference between :when and :while\n\n(time (dorun (for [x (range 1000) y (range 10000) :when (> x y)] [x y])))\n;; \"Elapsed time: 2898.908 msecs\"\n;;=> nil\n\n(time (dorun (for [x (range 1000) y (range 10000) :while (> x y)] [x y])))\n;; \"Elapsed time: 293.677 msecs\"\n;;=> nil\n", :created-at 1338313241000, :updated-at 1421258673026, :_id "542692d3c026201cdc326fa6"} {:author {:login "bzhou", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5ea589e907c3d7da52e3c76924fbe3f7?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; Demonstrating functional difference between :when and :while\n\n(for [x (range 3) y (range 3)] [x y])\n;;=> ([0 0] [0 1] [0 2] \n;; [1 0] [1 1] [1 2]\n;; [2 0] [2 1] [2 2])\n\n(for [x (range 3) y (range 3) :when (not= x y)] [x y])\n;;=> ( [0 1] [0 2] \n;; [1 0] [1 2] \n;; [2 0] [2 1] )\n\n; Here we see the :while applied to the immediately preceding seq\n(for [x (range 3) y (range 3) :while (not= x y)] [x y])\n;;=> ( \n;; [1 0] \n;; [2 0] [2 1] )\n\n;; The placement of the :while is important\n;; :while can cause a halt for a particular sequence\n\n(for [x (range 3) y (range 3) :while (not= x 1)] [x y])\n;;=> ([0 0] [0 1] [0 2] [2 0] [2 1] [2 2])\n\n(for [x (range 3) :while (not= x 1) y (range 3)] [x y])\n;;=> ([0 0] [0 1] [0 2])\n", :created-at 1340260912000, :updated-at 1510266180494, :_id "542692d3c026201cdc326fa7"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; More examples illustrating the difference between :when and :while\n\n;; Simple but inefficient method of checking whether a number is\n;; prime.\nuser=> (defn prime? [n]\n (not-any? zero? (map #(rem n %) (range 2 n))))\n#'user/prime?\n\nuser=> (range 3 33 2)\n(3 5 7 9 11 13 15 17 19 21 23 25 27 29 31)\n\n;; :when continues through the collection even if some have the\n;; condition evaluate to false, like filter\nuser=> (for [x (range 3 33 2) :when (prime? x)]\n x)\n(3 5 7 11 13 17 19 23 29 31)\n\n;; :while stops at the first collection element that evaluates to\n;; false, like take-while\nuser=> (for [x (range 3 33 2) :while (prime? x)]\n x)\n(3 5 7)\n\n;; The examples above can easily be rewritten with filter or\n;; take-while. When you have a for with multiple binding forms, so\n;; that the iteration occurs in a nested fashion, it becomes possible\n;; to write something briefly with 'for' that would be more verbose or\n;; unwieldy with nested filter or take-while expressions.\n\nuser=> (for [x (range 3 17 2) :when (prime? x)\n y (range 3 17 2) :when (prime? y)]\n [x y])\n([ 3 3] [ 3 5] [ 3 7] [ 3 11] [ 3 13]\n [ 5 3] [ 5 5] [ 5 7] [ 5 11] [ 5 13]\n [ 7 3] [ 7 5] [ 7 7] [ 7 11] [ 7 13]\n [11 3] [11 5] [11 7] [11 11] [11 13]\n [13 3] [13 5] [13 7] [13 11] [13 13])\n\nuser=> (for [x (range 3 17 2) :while (prime? x)\n y (range 3 17 2) :while (prime? y)]\n [x y])\n([3 3] [3 5] [3 7]\n [5 3] [5 5] [5 7]\n [7 3] [7 5] [7 7])\n\n;; This example only gives a finite result because of the :while\n;; expressions.\nuser=> (for [x (range) :while (< x 10) \n y (range) :while (<= y x)]\n [x y])\n\n([0 0]\n [1 0] [1 1]\n [2 0] [2 1] [2 2]\n [3 0] [3 1] [3 2] [3 3]\n [4 0] [4 1] [4 2] [4 3] [4 4]\n [5 0] [5 1] [5 2] [5 3] [5 4] [5 5]\n [6 0] [6 1] [6 2] [6 3] [6 4] [6 5] [6 6]\n [7 0] [7 1] [7 2] [7 3] [7 4] [7 5] [7 6] [7 7]\n [8 0] [8 1] [8 2] [8 3] [8 4] [8 5] [8 6] [8 7] [8 8]\n [9 0] [9 1] [9 2] [9 3] [9 4] [9 5] [9 6] [9 7] [9 8] [9 9])\n", :created-at 1345760672000, :updated-at 1345760672000, :_id "542692d3c026201cdc326fa8"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; Here are a couple of examples where the only difference is where\n;; the :while is placed, but it makes a significant difference in the\n;; behavior.\n\n;; When x=2 y=1 is reached, :while (<= x y) evaluates false, so all\n;; further items in the y collection are skipped. When x=3 y=1 is\n;; reached, the same thing happens.\n\nuser=> (for [x [1 2 3]\n y [1 2 3]\n :while (<= x y)\n z [1 2 3]]\n [x y z])\n([1 1 1] [1 1 2] [1 1 3]\n [1 2 1] [1 2 2] [1 2 3]\n [1 3 1] [1 3 2] [1 3 3])\n\n;; This is different. When x=2 y=1 z=1 is reached, :while (<= x y)\n;; evaluates false, but since the :while is after the binding for z,\n;; all further items in the z collection are skipped. Then x=2 y=2\n;; z=1 is tried, where the while expresssion evaluates true.\n\nuser=> (for [x [1 2 3]\n y [1 2 3]\n z [1 2 3]\n :while (<= x y)]\n [x y z])\n([1 1 1] [1 1 2] [1 1 3]\n [1 2 1] [1 2 2] [1 2 3]\n [1 3 1] [1 3 2] [1 3 3]\n [2 2 1] [2 2 2] [2 2 3]\n [2 3 1] [2 3 2] [2 3 3]\n [3 3 1] [3 3 2] [3 3 3])\n", :created-at 1345760698000, :updated-at 1345760698000, :_id "542692d3c026201cdc326fa9"} {:author {:login "octopusgrabbus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon"}, :editors [], :body "(defn all-files-present?\n\"Takes a list of real file names, and returns a map of files present 1\nand not present 0.\"\n[file-seq]\n(for [fnam file-seq\n :let [stat-map {(keyword fnam) (look-for fnam \"f\")}]]\n stat-map))\n\n(into {} (all-files-present? '(\"Makefile\" \"build.sh\" \"real-estate.csv\")))\n\n{:Makefile 1, :build.sh 1, :real-estate.csv 0}", :created-at 1356651292000, :updated-at 1356651292000, :_id "542692d3c026201cdc326faa"} {:editors [{:login "alvarogarcia7", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4199136?v=3"}], :updated-at 1456570106848, :created-at 1425980108716, :author {:avatar-url "https://avatars.githubusercontent.com/u/6026368?v=3", :account-source "github", :login "m-combinator"}, :body ";; Flattening a seq of pairs using for comprehensions\n\n(def pairs (for [i (range 10)] [i (inc i)]))\n;; ([0 1] [1 2] [2 3] [3 4] [4 5] [5 6] [6 7] [7 8] [8 9] [9 10])\n\n(def flattened (for [pair pairs element pair] element))\n;; (0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10)", :_id "54febacce4b0b716de7a6536"} {:editors [{:login "colorgmi", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/9025191?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/4199136?v=3", :account-source "github", :login "alvarogarcia7"} {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}], :body ";; Given an array of integers, return indices of the two numbers such that they \n;; add up to a specific target.\n\n;; You may assume that each input would have exactly one solution.\n;; Given nums = [2, 7, 11, 15], target = 9,\n\n;; Because nums[0] + nums[1] = 2 + 7 = 9,\n;; return [0, 1].\n\n(defn two-sum [nums target]\n (let [nums-index (zipmap nums (range))\n indexs (for [[x i] nums-index\n [y j] nums-index\n :when (< i j)\n :when (= (+ x y) target)]\n [i j])]\n (first indexs)))\n\n(two-sum [2 7 11 15] 9)\n;; [0 1]\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/9025191?v=3", :account-source "github", :login "colorgmi"}, :created-at 1455449257369, :updated-at 1460403168325, :_id "56c064a9e4b060004fc217c4"} {:updated-at 1494499956872, :created-at 1494499956872, :author {:login "abhilater", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1904958?v=3"}, :body ";;; Cartesian products of two sets\n\n(#(set\n (for[x %1, y %2]\n [x y])) #{1 2 3} #{4 5})\n\n;=> #{[2 5] [3 4] [1 4] [1 5] [2 4] [3 5]}", :_id "59144274e4b01f4add58feb5"} {:updated-at 1506265801327, :created-at 1506265801327, :author {:login "cuspymd", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/8870299?v=4"}, :body ";; Nested 'for' example to produce indexes of Two-dimensional array\n(for [i (range 3)]\n (for [j (range 3)]\n [i j]))\n\n;=> (([0 0] [0 1] [0 2]) \n; ([1 0] [1 1] [1 2]) \n; ([2 0] [2 1] [2 2]))", :_id "59c7cac9e4b03026fe14ea49"} {:updated-at 1626035981287, :created-at 1626035981287, :author {:login "jr0cket", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/250870?v=4"}, :body ";; Generate the hiccup for a collection of books, each book has unique details defined in each hash-map inside the collection.\n;; Destructure the keys in the hash-map for each book in turn\n\n(def practicalli-book-list\n [{:title \"Practicalli Spacemacs\"\n :url \"https://practical.li/spacemacs\"\n :image \"/practicalli-spacemacs-book-banner.png\"\n :description \"Coding Clojure with Emacs and Vim multi-modal editing\"}\n {:title \"Practicalli Clojure\"\n :url \"https://practical.li/clojure\"\n :image \"/practicalli-clojure-book-banner.png\"\n :description \"Learn the Clojure language through REPL driven development\"}])\n\n(defn books-list\n [books]\n (for [{:keys [title description url image]} books]\n [:div {:class \"column\"}\n [:a {:href url :target \"_blank\"}\n [:img {:src image}]]\n [:p [:a {:href url :target \"_blank\" }\n title]\n description]]))\n\n(book-list practicalli-book-list)\n;; => [:div {:class \"box\"} [:div {:class \"column\"} [:h2 {:class \"title has-text-centered\"} \"Freely available online books\"]] nil ([:div {:class \"column\"} [:div {:class \"columns\"} [:div {:class \"column\"} [:a {:href \"https://practical.li/spacemacs\", :target \"_blank\"} [:figure {:class \"image\"} [:img {:src \"/practicalli-spacemacs-book-banner.png\"}]]]] [:div {:class \"column\"} [:p [:a {:href \"https://practical.li/spacemacs\", :target \"_blank\", :class \"has-text-weight-bold\"} \"Practicalli Spacemacs\"] \"Emacs and Vim multi-modal editing\"]]]] [:div {:class \"column\"} [:div {:class \"columns\"} [:div {:class \"column\"} [:a {:href \"https://practical.li/clojure\", :target \"_blank\"} [:figure {:class \"image\"} [:img {:src \"/practicalli-clojure-book-banner.png\"}]]]] [:div {:class \"column\"} [:p [:a {:href \"https://practical.li/clojure\", :target \"_blank\", :class \"has-text-weight-bold\"} \"Practicalli Clojure\"] \"Learn the Clojure language through REPL driven development\"]]]])]\n", :_id "60eb570de4b0b1e3652d7516"} {:updated-at 1652121747673, :created-at 1652121747673, :author {:login "vipermark7", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/9751748?v=4"}, :body ";; Easy iteration through nested vectors\n\n(def matrix \n [[\"a\" \"b\"] [\"c\" \"d\"]])\n\n(for [row matrix letter row] \n letter)\n\n;; (\"a\" \"b\" \"c\" \"d\")", :_id "62796093e4b0b1e3652d75ed"}], :macro true, :notes [{:updated-at 1279948874000, :body "My English parser was choking on the description of this function.\r\n\r\n[This SO question](http://stackoverflow.com/questions/3322552/how-do-i-multiply-all-elements-in-one-collection-with-all-the-elements-in-another) has helped clarify how this function works.", :created-at 1279948874000, :author {:login "Jacolyte", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f87"} {:updated-at 1279949964000, :body "Example 1 can be rewritten without using the for macro. Pure functional should be preferred if possible:\r\n
    \r\n(filter even? (map (partial * 3)  [0 1 2 3 4 5]))\r\n
    ", :created-at 1279949964000, :author {:login "juergenhoetzel", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2736dfffc803c704dcf25b45ff63cede?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f88"} {:updated-at 1313975247000, :body "On juergenhoetzel's comment:\r\n\r\nAll the examples could be re-written in some combination of map and filter, but they are still valid examples of using the for comprehension, AFAIK:\r\n\r\nExamples:\r\n
    user=> (mapcat (fn [e] (map (fn [x] (* x e)) [1 2 3])) [1 2 3])\r\n(1 2 3 2 4 6 3 6 9)\r\nuser=> (mapcat (fn [e] (map (fn [x] [e x]) [1 2 3])) ['a 'b 'c])\r\n([a 1] [a 2] [a 3] [b 1] [b 2] [b 3] [c 1] [c 2] [c 3])\r\nuser=> (map (fn [e] [e (* e e)(* e e e)]) (range 1 6))\r\n([1 1 1] [2 4 8] [3 9 27] [4 16 64] [5 25 125])\r\nuser=> (map (fn [e] (* e e)) (range 3 7))\r\n(9 16 25 36)\r\nuser=> (map first (filter (fn [[x y]] (= y 0)) '([:a 1] [:b 2] [:c 0])))\r\n(:c)\r\nuser=>\r\n
    \r\n\r\n", :created-at 1313973784000, :author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fc7"} {:updated-at 1356553692000, :body "Take careful note of the description's wording:\r\n\r\n binding-form/collection-expr pairs, \r\n each followed by zero or more modifiers\r\n\r\nA consequence is that the binding list may *not* begin with a modifier, i.e a `:let`, `:when` or `:while`!\r\n\r\nThe following example is **illegal** syntax:\r\n\r\n (for [:let [a 1] b (range 5)] \r\n {a b})\r\n\r\nWhile it might sometimes be convenient to start a `for` with a `:let` to reduce code clutter, the \"correct\" procedure is to nest the `for` in a \"proper\" `let`, like this:\r\n\r\n (let [a 1]\r\n (for [b (range 5)] \r\n {a b}))\r\n\r\nSimilarly, a `:when` is better represented by nesting in an `if`.\r\n\r\n", :created-at 1356553540000, :author {:login "csmotricz", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/6c620615dfb537dbd5325380bd2eaa07?r=PG&default=identicon"}, :_id "542692edf6e94c6970521ffa"} {:updated-at 1375377539000, :body "The fifth example should probably be shown in first position, it's the most straightforward and readable for a beginner : \r\n\r\n(for [x (range 3 7)] (* x x))", :created-at 1375377539000, :author {:login "Joan Charmant", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/75a5fdba1a164425d43d3b9c4b830287?r=PG&default=identicon"}, :_id "542692edf6e94c6970522009"} {:updated-at 1395006875000, :body "\"**Sequence** comprehension\", not \"list comprehension\". ", :created-at 1395006875000, :author {:login "Thumbnail", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/db68e51797a2382e185b42ce6534b7a4?r=PG&default=identicon"}, :_id "542692edf6e94c6970522021"}], :arglists ["seq-exprs body-expr"], :doc "List comprehension. Takes a vector of one or more\n binding-form/collection-expr pairs, each followed by zero or more\n modifiers, and yields a lazy sequence of evaluations of expr.\n Collections are iterated in a nested fashion, rightmost fastest,\n and nested coll-exprs can refer to bindings created in prior\n binding-forms. Supported modifiers are: :let [binding-form expr ...],\n :while test, :when test.\n\n (take 100 (for [x (range 100000000) y (range 1000000) :while (< y x)] [x y]))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/for"} {:added "1.0", :ns "clojure.core", :name "binding", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1322088130000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-redefs", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e9a"} {:created-at 1374313487000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-bindings", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e9b"} {:created-at 1374512208000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-local-vars", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e9c"} {:created-at 1425742740372, :author {:login "kimtg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7685905?v=3"}, :to-var {:ns "clojure.core", :name "def", :library-url "https://github.com/clojure/clojure"}, :_id "54fb1b94e4b01ed96c93c886"}], :line 1947, :examples [{:author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :editors [{:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Here are the definitions.\n(defn mymax [x y]\n (min x y))\n\n(defn find-max [x y]\n (max x y))\n\nuser=> (let [max mymax]\n (find-max 10 20))\n\n20 ;let is ineffective outside current lexical scope\n\n\nuser=> (binding [max mymax]\n (find-max 10 20))\n\n10 ;because max is now acting as min", :created-at 1281546900000, :updated-at 1287628874000, :_id "542692cfc026201cdc326e66"} {:updated-at 1579643060326, :created-at 1321652674000, :body ";; As of Clojure 1.3, vars need to be explicitly marked as ^:dynamic in order for\n;; them to be dynamically rebindable:\n\nuser=> (def ^:dynamic x 1)\nuser=> (def ^:dynamic y 1)\nuser=> (+ x y)\n2\n\n;; Within the scope of the binding, x = 2 and y = 3\n\nuser=> (binding [x 2 \n y 3]\n (+ x y))\n5\n\n;; But once you leave the binding's scope, x and y maintain their original\n;; bindings:\n\nuser=> (+ x y)\n2", :editors [{:login "dijonkitchen", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/cab456ee2c30d86ce89400390ad812c6?r=PG&default=identicon", :account-source "clojuredocs", :login "onlyafly"}, :_id "542692d2c026201cdc326f54"} {:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [{:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}], :body ";;Use t like a \"template\"\n\n(declare ^:dynamic t)\n\n(defn addt [] \n (+ t 10))\n\n(binding [t 1]\n (addt))\n=> 11", :created-at 1326330032000, :updated-at 1326330097000, :_id "542692d2c026201cdc326f55"} {:body "; You can set! bindings. Useful in a stateful programming.\nuser=> (def ^:dynamic d)\n#'user/d\nuser=> d\n#\nuser=> (binding [d 0] (prn d) (set! d 1) (prn d))\n0\n1\nnil\nuser=> d\n#\n\n; Note that you can't use set! outside of binding [] \"stack\":\n(set! d 1) ; => ...Can't change/establish root binding...\n; You can use set! anywhere under binding [] \"stack\", including from lazy sequences:\n(defn set-d [v] (set! d v))\n(binding [d 0] (set-d 1) (prn d)) ;=> 1\n(first (binding [d 0] (set-d 1) (repeat d)) ) ;=> 1\n; But NOT from delay/force:\n(force (binding [d 0] (set-d 1) (delay d)) ) ;=> ...clojure.lang.Var$Unbound...", :author {:login "kimtg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7685905?v=3"}, :created-at 1425741813941, :updated-at 1546186846359, :editors [{:login "kimtg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7685905?v=3"} {:avatar-url "https://avatars2.githubusercontent.com/u/4270240?v=4", :account-source "github", :login "peter-kehl"} {:login "green-coder", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4"}], :_id "54fb17f5e4b01ed96c93c883"} {:body "; Speed test. recur is the preferred way.\nuser=> (def a (atom 0))\n#'user/a\nuser=> (def ^:dynamic b)\n#'user/b\nuser=> (def d)\n#'user/d\nuser=> (time (loop [r 0] (when (< r 10000000) (recur (inc r)))))\n\"Elapsed time: 8.062612 msecs\"\nnil\nuser=> (time (dotimes [_ 10000000] (reset! a 1)))\n\"Elapsed time: 93.428704 msecs\"\nnil\nuser=> (time (binding [b 0] (dotimes [_ 10000000] (set! b 1))))\n\"Elapsed time: 484.331821 msecs\"\nnil\nuser=> (time (with-local-vars [w 0] (dotimes [_ 10000000] (var-set w 1))))\n\"Elapsed time: 490.598696 msecs\"\nnil\nuser=> (time (dotimes [_ 10000000] (def d 1)))\n\"Elapsed time: 2154.646688 msecs\"\nnil\n", :author {:login "kimtg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7685905?v=3"}, :created-at 1425742394706, :updated-at 1425747333974, :editors [{:login "kimtg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7685905?v=3"}], :_id "54fb1a3ae4b0b716de7a6534"} {:editors [{:login "coldnew", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/39703?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3", :account-source "github", :login "bkovitz"}], :body ";; You can modify the variable inside a binding, \n;; inside a let, you can't.\n\n(def ^:dynamic z)\n\n(binding [z nil]\n (doseq [x (range 4) y (range 4)]\n (set! z [x y]))\n z)\n\n; => [3 3]\n\n;; You can modify the variable inside a for, with dorun.\n\n(binding [z nil]\n (dorun\n (for [x (range 4) y (range 4)]\n (set! z [x y])))\n z)\n\n; => [3 3]", :author {:avatar-url "https://avatars.githubusercontent.com/u/39703?v=3", :account-source "github", :login "coldnew"}, :created-at 1446002313487, :updated-at 1461711689159, :_id "56303e89e4b0290a56055d15"} {:editors [{:login "tizac", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1741276?v=3"}], :body ";; from stackoverflow http://stackoverflow.com/questions/1523240/let-vs-binding-in-clojure\n;; let creates a lexically scoped immutable alias for some value. \n;; binding creates a dynamically scoped binding for some Var.\n\n;; Dynamic binding means that the code inside your binding form and any code \n;; which that code calls (even if not in the local lexical scope) will see the new binding.\n\nuser> (def ^:dynamic x 0)\n#'user/x\n\n;; Lexical vs. dynamic binding:\n\nuser> (defn foo [] (println x))\n#'user/foo\nuser> (binding [x 1] (foo))\n1\nnil\nuser> (let [x 1] (foo))\n0\nnil", :author {:avatar-url "https://avatars.githubusercontent.com/u/1741276?v=3", :account-source "github", :login "tizac"}, :created-at 1463969516607, :updated-at 1463969570676, :_id "574266ece4b0a1a06bdee498"} {:updated-at 1468290506436, :created-at 1468290319127, :author {:login "eyelidlessness", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/199830?v=3"}, :body ";; Beware usage in ClojureScript around asynchronous calls, as the bound\n;; var's original value will be re-established before the async code executes:\n\n(def ^:dynamic *foo* nil)\n\n(binding [*foo* :bar]\n (js/setTimeout\n (fn []\n *foo* ;;=> nil\n ))\n\n;; Also beware *synchronous* usage inside `cljs.test/async`, as the bound\n;; var's original value will not be re-established:\n\n(ns my-ns\n (:require [cljs.test :refer-macros [async deftest is]]))\n\n(def ^:dynamic *foo* nil)\n\n(deftest my-test\n (async done\n (binding [*foo* :bar]\n (done))))\n\n(deftest another-test\n (async done\n (is (nil? *foo*))))\n\n;; FAIL in (another-test)\n;; expected: (nil? *foo*)\n;; actual: (not (nil? :bar))\n\n;; At time of writing, the stable ClojureScript version is 1.9.89.", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/199830?v=3", :account-source "github", :login "eyelidlessness"}], :_id "5784550fe4b0bafd3e2a049e"} {:updated-at 1556458271939, :created-at 1556458271939, :author {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}, :body ";; Re-bind `*in*` so that `read-line` reads from a file instead of stdin.\n;; Taken from here: https://stackoverflow.com/a/24826485/1019491\n\n(with-open [is (clojure.java.io/reader \"/tmp/foo.txt\")]\n (binding [*in* is]\n (println (read-line))))\n\n", :_id "5cc5ab1fe4b0ca44402ef712"} {:updated-at 1565050473837, :created-at 1565050473837, :author {:login "stribb", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/7216352?v=4"}, :body ";; Seed the random number generator so every invocation comes out the same.\n\n(require '[clojure.data.generators :as gen])\n\n(defn not-random-at-all []\n (let [wordlist '[one two three four five]]\n (binding [gen/*rnd* (java.util.Random. 42)]\n (gen/shuffle wordlist))))\n\n(not-random-at-all)\n;; => [two five one three four]\n(not-random-at-all)\n;; => [two five one three four]\n(not-random-at-all)\n;; => [two five one three four]\n", :_id "5d48c669e4b0ca44402ef791"} {:editors [{:login "PEZ", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/30010?v=4"}], :body ";; Beware of lazyness\n(def ^:dynamic *foo* :FOO)\n(defn foo [x] [*foo* x])\n\n;; realized when bindings are reset\n(binding [*foo* :BAR]\n (map foo [1 2 3]))\n=> ([:FOO 1] [:FOO 2] [:FOO 3])\n\n;; force realization while bindings active\n(binding [*foo* :BAR]\n (doall (map foo [1 2 3])))\n=> ([:BAR 1] [:BAR 2] [:BAR 3]) \n\n;; closure `bound-foo` with bindings\n(binding [*foo* :BAR]\n (let [bound-foo (bound-fn [x] (foo x))]\n (map bound-foo [1 2 3])))\n=> ([:BAR 1] [:BAR 2] [:BAR 3]) \n\n;; more convenient closuring\n(binding [*foo* :BAR]\n (let [bound-foo (bound-fn* foo)]\n (map bound-foo [1 2 3])))\n=> ([:BAR 1] [:BAR 2] [:BAR 3]) \n", :author {:avatar-url "https://avatars.githubusercontent.com/u/30010?v=4", :account-source "github", :login "PEZ"}, :created-at 1618243197010, :updated-at 1618346238324, :_id "60746e7de4b0b1e3652d74c4"}], :macro true, :notes [{:updated-at 1409723156000, :body "The first example (binding mymax to max) appears to be broken. The last line generates the error:\r\n
    \r\n  IllegalStateException Can't dynamically bind non-dynamic var: clojure.core/max\r\n
    \r\n\r\nI tried inserting (.setDynamic #'max) at the top, and it got rid of the error, but the binding didn't seem to actually happen. I.e. the last line prints 20.\r\n\r\n
    The only way I could get it to work is by redefining max from scratch as dynamic:\r\n\r\n
    \r\n(defn ^:dynamic max\r\n  ([x] x)\r\n  ([x y] (. clojure.lang.Numbers (max x y)))\r\n  ([x y & more]\r\n   (reduce max (max x y) more)))\r\n
    \r\n\r\nAfter THIS the first example succeeds.\r\n\r\n
    The moral of the story - I guess you can't easily bind built-in functions. You need to write your functions with the intention of them being bindable. And I guess the first example should simply be removed?", :created-at 1409723015000, :author {:login "fordsfords", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ab6989cb3f3a81269d91a003d45dab25?r=PG&default=identicon"}, :_id "542692edf6e94c697052202f"} {:author {:login "NeedMoreDesu", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/3812527?v=4"}, :updated-at 1509569062961, :created-at 1509569062961, :body "So about first example --\n
    \n(defn find-max [x y]\n  (max x y)) ;; => #'user/find-max\n(binding [max clojure.core/min]\n  (find-max 10 20)) ;; Can't dynamically bind non-dynamic var: clojure.core/max\n(def ^:dynamic max clojure.core/max)\n(binding [max clojure.core/min]\n  (find-max 10 20)) ;; => 20\n(defn find-max [x y]\n  (max x y)) ;; => #'user/find-max\n(binding [max clojure.core/min]\n  (find-max 10 20)) ;; => 10\n
    \nLong story short: var needs to be defined `^:dynamic` before you create your function with var being bound here, or else no dynamic building occur (which is intended behavior, I guess).", :_id "59fa3226e4b0a08026c48c8c"} {:author {:login "finalfantasia", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2316604?v=4"}, :updated-at 1677133081409, :created-at 1677133058906, :body "There's a great blog post from Chas Emerick about `binding`, [Be Mindful of Clojure's `binding`](https://cemerick.com/blog/2009/11/03/be-mindful-of-clojures-binding.html), that discusses two common pitfalls that one can fall into when using `binding`.", :_id "63f70502e4b08cf8563f4b72"}], :arglists ["bindings & body"], :doc "binding => var-symbol init-expr\n\n Creates new bindings for the (already-existing) vars, with the\n supplied initial values, executes the exprs in an implicit do, then\n re-establishes the bindings that existed before. The new bindings\n are made in parallel (unlike let); all init-exprs are evaluated\n before the vars are bound to their new values.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/binding"} {:added "1.0", :ns "clojure.core", :name "partial", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1358904778000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "comp", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ccb"} {:created-at 1358904783000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "juxt", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ccc"} {:created-at 1598161159341, :author {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "apply", :ns "clojure.core"}, :_id "5f420107e4b0b1e3652d739e"}], :line 2614, :examples [{:author {:login "nipra", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/142529?v=3"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (def to-english (partial clojure.pprint/cl-format nil \"~@(~@[~R~]~^ ~A.~)\"))\n#'user/to-english\n\nuser=> (to-english 1234567890)\n\"One billion, two hundred thirty-four million, five hundred sixty-seven thousand, eight hundred ninety\"\n", :created-at 1279053300000, :updated-at 1285501907000, :_id "542692cdc026201cdc326ceb"} {:author {:login "nipra", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/142529?v=3"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}], :body "user=> (def hundred-times (partial * 100))\n#'user/hundred-times\n\nuser=> (hundred-times 5)\n500\n\nuser=> (hundred-times 4 5 6)\n12000\n\nuser=> (def add-hundred (partial + 100))\n#'user/add-hundred\n\nuser=> (add-hundred 5)\n105\n", :created-at 1279053544000, :updated-at 1310120171000, :_id "542692cdc026201cdc326cee"} {:author {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}, :editors [{:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"} {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}], :body "(def subtract-from-hundred (partial - 100))\n\nuser=> (subtract-from-hundred 10) ; same as (- 100 10)\n90\n\nuser=> (subtract-from-hundred 10 20) ; same as (- 100 10 20)\n70", :created-at 1317743830000, :updated-at 1318431084000, :_id "542692d4c026201cdc327023"} {:author {:login "mihirmp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a8fd3b9768ad2d1fe09405348276705c?r=PG&default=identicon"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7412474?v=3", :account-source "github", :login "Lacty"} {:login "pbalduino", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/32979?v=4"}], :body "; Maps exponent to coefficient\n; x^3 + 2x + 1\n(def poly (fn [n]\n (cond\n (= 0 n) 1\n (= 1 n) 2\n (= 3 n) 1\n :else 0)))\n\n; Differentiates input by returning a polynomial that is curried\n; 3x^2 + 2\n(defn diff [p]\n (partial (fn [p n] (* (+ 1 n) (p (+ 1 n)))) p))\n\n(poly 3)\n;=> 1\n((diff poly) 3)\n;=> 0\n((diff poly) 2)\n;=> 3\n", :created-at 1339255851000, :updated-at 1575656058223, :_id "542692d4c026201cdc327026"} {:updated-at 1440758720254, :created-at 1440758720254, :author {:login "ftravers", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/443507?v=3"}, :body "user=> (defn fun-full [x y] (+ x y))\n;=> # (fun-full 2 3)\n;=> 5\n\nuser=> (def fun-half (partial fun-full 2))\n;=> # (fun-half 3)\n;=> 5\n", :_id "55e03bc0e4b072d7f27980f2"} {:editors [{:login "liango2", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5696817?v=3"}], :body ";;Takes a function f and the normal full arguments is allowed\n\nuser=> (defn add [x y] (+ x y))\n#'user/add\nuser=> (partial add 1 1 )\n#object[clojure.core$partial$fn__4529 0x5eb8fe04 \"clojure.core$partial$fn__4529@5eb8fe04\"]\nuser=> (apply (partial add 1 1 ) nil)\n2\nuser=> ((partial add 1 1 ))\n2\nuser=> ((partial add 1 1 1))\nArityException Wrong number of args (3) passed to: user/add clojure.lang.AFn.throwArity (AFn.java:429)\n\nuser=>", :author {:avatar-url "https://avatars.githubusercontent.com/u/5696817?v=3", :account-source "github", :login "liango2"}, :created-at 1451241930491, :updated-at 1451242239728, :_id "568031cae4b0e0706e05bd8c"} {:updated-at 1470796972437, :created-at 1470796972437, :author {:login "gosukiwi", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/161972?v=3"}, :body "user=> (def add1 (partial + 1))\n#'user/add1\nuser=> (add1)\n;=> 1\nuser=> (add1 2)\n;=> 3\nuser=> (add1 2 3 4)\n;=> 10\nuser=> (= (add1 2 3 4) (+ 1 2 3 4))\n;=> true", :_id "57aa94ace4b0bafd3e2a04d7"} {:editors [{:login "Lacty", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7412474?v=3"}], :body "(def times (partial *))\n\n(times 1) ; -> 1\n\n(times 1 2 3) ; -> 6\n\n(* 1 2 3) ; -> 6\n\n\n(def add-hundred (partial + 100))\n\n(add-hundred 1) ; -> 101\n\n(add-hundred 1 2 3) ; -> 106\n\n(+ 100 1 2 3) ; -> 106", :author {:avatar-url "https://avatars.githubusercontent.com/u/7412474?v=3", :account-source "github", :login "Lacty"}, :created-at 1470811578410, :updated-at 1470811725631, :_id "57aacdbae4b0bafd3e2a04d8"} {:updated-at 1484410971744, :created-at 1484410971744, :author {:login "codxse", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5813694?v=3"}, :body ";; Check if a character is vowel\n\n(def vowel? #(some (partial = %) \"aiueo\"))\n\n(vowel? \\e)\n;;=> true\n\n(vowel? \\c)\n;;=> nil", :_id "587a505be4b09108c8545a5a"} {:updated-at 1494497949851, :created-at 1494497949851, :author {:login "abhilater", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1904958?v=3"}, :body ";; apply feeds sequence items as variable args to the conj function\n;; variable args gets converted to list in the function arg and hence conj \n;; adds them as a list\n(apply #(conj [0 1] %&) [2 3 4 5])\n;;=> [0 1 (2 3 4 5)]\n\n;; Partial offers are mechanism to feed the variable args as is to the conj \n;; function effectively like (conj [] 2 3 4 5)\n(apply (partial conj [0 1]) [2 3 4 5])\n;;=> [0 1 2 3 4 5]", :_id "59143a9de4b01f4add58feb4"} {:updated-at 1517160889010, :created-at 1517160889010, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;practical example\n\n(def add-domain\n (partial (str \"@clojure.com\")))\n\n(str \"info\" add-domain )\n;;\"info@clojure.com\"", :_id "5a6e09b9e4b0c974fee49d11"} {:updated-at 1518786294793, :created-at 1518786294793, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body "(defn email-struct\n [username domain]\n (str username \"@\" domain))\n\n(def build-email\n #(partial email-struct %))\n\n((build-email \"info\") \"example.com\")\n;;\"info@example.com\"", :_id "5a86d6f6e4b0316c0f44f8c7"} {:updated-at 1556081366466, :created-at 1556081366466, :author {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}, :body ";; partial does not gel well with pure java methods\n\n;; Wrap Java method in Clojure fn\n(defn letter? [ch]\n (Character/isLetter ch))\n\n;; Idiomatic\n(filter letter? \"hello, world!\")\n;; => (\\h \\e \\l \\l \\o \\w \\o \\r \\l \\d)\n\n;; This works\n(filter (partial letter?) \"hello, world!\")\n;; => (\\h \\e \\l \\l \\o \\w \\o \\r \\l \\d)\n\n;; This also works\n(filter #(Character/isLetter %) \"hello, world!\")\n;; => (\\h \\e \\l \\l \\o \\w \\o \\r \\l \\d)\n\n;; This doesn't\n(filter (partial Character/isLetter) \"hello, world!\")\n;; => Unable to find static field: isLetter in class java.lang.Character", :_id "5cbfead6e4b0ca44402ef70f"} {:updated-at 1580488372127, :created-at 1580488372127, :author {:login "sulami", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1843193?v=4"}, :body ";; Beware that partial \"bakes in\" the original function and does not look it up\n;; again at call time, which can be confusing when mocking.\n\n(defn foo [] \"hit foo\")\n;; => #'user/foo\n(defn mock [] \"hit the mock\")\n;; => #'user/mock\n(def par (partial foo))\n;; => #'user/par\n(with-redefs-fn {#'foo mock} #(foo))\n;; => \"hit the mock\"\n(with-redefs-fn {#'foo mock} #(par))\n;; => \"hit foo\"", :_id "5e3456b4e4b0ca44402ef82a"} {:editors [{:login "jvw-git", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/3646688?v=4"}], :body ";; Partial application by calling partial significantly differs from partial\n;; application by wrapping a function call in an anonymous function.\n\n;; The code representing the to-be-applied function and to-be-applied-to arguments\n;; - with the 'call to partial' approach\n;; - is evaluated exactly once, when the call to partial is evaluated.\n;; - is not evaluated when a call to the resulting function is evaluated.\n;; - with the 'wrapped in an anonymous function' approach\n;; - is not evaluated when the anonymous function is evaluated.\n;; - is evaluated anew each time a call to the anonymous function is evaluated.\n\n;; If there are side effects involved in obtaining the to-be-applied function or\n;; to-be-applied-to arguments (because of with-redefs, this includes referring to a\n;; var by providing a symbol), carefully consider which approach to take.\n\n(defn fetch-processing-fn! [] (prn \"fetching...\") (fn [entity] entity))\n\n(defn load-entity! [id] (prn \"loading...\") :entity)\n\n\n(def top-level-fn-1 (partial (fetch-processing-fn!) (load-entity! 123)))\n;; \"fetching...\" is printed.\n;; \"loading...\" is printed.\n\n(top-level-fn-1)\n;; Nothing is printed.\n\n(top-level-fn-1)\n;; Nothing is printed.\n\n\n(def top-level-fn-2 #((fetch-processing-fn!) (load-entity! 123)))\n;; Nothing is printed.\n\n(top-level-fn-2)\n;; \"fetching...\" is printed.\n;; \"loading...\" is printed.\n\n(top-level-fn-2)\n;; \"fetching...\" is printed.\n;; \"loading...\" is printed.", :author {:avatar-url "https://avatars0.githubusercontent.com/u/3646688?v=4", :account-source "github", :login "jvw-git"}, :created-at 1596472064570, :updated-at 1596697721148, :_id "5f283b00e4b0b1e3652d7331"}], :notes [{:updated-at 1385283247000, :body "This function implements the concept of “[currying](http://en.wikipedia.org/wiki/Currying)â€�.", :created-at 1385283247000, :author {:login "roryokane", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5b2b185c814bb25f2f95a1152e58f033?r=PG&default=identicon"}, :_id "542692edf6e94c697052200e"}], :arglists ["f" "f arg1" "f arg1 arg2" "f arg1 arg2 arg3" "f arg1 arg2 arg3 & more"], :doc "Takes a function f and fewer than the normal arguments to f, and\n returns a fn that takes a variable number of additional args. When\n called, the returned function calls f with args + additional args.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/partial"} {:ns "clojure.core", :name "chunked-seq?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1443935187252, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk", :ns "clojure.core"}, :_id "5610b3d3e4b08e404b6c1c97"} {:created-at 1443935201452, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-first", :ns "clojure.core"}, :_id "5610b3e1e4b08e404b6c1c98"} {:created-at 1443935208310, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-rest", :ns "clojure.core"}, :_id "5610b3e8e4b08e404b6c1c99"} {:created-at 1443935214143, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-buffer", :ns "clojure.core"}, :_id "5610b3eee4b0686557fcbd46"} {:created-at 1443935221866, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-next", :ns "clojure.core"}, :_id "5610b3f5e4b0686557fcbd47"}], :line 715, :examples [{:updated-at 1335431382000, :created-at 1335431382000, :body "user=> (chunked-seq? (range 1000))\nfalse\n\nuser=> (chunked-seq? (seq (range 1000)))\ntrue\n\nuser=> (chunked-seq? (iterate inc 10))\nfalse\n\nuser=> (chunked-seq? (seq (iterate inc 10)))\nfalse", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692d2c026201cdc326f60"}], :notes nil, :arglists ["s"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/chunked-seq_q"} {:added "1.3", :ns "clojure.core", :name "find-keyword", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1430167074779, :author {:login "ljosa", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/197881?v=3"}, :to-var {:ns "clojure.core", :name "keyword", :library-url "https://github.com/clojure/clojure"}, :_id "553e9e22e4b01bb732af0a88"} {:created-at 1430167092343, :author {:login "ljosa", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/197881?v=3"}, :to-var {:ns "clojure.core", :name "name", :library-url "https://github.com/clojure/clojure"}, :_id "553e9e34e4b01bb732af0a89"} {:created-at 1430167188442, :author {:login "ljosa", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/197881?v=3"}, :to-var {:ns "clojure.core", :name "keyword?", :library-url "https://github.com/clojure/clojure"}, :_id "553e9e94e4b06eaacc9cda7d"} {:created-at 1430167194731, :author {:login "ljosa", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/197881?v=3"}, :to-var {:ns "clojure.core", :name "symbol", :library-url "https://github.com/clojure/clojure"}, :_id "553e9e9ae4b01bb732af0a8a"} {:created-at 1430167201482, :author {:login "ljosa", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/197881?v=3"}, :to-var {:ns "clojure.core", :name "intern", :library-url "https://github.com/clojure/clojure"}, :_id "553e9ea1e4b06eaacc9cda7e"}], :line 625, :examples [{:body "user=> (find-keyword \"a\")\nnil\nuser=> :a\n:a\nuser=> (find-keyword \"a\")\n:a", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1422932628869, :updated-at 1422932628869, :_id "54d03a94e4b081e022073c45"}], :notes nil, :tag "clojure.lang.Keyword", :arglists ["name" "ns name"], :doc "Returns a Keyword with the given namespace and name if one already\n exists. This function will not intern a new keyword. If the keyword\n has not already been interned, it will return nil. Do not use :\n in the keyword strings, it will be added automatically.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/find-keyword"} {:added "1.0", :ns "clojure.core", :name "replicate", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1385848235000, :author {:login "Alexey Tarasevich", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/43e0398b89022d32b43de4c968069312?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "repeat", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d08"}], :line 3006, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (apply str (replicate 7 \\space))\n ; 7 spaces\n\nuser=> (replicate 7 (rand-int 10))\n(3 3 3 3 3 3 3) ; the same number", :created-at 1281549294000, :updated-at 1332950215000, :_id "542692c9c026201cdc326a82"}], :deprecated "1.3", :notes [{:updated-at 1281553461000, :body "Note that `replicate` is obsolete. It's functionality is now available via the two-arg arity form of [`repeat`](http://clojuredocs.org/v/1578).", :created-at 1281553461000, :author {:login "kotarak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f94"}], :arglists ["n x"], :doc "DEPRECATED: Use 'repeat' instead.\n Returns a lazy seq of n xs.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/replicate"} {:added "1.0", :ns "clojure.core", :name "min-key", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1371841141000, :author {:login "adereth", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5ad11b4e208a6cdb3bd45fe01dea59b7?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "min", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521df4"} {:created-at 1371841145000, :author {:login "adereth", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5ad11b4e208a6cdb3bd45fe01dea59b7?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "max-key", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521df5"}], :line 5009, :examples [{:updated-at 1672874240930, :created-at 1280009320000, :body ";; we have a list of key colours\n;; We want to find the one closest to a supplied colour\n;; We're storing rgb values as [r g b]\n;; use min-key to find colour that minimizes \n;; the euclidean distance between the supplied colour \n;; and each key colour\n;; thanks to rhudson, raek and mfex on #clojure\n\n(defn distance-squared\n \"Euclidean distance between two collections considered as coordinates\"\n [c1 c2]\n (->> (map - c1 c2) (map #(* % %)) (reduce +)))\n\n(def key-colours\n {[224 41 224] :purple\n [24 180 46] :green\n [12 129 245] :blue\n [254 232 23] :yellow\n [233 233 233] :white\n [245 27 55] :red\n [231 119 41] :orange\n })\n\n(defn rgb-to-key-colour\n \"Find colour in colour map closest to the supplied [r g b] triple\"\n [rgb-triple colour-map]\n (colour-map\n (apply min-key (partial distance-squared rgb-triple) (keys colour-map))))\n\nuser=> (rgb-to-key-colour [255 0 0] key-colours)\n:red\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:login "jimberry1", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/73443103?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/583358786e336bb14a400ca17722ec3b?r=PG&default=identicon", :account-source "clojuredocs", :login "lozh"}, :_id "542692ccc026201cdc326ca7"} {:author {:login "jamesqiu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc1268deaa7f2e78fe2b5ea76e6481d8?r=PG&default=identicon"}, :editors [{:login "jamesqiu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc1268deaa7f2e78fe2b5ea76e6481d8?r=PG&default=identicon"}], :body "; \"min-key\"/\"max-key\" to \"min\"/\"max\" like \"sort-by\" to \"sort\"\n(min-key #(Math/abs %) -3 1 4)\n; 1\n\n(apply min-key #(Math/abs %) [-3 1 4])\n; 1\n", :created-at 1311522786000, :updated-at 1328006403000, :_id "542692ccc026201cdc326ca9"} {:updated-at 1593445838944, :created-at 1593445838944, :author {:login "guillaume", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/368?v=4"}, :body "user=> (min-key second [\"Jon\" 1] [\"Rich\" 6] [\"Nancy\" 3])\n[\"Jon\" 1]", :_id "5efa0dcee4b0b1e3652d731a"}], :notes nil, :arglists ["k x" "k x y" "k x y & more"], :doc "Returns the x for which (k x), a number, is least.\n\n If there are multiple such xs, the last one is returned.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/min-key"} {:added "1.5", :ns "clojure.core", :name "reduced", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1416151548299, :author {:login "ljos", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/585174?v=2"}, :to-var {:ns "clojure.core", :name "reduce", :library-url "https://github.com/clojure/clojure"}, :_id "5468c1fce4b0dc573b892fd4"} {:created-at 1416151556515, :author {:login "ljos", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/585174?v=2"}, :to-var {:ns "clojure.core", :name "reduced?", :library-url "https://github.com/clojure/clojure"}, :_id "5468c204e4b03d20a10242ab"} {:created-at 1456683943617, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unreduced", :ns "clojure.core"}, :_id "56d33ba7e4b02a6769b5a4ba"} {:created-at 1464286469066, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ensure-reduced", :ns "clojure.core"}, :_id "57473d05e4b0af2c9436d1f3"}], :line 2836, :examples [{:body ";; Suppose you want to short-circuit a sum like:\n(reduce (fn [a v] (+ a v)) (range 10))\n;;=> 45\n\n;; So that it returns the sum of the integers if less than 100:\n(reduce (fn [a v] (if (< a 100) (+ a v) (reduced :big))) (range 10))\n;;=> 45\n\n;; But the keyword :big otherwise:\n(reduce (fn [a v] (if (< a 100) (+ a v) (reduced :big))) (range 20))\n;;=> :big\n\n;; The value returned by (reduced :big) short-circuits the reduction so that \n;; it returns the wrapped value without ranging over the entire sequence.\n;; This is useful for infinite lazy sequences:\n(reduce (fn [a v] (if (< a 100) (+ a v) (reduced :big))) (range))\n;;=>:big\n\n;; Which would otherwise not terminate.", :author {:login "silasdavis", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/99715?v=2"}, :created-at 1412246795536, :updated-at 1495285680591, :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/4996067?v=3", :account-source "github", :login "matanster"}], :_id "542d2d0be4b05f4d257a2985"} {:updated-at 1516387837196, :created-at 1447889898907, :author {:login "teymuri", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/13352033?v=3"}, :body ";;re-implementing (some) using (reduce) and (reduced):\n\n(defn resome [pred koll]\n (reduce (fn [_ c] (when-let [x (pred c)] (reduced x)))\n nil koll))\n\n;;user> (resome #{4} [3 4 2 3 2])\n;;>>> 4\n;;user> (resome even? [3 41 25 3 2])\n;;>>> true\n;;user> (resome even? [3 41 25 3 27])\n;;>>> nil", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/13352033?v=3", :account-source "github", :login "teymuri"} {:login "functor-soup", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6382230?v=3"} {:avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4", :account-source "github", :login "bfontaine"} {:login "featheredtoast", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1322534?v=4"}], :_id "564d0beae4b0be225c0c4795"} {:updated-at 1545247173119, :created-at 1545247173119, :author {:login "TravisHeppner", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/9536486?v=4"}, :body ";;note the return from f must be from reduced for reduce to terminate early.\n\n;;no early termination as the return of f is nil\n(reduce (fn f [a b]\n (when (> b 2)\n (reduced \"Done early!\"))\n (println b)) [1 2 3 4 5])\n;;2\n;;3\n;;4\n;;5\n;;=> nil\n\n;;early termination as the return of f is \"Done early!\" wrapped in a reduce object.\n(reduce (fn f [a b]\n (if (> b 2)\n (reduced \"Done early!\")\n (println b))) [1 2 3 4 5])\n;;2\n;;=> \"Done early!\"", :_id "5c1a99c5e4b0ca44402ef5ee"}], :notes nil, :arglists ["x"], :doc "Wraps x in a way such that a reduce will terminate with the value x", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/reduced"} {:added "1.0", :ns "clojure.core", :name "char-escape-string", :file "clojure/core_print.clj", :type "var", :column 1, :see-alsos [{:created-at 1375209851000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "char-name-string", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cd9"} {:created-at 1534950301941, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "escape", :ns "clojure.string"}, :_id "5b7d7b9de4b00ac801ed9e6b"}], :line 200, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; simple examples\n\nuser=> (char-escape-string \\newline)\n\"\\\\n\"\nuser=> (char-escape-string \\c) ; no escape sequence for 'c'\nnil\nuser=> (char-escape-string \\tab)\n\"\\\\t\"\nuser=> (char-escape-string \\backspace)\n\"\\\\b\"\nuser=>", :created-at 1313928437000, :updated-at 1313928437000, :_id "542692c7c026201cdc3269b6"} {:updated-at 1534950256834, :created-at 1534950256834, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body "(require '[clojure.string :as s])\n\n;; Would like to print \"s\" as shown literally:\n(def s \"Type backslash-t '\\t' followed by backslash-n '\\n'\")\n\n;; This doesn't work, as \\t and \\n are interpreted:\n(println s)\n;; Type backslash-t ' ' followed by backslash-n '\n;; '\n\n;; Use with escape to print literally:\n(println (s/escape s char-escape-string))\n;; Type backslash-t '\\t' followed by backslash-n '\\n'", :_id "5b7d7b70e4b00ac801ed9e6a"}], :notes nil, :tag "java.lang.String", :arglists [], :doc "Returns escape string for char or nil if none", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/char-escape-string"} {:added "1.0", :ns "clojure.core", :name "re-matches", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1324028223000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "re-find", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d06"} {:created-at 1379040151000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "subs", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d07"} {:created-at 1432238328876, :author {:login "bobpoekert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/45596?v=3"}, :to-var {:ns "clojure.core", :name "re-groups", :library-url "https://github.com/clojure/clojure"}, :_id "555e38f8e4b01ad59b65f4d9"} {:created-at 1521975114344, :author {:login "witek", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/209520?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "re-pattern", :ns "clojure.core"}, :_id "5ab77f4ae4b045c27b7fac24"}], :line 4886, :examples [{:author {:login "ysph", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/eed512f3595f1baa31fd91f3b297ebbf?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; The distinction is that re-find tries to find _any part_ of the string\n;; that matches the pattern, but re-matches only matches if the _entire_\n;; string matches the pattern.\nuser=> (re-matches #\"hello\" \"hello, world\")\nnil\n\nuser=> (re-matches #\"hello.*\" \"hello, world\")\n\"hello, world\"\n\nuser=> (re-matches #\"hello, (.*)\" \"hello, world\")\n[\"hello, world\" \"world\"]\n", :created-at 1294394717000, :updated-at 1324028606000, :_id "542692c8c026201cdc3269eb"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; Note: See clojure.core/subs for discussion of behavior of substrings\n;; holding onto references of the original strings, which can\n;; significantly affect your memory usage in some cases.", :created-at 1379040148000, :updated-at 1379040148000, :_id "542692d4c026201cdc32704f"} {:author {:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"}, :editors [{:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"} {:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"} {:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"}], :body "; Regex match flags can be embedded in the regex string. So, we can convert the normal case-sensitive matching into case-insensitive matching.\n\nuser=> (re-matches #\"hello\" \"HELLO\") ; case-sensitive\nnil\n\nuser=> (re-matches #\"(?i)hello\" \"hello\") ; case-insensitive\n\"hello\"\nuser=> (re-matches #\"(?i)hello\" \"HELLO\") ; case-insensitive\n\"HELLO\"\nuser=> (re-matches #\"(?i)HELLO\" \"heLLo\") ; case-insensitive\n\"heLLo\"\n", :created-at 1399524098000, :updated-at 1399524286000, :_id "542692d4c026201cdc327050"}], :notes [{:author {:login "caumond", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11491686?v=4"}, :updated-at 1615713542191, :created-at 1615713542191, :body "Here is the [java official documentation](https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/util/regex/Pattern.html) for pattern specifications", :_id "604dd506e4b0b1e3652d748e"}], :arglists ["re s"], :doc "Returns the match, if any, of string to pattern, using\n java.util.regex.Matcher.matches(). Uses re-groups to return the\n groups.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/re-matches"} {:added "1.0", :ns "clojure.core", :name "array-map", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1283650361000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "assoc", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c4c"} {:created-at 1397668962000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "hash-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c4d"} {:created-at 1397668975000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sorted-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c4e"}], :line 4379, :examples [{:author {:login "Jacolyte", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (array-map [1 2] [3 4 5])\n{[1 2] [3 4 5]}", :created-at 1280205415000, :updated-at 1332949878000, :_id "542692cec026201cdc326d8c"} {:author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :editors [{:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"} {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (array-map :a 10)\n{:a 10}\n\nuser=> (array-map :a 10 :b 20)\n{:a 10 :b 20}\n\nuser=> (apply array-map [:a 10 :b 20 :c 30])\n{:a 10 :b 20 :c 30}\n\nuser=> (apply assoc {} [:a 10 :b 20 :c 30]) ;same result using assoc\n{:a 10 :b 20 :c 30}\n", :created-at 1283649638000, :updated-at 1285492106000, :_id "542692cec026201cdc326d8e"} {:updated-at 1463365462869, :created-at 1303524077000, :body "user=> (keys (assoc (array-map :foo 10 :bar 20) :baz 30))\n(:baz :foo :bar)\n; baz is first; :foo and :bar follow the order given to array-map\n\n\n;; My results have consistently been different from what's listed above.\nuser=> (keys (assoc (array-map :foo 10 :bar 20) :baz 30))\n; => (:foo :bar :baz)\nuser=> (assoc (array-map :foo 10 :bar 20) :baz 30)\n; => {:foo 10, :bar 20, :baz 30}\nuser=> *clojure-version*\n; => {:major 1, :minor 8, :incremental 0, :qualifier nil}\n;; As long as I have an array map, new items get added to the end, not\n;; the beginning.", :editors [{:login "TradeIdeasPhilip", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/18409827?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon", :account-source "clojuredocs", :login "steveminer"}, :_id "542692cec026201cdc326d93"} {:updated-at 1463365157869, :created-at 1463365157869, :author {:login "TradeIdeasPhilip", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/18409827?v=3"}, :body ";; Sometimes Clojure will automatically choose between a hash map and\n;; an array map. What's the rule? Let's try a few experiments.\n\n;; Start with a quick way to make a map with N items.\nuser=> (defn make-map [count] (zipmap (range count) (range count)))\n;; => #'user/make-map\nuser=> (make-map 3)\n;; => {0 0, 1 1, 2 2}\n\n;; Try a few maps. The cutoff seems to be 9.5. If you have fewer than\n;; 9.5 items you get an array map. If you have more than 9.5 items you\n;; get a hash map.\nuser=> (type (make-map 8))\n;; => clojure.lang.PersistentArrayMap\nuser=> (type (make-map 9))\n;; => clojure.lang.PersistentArrayMap\nuser=> (type (make-map 10))\n;; => clojure.lang.PersistentHashMap\nuser=> (type (make-map 11))\n;; => clojure.lang.PersistentHashMap\n\n;; Using assoc we get similar results. 9 or fewer items yields an array\n;; map. 10 or more yields a hash map.\nuser=> (type (assoc (make-map 9) :x 1)) ; 10 items -> hash map.\n;; => clojure.lang.PersistentHashMap\nuser=> (type (assoc (make-map 8) :x 1)) ; 9 items -> array map.\n;; => clojure.lang.PersistentArrayMap\nuser=> (type (assoc (make-map 8) :x 1 :y 2)) ; 10 items -> hash map.\n;; => clojure.lang.PersistentHashMap\nuser=> (type (assoc (assoc (make-map 8) :x 1) :y 2)) ; 10 items -> hash map.\n;; => clojure.lang.PersistentHashMap\n\n;; But when we use { and } to create a map, the cutoff seems to move to 8.5.\n;; A map with 9 items created with assoc or zipmap would be an array map,\n;; but a map with 9 items created by { } is a hash map.\nuser=> (type {0 0, 1 1, 2 2, 3 3, 4 4, 5 5, 6 6, 7 7}) ; 8 items -> array map.\n;; => clojure.lang.PersistentArrayMap\nuser=> (type {0 0, 1 1, 2 2, 3 3, 4 4, 5 5, 6 6, 7 7, 8 8}) ; 9 items -> hash\n;; => clojure.lang.PersistentHashMap\n\n;; Calling dissoc on an array map always yields an array map, regardless of\n;; the size of the map.\n;; Let's start by making a large array map then remove a few items. This will\n;; give us array maps larger than you could create with assoc.\nuser=> (def array20 (apply array-map (range 40)))\n;; => #'user/array20\nuser=> (type array20)\n;; => clojure.lang.PersistentArrayMap\nuser=> (type (dissoc array20 6))\n;; => clojure.lang.PersistentArrayMap\nuser=> (count (dissoc array20 6))\n;; => 19\nuser=> (type (dissoc array20 6 2))\n;; => clojure.lang.PersistentArrayMap\nuser=> (count (dissoc array20 6 2))\n;; => 18\n\n;; Calling dissoc on a hash map always yields another hash map, regardless\n;; of the size of the map.\n;; Let's start by making a large hash map then remove a lot of items. This\n;; will give us hash maps smaller than you could create with assoc.\nuser=> (type (make-map 40))\n;; => clojure.lang.PersistentHashMap\nuser=> (type (apply dissoc (make-map 40) (range 1 80)))\n;; => clojure.lang.PersistentHashMap\nuser=> (count (apply dissoc (make-map 40) (range 1 80)))\n;; => 1\nuser=> (apply dissoc (make-map 40) (range 1 80))\n;; => {0 0}\nuser=> (type (apply dissoc (make-map 40) (range 0 80)))\n;; => clojure.lang.PersistentHashMap\nuser=> (count (apply dissoc (make-map 40) (range 0 80)))\n;; => 0\nuser=> (apply dissoc (make-map 40) (range 0 80))\n;; => {}\n", :_id "57392e25e4b071da7d6cfd0c"} {:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; Maybe you generated a sequence of kv pairs\n(def kvs [[:a 1] [:b 2] [:c 3] [:d 4] [:e 5] [:f 6] [:g 7] [:h 8] [:i 9]])\n\n;; A naïve approach to putting into an array-map…\n(into (array-map) kvs)\n;; => {:e 5, :g 7, :c 3, :h 8, :b 2, :d 4, :f 6, :i 9, :a 1}\n;; …loses order\n(type *1)\n;; => clojure.lang.PersistentHashMap\n\n;; This approach…\n(apply array-map (sequence cat kvs))\n;; => {:a 1, :b 2, :c 3, :d 4, :e 5, :f 6, :g 7, :h 8, :i 9}\n;; …preserves order\n(type *1)\n;; => clojure.lang.PersistentArrayMap", :author {:avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4", :account-source "github", :login "tomdl89"}, :created-at 1659043605194, :updated-at 1682634761186, :_id "62e2ff15e4b0b1e3652d7631"}], :notes [{:updated-at 1280205606000, :body "The definition is kind of short, IMO. More descriptively, `array-map` creates a mapping with arrays being the keys and the values. It doesn't seem like `array-map` cares whether or not the keys/values are arrays, although it doesn't seem to like sequences.", :created-at 1280205606000, :author {:login "Jacolyte", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f8d"} {:updated-at 1303523878000, :body "An array-map maintains the insertion order of the keys. Look up is linear, which is not a problem for small maps (say less than 10 keys). If your map is large, you should use hash-map instead. \r\n\r\nWhen you assoc onto an existing array-map, the result is a new array-map with the new key as the first key. The rest of the keys are in the same order as the original. Functions such as seq and keys will respect the key order. \r\n\r\nNote that assoc will decide to return a hash-map if the result is too big to be efficient.

    \r\n", :created-at 1303523878000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fba"}], :arglists ["" "& keyvals"], :doc "Constructs an array-map. If any keys are equal, they are handled as\n if by repeated uses of assoc.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/array-map"} {:added "1.3", :ns "clojure.core", :name "unchecked-byte", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1496262162534, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "byte", :ns "clojure.core"}, :_id "592f2612e4b06e730307db1c"}], :line 3516, :examples [{:body "user=> (unchecked-byte 127)\n127\nuser=> (unchecked-byte 128)\n-128\nuser=> (unchecked-byte 255)\n-1\nuser=> (unchecked-byte 256)\n0\nuser=> (unchecked-byte 257)\n1", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423522274775, :updated-at 1423522274775, :_id "54d939e2e4b081e022073c74"} {:updated-at 1496262153952, :created-at 1496262153952, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body "(unchecked-byte 1)\n;;=> 1\n(unchecked-byte 1N)\n;;=> 1\n(unchecked-byte 1.1)\n;;=> 1\n(unchecked-byte 1.9)\n;;=> 1\n(unchecked-byte 5/3)\n;;=> 1\n\n(unchecked-byte -1)\n;;=> -1\n(unchecked-byte -1N)\n;;=> -1\n(unchecked-byte -1.1)\n;;=> -1\n(unchecked-byte -1.9)\n;;=> -1\n(unchecked-byte -5/3)\n;;=> -1\n\n;;;; Note that (unchecked-byte) does not range check its argument\n;;;; so integer overflow or rounding may occur. \n;;;; Use (byte) if you want to throw an exception in such cases.\n\n(unchecked-byte 128)\n;;=> -128\n(unchecked-byte -129)\n;;=> 129\n\n(byte 128)\n;;=> IllegalArgumentException Value out of range for byte: 128\n(byte -129)\n;;=> IllegalArgumentException Value out of range for byte: -129\n\n(unchecked-byte 1.0E2)\n;;=> 100\n(unchecked-byte 1.0E3)\n;;=> -24\n\n(byte 1.0E2)\n;;=> 100\n(byte 1.0E3)\n;;=> IllegalArgumentException Value out of range for byte: 1000.0", :_id "592f2609e4b06e730307db1b"}], :notes nil, :arglists ["x"], :doc "Coerce to byte. Subject to rounding or truncation.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-byte"} {:added "1.0", :ns "clojure.core", :name "with-local-vars", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1374310504000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-bindings", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cea"} {:created-at 1423524505831, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "var-set", :library-url "https://github.com/clojure/clojure"}, :_id "54d94299e4b081e022073c7d"} {:created-at 1437143798426, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "volatile!", :ns "clojure.core"}, :_id "55a912f6e4b06a85937088aa"} {:created-at 1461815729270, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "var-get", :ns "clojure.core"}, :_id "572189b1e4b0f8c89e75b110"}], :line 4340, :examples [{:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; with-local-vars allows you to write more imperative-style code, for cases\n;; where you really want to. factorial isn't a case where it helps, but\n;; it is short and familiar. Note that (var-get acc) can be abbreviated\n;; as @acc\nuser=> (defn factorial [x]\n (with-local-vars [acc 1, cnt x]\n (while (> @cnt 0)\n (var-set acc (* @acc @cnt))\n (var-set cnt (dec @cnt)))\n @acc))\n#'user/factorial\nuser=> (factorial 7)\n5040\n", :created-at 1331249053000, :updated-at 1331249053000, :_id "542692d6c026201cdc3270b9"} {:updated-at 1492497328392, :created-at 1492497328392, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :body "(with-local-vars [a-local-var-variable \"value\"]\n ;; If you use the symbol by itself, you get the Var back\n (println a-local-var-variable)\n ;; So when using local var variables, you must explicitly\n ;; get the value inside the Var\n (println (var-get a-local-var-variable))\n ;; You can also get the value of a Var by using deref\n (println (deref a-local-var-variable))\n ;; Or the @ reader macro\n (println @a-local-var-variable))", :_id "58f5b3b0e4b01f4add58fe96"} {:updated-at 1567623091068, :created-at 1500198345816, :author {:login "char16t", :account-source "github", :avatar-url "https://avatars6.githubusercontent.com/u/5310476?v=4"}, :body ";; with-local-vars allows you to write more imperative-style code, for cases\n;; where you really want to. This example demonstrate how to change variable value\n;; like in for-loop. There used doseq instead of for, because `for` is a macro\n;; that generates lazy sequence that will be realized out of ranges\n;; with-local-vars block \n(with-local-vars [n 0] \n (doseq [x (range 3)]\n (do (var-set n (inc (var-get n)))\n (println (var-get n)))))\n; 1\n; 2\n; 3\n;=> nil\n", :editors [{:avatar-url "https://avatars6.githubusercontent.com/u/5310476?v=4", :account-source "github", :login "char16t"} {:login "cloojure", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/7083783?v=4"}], :_id "596b35c9e4b0d19c2ce9d6fc"}], :macro true, :notes nil, :arglists ["name-vals-vec & body"], :doc "varbinding=> symbol init-expr\n\n Executes the exprs in a context in which the symbols are bound to\n vars with per-thread bindings to the init-exprs. The symbols refer\n to the var objects themselves, and must be accessed with var-get and\n var-set", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/with-local-vars"} {:added "1.0", :ns "clojure.core", :name "ns-imports", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1288055178000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "ns-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e00"}], :line 4200, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [], :body "user> (ns-imports 'clojure.core)\n{ClassVisitor clojure.asm.ClassVisitor, ProcessBuilder java.lang.ProcessBuilder, Enum java.lang.Enum, SuppressWarnings java.lang.SuppressWarnings, Throwable java.lang.Throwable, InterruptedException ...chop...}", :created-at 1288074884000, :updated-at 1288074884000, :_id "542692ccc026201cdc326c68"}], :notes nil, :arglists ["ns"], :doc "Returns a map of the import mappings for the namespace.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ns-imports"} {:added "1.0", :ns "clojure.core", :name "send-off", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1282635172000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "send", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e37"} {:created-at 1282635178000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "agent", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e38"} {:created-at 1282635185000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "shutdown-agents", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e39"} {:created-at 1614551206060, :author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "send-via", :ns "clojure.core"}, :_id "603c18a6e4b0b1e3652d7468"}], :line 2122, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"} {:login "sfreund", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a288ab5288d2c86c37f8ae3aaa133b1a?r=PG&default=identicon"} {:login "sfreund", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a288ab5288d2c86c37f8ae3aaa133b1a?r=PG&default=identicon"} {:login "fordsfords", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7671908?v=3"}], :body "user=> (def my-agent (agent \"\"))\n#'user/my-agent\nuser=> @my-agent\n\"\"\n\n;; Note the following happens asynchronously in a thread\n;; pool\nuser=> (send-off my-agent #(slurp %2) \"file.txt\")\n#\n\n;; while the slurp is in-progress, @my-agent will return \"\".\n\n;; Once the request has completed, the value will\n;; be updated when we look at it.\nuser=> @my-agent\n\"file contents\"\n", :created-at 1285922554000, :updated-at 1417372052900, :_id "542692c8c026201cdc326a5a"} {:editors [{:login "kwladyka", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/3903726?v=3"}], :body ";; send should be used for actions that are CPU limited,\n;; while send-off is appropriate for actions that may block on IO.\n\n;; send is like async/go, send-off is like async/thread\n;; so send use limited pool by CPU for agents to not overload CPU,\n;; while send-off use independent threads without limitations.", :author {:avatar-url "https://avatars1.githubusercontent.com/u/3903726?v=3", :account-source "github", :login "kwladyka"}, :created-at 1496609297326, :updated-at 1496609746458, :_id "59347211e4b06e730307db22"}], :notes [{:updated-at 1396535611000, :body "The example uses \"send\", this is supposed to be an example for \"send-off\".", :created-at 1396535611000, :author {:login "Benissimo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e580eaf74a5f97c7ea01e0c026221a1d?r=PG&default=identicon"}, :_id "542692edf6e94c6970522022"} {:body "\"send\" and \"send-off\" are identical in syntax and semantics. The only difference is the thread pool used to dispatch the agent. \"send\" uses a fixed-sized thread pool initialized at startup to contain a few more threads than the number of cores on the host computer. Since \"send\"s thread pool is fixed size, using it to dispatch blocking code can result in all the pool's threads being blocked, and other \"send\"s queued waiting for a thread to finish its work. This can produce artificially low performance, and in rare conditions, can deadlock (if a queued thread is needed to unblock the blocked pool threads).\n\n\"send-off\" uses a separate thread pool which can grow as-needed. I.e. a \"send-off\" request will never be queued waiting for a thread; if the existing pool is empty, a new thread is created. However, if many long-running CPU-bound (not blocking) requests are being submitted, \"send-off\" can be counter-productive; having more CPU-bound threads than cores results in unnecessary scheduling overhead as the threads are timeshared across the cores. \"send\"s limited thread pool produces higher throughput for CPU-bound requests.", :created-at 1417371642071, :updated-at 1417372219777, :author {:login "fordsfords", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7671908?v=3"}, :_id "547b5ffae4b0dc573b892fe6"}], :arglists ["a f & args"], :doc "Dispatch a potentially blocking action to an agent. Returns the\n agent immediately. Subsequently, in a separate thread, the state of\n the agent will be set to the value of:\n\n (apply action-fn state-of-agent args)", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/send-off"} {:added "1.0", :ns "clojure.core", :name "defmacro", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1336311079000, :author {:login "redraiment", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/33087654dbc710e81f51fda5f8241f28?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "macroexpand", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f7d"} {:created-at 1336311088000, :author {:login "redraiment", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/33087654dbc710e81f51fda5f8241f28?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "macroexpand-1", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f7e"} {:created-at 1336311122000, :author {:login "redraiment", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/33087654dbc710e81f51fda5f8241f28?r=PG&default=identicon"}, :to-var {:ns "clojure.walk", :name "macroexpand-all", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f7f"}], :line 444, :examples [{:author {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"}, :editors [{:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"} {:login "kochb", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1012892?v=3"}], :body "(defmacro with-tree\n \"works on a JTree and restores its expanded paths after executing body\"\n [tree & body]\n `(let [tree# ~tree\n root# (.getRoot (.getModel tree#))\n expanded# (if-let [x# (.getExpandedDescendants\n tree# (TreePath. root#))]\n (enumeration-seq x#)\n ())\n selectionpaths# (. selectionmodel# getSelectionPaths)]\n ~@body\n (doseq [path# expanded#]\n (.expandPath tree# path#))))\n\n;; usage:\n\n(with-tree *one-jtree-instance*\n ;; some code here...\n )", :created-at 1286492372000, :updated-at 1421193676346, :_id "542692ccc026201cdc326c86"} {:author {:login "Clinton", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e460563f35b0b25d8671d6ef83f54ce?r=PG&default=identicon"}, :editors [], :body "(defmacro unless [pred a b]\n `(if (not ~pred) ~a ~b))\n\n;; usage:\n\n(unless false (println \"Will print\") (println \"Will not print\"))", :created-at 1327060274000, :updated-at 1327060274000, :_id "542692d2c026201cdc326f7a"} {:author {:login "octopusgrabbus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon"}, :editors [], :body "(def dbg 1)\n\n(defmacro chk-flagM\n \"Throws an exception if flag does not resolve; else returns flag's value.\"\n [flag]\n (if (not (resolve flag))\n (throw (Exception. (str 'flag \" is not a valid var.\")))\n flag))\n\n(defn write-csv-file\n \"Writes a csv file using a key and an s-o-s\"\n [out-sos out-file]\n\n (if (>= (chk-flagM dbg) 2)\n (println (first out-sos), \"\\n\", out-file))\n\n (spit out-file \"\" :append false)\n (with-open [out-data (io/writer out-file)]\n (csv/write-csv out-data (map #(concat % [\"\"]) out-sos))))\n\n", :created-at 1361941726000, :updated-at 1361941726000, :_id "542692d2c026201cdc326f7b"} {:updated-at 1592919257677, :created-at 1592919257677, :author {:login "vale981", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4025991?v=4"}, :body ";; We can implement algebraic infix notation, which is quite handy for\n;; typing in formulas. :-)\n\n(defmacro __\n \"Expands algebraic infix notation to standard clojure forms. Supports\n operator precedence.\"\n [[item op & rst :as lst]]\n (let [item (if (seq? item)\n `(__ ~item)\n item)]\n (if op\n (case op\n (+ -) `(~op ~item (__ ~rst))\n (* /) (let [[next & rst] rst]\n `(__\n ((~op ~item\n ~(if (seq? next)\n `(__ ~next) next)) ~@rst)))\n ;; we already have a clojure form\n lst)\n item)))\n\n(clojure.walk/macroexpand-all '(__ (1 * 2 + 3 * 4 + (1 + 2))))\n;; => (+ (* 1 2) (+ (* 3 4) (+ 1 2)))\n\n;; parens for precedence\n(clojure.walk/macroexpand-all '(__ (1 + 2 * (3 + 4))))\n;; => (+ 1 (* 2 (+ 3 4)))\n\n;; usual clojure notation in the middle of it\n(clojure.walk/macroexpand-all '(__ (1 + 2 * (+ 3 4))))\n;; => (+ 1 (* 2 (+ 3 4)))", :_id "5ef204d9e4b0b1e3652d730e"} {:updated-at 1603447108371, :created-at 1603446989723, :author {:login "jimka2001", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/6414129?v=4"}, :body ";; The meta data notation `^:dynamic` can be used to force a variable to be dynamic.\n\n(def ^:dynamic *my-dynamic-variable* \"my doc string\" the-initial-value)\n\n;; However, using this notation within a macro does not have the same semantics.\n;; For example the following macro *will not* expand to a definition of a dynamic \n;; variable whose value is a function.\n\n\n(defmacro dyn-fun [name lambda-list & body]. ;; WRONG\n `(def ^:dynamic ~name (fn ~lambda-list ~@body)))\n\n\n;; The macro should be written something like the following.\n\n\n(defmacro dyn-fun [name lambda-list & body]\n `(def ~(with-meta name {:dynamic true}) (fn ~lambda-list ~@body)))\n", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/6414129?v=4", :account-source "github", :login "jimka2001"}], :_id "5f92a8cde4b0b1e3652d73e8"}], :macro true, :notes [{:updated-at 1332614198000, :body "The body of a macro has two implicitly bound symbols: &form and &env. They work like two extra unnamed args. The names begin with '&' to avoid name clashes with normal user-defined symbols. The value of &form is the form of the original macro call before macro expansion. There's useful meta-data on &form. The value of &env is the \"environment\", which is basically a map of lexical bindings. The keys of &env are the lexically bound symbols. The values are internal compiler details, and probably aren't useful for user code.\r\n\r\n\r\nSee also:\r\n[http://blog.jayfields.com/2011/02/clojure-and.html](http://blog.jayfields.com/2011/02/clojure-and.html)", :created-at 1332559647000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fdc"} {:updated-at 1348338864000, :body "Due to syntax-quote resolving symbols (see the [Clojure reader docs](http://clojure.org/reader)), you won't be able to include a regular `let` statement inside a macro, i.e.:\r\n\r\n
    (defmacro m [] `(let [x 1] x))\r\n(m) ; => CompilerException java.lang.RuntimeException: Can't let qualified name: user/x, compiling:(NO_SOURCE_PATH:1)
    \r\n\r\nWe can see why:\r\n\r\n
    (macroexpand-1 '(m)) ; => (clojure.core/let [user/x 1] user/x)
    \r\nThe syntax-quote has resolved `x` to `user/x`—which can't be `let`. This is a good thing, as it's signalling to us that we should use gensyms by appending `#`:\r\n\r\n
    (defmacro m [] `(let [x# 1] x#))\r\n(m) ; => 1\r\n(macroexpand-1 '(m)) ; => (clojure.core/let [x__383__auto__ 1] x__383__auto__)
    ", :created-at 1348338864000, :author {:login "Arlen", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8bfb3a1eb9879049b4886cd3f9f321c4?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fe7"} {:updated-at 1396943327000, :body "@Arlen:\r\nIf you want to capture the local variables, or create a non-locally scoped variable, you can prepend them with ~', allow a namespace capture:\r\n\r\n
    (defmacro m [] `(let [~'x 1] ~'x))\r\n(m) ; => 1\r\n(macroexpand-1 '(m)) ; => (clojure.core/let [x 1] x)\r\n
    \r\nuseful, if you desire it.", :created-at 1396943283000, :author {:login "travis_rodman", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/988e7de687c27107309bebe02aee1984?r=PG&default=identicon"}, :_id "542692edf6e94c6970522024"} {:body "When debugging macros that use &env, beware that
    clojure.walk/macroexpand-all
    doesn't \"set up\" any symbols. It ignores any symbols from
    (let [...] ...)
    and similar. To test &env, run the macro directly.", :created-at 1547117881414, :updated-at 1547117901908, :author {:avatar-url "https://avatars2.githubusercontent.com/u/4270240?v=4", :account-source "github", :login "peter-kehl"}, :_id "5c372539e4b0ca44402ef619"}], :arglists ["name doc-string? attr-map? [params*] body" "name doc-string? attr-map? ([params*] body) + attr-map?"], :doc "Like defn, but the resulting function name is declared as a\n macro and will be used as a macro by the compiler when it is\n called.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/defmacro"} {:added "1.3", :ns "clojure.core", :name "every-pred", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1348529552000, :author {:login "hugoduncan", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/80fa2a15219b987664e4d6f5c78b4c27?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "some-fn", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bf2"} {:created-at 1422932166689, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "every?", :library-url "https://github.com/clojure/clojure"}, :_id "54d038c6e4b0e2ac61831cf4"}], :line 7396, :examples [{:updated-at 1335431607000, :created-at 1335431607000, :body "user=> ((every-pred number? odd?) 3 9 11)\ntrue", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692d2c026201cdc326fa0"} {:editors [{:login "daveliepmann", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/974443?v=4"}], :body "(filter (every-pred pos? ratio?)\n [0 2/3 -2/3 1/4 -1/10 5 3/3])\n=> (2/3 1/4)", :author {:avatar-url "https://avatars3.githubusercontent.com/u/974443?v=4", :account-source "github", :login "daveliepmann"}, :created-at 1549903494471, :updated-at 1551557625726, :_id "5c61a686e4b0ca44402ef67b"} {:updated-at 1549903552234, :created-at 1549903552234, :author {:login "daveliepmann", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/974443?v=4"}, :body "((every-pred string? (comp (partial > 5) count)) \"abc\")\ntrue\n((every-pred string? (comp (partial > 5) count)) \"abcdef\")\nfalse", :_id "5c61a6c0e4b0ca44402ef67c"}], :notes [{:body "Careful—every predicate with no arguments is considered true:\n
    \nuser> ((every-pred (constantly false)))\ntrue\nuser> ((every-pred (constantly false)) 1)\nfalse\n
    ", :created-at 1468616330948, :updated-at 1468616364083, :author {:avatar-url "https://avatars.githubusercontent.com/u/7443?v=3", :account-source "github", :login "harold"}, :_id "57894e8ae4b0bafd3e2a04a3"}], :arglists ["p" "p1 p2" "p1 p2 p3" "p1 p2 p3 & ps"], :doc "Takes a set of predicates and returns a function f that returns true if all of its\n composing predicates return a logical true value against all of its arguments, else it returns\n false. Note that f is short-circuiting in that it will stop execution on the first\n argument that triggers a logical false result against the original predicates.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/every-pred"} {:added "1.0", :ns "clojure.core", :name "keys", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1289979132000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vals", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cef"} {:created-at 1289979143000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "hash-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cf0"} {:created-at 1318592870000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "key", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cf1"} {:created-at 1470842025768, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "select-keys", :ns "clojure.core"}, :_id "57ab44a9e4b0bafd3e2a04db"}], :line 1555, :examples [{:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "(keys {:keys :and, :some :values})\n;;=> (:keys :some)\n\n(keys {})\n;;=> nil\n\n(keys nil)\n;;=> nil", :created-at 1280458583000, :updated-at 1423522822893, :_id "542692c7c026201cdc326951"} {:updated-at 1477296966414, :created-at 1477296966414, :author {:login "gzmask", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/132936?v=3"}, :body ";; although doc says it only takes a map, this still works:\n(keys (filter (fn [[_ v]] (-> v :t)) {:a {:t true} :b {:t false} :c {:t true}}))\n;;=> (:a :c)", :_id "580dc346e4b001179b66bddb"}], :notes [{:updated-at 1385457055000, :body "Functions keys and vals return sequences such that\r\n
    \r\n(= (zipmap (keys m) (vals m)) m)\r\n
    ", :created-at 1385457055000, :author {:login "akhudek", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/aaf21f137b69cc5154c8afb29b793e18?r=PG&default=identicon"}, :_id "542692edf6e94c6970522010"} {:body "I noticed that the keys are not always returned in the same order. Usually they are, but not always.", :created-at 1443420358374, :updated-at 1443420375336, :author {:avatar-url "https://avatars.githubusercontent.com/u/5528061?v=3", :account-source "github", :login "Jarzka"}, :_id "5608d8c6e4b08e404b6c1c8a"} {:author {:login "ac1dr3d", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10298138?v=4"}, :updated-at 1522928591363, :created-at 1522928591363, :body "Map with 8 or more keys order are unexpected.", :_id "5ac60bcfe4b045c27b7fac36"}], :arglists ["map"], :doc "Returns a sequence of the map's keys, in the same order as (seq map).", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/keys"} {:added "1.0", :ns "clojure.core", :name "rationalize", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 1277, :examples [{:author {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}, :editors [], :body "
    \r\nuser=> (rationalize 1.5)\r\n3/2\r\n
    ", :created-at 1283819843000, :updated-at 1283819843000, :_id "542692cbc026201cdc326c27"} {:updated-at 1335430728000, :created-at 1335430728000, :body "user=> (rationalize Math/PI)\n3141592653589793/1000000000000000\n\nuser=> (rationalize (Math/sqrt 2))\n14142135623730951/10000000000000000", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692d4c026201cdc327049"} {:body "(rationalize 2/4)\n;; => 1/2\n\n(rationalize 4/2)\n;; => 2\n\n(rationalize 2)\n;; => 2\n\n(rationalize 2.0)\n;; => 2N", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423041167517, :updated-at 1423041167517, :_id "54d1e28fe4b0e2ac61831d0c"} {:updated-at 1495120328324, :created-at 1495120328324, :author {:login "mhmdsalem1993", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/10787314?v=3"}, :body ";; To quickly convert a mixed number to an improper fraction, \n;; multiply the denominator\n;; by the whole number and add to the numerator\n\n(= (+ 20 3/4) (rationalize (/ (+ (* 20 4) 3) 4)))\n;; => true", :_id "591db9c8e4b01920063ee061"}], :notes [{:updated-at 1388083523000, :body "Remember that for irrational numbers, like sqrt 2, this is only an estimate (pretty good one). ", :created-at 1388083523000, :author {:login "wikopl", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ebf7a80146fda866cb2737cbabf79d63?r=PG&default=identicon"}, :_id "542692edf6e94c6970522017"}], :arglists ["num"], :doc "returns the rational value of num", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/rationalize"} {:added "1.0", :ns "clojure.core", :name "load-file", :type "function", :see-alsos [{:created-at 1286271536000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "load", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d3c"} {:created-at 1350073018000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "spit", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d3d"} {:created-at 1519290658085, :author {:login "witek", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/209520?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "load-string", :ns "clojure.core"}, :_id "5a8e8922e4b0316c0f44f8e9"}], :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "shawnmorel", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4a701b9e9467b6ccee6b83c698ea6b15?r=PG&default=identicon"} {:login "Jeff Terrell", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/658b2643cf2a8192286b5bb1ecb62cf8?r=PG&default=identicon"}], :body ";; Very useful from a REPL\n;; Paths are specified as strings using canonical file path notation \n;; (rather than clojure-style namespaces dependent on the JVM classpath).\n;; The working directory is set to wherever you invoked the JVM from, \n;; likely the project root.\n\n(load-file \"src/mylib/core.clj\")\n\n;; now you can go and evaluate vars defined in that file.", :created-at 1286271505000, :updated-at 1344912514000, :_id "542692cdc026201cdc326d3e"} {:author {:login "lambder", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1c0c20072f52de3a6335cae183b865f6?r=PG&default=identicon"}, :editors [{:login "lambder", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1c0c20072f52de3a6335cae183b865f6?r=PG&default=identicon"}], :body ";; file located at src/address_book/core.clj\n;; current dir is src/..\n\n(load-file \"src/address_book/core.clj\")", :created-at 1307936530000, :updated-at 1307936548000, :_id "542692cdc026201cdc326d41"} {:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4", :account-source "github", :login "bfontaine"} {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4"}], :body ";; create a clojure file on the fly using spit\n;; then load it into the REPL and use its function\n\nuser=> (spit \"mycode.clj\" \"(defn doub [x] (* x 2))\")\nnil\nuser=> (load-file \"mycode.clj\")\n#'user/doub\nuser=> (doub 23)\n46\n\n;; Note this is similar to using load-string:\nuser=> (load-string \"(defn doub [x] (* x 2))\")\n#'user/doub", :created-at 1313970180000, :updated-at 1666340708697, :_id "542692cdc026201cdc326d43"}], :notes [{:updated-at 1350351731000, :body "

    Be aware that this function is intended to load code only. If your data structures or a string in them grow bigger than around 65,535 it crashes.

    \r\n\r\n

    Exception similar to:

    \r\n
    java.lang.ClassFormatError: Unknown constant tag 49 in class file parse$eval13
    \r\n\r\n

    Please use read-string instead.

    \r\n\r\nExample:
    (read-string (slurp \"data.clj\"))
    \r\n\r\nSource: Google Groups", :created-at 1350351731000, :author {:login "dedeibel", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e89e54d864f1e584c5ef4102f98bc83?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fee"} {:updated-at 1371613686000, :body "

    The following marginally helpful error will be thrown if you have a typo in your file:

    \r\n\r\n
    CompilerException java.lang.RuntimeException: Unable to resolve symbol: load-file in this context, compiling:(NO_SOURCE_PATH:1:1)
    \r\n\r\n

    Fix the syntax error(s) in and you'll be able to use load-file again.

    \r\n\r\n\r\n", :created-at 1371447277000, :author {:login "arkh", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1c6ed9b963d758914c2744befd4974ca?r=PG&default=identicon"}, :_id "542692edf6e94c6970522005"}], :arglists ["name"], :doc "Sequentially read and evaluate the set of forms contained in the file.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/load-file"} {:added "1.0", :ns "clojure.core", :name "distinct?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1396938477000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "distinct", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bf7"}], :line 5685, :examples [{:updated-at 1521560626736, :created-at 1279073728000, :body "user=> (distinct? 1 2 3)\ntrue\nuser=> (distinct? 1 2 3 3)\nfalse\nuser=> (distinct? 1 2 3 1)\nfalse", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/675861?v=3", :account-source "github", :login "fellipebrito"} {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/147981?v=3", :account-source "github", :login "dpritchett"}, :_id "542692c9c026201cdc326a8f"} {:editors [{:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"} {:login "rmfbarker", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4708454?v=4"}], :body "(distinct? ['A 'A 'c]) ;;=> true\n(distinct? 'A 'A 'c) ;;=> false\n(apply distinct? ['A 'A 'c]) ;;=> false\n\n(distinct? [1 1 'c]) ;;=> true\n(distinct? 1 1 'c) ;;=> false\n\n;; Like `min` or `max` and unlike `distinct` the \n;; parameters are taken separately, i.e. not in a \n;; collection. ", :author {:avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4", :account-source "github", :login "Crowbrammer"}, :created-at 1615302123852, :updated-at 1687644700733, :_id "60478debe4b0b1e3652d747d"}], :notes nil, :tag "java.lang.Boolean", :arglists ["x" "x y" "x y & more"], :doc "Returns true if no two of the arguments are =", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/distinct_q"} {:added "1.9", :ns "clojure.core", :name "pos-int?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495640931493, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "neg-int?", :ns "clojure.core"}, :_id "5925ab63e4b093ada4d4d730"} {:created-at 1495640936398, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nat-int?", :ns "clojure.core"}, :_id "5925ab68e4b093ada4d4d731"} {:created-at 1495705345491, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "int?", :ns "clojure.core"}, :_id "5926a701e4b093ada4d4d74e"}], :line 1408, :examples [{:editors [{:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}], :body "(pos-int? 1)\n;;=> true\n(pos-int? 9223372036854775807)\n;;=> true\n\n;;;; false for non-positive values\n\n(pos-int? 0)\n;;=> false\n(pos-int? -1)\n;;=> false\n\n;;;; false for decimal values\n\n(pos-int? 1.0)\n;;=> false\n(pos-int? 1/2)\n;;=> false\n\n;;;; false for BigInt values\n\n(pos-int? 1N)\n;;=> false\n(pos-int? 9223372036854775808)\n;;=> false", :author {:avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3", :account-source "github", :login "svenschoenung"}, :created-at 1495703711193, :updated-at 1495703782768, :_id "5926a09fe4b093ada4d4d74b"}], :notes nil, :arglists ["x"], :doc "Return true if x is a positive fixed precision integer", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/pos-int_q"} {:added "1.2", :ns "clojure.core", :name "extenders", :file "clojure/core_deftype.clj", :type "function", :column 1, :see-alsos [{:created-at 1542365699743, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defprotocol", :ns "clojure.core"}, :_id "5beea203e4b00ac801ed9eff"} {:created-at 1542365712085, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "extends?", :ns "clojure.core"}, :_id "5beea210e4b00ac801ed9f00"}], :line 563, :examples [{:author {:login "leifp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d2f37720f063404ef83b987d2824353d?r=PG&default=identicon"}, :editors [], :body "user=> (defprotocol P (id [this]))\nP\nuser=> (extend-protocol P \n String \n (id [this] this)\n clojure.lang.Symbol \n (id [this] (name this))\n clojure.lang.Keyword\n (id [this] (name this)))\nnil\nuser=> (extenders P)\n(java.lang.String clojure.lang.Symbol clojure.lang.Keyword)\n", :created-at 1342531381000, :updated-at 1342531381000, :_id "542692d3c026201cdc326fa3"}], :notes nil, :arglists ["protocol"], :doc "Returns a collection of the types explicitly extending protocol", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/extenders"} {:added "1.3", :ns "clojure.core", :name "unchecked-short", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1496261308269, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "short", :ns "clojure.core"}, :_id "592f22bce4b06e730307db19"}], :line 3522, :examples [{:editors [{:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}], :body "(unchecked-short 1)\n;;=> 1\n(unchecked-short 1N)\n;;=> 1\n(unchecked-short 1.1)\n;;=> 1\n(unchecked-short 1.9)\n;;=> 1\n(unchecked-short 5/3)\n;;=> 1\n\n(unchecked-short -1)\n;;=> -1\n(unchecked-short -1N)\n;;=> -1\n(unchecked-short -1.1)\n;;=> -1\n(unchecked-short -1.9)\n;;=> -1\n(unchecked-short -5/3)\n;;=> -1\n\n;;;; Note that (unchecked-short) does not range check its argument\n;;;; so integer overflow or rounding may occur. \n;;;; Use (short) if you want to throw an exception in such cases.\n\n(unchecked-short 32768)\n;;=> -32768\n(unchecked-short -32769)\n;;=> 32767\n\n(short 32768)\n;;=> IllegalArgumentException Value out of range for short: 32768\n(short -32769)\n;;=> IllegalArgumentException Value out of range for short: -32769\n\n(unchecked-short 1.0E4)\n;;=> 10000\n(unchecked-short 1.0E5)\n;;=> -31072\n\n(short 1.0E4)\n;;=> 10000\n(short 1.0E5)\n;;=> IllegalArgumentException Value out of range for short: 100000.0\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3", :account-source "github", :login "svenschoenung"}, :created-at 1496261208846, :updated-at 1496261256909, :_id "592f2258e4b06e730307db17"}], :notes nil, :arglists ["x"], :doc "Coerce to short. Subject to rounding or truncation.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-short"} {:added "1.0", :ns "clojure.core", :name "methods", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1337585063000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "get-method", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f4f"} {:created-at 1337585066000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "remove-method", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f50"} {:created-at 1337585074000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "prefer-method", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f51"} {:created-at 1337585077000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "prefers", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f52"}], :line 1811, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user=> (use 'clojure.pprint)\nuser=> (pprint (methods print-dup))\n{nil #,\n java.lang.String #,\n java.lang.Boolean #,\n clojure.lang.IPersistentList\n #,\n java.sql.Timestamp\n #,\n java.util.UUID #,\n clojure.lang.Var #,\n clojure.lang.PersistentVector\n #,\n java.util.Calendar\n #,\n java.util.Map #,\n java.lang.Class #,\n java.util.regex.Pattern #,\n java.lang.Number #,\n java.lang.Long #,\n clojure.lang.Namespace #,\n java.math.BigDecimal #,\n clojure.lang.Symbol #,\n clojure.lang.Keyword #,\n clojure.lang.LazilyPersistentVector\n #,\n java.util.Collection #,\n java.lang.Double #,\n clojure.lang.Fn #,\n clojure.lang.IRecord #,\n clojure.lang.PersistentHashSet\n #,\n clojure.lang.IPersistentCollection\n #,\n clojure.lang.BigInt #,\n clojure.lang.ISeq #,\n java.util.Date #,\n clojure.lang.PersistentHashMap\n #,\n clojure.lang.IPersistentMap\n #,\n clojure.lang.Ratio #,\n java.lang.Character #}", :created-at 1286272206000, :updated-at 1423014816147, :_id "542692ccc026201cdc326cc5"} {:updated-at 1456200644152, :created-at 1456200644152, :author {:login "runningskull", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/187989?v=3"}, :body "user=> (defmulti do-math (fn [operation x y] operation))\n\n#'user/do-math\n\nuser=> (defmethod do-math :add [_ x y] (+ x y))\n... (defmethod do-math :subtract [_ x y] (- x y))\n... (defmethod do-math :hypotenuse [_ x y] (Math/sqrt (+ (* x x) (* y y))))\n\n#multifn[do-math 0x3a1c348]\n\nuser=> (methods do-math)\n\n{:hypotenuse #function[user/eval42540$fn--42541],\n :add #function[user/eval42521$fn--42522],\n :subtract #function[user/eval42525$fn--42526]}\n", :_id "56cbdbc4e4b0b41f39d96cd2"}], :notes [{:updated-at 1286272245000, :body "Not the most useful output format I've ever seen. :-)", :created-at 1286272245000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f99"}], :arglists ["multifn"], :doc "Given a multimethod, returns a map of dispatch values -> dispatch fns", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/methods"} {:added "1.0", :ns "clojure.core", :name "odd?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "even?", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1354423246000, :_id "542692ebf6e94c6970521d53"}], :line 1394, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (odd? 1)\ntrue\nuser=> (odd? 2)\nfalse\nuser=> (odd? 0)\nfalse", :created-at 1279074688000, :updated-at 1332952870000, :_id "542692c8c026201cdc3269e5"} {:body "user=> (filter odd? (range 15))\n(1 3 5 7 9 11 13)", :author {:login "mookid", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7757342?v=3"}, :created-at 1429217504160, :updated-at 1429217504160, :_id "553020e0e4b033f34014b76f"}], :notes nil, :arglists ["n"], :doc "Returns true if n is odd, throws an exception if n is not an integer", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/odd_q"} {:ns "clojure.core", :name "->ArrayChunk", :file "clojure/gvec.clj", :type "function", :column 1, :see-alsos nil, :line 36, :examples nil, :notes nil, :arglists ["am arr off end"], :doc "Positional factory function for class clojure.core.ArrayChunk.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/->ArrayChunk"} {:added "1.0", :ns "clojure.core", :name "float-array", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1657816974619, :author {:login "rosejn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/36590?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "aset", :ns "clojure.core"}, :_id "62d0478ee4b0b1e3652d7620"} {:created-at 1657816984539, :author {:login "rosejn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/36590?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "aget", :ns "clojure.core"}, :_id "62d04798e4b0b1e3652d7621"}], :line 5277, :examples [{:updated-at 1657817072470, :created-at 1281617421000, :body "user=> (float-array [1 2 3])\n#\nuser=> (aget *1 2)\n3.0\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "rosejn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/36590?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon", :account-source "clojuredocs", :login "gstamp"}, :_id "542692c9c026201cdc326ae0"} {:editors [{:login "JulienRouse", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/5703619?v=4"}], :body "user=> (def f (float-array [1 2 3]))\n#'user/f\n\nuser=> f\n#object[\"[F\" 0x56ce4eda \"[F@56ce4eda\"]\n\n;;You can transform the array back into a Clojure vector with vec\nuser=> (vec f)\n[1.0 2.0 3.0]\n\n;;Also with into, works with list vector and set but not map\nuser=> (into [] f)\n[1.0 2.0 3.0]\n\nuser=> (into () f)\n(3.0 2.0 1.0)\n\nuser=> (into #{} f)\n=> #{3.0 2.0 1.0}\n\nuser=> (into {} f)\nExecution error (IllegalArgumentException) at user/eval1691 \n(form-init8077017244851884694.clj:1).\nDon't know how to create ISeq from: java.lang.Float", :author {:avatar-url "https://avatars1.githubusercontent.com/u/5703619?v=4", :account-source "github", :login "JulienRouse"}, :created-at 1550505235553, :updated-at 1550515519268, :_id "5c6ad513e4b0ca44402ef68f"} {:editors [{:login "JulienRouse", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/5703619?v=4"}], :body ";;Works for vector, list and set\nuser=> (float-array [1 2 3])\n#object[\"[F\" 0x6a86faa1 \"[F@6a86faa1\"]\n\nuser=> (float-array '(1 2 3))\n#object[\"[F\" 0xd5e9fe8 \"[F@d5e9fe8\"]\n\nuser=> (float-array #{1 2 3})\n#object[\"[F\" 0x7b327946 \"[F@7b327946\"]\n\n;;But not map\nuser=> (float-array {1 2})\nExecution error (ClassCastException) at user/eval2022 \n(form-init8077017244851884694.clj:1).\nclojure.lang.MapEntry cannot be cast to java.lang.Number", :author {:avatar-url "https://avatars1.githubusercontent.com/u/5703619?v=4", :account-source "github", :login "JulienRouse"}, :created-at 1550515507149, :updated-at 1550515532633, :_id "5c6afd33e4b0ca44402ef694"}], :notes nil, :arglists ["size-or-seq" "size init-val-or-seq"], :doc "Creates an array of floats", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/float-array"} {:added "1.0", :ns "clojure.core", :name "*3", :file "clojure/core.clj", :type "var", :column 1, :see-alsos [{:created-at 1302912219000, :author {:login "hoornet", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5834f829a9def19620d4014c46642172?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "*1", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d6a"} {:created-at 1302912225000, :author {:login "hoornet", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5834f829a9def19620d4014c46642172?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "*2", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d6b"}], :dynamic true, :line 6289, :examples [{:updated-at 1285502085000, :created-at 1279048146000, :body "user=> \"Hello!\"\n\"Hello!\"\n\nuser=> \"Hello World!\"\n\"Hello World!\"\n\nuser=> \"Hi Everyone!\"\n\"Hi Everyone!\"\n\nuser=> [*1 *2 *3]\n[\"Hi Everyone!\" \"Hello World!\" \"Hello!\"]\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692c6c026201cdc326913"} {:updated-at 1285502101000, :created-at 1279048336000, :body "user=> (range 5)\n(0 1 2 3 4)\nuser=> (last *1)\n4\nuser=> (last *2)\n4\nuser=> (last *3)\n4\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692c6c026201cdc326915"}], :notes nil, :arglists [], :doc "bound in a repl thread to the third most recent value printed", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*3"} {:added "1.0", :ns "clojure.core", :name "alias", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1374148345000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ns-aliases", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d62"} {:created-at 1390613584000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "ns-unalias", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d63"} {:created-at 1412905255114, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "require", :library-url "https://github.com/clojure/clojure"}, :_id "54373927e4b0ae7956031580"} {:created-at 1416004697043, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:ns "clojure.core", :name "ns", :library-url "https://github.com/clojure/clojure"}, :_id "54668459e4b03d20a10242a5"}], :line 4264, :examples [{:author {:login "teyc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd6e62afb4881ab0f617611b8b65d003?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(require 'clojure.string)\n;;=> nil\n\n(alias 'string 'clojure.string)\n;;=> nil\n\n(string/capitalize \"hONdURas\")\n;;=> \"Honduras\"", :created-at 1283925470000, :updated-at 1416004474780, :_id "542692cec026201cdc326e01"} {:body ";; The alias can also be created when the \n;; namespace is required using the :as keyword.\n\n(require '[clojure.string :as string])\n(string/capitalize \"hONdURas\")\n;;=> \"Honduras\"", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1412886822918, :updated-at 1412886822918, :_id "5436f126e4b0ae795603157f"}], :notes nil, :arglists ["alias namespace-sym"], :doc "Add an alias in the current namespace to another\n namespace. Arguments are two symbols: the alias to be used, and\n the symbolic name of the target namespace. Use :as in the ns macro in preference\n to calling this directly.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/alias"} {:added "1.2", :ns "clojure.core", :name "frequencies", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1325040915000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "group-by", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d38"} {:created-at 1396938657000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "distinct", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d39"}], :line 7203, :examples [{:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (frequencies ['a 'b 'a 'a])\n{a 3, b 1}", :created-at 1282321661000, :updated-at 1332952608000, :_id "542692cac026201cdc326b14"} {:updated-at 1492057390955, :created-at 1492057390955, :author {:login "pharcosyle", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/60688?v=3"}, :body ";; Turn a frequency map back into a coll.\n\n(mapcat (fn [[x n]] (repeat n x)) {:a 2 :b 1 :c 3})\n;;=> (:a :a :b :c :c :c)\n", :_id "58eefd2ee4b01f4add58fe8d"} {:updated-at 1617958558047, :created-at 1617958558047, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1334295?v=4"}, :body ";; combine it with map to apply a function\n\n(def students\n [{:name \"Alice\" :age 23 :gender :female}\n {:name \"Bob\" :age 21 :gender :male}\n {:name \"John\" :age 23 :gender :male}\n {:name \"Maria\" :age 22 :gender :female}\n {:name \"Julie\" :age 22 :gender :female}])\n\n(frequencies (map :gender students))\n;; => {:female 3, :male 2}\n\n(frequencies (map :age students))\n;;=> {23 2, 21 1, 22 2}\n", :_id "6070169ee4b0b1e3652d74ba"}], :notes [{:updated-at 1358885265000, :body "
    (fn [coll]\r\n   (let [gp (group-by identity coll)] \r\n      (zipmap (keys gp) (map #(count (second %)) gp))))
    ", :created-at 1358885188000, :author {:login "lispro06", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/20c3faad6f66a434dae42b5ed8ad305?r=PG&default=identicon"}, :_id "542692edf6e94c6970521ffb"} {:updated-at 1370062406000, :body " (into {} (for [[k v] (group-by identity \"abbbc\")] [k (count v)]))\r\n", :created-at 1370062406000, :author {:login "danneu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c42635853936e509f76ece9d8187c4aa?r=PG&default=identicon"}, :_id "542692edf6e94c6970522004"} {:author {:login "ppsreejith", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1743700?v=3"}, :updated-at 1453125303725, :created-at 1453125303725, :body "
    \nuser=> (frequencies [3 6 2 6 8 7 'b 'c 3 5 3 4 7 6 'a])\n{2 1, 3 3, 4 1, 5 1, 6 3, 7 2, 8 1, a 1, c 1, b 1}\nuser=> (frequencies [3 6 2 6 8 7 'b 'c])\n{3 1, 6 2, 2 1, 8 1, 7 1, b 1, c 1}\n;Note that the order of keys need not be in order of vector\n
    ", :_id "569ceeb7e4b060004fc217ae"} {:author {:login "humorless", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/3061798?v=4"}, :updated-at 1557220455720, :created-at 1557220455720, :body "```\n(defn frequencies-by\n \"a generalized version of frequencies\"\n [f coll]\n (let [gp (group-by f coll)]\n (zipmap (keys gp) (map #(count (second %)) gp))))\n```", :_id "5cd14c67e4b0ca44402ef71b"}], :arglists ["coll"], :doc "Returns a map from distinct items in coll to the number of times\n they appear.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/frequencies"} {:added "1.0", :ns "clojure.core", :name "read-string", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1289454685000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pr-str", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a90"} {:created-at 1289454689000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "str", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a91"} {:created-at 1313054776000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "read", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a92"} {:created-at 1334883935000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "load-string", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a93"} {:created-at 1352963672000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "*read-eval*", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a94"} {:created-at 1422653056995, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=2"}, :to-var {:ns "clojure.main", :name "load-script", :library-url "https://github.com/clojure/clojure"}, :_id "54cbf680e4b0e2ac61831cef"} {:created-at 1422653083632, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=2"}, :to-var {:ns "clojure.edn", :name "read-string", :library-url "https://github.com/clojure/clojure"}, :_id "54cbf69be4b0e2ac61831cf0"}], :line 3805, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (read-string \"1.1\") \n1.1\n\nuser=> (read-string \"1.1.1 (+ 1 1)\")\njava.lang.RuntimeException: java.lang.NumberFormatException: Invalid number: 1.1.1 (NO_SOURCE_FILE:0)\n\nuser=> (read-string \"(+ 1 1)\")\n(+ 1 1)\n", :created-at 1282634798000, :updated-at 1285494370000, :_id "542692c9c026201cdc326ad6"} {:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [{:login "tormaroe", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8bc7bb10bee96efb190053fe92ffd250?r=PG&default=identicon"}], :body "user=> (eval (read-string \"(+ 1 1)\"))\n2\n\nuser=> (read-string (prn-str (+ 1 1)))\n2\n", :created-at 1289408002000, :updated-at 1289710230000, :_id "542692c9c026201cdc326ad8"} {:author {:login "benjiiiiii", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd1adaf32d9dc6531d6041dbc379efb0?r=PG&default=identicon"}, :editors [], :body "user=> (+ 11 (read-string \"23\"))\n34\n", :created-at 1291246357000, :updated-at 1291246357000, :_id "542692c9c026201cdc326ada"} {:author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}], :body "user=> (read-string \"; foo\\n5\")\n5\n\nuser=> (read-string \"#^String x\")\nx\n\nuser=> (read-string \"(1)\")\n(1)\n\nuser=> (read-string \"(+ 1 2) (- 3 2)\")\n(+ 1 2)\n\nuser=> (read-string \"@a\")\n(clojure.core/deref a)\n\nuser=> (read-string \"(+ 1 2))))))\")\n(+ 1 2)\n\nuser=> (read-string \"::whatever-namespace-you-are-in\")\n:user/whatever-namespace-you-are-in", :created-at 1335430367000, :updated-at 1335430553000, :_id "542692d5c026201cdc32705f"} {:author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :editors [{:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}], :body ";convert a string representing a sequence,\n;to the sequence that the string represents\nuser=> (read-string \"(\\\\( \\\\x \\\\y \\\\) \\\\z)\")\n(\\( \\x \\y \\) \\z)\n\n;then you can convert to the string that the string-sequence represents\nuser=> (apply str (read-string \"(\\\\( \\\\x \\\\y \\\\) \\\\z)\"))\n\"(xy)z\"\n\n;which is the inverse of\nuser=> (str (first (list (seq \"(xy)z\"))))\n\"(\\\\( \\\\x \\\\y \\\\) \\\\z)\"", :created-at 1345526514000, :updated-at 1345526600000, :_id "542692c9c026201cdc326adb"} {:author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :editors [], :body ";; you can think of read-string as the inverse of pr-str\n;; turn string into symbols\nuser=> (read-string \"(a b foo :bar)\")\n(a b foo :bar)\n\n;;turn symbols into a string\nuser=> (pr-str '(a b foo :bar))\n\"(a b foo :bar)\"", :created-at 1346843994000, :updated-at 1346843994000, :_id "542692d5c026201cdc327061"} {:updated-at 1518357675254, :created-at 1360635743000, :body ";; WARNING: You SHOULD NOT use clojure.core/read-string to read data from\n;; untrusted sources. See the examples for clojure.core/read, because the same\n;; issues exist for both read and read-string.", :editors [{:login "green-coder", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}, :_id "542692d5c026201cdc327062"} {:updated-at 1455932713195, :created-at 1455932713195, :author {:login "one-finger", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/17347889?v=3"}, :body ";; convert binary number provided in the form of a string to its numerical value.\nuser=> (read-string (str \"2r\" \"1011\"))\n11\n", :_id "56c7c529e4b0b41f39d96ccf"} {:updated-at 1613109472732, :created-at 1557061665574, :author {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/24317401?v=4"}, :body ";; be careful with octal values\nuser=> (read-string \"042\")\n34\n\nuser=> (read-string \"08\")\nExecution error (NumberFormatException)\nInvalid number: 08\n\n;; replace leading zeroes with regex\nuser=> (read-string (clojure.string/replace \"042\" #\"^0+(?!$)\" \"\"))\n42\n\nuser=> (read-string (clojure.string/replace \"00\" #\"^0+(?!$)\" \"\"))\n0", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/39972994?v=4", :account-source "github", :login "jocatelo"}], :_id "5ccee021e4b0ca44402ef71a"} {:editors [{:login "adanhawth", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/36526095?v=4"}], :body ";; if someone littered your csv fields with escaped double quotes...\n(def quoted-string \"\\\"1.23\\\"\")\n\n;; and you find yourself in angst, cause this won't work...\n(Double. quoted-string)\n\t;; Execution error (IllegalArgumentException) at user/eval6365 (form-init17453115089215840832.clj:1).\n\t;; No matching ctor found for class java.lang.Double\n\n;; you don't have to hate the player; but you can come prepared for the game\n(Double. (read-string quoted-string))\n\t;; 1.23", :author {:avatar-url "https://avatars2.githubusercontent.com/u/36526095?v=4", :account-source "github", :login "adanhawth"}, :created-at 1582746730566, :updated-at 1582746790901, :_id "5e56cc6ae4b087629b5a18aa"} {:updated-at 1660763271174, :created-at 1660763271174, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=4"}, :body ";;;; Data representation is same as the one produced by (read-string)\n;;;; and (read) when provided with the option to preserve data conditionals\n\n(read-string {:read-cond :preserve} \"#?(:clj (println \\\"Hey World!\\\"))\")\n;;=> #?(:clj (println \"Hey World!\"))\n", :_id "62fd3c87e4b0b1e3652d763d"}], :notes [{:updated-at 1289408055000, :body "read-string is useful for running clojure code from a script or translator.", :created-at 1289408055000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fa2"} {:author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :updated-at 1568111197675, :created-at 1568111197675, :body "Never **EVER** use `read-string` on data from an untrusted source. Prefer `clojure.edn/read-string` to parse EDN. The former can execute arbitrary code, including calling external URLs or reading/writing/erasing files.", :_id "5d777a5de4b0ca44402ef7af"}], :arglists ["s" "opts s"], :doc "Reads one object from the string s. Optionally include reader\n options, as specified in read.\n\n Note that read-string can execute code (controlled by *read-eval*),\n and as such should be used only with trusted sources.\n\n For data structure interop use clojure.edn/read-string", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/read-string"} {:added "1.0", :ns "clojure.core", :name "proxy", :file "clojure/core_proxy.clj", :type "macro", :column 1, :see-alsos [{:created-at 1360270636000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "gen-class", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521c9e"} {:created-at 1360270701000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "gen-interface", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521c9f"} {:created-at 1361858921000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "reify", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ca0"}], :line 329, :examples [{:author {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3", :account-source "github", :login "bkovitz"}], :body ";; adding a mouse-pressed callback to a Swing component:\n\n(defn add-mousepressed-listener\n [component f & args]\n (let [listener (proxy [MouseAdapter] []\n (mousePressed [event]\n (apply f event args)))]\n (.addMouseListener component listener)\n listener))\n", :created-at 1287523639000, :updated-at 1460780025090, :_id "542692cdc026201cdc326d5c"} {:author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :editors [], :body ";; BUG: proxy dispatches *only* on name, not arity:\nuser=> (let [p (proxy [java.io.InputStream] [] (read [] -1))]\n (println (.read p))\n (println (.read p (byte-array 3) 0 3)))\n\n-1\nArityException Wrong number of args (4) passed to: core$eval213$fn clojure.lang.AFn.throwArity (AFn.java:437)\n", :created-at 1336686490000, :updated-at 1336686490000, :_id "542692d4c026201cdc327040"} {:updated-at 1586252027510, :created-at 1363059784000, :body ";; You can, however, provide multiple-arity functions to get some support \n;; for overloading\nuser> (let [p (proxy [java.io.InputStream] []\n (read\n ([] 1)\n ([^bytes bytes] 2)\n ([^bytes bytes off len] 3)))]\n (println (.read p))\n (println (.read p (byte-array 3)))\n (println (.read p (byte-array 3) 0 3)))\n\n1\n2\n3\nnil", :editors [{:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/61b4809de147650070a5e209be48fe7f?r=PG&default=identicon", :account-source "clojuredocs", :login "craigandera"}, :_id "542692d4c026201cdc327041"} {:updated-at 1586252042920, :created-at 1542943086091, :author {:login "gluer", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/22495106?v=4"}, :body ";; a simple example\n\n(defn f [& i]\n (proxy [clojure.lang.ISeq][]\n (seq [] (sort i))\n (toString [] (apply str (interpose \"-\" i)))))\n\n(seq (f 4 3 2 1))\n;;=> (1 2 3 4)\n\n\n(str (f 4 3 2 1))\n;;=> \"4-3-2-1\"", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/22495106?v=4", :account-source "github", :login "gluer"} {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}], :_id "5bf7716ee4b0ca44402ef5c6"} {:updated-at 1587490591311, :created-at 1587490591311, :author {:login "audriu", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/41568862?v=4"}, :body ";; usage of implicit 'this\n(def prx (proxy [java.lang.Runnable] []\n (run \n ([] (println \"We can use this inside here\" this) 1))))\n\n(.run prx)\n;;=>We can use this inside here #object[user.proxy$java.lang.Object$Runnable.....", :_id "5e9f2f1fe4b087629b5a18db"}], :macro true, :notes nil, :arglists ["class-and-interfaces args & fs"], :doc "class-and-interfaces - a vector of class names\n\n args - a (possibly empty) vector of arguments to the superclass\n constructor.\n\n f => (name [params*] body) or\n (name ([params*] body) ([params+] body) ...)\n\n Expands to code which creates a instance of a proxy class that\n implements the named class/interface(s) by calling the supplied\n fns. A single class, if provided, must be first. If not provided it\n defaults to Object.\n\n The interfaces names must be valid interface types. If a method fn\n is not provided for a class method, the superclass method will be\n called. If a method fn is not provided for an interface method, an\n UnsupportedOperationException will be thrown should it be\n called. Method fns are closures and can capture the environment in\n which proxy is called. Each method fn takes an additional implicit\n first arg, which is bound to 'this. Note that while method fns can\n be provided to override protected methods, they have no other access\n to protected members, nor to super, as these capabilities cannot be\n proxied.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/proxy"} {:added "1.0", :ns "clojure.core", :name "rsubseq", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1330671605000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "subseq", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521efe"}], :line 5126, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [], :body "user> (rsubseq (sorted-set 1 2 3 4 5) < 3)\n(2 1)", :created-at 1286871962000, :updated-at 1286871962000, :_id "542692c9c026201cdc326af4"} {:editors [{:login "TradeIdeasPhilip", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/18409827?v=3"}], :body ";; If you use the longer form, with the end condition, there are some rules.\n;; start-key should be <= end-key. start-test should be \">\" or \">=\".\n;; end-test should be \"<\" or \"<=\". If follow these rules you'll get all the\n;; values between start-key and end-key. If you don't you won't get an error,\n;; but you probably won't get the result you expect. These rules are exactly\n;; the same for subseq.\n\n;; As expected, returns everything between 2 and 4, in reverse order.\nuser=> (rsubseq (sorted-set 1 2 3 4 5) >= 2 <= 4)\n;; => (4 3 2)\n\n;; Probably not what you expected!\nuser=> (rsubseq (sorted-set 1 2 3 4 5) <= 4 >= 2)\n;; => (2 1)\n\n;; As expected, returns everything between 2 and 4, in order.\nuser=> (subseq (sorted-set 1 2 3 4 5) >= 2 <= 4)\n;; => (2 3 4)\n\n;; Probably not what you expected!\nuser=> (subseq (sorted-set 1 2 3 4 5) <= 4 >= 2)\n;; => (4 5)\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/18409827?v=3", :account-source "github", :login "TradeIdeasPhilip"}, :created-at 1463328932267, :updated-at 1463329023275, :_id "5738a0a4e4b071da7d6cfd0b"}], :notes nil, :arglists ["sc test key" "sc start-test start-key end-test end-key"], :doc "sc must be a sorted collection, test(s) one of <, <=, > or\n >=. Returns a reverse seq of those entries with keys ek for\n which (test (.. sc comparator (compare ek key)) 0) is true", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/rsubseq"} {:added "1.2", :ns "clojure.core", :name "inc", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1325850434000, :author {:login "frangio", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/646001f0ba2b7df47a16c0a1d5b62225?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "dec", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d99"} {:created-at 1415177507055, :author {:login "rvlieshout", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/139665?v=2"}, :to-var {:ns "clojure.core", :name "inc'", :library-url "https://github.com/clojure/clojure"}, :_id "5459e523e4b03d20a102429d"} {:created-at 1525271648690, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unchecked-inc", :ns "clojure.core"}, :_id "5ae9cc60e4b045c27b7fac5b"}], :line 922, :examples [{:author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (inc 1)\n2\n\nuser=> (inc 1.0)\n2.0\n\nuser=> (inc 1/2)\n3/2\n\nuser=> (inc -1)\n0", :created-at 1279992305000, :updated-at 1411874902968, :_id "542692cac026201cdc326b45"} {:updated-at 1516199380227, :created-at 1516199380227, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;increment all the element in a collection\n\n(map inc [1 2 3 4 5])\n;;(2 3 4 5 6) return type list\n\n(into [] (map inc [1 2 3 4 5]))\n;;[2 3 4 5 6] return type vector", :_id "5a5f5dd4e4b0a08026c48cf8"} {:updated-at 1524688467780, :created-at 1524688121378, :author {:login "wuleicanada", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/5652075?v=4"}, :body ";; Careful when using ClojureScript\n;; Make sure you're passing a number\n;; because JavaScript + also does string concatenation\ncljs.user=> (inc \"1\")\n\"11\"\ncljs.user=> (inc 1)\n2\n\n;; Although it's not the case with dec\n;; In JavaScript \"1\" - 1 = 0\ncljs.user=> (dec \"1\")\n0\ncljs.user=> (dec 1)\n0\n\n", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/5652075?v=4", :account-source "github", :login "wuleicanada"}], :_id "5ae0e4f9e4b045c27b7fac53"} {:updated-at 1633068446525, :created-at 1633068446525, :author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :body ";; You cannot `inc` a `nil` in Clojure, but you\n;; can in ClojureScript\n\n;; Clojure\n(inc nil) ;;=> NullPointerException\n\n;; ClojureScript\n(inc nil) ;;=> 1", :_id "6156a59ee4b0b1e3652d754f"}], :notes [{:updated-at 1316509073000, :body "Is the documentation suppose to be: \"Returns a number one greater than x.\" ? If not what is num?", :created-at 1316509073000, :author {:login "icefox", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/dc848256f8954abd612cbe7e81859f91?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fcc"} {:author {:login "arashgithub", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1148053?v=3"}, :updated-at 1457669616170, :created-at 1457669616170, :body "is code \"(def i (inc i))\" is conflict with the notion of immutable of data in Clojure. ", :_id "56e245f0e4b0119038be0212"} {:author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=3"}, :updated-at 1458583922104, :created-at 1458583922104, :body "Nope, quite the opposite. \"def\" defines a var: \n
    \nuser=> (type (def i 1))\nclojure.lang.Var\n
    \nA var is one of the 4 types dealing with mutable state (it is not an immutable data structure, like maps, vectors, sets and so on) and it does so following a specific semantic (see http://clojure.org/reference/vars).", :_id "56f03972e4b09295d75dbf35"}], :arglists ["x"], :doc "Returns a number one greater than num. Does not auto-promote\n longs, will throw on overflow. See also: inc'", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/inc"} {:added "1.0", :ns "clojure.core", :name "get-method", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1337585046000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "remove-method", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e3c"} {:created-at 1337585052000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "methods", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e3d"}], :line 1817, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; define a multi-method, then demonstrate that you may use \n;; get-method in the same way you can call the method directly\n\nuser=> (defmulti tos :Ob)\n#'user/tos\nuser=> (defn line [p1 p2] {:Ob :line :p1 p1 :p2 p2})\n#'user/line\nuser=> (defn circle [cent rad] {:Ob :circle :cent cent :rad rad})\n#'user/circle\nuser=> (defmethod tos :line [l] (str \"Line:\" (l :p1) (l :p2)))\n#\nuser=> (defmethod tos :circle [c] (str \"Circle:\" (c :cent) (c :rad)))\n#\nuser=> (println (tos (circle [2 3] 3.3)))\nCircle:[2 3]3.3\nnil\nuser=> (println (tos (line [1 1][0 0])))\nLine:[1 1][0 0]\nnil\nuser=> (println ((get-method tos :line) (line [1 2][3 4]) ))\nLine:[1 2][3 4]\nnil\nuser=>", :created-at 1313922883000, :updated-at 1313922883000, :_id "542692cfc026201cdc326e6b"}], :notes nil, :arglists ["multifn dispatch-val"], :doc "Given a multimethod and a dispatch value, returns the dispatch fn\n that would apply to that value, or nil if none apply and no default", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/get-method"} {:added "1.3", :ns "clojure.core", :name "with-redefs", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1322088077000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-redefs-fn", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b7b"} {:created-at 1322088155000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "alter-var-root", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b7c"} {:created-at 1365637645000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-bindings", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b7d"}], :line 7518, :examples [{:updated-at 1335591486000, :created-at 1335591486000, :body "user=> [(type []) (class [])]\n[clojure.lang.PersistentVector clojure.lang.PersistentVector]\n\nuser=> (with-redefs [type (constantly java.lang.String)\n class (constantly 10)]\n [(type [])\n (class [])])\n[java.lang.String 10]", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692d6c026201cdc3270bc"} {:author {:login "johnnyluu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ba99f2dc1064733c7badbb16db9254a?r=PG&default=identicon"}, :editors [{:login "johnnyluu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ba99f2dc1064733c7badbb16db9254a?r=PG&default=identicon"} {:login "rebcabin", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/880b0bb3a4be9237326dd69565444dee?r=PG&default=identicon"}], :body "(ns http)\n\n(defn post [url]\n {:body \"Hello world\"})\n\n(ns app\n (:require [clojure.test :refer [deftest is run-tests]]))\n\n(deftest is-a-macro\n (with-redefs [http/post (fn [url] {:body \"Goodbye world\"})]\n (is (= {:body \"Goodbye world\"} (http/post \"http://service.com/greet\")))))\n\n(run-tests) ;; test is passing", :created-at 1350024154000, :updated-at 1366582892000, :_id "542692d6c026201cdc3270bd"} {:author {:login "w01fe", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e6b62d981155b5945a29d84a2e439663?r=PG&default=identicon"}, :editors [], :body ";; be careful, with-redefs can permanently change a var if applied concurrently:\n\nuser> (defn ten [] 10)\n#'user/ten\nuser> (doall (pmap #(with-redefs [ten (fn [] %)] (ten)) (range 20 100)))\n...\nuser> (ten)\n79", :created-at 1352471112000, :updated-at 1352471112000, :_id "542692d6c026201cdc3270c0"} {:author {:login "nickzam", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/89377?v=2"}, :editors [], :body ";; redefine var\n(def foo 1)\n#'user/foo\n(with-redefs [foo 2] foo)\n2\n\n;; redefine private var\n(ns first)\n(def ^:private foo 1)\n#'first/foo\n\n(ns second)\n(with-redefs [first/foo 2] @#'first/foo)\n2\n\n;; @#' is the macros of (deref (var first/foo))\n(with-redefs [first/foo 2] (deref (var first/foo))\n2", :created-at 1405030383000, :updated-at 1405030383000, :_id "542692d6c026201cdc3270c1"} {:updated-at 1625736978558, :created-at 1625736978558, :author {:login "deadghost", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1156996?v=4"}, :body ";; Vars return to their previous value outside of `with-redefs` body\n\n(with-redefs [first last] (first [1 2]))\n;; => 2\n((with-redefs [first last] #(first [1 2])))\n;; => 1", :_id "60e6c712e4b0b1e3652d7514"} {:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; Macros are not stored in vars, so `with-redefs` doesn't work on them.\n(defmacro a [] 1)\n=> #'user/a\n(a)\n=> 1\n(with-redefs [a (constantly 2)] (a))\n=> 1", :author {:avatar-url "https://avatars.githubusercontent.com/u/8080718?v=4", :account-source "github", :login "owenRiddy"}, :created-at 1658537792859, :updated-at 1659109879089, :_id "62db4740e4b0b1e3652d762f"}], :macro true, :notes nil, :arglists ["bindings & body"], :doc "binding => var-symbol temp-value-expr\n\n Temporarily redefines Vars while executing the body. The\n temp-value-exprs will be evaluated and each resulting value will\n replace in parallel the root value of its Var. After the body is\n executed, the root values of all the Vars will be set back to their\n old values. These temporary changes will be visible in all threads.\n Useful for mocking out functions during testing.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/with-redefs"} {:added "1.9", :ns "clojure.core", :name "uuid?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 6805, :examples [{:updated-at 1495999029126, :created-at 1495999029126, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body "(uuid? (java.util.UUID/randomUUID))\n;;=> true\n(uuid? (read-string \"#uuid \\\"f81d4fae-7dec-11d0-a765-00a0c91e6bf6\\\"\"))\n;;=> true\n\n(uuid? \"f81d4fae-7dec-11d0-a765-00a0c91e6bf6\")\n;;=> false", :_id "592b2235e4b093ada4d4d780"} {:editors [{:login "E-A-Griffin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/53583563?v=4"}], :body ";; If using a version of Clojure >= 1.11 use `parse-uuid`\n(def new-u (parse-uuid \"4fe5d828-6444-11e8-8222-720007e40350\"))\n;;=> #'user/new-u\nnew-u\n;;=> #uuid \"4fe5d828-6444-11e8-8222-720007e40350\"\n(uuid? new-u)\n;;=> true\n\n;; There is no (uuid) function to coerce a string to a UUID prior to Clojure v1.11, but you can \n;; produce one via Java interop:\n\n(def old-u (java.util.UUID/fromString \"4fe5d828-6444-11e8-8222-720007e40350\"))\n;;=> #'user/old-u\nold-u\n;;=> #uuid \"4fe5d828-6444-11e8-8222-720007e40350\"\n(uuid? old-u)\n;;=> true", :author {:avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4", :account-source "github", :login "timgilbert"}, :created-at 1527711361366, :updated-at 1665246163158, :_id "5b0f0681e4b045c27b7fac86"} {:updated-at 1539315353361, :created-at 1539315353361, :author {:login "ashton314", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/2874507?v=4"}, :body ";; Change a UUID to a string:\n\n\n(.toString (java.util.UUID/randomUUID))\n;;=>\"91bb281c-4cdd-4bea-bd9c-27b5f9c75812\"", :_id "5bc01699e4b00ac801ed9ed9"}], :notes [{:author {:login "E-A-Griffin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/53583563?v=4"}, :updated-at 1665246371235, :created-at 1665246331215, :body ";; Docs for added UUID functions in Clojure 1.11\n\n`parse-uuid`: https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/parse-uuid\n\n`random-uuid`: https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/random-uuid", :_id "6341a47be4b0b1e3652d7673"}], :arglists ["x"], :doc "Return true if x is a java.util.UUID", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/uuid_q"} {:added "1.0", :ns "clojure.core", :name "bit-clear", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1527805067810, :author {:login "NealEhardt", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1338977?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "bit-set", :ns "clojure.core"}, :_id "5b10748be4b045c27b7fac8b"}], :line 1331, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (bit-clear 2r1011 3) ; index is 0-based\n3 \n;; 3 = 2r0011\n\n;; the same in decimal\nuser=> (bit-clear 11 3) \n3", :created-at 1280337817000, :updated-at 1332950801000, :_id "542692cbc026201cdc326bbf"}], :notes nil, :arglists ["x n"], :doc "Clear bit at index n", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bit-clear"} {:added "1.0", :ns "clojure.core", :name "filter", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1282310761000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "remove", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e17"} {:created-at 1399907449000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "keep", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e19"} {:created-at 1413316825235, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "filterv", :library-url "https://github.com/clojure/clojure"}, :_id "543d80d9e4b02688d208b1b6"} {:created-at 1487135971846, :author {:login "chrismurrph", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10278575?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "group-by", :ns "clojure.core"}, :_id "58a3e4e3e4b01f4add58fe56"}], :line 2793, :examples [{:updated-at 1420743803007, :created-at 1279065921000, :body "(filter even? (range 10))\n;;=> (0 2 4 6 8)\n\n(filter (fn [x]\n (= (count x) 1))\n [\"a\" \"aa\" \"b\" \"n\" \"f\" \"lisp\" \"clojure\" \"q\" \"\"])\n;;=> (\"a\" \"b\" \"n\" \"f\" \"q\")\n\n(filter #(= (count %) 1)\n [\"a\" \"aa\" \"b\" \"n\" \"f\" \"lisp\" \"clojure\" \"q\" \"\"])\n;;=> (\"a\" \"b\" \"n\" \"f\" \"q\")\n\n; When coll is a map, pred is called with key/value pairs.\n(filter #(> (second %) 100)\n {:a 1\n :b 2\n :c 101\n :d 102\n :e -1})\n;;=> ([:c 101] [:d 102])\n\n(into {} *1)\n;;=> {:c 101, :d 102}\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/263299?v=2", :account-source "github", :login "zw"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692cac026201cdc326b5f"} {:updated-at 1435879726137, :created-at 1435879726137, :author {:login "bsvingen", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1647562?v=3"}, :body ";; Used without a collection, filter will create a transducer:\n(def xf (filter odd?))\n\n;; We can now apply this transducer to a sequence:\n(transduce xf conj (range 10))\n;; => [1 3 5 7 9]\n", :_id "5595c92ee4b00f9508fd66f4"} {:updated-at 1446483945707, :created-at 1446482046531, :author {:login "Art-B", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1143795?v=3"}, :body ";;When filtering a map, the predicate takes a _list_ of length 2\n(filter (fn [[k v]] (even? k))\n {1 \"a\", 2 \"b\", 3 \"c\", 4 \"d\"}\n)\n;;output:: ([2 \"b\"] [4 \"d\"])\n\n;;A function of arity two will cause an error\n(comment will fail!) \n(filter (fn [k v] (even? k))\n {1 \"a\", 2 \"b\", 3 \"c\", 4 \"d\"}\n)\n;;output:: clojure.lang.ArityException: Wrong number of args (1) passed to: ...", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/1143795?v=3", :account-source "github", :login "Art-B"}], :_id "5637907ee4b04b157a6648df"} {:updated-at 1638750543664, :created-at 1446999529588, :author {:login "puppybits", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/140163?v=3"}, :body "; remove empty vectors from the root vector\n(def vector-of-vectors [[1 2 3] [] [1] []])\n\n(def populated-vector? \n (fn \n [item] \n (not= item [])))\n\n(filter populated-vector? vector-of-vectors)\n\n; => ([1 2 3] [1])\n\n; or\n(filter seq vector-of-vectors)", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/140163?v=3", :account-source "github", :login "puppybits"} {:login "KyleErhabor", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/40676441?v=4"}], :_id "563f75e9e4b0290a56055d22"} {:updated-at 1471132372267, :created-at 1471132372267, :author {:login "sleyzerzon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/528932?v=3"}, :body ";;filter a map on its values\n(filter (comp #{2 3} last) {:x 1 :y 2 :z 3})\n;;=> ([:y 2] [:z 3])", :_id "57afb2d4e4b02d8da95c26fd"} {:updated-at 1471132498612, :created-at 1471132498612, :author {:login "sleyzerzon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/528932?v=3"}, :body ";;filter a map on its values\n(filter (comp #{2 3} last) {:x 1 :y 2 :z 3})\n;;=> ([:y 2] [:z 3])\n\n;;extract keys for certain values\n(map first (filter (comp #{2 3} last) {:x 1 :y 2 :z 3}))\n=> (:y :z)", :_id "57afb352e4b02d8da95c26fe"} {:editors [{:login "mdubakov", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/465999?v=3"}], :body ";; You can use set as a filter predicate. In this case it is sets intersection\n(filter #{0 1 2 3} #{2 3 4 5})\n=> (3 2) ", :author {:avatar-url "https://avatars2.githubusercontent.com/u/465999?v=3", :account-source "github", :login "mdubakov"}, :created-at 1491555992092, :updated-at 1491556073772, :_id "58e75698e4b01f4add58fe86"} {:updated-at 1494575824785, :created-at 1494575824785, :author {:login "st-keller", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/476463?v=3"}, :body ";; That's how to get everything from a seq that is not nil;\n(filter some? '(1 nil [] :a nil))\n=> (1 [] :a)", :_id "59156ad0e4b01920063ee05a"} {:updated-at 1517054565714, :created-at 1517054565714, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;practical example using an anonymous function \n;;which return a boolean value\n(def entries [{:month 1 :val 12 :s1 true :s2 false}\n {:month 2 :val 3 :s1 false :s2 true}\n {:month 3 :val 32 :s1 true :s2 false}\n {:month 4 :val 18 :s1 true :s2 false}\n {:month 5 :val 32 :s1 false :s2 true}\n {:month 6 :val 62 :s1 false :s2 true}\n {:month 7 :val 12 :s1 false :s2 true}\n {:month 8 :val 142 :s1 true :s2 false}\n {:month 9 :val 52 :s1 true :s2 false}\n {:month 10 :val 18 :s1 true :s2 false}\n {:month 11 :val 23 :s1 false :s2 true}\n {:month 12 :val 56 :s1 false :s2 true}])\n\n(filter #(:s2 %) entries)\n\n(filter #(and (:s2 %) (> (:val %) 30)) entries)\n", :_id "5a6c6a65e4b076dac5a728aa"} {:editors [{:login "ahmadrasyidsalim", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/18344132?v=4"}], :body ";; given users\n;; [\"pinisi\" \"sikad\" \"zenius\" \"teacher\" \"law\" \"calvin\" \"ijul\"]\n;; \n;; kick \"law\" and \"teacher\"\n\n(filter #(not (some (fn [u] (= u %)) \n [\"law\" \"teacher\"])) \n [\"pinisi\" \"sikad\" \"zenius\" \"teacher\" \"law\" \"calvin\" \"ijul\"])", :author {:avatar-url "https://avatars3.githubusercontent.com/u/5813694?v=4", :account-source "github", :login "codxse"}, :created-at 1530620467973, :updated-at 1632120981728, :_id "5b3b6a33e4b00ac801ed9e23"} {:editors [{:login "tmountain", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/135297?v=4"}], :body ";; if you want to apply multiple predicates, use every-pred\n;; in conjunction with filter\n;; output: (2, 4)\n\n(filter\n (apply every-pred [even? #(< % 5)]) [1, 2, 3, 4, 5])\n\n;; if you want to apply any predicate, use some-fn\n;; output: (0 2 4 6 7 8 9)\n\n(filter\n (some-fn even? #(> % 5))\n (range 10))", :author {:avatar-url "https://avatars1.githubusercontent.com/u/135297?v=4", :account-source "github", :login "tmountain"}, :created-at 1539887379558, :updated-at 1539888985733, :_id "5bc8d113e4b00ac801ed9ee4"}], :notes [{:author {:login "brunchboy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2228869?v=3"}, :updated-at 1441227184007, :created-at 1441227184007, :body "Although the documentation states that the predicate must be free of side effects, it would be more accurate to say that you should not rely on filter to induce side effects that may be caused by the predicate, nor on the timing of when the predicate will be evaluated, because of the lazy and chunked nature of filter.", :_id "55e761b0e4b0efbd681fbb93"} {:author {:login "mattiasw2", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1294931?v=3"}, :updated-at 1474933697182, :created-at 1474933697182, :body "Note that filtering a map will not create a map. If you want to do a lookup on the result, you need to surround the call to filter with (into {} (filter ...))", :_id "57e9b3c1e4b0709b524f050e"}], :arglists ["pred" "pred coll"], :doc "Returns a lazy sequence of the items in coll for which\n (pred item) returns logical true. pred must be free of side-effects.\n Returns a transducer when no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/filter"} {:added "1.0", :ns "clojure.core", :name "locking", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1410129605000, :author {:login "SQuest", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/14c2b5159bb6d42d41ab04b1c714bd1b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "future", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c76"}], :line 1647, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "(def o (Object.))\n(future (locking o \n (Thread/sleep 5000) \n (println \"done1\")))\n\n;; Now run this before 5 seconds is up and you'll \n;; find the second instance waits for the first instance to print done1\n;; and release the lock, and then it waits for 1 second and prints done2\n\n(Thread/sleep 1000) ; give first instance 1 sec to acquire the lock\n(locking o \n (Thread/sleep 1000)\n (println \"done2\"))\n;; => done1\n;; => done2\n;; => nil\n\n;; locking operates like the synchronized keyword in Java.\n", :created-at 1286271996000, :updated-at 1423012941325, :_id "542692cdc026201cdc326d21"} {:updated-at 1563441285293, :created-at 1563441285293, :author {:login "liuchong", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/236058?v=4"}, :body "(def x 1)\n\n;; Reentrant\n\n(locking x (locking x (println \"hehe in\")) (println \"hehe out\"))\n;; => hehe in\n;; => hehe out\n;; => nil", :_id "5d303885e4b0ca44402ef787"}], :macro true, :notes nil, :arglists ["x & body"], :doc "Executes exprs in an implicit do, while holding the monitor of x.\n Will release the monitor of x in all circumstances.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/locking"} {:added "1.0", :ns "clojure.core", :name "list", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 16, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (list 'a 'b 'c 'd 'e 'f 'g)\n(a b c d e f g)\nuser=> (list 1 2 3)\n(1 2 3)", :created-at 1279072062000, :updated-at 1332950370000, :_id "542692cfc026201cdc326e52"} {:author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (let [m {:1 1 :2 2 :3 3 :4 4}] (map list (keys m) (vals m)))\n((:1 1) (:2 2) (:3 3) (:4 4))", :created-at 1279557389000, :updated-at 1332950386000, :_id "542692cfc026201cdc326e54"} {:body ";; Lists can also be constructed literally using quote, but note the difference\n\n;; When using list the arguments are evaluated\n(let [x 1 y 2]\n (list x y))\n;; => (1 2)\n\n;; ... and when using quote ' they are not:\n(let [x 1 y 2]\n '(x y))\n;; => (x y)\n\n;; there is syntax quote ` (back tick) that allows selective evaluation inside it with ~:\n(let [x 1 y 2]\n `(~x ~y))\n;; => (1 2)\n\n;; But syntax quote ` is mostly used in macro definitions where most elements\n;; should not be evaluated and unquoted with ~ and list form above feels\n;; more idiomatic for simple list construction.", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423011991402, :updated-at 1423012027889, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :_id "54d17097e4b0e2ac61831cfe"}], :notes nil, :arglists ["& items"], :doc "Creates a new list containing the items.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/list"} {:added "1.2", :ns "clojure.core", :name "+", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1351919360000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "+'", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cb3"} {:created-at 1314343076000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "*", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eaa"} {:created-at 1314343079000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "-", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eab"} {:created-at 1423526895712, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "unchecked-add", :library-url "https://github.com/clojure/clojure"}, :_id "54d94befe4b081e022073c82"} {:created-at 1525303139502, :author {:login "NealEhardt", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1338977?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "inc", :ns "clojure.core"}, :_id "5aea4763e4b045c27b7fac5d"}], :line 984, :examples [{:updated-at 1598154469428, :created-at 1279418175000, :body "(+)\n;;=> 0\n\n(+ 1)\n;;=> 1\n\n(+ -10)\n;;=> -10\n\n(+ 1 2)\n;;=> 3\n\n(+ 1 2 3)\n;;=> 6\n\n(+ 1/2 1/2)\n;;=> 1N\n\n(apply + (range 10000000000000 10000000001000))\n;; ArithmeticException: integer overflow", :editors [{:login "MrHus", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4"} {:avatar-url "https://www.gravatar.com/avatar/edeae8e7534b3d554e4ec2c35ffc68d?r=PG&default=identicon", :account-source "clojuredocs", :login "semperos"} {:avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon", :account-source "clojuredocs", :login "TimMc"} {:avatar-url "https://www.gravatar.com/avatar/611bdccae60c79419a30df0e2d6adc2b?r=PG&default=identicon", :account-source "clojuredocs", :login "csophys"} {:avatar-url "https://www.gravatar.com/avatar/60838f7abe2eb311a6e00b10597f34c2?r=PG&default=identicon", :account-source "clojuredocs", :login "BenjyCui"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=2", :account-source "github", :login "phreed"} {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}], :author {:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"}, :_id "542692c8c026201cdc326a18"}], :notes nil, :arglists ["" "x" "x y" "x y & more"], :doc "Returns the sum of nums. (+) returns 0. Does not auto-promote\n longs, will throw on overflow. See also: +'", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/+"} {:added "1.0", :ns "clojure.core", :name "split-with", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1314290648000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "split-at", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c05"} {:created-at 1314291178000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "split", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c06"} {:created-at 1347077825000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "take-while", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c07"} {:created-at 1347077831000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "drop-while", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c08"} {:created-at 1659193713800, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "partition-by", :ns "clojure.core"}, :_id "62e54971e4b0b1e3652d7633"}], :line 2992, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user=> (split-with (partial >= 3) [1 2 3 4 5])\n[(1 2 3) (4 5)]\n\nuser=> (split-with (partial > 3) [1 2 3 2 1])\n[(1 2) (3 2 1)]\n\nuser=> (split-with (partial > 10) [1 2 3 2 1])\n[(1 2 3 2 1) ()]", :created-at 1281512571000, :updated-at 1423277699986, :_id "542692c8c026201cdc3269ee"} {:editors [{:login "achesnais", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6626105?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/1200122?v=3", :account-source "github", :login "Bediako"} {:login "v-kolesnikov", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/6506296?v=4"}], :body ";; If your plan is to split based on a certain value, using sets as\n;; predicates here isn't entirely straightforward.\n\nuser=> (split-with #{:c} [:a :b :c :d])\n[() (:a :b :c :d)]\n\n;; This is because the split happens at the first false/nil predicate result.\n;; Your predicate should thus return false upon hitting the desired split value!\n\nuser=> (split-with (complement #{:c}) [:a :b :c :d])\n[(:a :b) (:c :d)]\n\n;; In short, the predicate defines an attribute valid for the whole left\n;; side of the split. There's no such guarantee for the right side!\n\nuser=> (split-with odd? [1 3 5 6 7 9])\n[(1 3 5) (6 7 9)]\n\n;; Except if your predicate never returns false.\nuser=> (split-with (complement #{:e}) [:a :b :c :d])\n[(:a :b :c :d) ()]\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/6626105?v=3", :account-source "github", :login "achesnais"}, :created-at 1470855993350, :updated-at 1511009715200, :_id "57ab7b39e4b0bafd3e2a04dd"} {:updated-at 1623499263951, :created-at 1581787276541, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; The following split-by builds on top of split-with. Instead of \n;; splitting only the first time pred returns false, it splits (lazily)\n;; every time it turns from true to false.\n\n(defn split-by [pred coll]\n (lazy-seq\n (when-let [s (seq coll)]\n (let [[xs ys] (split-with pred s)]\n (if (seq xs)\n (cons xs (split-by pred ys))\n (let [!pred (complement pred)\n skip (take-while !pred s)\n others (drop-while !pred s)\n [xs ys] (split-with pred others)]\n (cons (concat skip xs)\n (split-by pred ys))))))))\n\n(split-by #(zero? (mod % 2)) [1 1 2 3 3 4 5 6 7 9])\n;; => ((1 1 2) (3 3 4) (5 6) (7 9))", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"} {:login "frwdrik", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/13023061?v=4"}], :_id "5e48288ce4b0ca44402ef839"}], :notes nil, :arglists ["pred coll"], :doc "Returns a vector of [(take-while pred coll) (drop-while pred coll)]", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/split-with"} {:added "1.0", :ns "clojure.core", :name "aset", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1588281651305, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "aget", :ns "clojure.core"}, :_id "5eab4133e4b087629b5a18ee"} {:created-at 1668707576824, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "aset-int", :ns "clojure.core"}, :_id "637674f8e4b0b1e3652d7683"} {:created-at 1668707583337, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "aset-double", :ns "clojure.core"}, :_id "637674ffe4b0b1e3652d7684"}], :line 3923, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [], :body "user=> (def my-array (into-array Integer/TYPE [1 2 3]))\n#'user/my-array\n\nuser=> (aset my-array 1 10) ; Set the element with index 1 to 10\n10\n\nuser=> (into [] my-array)\n[1 10 3]", :created-at 1286508598000, :updated-at 1286508598000, :_id "542692cbc026201cdc326ba0"} {:body "; Two dimensional example\n(use 'clojure.pprint)\n(let [the-array (make-array Long/TYPE 2 3) ]\n (dotimes [nn 6]\n (let [ii (quot nn 3)\n jj (rem nn 3) ]\n (aset the-array ii jj nn)\n ))\n (pprint the-array)\n)\n;=> [[0, 1, 2], [3, 4, 5]]\n\n; Types are defined in clojure/genclass.clj:\n; Boolean/TYPE\n; Character/TYPE\n; Byte/TYPE\n; Short/TYPE\n; Integer/TYPE\n; Long/TYPE\n; Float/TYPE\n; Double/TYPE\n; Void/TYPE\n\n", :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :created-at 1423782804290, :updated-at 1423783298831, :editors [{:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}], :_id "54dd3394e4b0e88f43c5afa1"} {:body ";; Simple 2D example:\n(def a (to-array-2d [[1 2] [3 4]]))\n;=> #'expt.core/a\n(aset a 0 1 \"foo\")\n;=> \"foo\"\nexpt.core=> (map vec a)\n;=> ([1 \"foo\"] [3 4])", :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :created-at 1432828883628, :updated-at 1432829193467, :editors [{:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}], :_id "55673bd3e4b01ad59b65f4dc"} {:updated-at 1588283235231, :created-at 1588282039336, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; transpose a matrix (two-dimensional array of doubles)\n;; using in-place mutation and no additional memory space.\n\n(defn transpose! [^\"[[D\" matrix]\n (dotimes [i (alength matrix)]\n (doseq [j (range (inc i) (alength matrix))]\n (let [copy (aget matrix i j)]\n (aset matrix i j (aget matrix j i))\n (aset matrix j i copy)))))\n\n(def matrix\n (into-array\n (map double-array\n [[1.0 2.0 3.0]\n [4.0 5.0 6.0]\n [7.0 8.0 9.0]])))\n\n(transpose! matrix)\n(mapv vec matrix)\n\n;; [[1.0 4.0 7.0]\n;; [2.0 5.0 8.0]\n;; [3.0 6.0 9.0]]\n", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5eab42b7e4b087629b5a18ef"} {:updated-at 1682634188137, :created-at 1682634188137, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; Doubles are converted to floats; longs to ints, and vice versa:\n(aset (int-array [1 2 3]) 0 (long 42))\n;; => 42\n\n(aset (long-array [1 2 3]) 0 (int 42))\n;; => 42\n\n(aset (float-array [1.0 2.0 3.0]) 0 (double 42.0))\n;; => 42.0\n\n(aset (double-array [1.0 2.0 3.0]) 0 (float 42.0))\n;; => 42.0\n\n;; But some other conversions that may seem possible, are not:\n(aset (byte-array [1 2 3]) 0 (int 42))\n;; => Execution error (IllegalArgumentException) at…\n;; No matching method aset found taking 3 args\n\n(aset (short-array [1 2 3]) 0 (long 42))\n;; => Execution error (IllegalArgumentException) at…\n;; No matching method aset found taking 3 args\n\n;; It's best to be explicit:\n(aset (short-array [1 2 3]) 0 (short 42))\n;; => 42\n", :_id "644af5cce4b08cf8563f4b9e"}], :notes nil, :arglists ["array idx val" "array idx idx2 & idxv"], :doc "Sets the value at the index/indices. Works on Java arrays of\n reference types. Returns val.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/aset"} {:ns "clojure.core", :name "->VecNode", :file "clojure/gvec.clj", :type "function", :column 1, :see-alsos nil, :line 17, :examples nil, :notes nil, :arglists ["edit arr"], :doc "Positional factory function for class clojure.core.VecNode.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/->VecNode"} {:added "1.0", :ns "clojure.core", :name "keyword", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1292127515000, :author {:login "bgruber", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3c2dc1a076ff6e60dfb085ecddcc9f6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "name", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cf9"} {:created-at 1318592819000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "keyword?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cfa"} {:created-at 1331680528000, :author {:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "namespace", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cfb"} {:created-at 1331680582000, :author {:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "find-keyword", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cfc"} {:created-at 1350410417000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "symbol", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cfd"}], :line 614, :examples [{:updated-at 1406075185000, :created-at 1280546489000, :body ";; (keyword name): name can be string, symbol, or keyword.\n;; \n;; (keyword ns name): ns and name must both be string.\n;; \n;; A keyword string, like a symbol, begins with a non-numeric\n;; character and can contain alphanumeric characters and *, +, !, -,\n;; _, and ?. (see http://clojure.org/reader for details).\n;; \n;; keyword does not validate input strings for ns and name, and may\n;; return improper keywords with undefined behavior for non-conformant\n;; ns and name.\n\nuser=> (keyword 'foo)\n:foo\n\nuser=> (keyword \"foo\") \n:foo\n\nuser=> (keyword \"user\" \"foo\")\n:user/foo\n\n;; keyword in current namespace\nuser=> (keyword (str *ns*) \"foo\")\n:user/foo", :editors [{:avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon", :account-source "clojuredocs", :login "gstamp"} {:avatar-url "https://www.gravatar.com/avatar/7567c12df3f5e8f8ca031d4320b476ba?r=PG&default=identicon", :account-source "clojuredocs", :login "Alan"} {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"}], :author {:avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon", :account-source "clojuredocs", :login "dakrone"}, :_id "542692cec026201cdc326d70"} {:author {:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"}, :editors [{:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"} {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}], :body ";; some gotchas to be aware of:\n\nuser=> (keyword \"user\" 'abc)\nClassCastException clojure.lang.Symbol cannot be cast to java.lang.String clojure.core/keyword (core.clj:558)\n\nuser=> (keyword *ns* \"abc\")\nClassCastException clojure.lang.Namespace cannot be cast to java.lang.String clojure.core/keyword (core.clj:558)\n\nuser=> (keyword 'user \"abc\")\nClassCastException clojure.lang.Symbol cannot be cast to java.lang.String clojure.core/keyword (core.clj:558)\n\n\n;; Warning - the following generated keywords are non-conformant and may wreak\n;; serious havoc in the near/far future when least expected...\n;; Even if `keyword?` might return true for them and they seem to work with\n;; `name` and `namespace` as well, and they can be used as functions\n;; (e.g. `(:/// {:/// \"x\"})` works), problems usually come at e.g. destructuring... \n\nuser=> (keyword \"abc def\")\n:abc def\n\nuser=> (keyword \"123def\")\n:123def\n\nuser=> (keyword \"/abc/def/ghi\")\n:/abc/def/ghi\n\nuser=> (keyword \":\" \":\")\n::/:\n\nuser=> (keyword \"/\" \"/\")\n:///\n\nuser=> (keyword \"\")\n:\n\nuser=> (keyword \"\" \"/\")\n://\n\nuser=> (keyword \"...\")\n:...", :created-at 1331680488000, :updated-at 1548520687081, :_id "542692d3c026201cdc326fde"} {:updated-at 1406075556000, :created-at 1392677011000, :body ";; You can define namespaced keywords using '::'\nuser=> (def a :foo)\n#'user/a\n\nuser=> (def b ::foo)\n#'user/b\n\nuser=> (ns foo)\nfoo=> user/a\n:foo\n\nfoo=> user/b\n:user/foo\n\nfoo=> ::foo\n:foo/foo\n\nfoo=> (= user/a :foo)\ntrue\n\nfoo=> (= user/b ::foo)\nfalse\n\nfoo=> (= user/b :user/foo)\ntrue", :editors [{:avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon", :account-source "clojuredocs", :login "Phalphalak"} {:avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon", :account-source "clojuredocs", :login "Phalphalak"} {:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"}], :author {:avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon", :account-source "clojuredocs", :login "Phalphalak"}, :_id "542692d3c026201cdc326fe0"} {:updated-at 1445848617591, :created-at 1445848617591, :author {:login "ShayMatasaro", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1350551?v=3"}, :body ";;only convert strings\nuser=> (keyword 1)\nnil\n\n\nuser=> (keyword '1)\nnil\n", :_id "562de629e4b0290a56055d13"} {:editors [{:login "PetrGlad", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/124476?v=3"}], :body "(keyword \"my.key\")\n;=> :my.key\n(qualified-keyword? :my.key)\n;=> nil ;; \"my.key\" is just name, dot does not count\n(keyword \"my.namespace\" \"my.key\") \n;=> :my.namespace/my.key\n(qualified-keyword? :my.namespace/my.key)\n;=> true \n(namespace :my.namespace/my.key) \n;=> \"my.namespace\"\n(name :my.namespace/my.key) \n;=> \"my.key\"\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/124476?v=3", :account-source "github", :login "PetrGlad"}, :created-at 1482252029047, :updated-at 1482252099977, :_id "58595efde4b004d3a355e2c9"} {:updated-at 1517353605671, :created-at 1517352728207, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body ";; let's make an illustrative namespace\n(create-ns 'my.arbitrary.long.namespace)\n(alias 'maln 'my.arbitrary.long.namespace)\n;; more typically loaded and aliased with require\n;; (require '[my.arbitrary.long.namespace :as maln])\n\n;; Qualified keywords may be specified with the namespace or the alias.\n;; But unlike with symbols where the bare alias is used \n;; you need to prefix the alias with '::' \n:my.arbitrary.long.namespace/foo\n;=> :my.arbitrary.long.namespace/foo\n::maln/bar\n;=> :my.arbitrary.long.namespace/bar", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}], :_id "5a70f718e4b0c974fee49d14"} {:editors [{:login "jasonisgraham", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/3493406?v=4"} {:avatar-url "https://avatars3.githubusercontent.com/u/11671382?v=4", :account-source "github", :login "dominem"}], :body "\n;; You can use existing keywords (cljs only)\n\n(keyword :namespace :keyword)\n;;=> :namespace/keyword\n\n(keyword \"namespace\" :keyword)\n;;=> :namespace/keyword\n\n(keyword :namespace \"keyword\")\n;;=> :namespace/keyword\n\n(keyword :meta-namespace/namespace :meta-keyword/keyword)\n;;=> :namespace/keyword\n", :author {:avatar-url "https://avatars2.githubusercontent.com/u/10955264?v=4", :account-source "github", :login "troglotit"}, :created-at 1527776571957, :updated-at 1565335543185, :_id "5b10053be4b045c27b7fac89"} {:editors [{:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}], :body ";; different (non-conformant) keywords can have the same printed representation:\n\n(= :a/b/c (keyword \"a\" \"b/c\"))\n;;=> true\n\n(keyword \"a/b\" \"c\")\n;;=> :a/b/c\n\n(= (str (keyword \"a/b\" \"c\")) (str (keyword \"a\" \"b/c\")))\n;;=> true\n\n(= (keyword \"a/b\" \"c\") (keyword \"a\" \"b/c\"))\n;;=> false\n", :author {:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"}, :created-at 1548521622644, :updated-at 1548521923629, :_id "5c4c9096e4b0ca44402ef63d"} {:updated-at 1599398418945, :created-at 1599398354277, :author {:login "luiszambon", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/41161270?v=4"}, :body "(defn creating-map\n [key value]\n {(keyword key) value})\n\n(:map-key (creating-map \"map-key\" \"map-value\"))\n;;=>\"map-value\"", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/41161270?v=4", :account-source "github", :login "luiszambon"}], :_id "5f54e1d2e4b0b1e3652d73b0"} {:updated-at 1641596456686, :created-at 1641596456686, :author {:login "jkndrkn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/91959?v=4"}, :body ";; Be careful because it is possible to create keywords that contain whitespace\n\n(keyword \"my-keyword\\t\")\n;;=> :my-keyword\n\n(name (keyword \"my-keyword\\t\"))\n;;=> \"my-keyword\\t\"\n\n\n(= (keyword \"my-keyword\") :my-keyword)\n;;=> true\n\n(= (keyword \"my-keyword\\t\") :my-keyword)\n;;=> false\n", :_id "61d8c628e4b0b1e3652d759d"}], :notes nil, :tag "clojure.lang.Keyword", :arglists ["name" "ns name"], :doc "Returns a Keyword with the given namespace and name. Do not use :\n in the keyword strings, it will be added automatically.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/keyword"} {:added "1.0", :ns "clojure.core", :name "*ns*", :type "var", :see-alsos nil, :examples [{:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [], :body "user=> *ns*\n#", :created-at 1289039963000, :updated-at 1289039963000, :_id "542692c7c026201cdc3269c7"} {:author {:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"}], :body "user=> (ns foo.bar)\nnil\n\nfoo.bar=> *ns*\n#", :created-at 1406094577000, :updated-at 1406094613000, :_id "542692d1c026201cdc326f35"} {:editors [{:login "Artiavis", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1834136?v=3"}], :body ";; A (rare) trap which can happen is attempting to dynamically call `in-ns`, due to how\n;; `*ns*` is really an instance of `clojure.lang.Var` with a root binding.\nuser=> (ns my.namespace)\nnil\n\nmy.namespace=> *ns*\n#\n\n;; This will *only* work in the REPL (or REPL-like environments)!!\n;; Tools like Boot and Lein may or may not provide this (read the manual/code)\nmy.namespace=> (defn swap-ns! [ns-name] (in-ns ns-name))\n#'my.namespace/swap-ns!\n\nmy.namespace=> (swap-ns! 'other.ns)\n#namespace[other.ns]\n\n;; Later, at runtime...\n;; Throws IllegalStateException(\"Can't change/establish root binding of: *ns* with set\")\n;; Remember, *ns* is a root var and in-ns calls set!, which only works after\n;; someone somewhere calls the binding macro (or Java equivalent)\n(defn -main\n [& args]\n (println *ns*)\n (swap-ns! 'arbitrary-namespace))\n;; prints #namespace[clojure.core] and then will crash", :author {:avatar-url "https://avatars1.githubusercontent.com/u/1834136?v=3", :account-source "github", :login "Artiavis"}, :created-at 1497795113128, :updated-at 1497795249422, :_id "59468a29e4b06e730307db35"}], :notes [{:updated-at 1310470085000, :body "A trap I fell into was that *ns* seems to get assigned to clojure.core when run as a \"gen-class\" compiled class.", :created-at 1310470085000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fc4"} {:body "To clarify the above point, see my example above. Although within Lein/Boot/REPL/Compiler contexts, `*ns*` is thread-local due to the use of the `binding` machinery, and so `in-ns` works in those situtations, `*ns*` has a root of `clojure.core`. That means that, at runtime, you cannot call `in-ns` within functions until you've first called `binding`. (This could be relevant for e.g. `eval` calls.)", :created-at 1497579558843, :updated-at 1497795316359, :author {:avatar-url "https://avatars1.githubusercontent.com/u/1834136?v=3", :account-source "github", :login "Artiavis"}, :_id "59434026e4b06e730307db34"}], :tag "clojure.lang.Namespace", :arglists [], :doc "A clojure.lang.Namespace object representing the current namespace.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*ns*"} {:ns "clojure.core", :name "destructure", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 4389, :examples [{:author {:login "reborg", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5b2768c3c24e6e96d838c4c43038de93?r=PG&default=identicon"}, :editors [], :body "; look ma, no let!\n(map #(intern *ns* (first %) (eval (last %))) (partition 2 (destructure '[[a b] [\"a\" \"b\"]])))\nuser=> a\n\"a\"\nuser=> b\n\"b\"", :created-at 1396388229000, :updated-at 1396388229000, :_id "542692d2c026201cdc326f8d"} {:updated-at 1519692244573, :created-at 1519675914364, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body ";; Based on the previous example...\n\n;; Suppose you want to do some work at the repl.\n;; It would be nice if the def and let had similar syntax but they do not.\n\n(defn def+ [bindings] \n (let [bings (partition 2 (destructure bindings))\n obj (first bings)\n redef (rest bings)]\n \n (intern *ns* (first obj) (eval (second obj))) \n (map #(intern *ns* (first %) (eval (last %))) redef)))\n\n(def+ '[[u s v] [1 5 9]]) \n \n;; def+ is better implemented as a macro.\n;; It does have the drawback of introducing some intermediate gen variables.\n;; But, it prints the names of all variables.\n\n(defmacro def+\n \"binding => binding-form\n internalizes binding-forms as if by def.\"\n {:added \"1.9\", :special-form true, :forms '[(def+ [bindings*])]}\n [& bindings]\n (let [bings (partition 2 (destructure bindings))]\n (sequence cat \n ['(do) \n (map (fn [[var value]] `(def ~var ~value)) bings)\n [(mapv (fn [[var _]] (str var)) bings)]])))\n\n(def+ [u s v] [1 5 9] \n foo \"bar\" \n [a b] [\"abc\" \"bcd\"])\n;=> #'user/b\n\na\n;=> \"abc\"\n\n;; The justification for such a macro is manifest when\n;; debugging at the repl.\n;; Suppose the following is in a function and \n(let [[a b] [\"a\" \"b\"]] \n (str a b) ; is this correct?\n (conj a b) ; how about this?\n (cat a b)) ; or this?\n\n;; Now in this case the problem is clear but in general it may not be.\n;; So you get set up to track down this problem. \n(def+ [a b] [\"a\" \"b\"])\n\n;; Without def+ you would have to do something like the following...\n(def ab [\"a\" \"b\"])\n(def a (nth ab 0))\n(def b (nth ab 1))\n;; ...to get set up in the repl.", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}], :_id "5a946a0ae4b0316c0f44f8f2"}], :notes [{:author {:login "Ragsboss", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/3869936?v=3"}, :updated-at 1494263800930, :created-at 1494263800930, :body "I found https://clojure.org/guides/destructuring extremely useful", :_id "5910a7f8e4b01f4add58feb1"} {:body "\"[The `destructure` function] implements the destructuring logic and [...] is designed to be invoked in a macro\". For more info about `desctructure` see https://clojure.org/guides/destructuring#_macros.", :created-at 1519164976336, :updated-at 1519165254309, :author {:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"}, :_id "5a8c9e30e4b0316c0f44f8d8"}], :arglists ["bindings"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/destructure"} {:ns "clojure.core", :name "*assert*", :type "var", :see-alsos [{:created-at 1301778092000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "assert", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d09"}], :examples [{:updated-at 1475615278407, :created-at 1475615278407, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body "user=> (set! *assert* true)\n\nuser=> (defn str->int\n [x]\n {:pre [(string? x)]}\n (Integer/valueOf x))\n\nuser=> (str->int 12.2)\n;;=> AssertionError Assert failed: (string? x) user/str->int...", :_id "57f41a2ee4b0709b524f051e"}], :notes [{:updated-at 1406676369000, :body "A little digging through the RT.java code confirms that this is dynamic, and defaults to true.", :created-at 1406676369000, :author {:login "hlship", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cb598cc180c2363c093e92e8e87e0493?r=PG&default=identicon"}, :_id "542692edf6e94c697052202e"}], :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*assert*"} {:added "1.0", :ns "clojure.core", :name "defmulti", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1285162568000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defmethod", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c30"} {:created-at 1341270331000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "remove-method", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c31"} {:created-at 1341270338000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "remove-all-methods", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c32"} {:created-at 1341270344000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "prefers", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c33"} {:created-at 1341270349000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "methods", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c34"} {:created-at 1341270355000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "get-method", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c35"} {:created-at 1351463879000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defprotocol", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c36"} {:created-at 1413313710551, :author {:login "kgann", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1098962?v=2"}, :to-var {:ns "clojure.core", :name "make-hierarchy", :library-url "https://github.com/clojure/clojure"}, :_id "543d74aee4b02688d208b1b5"} {:created-at 1485980931712, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "multi-spec", :ns "clojure.spec"}, :_id "58924503e4b01f4add58fe38"}], :line 1725, :examples [{:author {:login "Victor", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc41ebab54cc0e0fbe99d753876d45ce?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:avatar-url "https://avatars.githubusercontent.com/u/200617?v=3", :account-source "github", :login "bsima"} {:avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4", :account-source "github", :login "bfontaine"} {:login "Luke1298", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7078861?v=4"}], :body ";; Define the multimethod\n(defmulti service-charge (juxt account-level :tag))\n\n;; Handlers for resulting dispatch values\n(defmethod service-charge [::acc/Basic ::acc/Checking] [_] 25)\n(defmethod service-charge [::acc/Basic ::acc/Savings] [_] 10)\n(defmethod service-charge [::acc/Premium ::acc/Account] [_] 0)", :created-at 1290489704000, :updated-at 1643237673567, :_id "542692cdc026201cdc326d58"} {:author {:login "Victor", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc41ebab54cc0e0fbe99d753876d45ce?r=PG&default=identicon"}, :editors [{:login "stand", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d7f9ed2753f8b3517f1539f6129f0a17?r=PG&default=identicon"} {:avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4", :account-source "github", :login "bfontaine"} {:login "blue0513", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/8979468?v=4"}], :body ";this example illustrates that the dispatch type\n;does not have to be a symbol, but can be anything (in this case, it's a string)\n\n(defmulti greeting\n (fn[x] (get x \"language\")))\n\n;params is not used, so we could have used [_]\n(defmethod greeting \"English\" [params]\n \"Hello!\")\n\n(defmethod greeting \"French\" [params]\n \"Bonjour!\")\n\n;;default handling\n(defmethod greeting :default [params]\n (throw (IllegalArgumentException. \n (str \"I don't know the \" (get params \"language\") \" language\"))))\n\n;then can use this like this:\n(def english-map {\"id\" \"1\", \"language\" \"English\"})\n(def french-map {\"id\" \"2\", \"language\" \"French\"})\n(def spanish-map {\"id\" \"3\", \"language\" \"Spanish\"})\n\n=>(greeting english-map)\n\"Hello!\"\n=>(greeting french-map)\n\"Bonjour!\"\n=>(greeting spanish-map)\n java.lang.IllegalArgumentException: I don't know the Spanish language", :created-at 1290492895000, :updated-at 1589637326870, :_id "542692cdc026201cdc326d59"} {:author {:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"}, :editors [{:login "cddr", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/48030?v=3"}], :body ";; Implementing factorial using multimethods Note that factorial-like function \n;; is best implemented using `recur` which enables tail-call optimization to avoid \n;; a stack overflow error. This is a only a demonstration of clojure's multimethod\n\n;; identity form returns the same value passed\n(defmulti factorial identity)\n\n(defmethod factorial 0 [_] 1)\n(defmethod factorial :default [num] \n (* num (factorial (dec num))))\n\n(factorial 0) ; => 1\n(factorial 1) ; => 1\n(factorial 3) ; => 6\n(factorial 7) ; => 5040", :created-at 1313197324000, :updated-at 1433710661793, :_id "542692cdc026201cdc326d5b"} {:body ";; defmulti/defmethods support variadic arguments and dispatch functions.\n\n(defmulti bat \n (fn ([x y & xs] \n (mapv class (into [x y] xs)))))\n(defmethod bat [String String] [x y & xs] \n (str \"str: \" x \" and \" y))\n(defmethod bat [String String String] [x y & xs] \n (str \"str: \" x \", \" y \" and \" (first xs)))\n(defmethod bat [String String String String] [x y & xs] \n (str \"str: \" x \", \" y \", \" (first xs) \" and \" (second xs)))\n(defmethod bat [Number Number] [x y & xs] \n (str \"number: \" x \" and \" y))\n\n;; you call it like this...\n\n(bat \"mink\" \"stoat\")\n;; => \"str: mink and stoat\"\n\n(bat \"bear\" \"skunk\" \"sloth\")\n;; => \"str: bear, skunk and sloth\"\n\n(bat \"dog\" \"cat\" \"cow\" \"horse\")\n;; => \"str: dog, cat, cow and horse\"\n\n(bat 1 2)\n;; => \"number: 1 and 2\"", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1412178008616, :updated-at 1412178054860, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :_id "542c2058e4b05f4d257a2966"} {:body ";; defmulti - custom hierarchy\n\n(def h (-> (make-hierarchy)\n (derive :foo :bar)))\n\n(defmulti f identity :hierarchy #'h) ;; hierarchy must be a reference type\n\n(defmethod f :default [_] \"default\")\n(defmethod f :bar [_] \"bar\")\n\n(f :unknown) ;; \"default\"\n(f :bar) ;; \"bar\"\n(f :foo) ;; \"bar\"\n\n;; Note that any deref'able type is fine. \n;; Using an atom instead of (var h) is preferable in clojurescript \n;; (which adds a lot of meta information to vars)", :author {:login "kgann", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1098962?v=2"}, :created-at 1413313971298, :updated-at 1440343358927, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/671872?v=3", :account-source "github", :login "hura"}], :_id "543d75b3e4b0a3cf052fe476"} {:updated-at 1440343192893, :created-at 1440343192893, :author {:login "hura", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/671872?v=3"}, :body ";; If you're REPLing you might want to re-define the defmulti dispatch function \n;; (which defmulti won't allow you to do). For this you can use `ns-unmap`:\n\n(defmulti x (fn[_] :inc))\n(defmethod x :inc [y] (inc y))\n(defmethod x :dec [y] (dec y))\n(x 0) ;; => 1\n(defmulti x (fn[_] :dec)) ;; Can't redefine :(\n(x 0) ;; => 1 ;; STILL :(\n(ns-unmap *ns* 'x) ;; => unmap the var from the namespace\n(defmulti x (fn[_] :dec))\n(x 0) ;; => Exception, we now need to redefine our defmethods.\n\n;; So in your file while developing you'd put the ns-unmap to the top of the file\n", :_id "55d9e498e4b0831e02cddf1b"} {:updated-at 1444625178263, :created-at 1444625178263, :author {:login "metasoarous", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/88556?v=3"}, :body ";; It's nice for multimethods to have arglists metadata so that calling `doc`\n;; prints the arglist, instead of just the docstring. For example:\n\n(defmulti f \"Great function\" (fn [x] :blah))\n(doc f)\n;; -------------------------\n;; user/f\n;; Great function\n\n;; However, we can add `:arglists` metadata via a third (optional) argument to `defmulti` (`attr-map?` in the docstring for `defmulti`):\n\n(defmulti g \"Better function\" {:arglists '([x])} (fn [x] :blah))\n(doc g)\n;; -------------------------\n;; user/f\n;; ([x])\n;; Better function\n", :_id "561b3b1ae4b0b41dac04c957"} {:updated-at 1452157994440, :created-at 1452156707338, :author {:login "peter", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2008?v=3"}, :body "(defmulti compact map?)\n\n(defmethod compact true [map]\n (into {} (remove (comp nil? second) map)))\n\n(defmethod compact false [col]\n (remove nil? col))\n\n; Usage:\n\n(compact [:foo 1 nil :bar])\n; => (:foo 1 :bar)\n\n(compact {:foo 1 :bar nil :baz \"hello\"})\n; => {:foo 1, :baz \"hello\"}\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/2008?v=3", :account-source "github", :login "peter"}], :_id "568e2723e4b0f37b65a3c27f"} {:updated-at 1465222176322, :created-at 1465221190822, :author {:login "rauhs", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/11081351?v=3"}, :body ";; This show how to do a wildcard match to a dispatch value:\n(defmulti xyz (fn [x y] [x y]))\n\n;; We don't care about the first argument:\n(defmethod xyz [::default :b]\n [x y]\n :d-b)\n\n;; We have to implement this manually:\n(defmethod xyz :default\n [x y]\n (let [recover (get-method xyz [::default y])]\n ;; Prevent infinite loop:\n (if (and recover (not (= (get-method xyz :default) recover)))\n (do\n (println \"Found a default\")\n ;; Add the default to the internal cache:\n ;; Clojurescript will want (-add-method ...)\n (.addMethod ^MultiFn xyz [x y] recover)\n (recover ::default y))\n :default)))\n\n(xyz nil :b) ;; => :d-b\n;; only prints \"Found a default\" once!", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/11081351?v=3", :account-source "github", :login "rauhs"}], :_id "57558046e4b0bafd3e2a0474"} {:updated-at 1484939584615, :created-at 1484939584615, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :body ";; Extremely simple example, dispatching on a single field of the input map.\n;; Here we have a polymorphic map that looks like one of these two examples:\n\n;; {:name/type :split :name/first \"Bob\" :name/last \"Dobbs\"}\n;; {:name/type :full :name/full \"Bob Dobbs\"}\n\n(defmulti full-name :name/type)\n\n(defmethod full-name :full [name-data] \n (:name/full name-data))\n\n(defmethod full-name :split [name-data] \n (str (:name/first name-data) \" \" (:name/last name-data)))\n\n(defmethod full-name :default [_] \"???\")\n\n(full-name {:name/type :full :name/full \"Bob Dobbs\"})\n;; => \"Bob Dobbs\"\n\n(full-name {:name/type :split :name/first \"Bob\" :name/last \"Dobbs\"})\n;; => \"Bob Dobbs\"\n\n(full-name {:name/type :oops :name/full \"Bob Dobbs\"})\n;; => \"???\"\n", :_id "58826140e4b09108c8545a5b"} {:editors [{:login "green-coder", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4"}], :body ";;polymorphism classic example\n\n;;defmulti\n(defmulti draw :shape)\n\n;;defmethod\n(defmethod draw :square [geo-obj] (str \"Drawing a \" (:clr geo-obj) \" square\"))\n(defmethod draw :triangle [geo-obj] (str \"Drawing a \" (:clr geo-obj) \" triangle\"))\n\n(defn square [color] {:shape :square :clr color})\n(defn triangle [color] {:shape :triangle :clr color})\n\n(draw (square \"red\"))\n(draw (triangle \"green\"))", :author {:avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4", :account-source "github", :login "ibercode"}, :created-at 1510785469752, :updated-at 1531155016694, :_id "5a0cc1bde4b0a08026c48cb9"} {:updated-at 1510845199326, :created-at 1510845199326, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;defmulti with dispatch function\n(defmulti salary (fn[amount] (amount :t)))\n\n;;defmethod provides a function implementation for a particular value\n(defmethod salary \"com\" [amount] (+ (:b amount) (/ (:b amount) 2)))\n(defmethod salary \"bon\" [amount] (+ (:b amount) 99))\n\n(salary {:t \"com\" :b 1000}) ;;1500\n(salary {:t \"bon\" :b 1000}) ;;1099 ", :_id "5a0dab0fe4b0a08026c48cba"} {:updated-at 1568297637555, :created-at 1568297637555, :author {:login "the-frey", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/2385077?v=4"}, :body ";; dispatch on the first argument\n(defmulti example-multimethod\n (fn [arg-one opts] arg-one))\n\n;; the opts are available in the defmethods\n(defmethod example-multimethod :path-one [_ opts]\n (println (:first-opt opts)))\n\n(defmethod example-multimethod :path-two [_ opts]\n (println (:second-opt opts)))\n\n(example-multimethod :path-one {:first-opt 1\n :second-opt 2})\n;; 1\n;; => nil", :_id "5d7a52a5e4b0ca44402ef7b3"} {:updated-at 1598457058014, :created-at 1598457058014, :author {:login "Gavlooth", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10321050?v=4"}, :body ";; You can use multiarity in multimethods \n(defmulti foo (fn [x & _] x))\n\n(defmethod foo :default [_ & _] \"DEFAULT VALUE DISPACHED\")\n\n;; Like a standar multi-arity function\n(defmethod foo :bar \n ([_ _] \"ONE ARGUMENT\")\n ([_ _ _] \"TWO ARGUMENTs\")\n ([_ _ _ _] \"THREE ARGUMENTs\")\n ([_ _ _ _ & more] (cl-format nil \"~d ARGUMENTS\" (+ 3 (count more)))))\n \n(foo :baz 1)\n;; => \"DEFAULT VALUE DISPACHED\"\n\n(foo :bar 1)\n;; => \"ONE ARGUMENT\"\n\n(foo :bar 1 2)\n;; => \"TWO ARGUMENTs\"\n\n(foo :bar 1 2 3)\n;; => \"THREE ARGUMENTs\"\n\n(foo :bar 1 2 3 4 )\n;; => \"4 ARGUMENTS\"\n\n(foo :bar 1 2 3 4 5)\n;; => \"5 ARGUMENTS\"\n\n(foo :baz 1)\n;; => \"DEFAULT VALUE DISPACHED\"\n\n(foo :bar)\n; eval (current-form): (foo :bar)\n; (err) Execution error (ArityException) at user/eval22248 \n; (err) Wrong number of args (1) passed to: user/eval22204/fn--22205\n\n", :_id "5f4684e2e4b0b1e3652d73ad"} {:editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}], :body ";; To call the dispatch function without dispatching to a method, \n;; just to examine the dispatch key\n(defmulti xyzzy (fn [x y] (+ x y)))\n((.dispatchFn xyzzy) 3 7)\n;; => 10\n\n;; The above is specific to Clojure on the JVM. In ClojureScript it is\n;; slightly different:\n((.-dispatch-fn xyzzy) 3 7)\n;; => 10", :author {:avatar-url "https://avatars1.githubusercontent.com/u/6414129?v=4", :account-source "github", :login "jimka2001"}, :created-at 1601239335909, :updated-at 1601314098960, :_id "5f70f927e4b0b1e3652d73c3"}], :macro true, :notes [{:updated-at 1290493285000, :body "See also\r\n\r\nhttp://clojure.org/runtime_polymorphism\r\n\r\nhttp://clojure.org/multimethods\r\n\r\n", :created-at 1290493285000, :author {:login "Victor", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc41ebab54cc0e0fbe99d753876d45ce?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fa5"}], :arglists ["name docstring? attr-map? dispatch-fn & options"], :doc "Creates a new multimethod with the associated dispatch function.\n The docstring and attr-map are optional.\n\n Options are key-value pairs and may be one of:\n\n :default\n\n The default dispatch value, defaults to :default\n\n :hierarchy\n\n The value used for hierarchical dispatch (e.g. ::square is-a ::shape)\n\n Hierarchies are type-like relationships that do not depend upon type\n inheritance. By default Clojure's multimethods dispatch off of a\n global hierarchy map. However, a hierarchy relationship can be\n created with the derive function used to augment the root ancestor\n created with make-hierarchy.\n\n Multimethods expect the value of the hierarchy option to be supplied as\n a reference type e.g. a var (i.e. via the Var-quote dispatch macro #'\n or the var special form).", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/defmulti"} {:added "1.1", :ns "clojure.core", :name "chars", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "char-array", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917427000, :_id "542692eaf6e94c6970521bcf"}], :line 5358, :examples [{:updated-at 1486713986324, :created-at 1486713986324, :author {:login "zezhenyan", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8064559?v=3"}, :body "user=> (seq (chars (char-array \"this is a good one\")))\n(\\t \\h \\i \\s \\space \\i \\s \\space \\a \\space \\g \\o \\o \\d \\space \\o \\n \\e)", :_id "589d7482e4b01f4add58fe44"} {:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; char-array will convert where possible\n(char-array \"foo\");; => [\\f, \\o, \\o]\n\n;; chars will not\n(try (chars \"foo\")\n (catch ClassCastException e (ex-message e)))\n;; => \"java.lang.String cannot be cast to [C\"\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4", :account-source "github", :login "tomdl89"}, :created-at 1656673310214, :updated-at 1656673548489, :_id "62bed41ee4b0b1e3652d7615"} {:updated-at 1682278412171, :created-at 1682278412171, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; Casting avoids expensive reflection, so to see the benefit, enable warning:\n(set! *warn-on-reflection* true)\n\n;; We'll def a char-array but won't type-hint the var:\n(def my-array (char-array [\\f \\g \\h \\i \\j]))\n\n;; and try to amap over it without using `chars` or type hinting:\n(amap my-array i _ (-> my-array (aget i) clojure.string/capitalize first unchecked-char))\n;; Reflection warning… call to static method alength on clojure.lang.RT can't be resolved (argument types: unknown).\n;; Reflection warning… call to static method aclone on clojure.lang.RT can't be resolved (argument types: unknown).\n;; Reflection warning… call to static method aget on clojure.lang.RT can't be resolved (argument types: unknown, int).\n;; Reflection warning… call to static method aset on clojure.lang.RT can't be resolved (argument types: unknown, int, char).\n;; => [\\F, \\G, \\H, \\I, \\J]\n\n;; We can use `chars` to avoid reflection:\n(amap (chars my-array) i _ (-> (chars my-array) (aget i) clojure.string/capitalize first unchecked-char))\n;; => [\\F, \\G, \\H, \\I, \\J]\n\n;; Just as we can type hint in place:\n(amap ^chars my-array i _ (-> ^chars my-array (aget i) clojure.string/capitalize first unchecked-char))\n;; => [\\F, \\G, \\H, \\I, \\J]\n\n;; Or type hint the var:\n(def ^\"[C\" my-array (char-array [\\f \\g \\h \\i \\j]))\n(amap my-array i _ (-> my-array (aget i) clojure.string/capitalize first unchecked-char))\n;; => [\\F, \\G, \\H, \\I, \\J]\n", :_id "6445880ce4b08cf8563f4b94"}], :notes nil, :arglists ["xs"], :doc "Casts to chars[]", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/chars"} {:added "1.0", :ns "clojure.core", :name "str", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1347870090000, :author {:login "JR0cket", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ff5786158c0be54051ef8e5c544555d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pr", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e5e"} {:created-at 1347870109000, :author {:login "JR0cket", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ff5786158c0be54051ef8e5c544555d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "prn", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e5f"} {:created-at 1423277783809, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "pr-str", :library-url "https://github.com/clojure/clojure"}, :_id "54d57ed7e4b0e2ac61831d22"} {:created-at 1423277796681, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "prn-str", :library-url "https://github.com/clojure/clojure"}, :_id "54d57ee4e4b0e2ac61831d23"} {:created-at 1423277811434, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "print-str", :library-url "https://github.com/clojure/clojure"}, :_id "54d57ef3e4b0e2ac61831d24"} {:created-at 1423277823482, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "println-str", :library-url "https://github.com/clojure/clojure"}, :_id "54d57effe4b0e2ac61831d25"}], :line 544, :examples [{:author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:avatar-url "https://avatars2.githubusercontent.com/u/24441401?v=4", :account-source "github", :login "themustafabasit"}], :body "user=> \"some string\"\n\"some string\"\n\nuser=> (str)\n\"\"\n\nuser=> (str nil)\n\"\"\n\nuser=> (str 1)\n\"1\"\n\nuser=> (str 1 2 3)\n\"123\"\n\nuser=> (str 1 'symbol :keyword)\n\"1symbol:keyword\"\n\n;; A very common usage of str is to apply it to an existing collection:\nuser=> (apply str [1 2 3])\n\"123\"\n\n;; compare it with:\nuser=> (str [1 2 3])\n\"[1 2 3]\"\n\n", :created-at 1279191631000, :updated-at 1599671667197, :_id "542692ccc026201cdc326c5f"} {:author {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"}, :editors [{:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"}], :body ";; Destructuring with a string, getting just a few characters from it\nuser=> (let [[first-char second-char] \"abcde\"] \n (prn 'first= first-char) \n (prn 'second= second-char))\nfirst= \\a\nsecond= \\b\nnil\n\n;; More destructuring with a string\nuser=> (let [[first-char second-char & rest-of-chars] \"abcde\"] \n (prn 'first= first-char) \n (prn 'second= second-char) \n (prn 'rest= rest-of-chars))\nfirst= \\a\nsecond= \\b\nrest= (\\c \\d \\e)\nnil\n\n;; Destructuring, getting the first character of a string\n;; and then a reference to the entire string\nuser=> (let [[first-char :as all-the-string] \"abcde\"] \n (prn 'first= first-char) \n (prn 'all= all-the-string))\nfirst= \\a\nall= \"abcde\"\nnil", :created-at 1285683003000, :updated-at 1285683237000, :_id "542692ccc026201cdc326c64"} {:updated-at 1471001180731, :created-at 1471001180731, :author {:login "Lacty", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7412474?v=3"}, :body "user=> (str \"L\" \"a\")\n\"La\"\n\nuser=> (str \"L\" 5 \"a\")\n\"L5a\"", :_id "57adb25ce4b0bafd3e2a04ef"} {:updated-at 1517964096633, :created-at 1517964096633, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body ";; sometimes when printing lazy sequences you do not get what you want.\n(str (take 5 (range 10)))\n;=> \"clojure.lang.LazySeq@1b554e1\"\n\n;; in those cases `pr-str` to the rescue.\n(pr-str (take 5 (range 10)))\n;=> \"(0 1 2 3 4)\"", :_id "5a7a4b40e4b0e2d9c35f7422"} {:updated-at 1527025723311, :created-at 1527025723311, :author {:login "operasfantom", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31903947?v=4"}, :body ";; be careful with java.lang.Double to java.lang.String conversion\n(str -128004972.0)\n;=> \"-1.28004972E8\"\n", :_id "5b04903be4b045c27b7fac74"} {:updated-at 1547468102218, :created-at 1547468102218, :author {:login "RayceeM", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/28865179?v=4"}, :body ";; Using str in maps\n(def user-map {:fname \"Jane\" :sname \"Doe\"})\n\n;;getting the value of the first key \n(:fname user-map)\n;=> \"Jane\"\n\n(str (:fname user-map) \" \" (:sname user-map))\n;=> \"Jane Doe\"", :_id "5c3c7d46e4b0ca44402ef61b"} {:updated-at 1599671842283, :created-at 1599671842283, :author {:login "themustafabasit", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/24441401?v=4"}, :body "(str nil)\n;; => \"\"\n\n(str true)\n;; => \"true\"\n\n(str false)\n;; => \"false\"\n", :_id "5f590e22e4b0b1e3652d73b6"}], :notes nil, :tag "java.lang.String", :arglists ["" "x" "x & ys"], :doc "With no args, returns the empty string. With one arg x, returns\n x.toString(). (str nil) returns the empty string. With more than\n one arg, returns the concatenation of the str values of the args.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/str"} {:added "1.0", :ns "clojure.core", :name "next", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1289038123000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rest", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cc7"} {:created-at 1289038131000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "first", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cc8"} {:created-at 1344490440000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "fnext", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cc9"} {:created-at 1505013547909, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nthrest", :ns "clojure.core"}, :_id "59b4af2be4b09f63b945ac6c"} {:created-at 1505013554008, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nthnext", :ns "clojure.core"}, :_id "59b4af32e4b09f63b945ac6d"}], :line 57, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}], :body "user=> (next '(:alpha :bravo :charlie))\n(:bravo :charlie)\n\nuser=> (next (next '(:one :two :three)))\n(:three)\n\nuser=> (next (next (next '(:one :two :three))))\nnil", :created-at 1279071284000, :updated-at 1289038286000, :_id "542692c8c026201cdc3269fb"} {:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [{:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"} {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"} {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}], :body ";; next is used in the recursive call. (This is a naive implementation for illustration only. Using `rest` is usually preferred over `next`.)\n\n(defn my-map [func a-list]\n (when a-list\n (cons (func (first a-list))\n (my-map func (next a-list)))))", :created-at 1289038112000, :updated-at 1306984795000, :_id "542692c8c026201cdc3269fd"} {:body ";; Difference between next and rest:\n\n(next [:a])\n;; => nil\n(rest [:a])\n;; => ()\n\n(next [])\n;; => nil\n(rest [])\n;; => ()\n\n(next nil)\n;; => nil\n(rest nil)\n;; => ()", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423016858063, :updated-at 1423094962892, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :_id "54d1839ae4b0e2ac61831d05"}], :notes [{:updated-at 1306987897000, :body "
    (next aseq) === (seq (rest aseq))
    \r\n\r\nWhen writing lazy sequence functions, you should use [rest](../clojure.core/rest), not next.", :created-at 1306984569000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fc0"}], :tag "clojure.lang.ISeq", :arglists ["coll"], :doc "Returns a seq of the items after the first. Calls seq on its\n argument. If there are no more items, returns nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/next"} {:added "1.0", :ns "clojure.core", :name "hash-map", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1317787775000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "merge", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b50"} {:created-at 1320356522000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "assoc", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b51"} {:created-at 1320356532000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "dissoc", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b52"} {:created-at 1397669031000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "array-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b53"} {:created-at 1397669038000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sorted-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b54"} {:created-at 1437362390089, :author {:login "ljosa", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/197881?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "into", :ns "clojure.core"}, :_id "55ac68d6e4b06a85937088b2"} {:created-at 1474932016523, :author {:login "olivergeorge", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/99447?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "zipmap", :ns "clojure.core"}, :_id "57e9ad30e4b0709b524f050d"} {:created-at 1517623031883, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "keys", :ns "clojure.core"}, :_id "5a7516f7e4b0e2d9c35f7413"} {:created-at 1517623038263, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "vals", :ns "clojure.core"}, :_id "5a7516fee4b0e2d9c35f7414"}], :line 379, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"} {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"} {:login "pilku", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/2970556?v=4"}], :body ";; create hash map the long way\nuser=> (hash-map)\n{}\n\n;; create array map the short way\nuser=> {}\n{}\n\n;; sending a key more times, will remap it to the last value\nuser=> (hash-map :key1 1, :key1 2) \n{:key1 2} \n\nuser=> {:key1 1, :key1 2}\nIllegalArgumentException Duplicate key: :key1 clojure.lang.PersistentArrayMap.createWithCheck (PersistentArrayMap.java:70)\n\n\nuser=> (hash-map :key1 'val1, 'key2 :val2, [:compound :key] nil)\n{[:compound :key] nil, :key1 val1, key2 :val2} \n\n", :created-at 1280353272000, :updated-at 1591472591014, :_id "542692cfc026201cdc326e1f"} {:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (map #(hash-map % 0) (seq \"abcdefgh\"))\n({\\a 0} {\\b 0} {\\c 0} {\\d 0} {\\e 0} {\\f 0} {\\g 0} {\\h 0}) \n\nuser=> (apply hash-map (.split \"a 1 b 2 c 3\" \" \"))\n{\"a\" \"1\", \"b\" \"2\", \"c\" \"3\"}", :created-at 1280353365000, :updated-at 1332950168000, :_id "542692cfc026201cdc326e23"} {:author {:login "dipto_sarkar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c1d3141a40d240f0918260201aaa0b01?r=PG&default=identicon"}, :editors [{:login "dipto_sarkar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c1d3141a40d240f0918260201aaa0b01?r=PG&default=identicon"} {:login "roryokane", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5b2b185c814bb25f2f95a1152e58f033?r=PG&default=identicon"}], :body "; a hash map can be stored in a var by using `def`\nuser=> (def person {:name \"Steve\" :age 24 :salary 7886 :company \"Acme\"})\n#'user/person\nuser=> person\n{:age 24, :name \"Steve\", :salary 7886, :company \"Acme\"}", :created-at 1341478710000, :updated-at 1388572400000, :_id "542692d3c026201cdc326fc4"} {:updated-at 1463334174783, :created-at 1342846621000, :body ";; Take a sequence of sequences (vector of vectors), and create a map\n;; using date as the map key.\n(def csv1 [[\"01/01/2012\" 1 2 3 4][\"06/15/2012\" 38 24 101]])\n\n(map #(hash-map (keyword (first %1)) (vec (rest %1))) csv1)\n;;=> ({:01/01/2012 [1 2 3 4]} {:06/15/2012 [38 24 101]})\n\n;; merge the list of maps into a single map\n(apply merge '({\"01/01/2012\" [1 2 3 4]} {\"06/15/2012\" [38 24 101]}))\n;;=> {\"06/15/2012\" [38 24 101], \"01/01/2012\" [1 2 3 4]}\n\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/b11cdeef90d84ff8af2a2c5012402939?r=PG&default=identicon", :account-source "clojuredocs", :login "Deadron"} {:avatar-url "https://www.gravatar.com/avatar/b11cdeef90d84ff8af2a2c5012402939?r=PG&default=identicon", :account-source "clojuredocs", :login "Deadron"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "TradeIdeasPhilip", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/18409827?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon", :account-source "clojuredocs", :login "octopusgrabbus"}, :_id "542692d3c026201cdc326fc7"} {:updated-at 1459028606947, :created-at 1459028606947, :author {:login "smnplk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/380618?v=3"}, :body "(apply hash-map [:a 1 :b 2])\n;;=> {:b 2 :a 1}\n\n;;is the same as\n(def build-map (partial assoc {}))\n(apply build-map [:a 1 :b 2])\n;;=> {:b 2 :a 1}", :_id "56f7027ee4b0103e9c7d9d26"} {:editors [{:login "rebcabin", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/207047?v=4"} {:avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4", :account-source "github", :login "dijonkitchen"}], :body ";; A hash map acts like a lookup function taking a key as first argument:\n({:a 1, :b 2} :a)\n;;=> 1\n\n;; If the key is not present, nil is returned...\n({:a 1, :b 2} :qwerty)\n;;=> nil\n\n;; ... unless there is a second argument, which becomes the default value to\n;; return when the lookup key is not found:\n({:a 1, :b 2} :qwerty :uiop)\n;;=> :uiop\n\n;; That behavior can lead to surprises:\n(let [map-example {:a 1, :b 2}]\n (map-example #(* % %) (range 10)))\n;;=> (0 1 2 3 4 5 6 7 8 9) \n;; since (range 10) is the default and #(* % %) is an anonymous function that isn't a key in map-example\n\n;; It may be more explicit to use get instead\n(get {:a 1, :b 2} :qwerty :uiop)\n;;=> :uiop", :author {:avatar-url "https://avatars1.githubusercontent.com/u/207047?v=4", :account-source "github", :login "rebcabin"}, :created-at 1563554106051, :updated-at 1587741064160, :_id "5d31f13ae4b0ca44402ef788"}], :notes [{:author {:login "er2", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4515131?v=4"}, :updated-at 1670789233819, :created-at 1670789233819, :body "If you want to create a map from a sequence of pairs, e.g. `[[k1 v1] [k2 v2]]`, see [`into`](https://clojuredocs.org/clojure.core/into).", :_id "63963871e4b0b1e3652d7698"}], :arglists ["" "& keyvals"], :doc "keyval => key val\n Returns a new hash map with supplied mappings. If any keys are\n equal, they are handled as if by repeated uses of assoc.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/hash-map"} {:added "1.0", :ns "clojure.core", :name "if-let", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1293436184000, :author {:login "0x89", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/56bc4acd59315ed4dc1cb99c3be71102?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "when-let", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d88"} {:created-at 1315004464000, :author {:login "srid", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd3a68d670372cd09876c26270a4299a?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "if", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d89"} {:created-at 1440455843468, :author {:login "brunchboy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2228869?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "if-some", :ns "clojure.core"}, :_id "55db9ca3e4b072d7f27980f0"}], :line 1841, :examples [{:updated-at 1285499963000, :created-at 1279379785000, :body "user=> (defn sum-even-numbers [nums]\n (if-let [nums (seq (filter even? nums))]\n (reduce + nums)\n \"No even numbers found.\"))\n#'user/sum-even-numbers\n\nuser=> (sum-even-numbers [1 3 5 7 9])\n\"No even numbers found.\"\n\nuser=> (sum-even-numbers [1 3 5 7 9 10 12])\n22\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692cdc026201cdc326cf5"} {:author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :editors [{:login "nipra", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/142529?v=3"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :body " (if-let [x false y true]\n \"then\"\n \"else\")\n;; java.lang.IllegalArgumentException: if-let requires exactly 2 forms in binding vector (NO_SOURCE_FILE:1)\n;; see if-let* below\n\n(defn if-let-demo [arg]\n (if-let [x arg]\n \"then\"\n \"else\"))\n\n(if-let-demo 1) ; anything except nil/false\n;;=> \"then\"\n(if-let-demo nil)\n;;=> \"else\"\n(if-let-demo false)\n;;=> \"else\"\n", :created-at 1279489140000, :updated-at 1508883080013, :_id "542692cdc026201cdc326cf7"} {:updated-at 1529851111869, :created-at 1305844049000, :body ";; This macro is nice when you need to calculate something big. And you need \n;; to use the result but only when it's true:\n\n(if-let [life (meaning-of-life 12)]\n life\n (if-let [origin (origin-of-life 1)]\n origin\n (if-let [shooter (who-shot-jr 5)]\n shooter\n\t 42)))\n\n;; As you can see in the above example it will return the answer \n;; to the question only if the answer is not nil. If the answer\n;; is nil it will move to the next question. Until finally it\n;; gives up and returns 42.", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"} {:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:login "green-coder", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4"}], :author {:login "MrHus", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4"}, :_id "542692cdc026201cdc326cfa"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; See examples for \"if\" explaining Clojure's idea of logical true\n;; and logical false.", :created-at 1334293326000, :updated-at 1334293326000, :_id "542692d3c026201cdc326fcb"} {:author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :editors [{:login "schmee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3405586?v=3"}], :body ";;; with destructuring binding\n\n;; successful case\n(if-let [[w n] (re-find #\"a(\\d+)x\" \"aaa123xxx\")]\n [w n]\n :not-found) ;=> [\"a123x\" \"123\"]\n\n;; unsuccessful case\n(if-let [[w n] (re-find #\"a(\\d+)x\" \"bbb123yyy\")]\n [w n]\n :not-found) ;=> :not-found\n\n;; same as above\n(if-let [[w n] nil]\n [w n]\n :not-found) ;=> :not-found\n\n;; on Map\n(if-let [{:keys [a b]} nil]\n [a b]\n :not-found) ;=> :not-found\n", :created-at 1399644384000, :updated-at 1420673793910, :_id "542692d3c026201cdc326fcc"} {:body ";; Note that the binding only extends to the then form, not to the else:\nuser=> (if-let [x nil] \"then\" x)\nCompilerException java.lang.RuntimeException: Unable to resolve symbol:\nx in this context, compiling: ...", :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :created-at 1418536023963, :updated-at 1418536080362, :editors [{:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}], :_id "548d2457e4b04e93c519ffa7"} {:editors [{:avatar-url "https://avatars.githubusercontent.com/u/367789?v=3", :account-source "github", :login "mattvvhat"} {:login "antonmos", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2713?v=3"}], :updated-at 1472595205961, :created-at 1428550556244, :author {:avatar-url "https://avatars.githubusercontent.com/u/367789?v=3", :account-source "github", :login "mattvvhat"}, :body ";; Works well with collections\n\n=> (def x {:whatever 1})\n\n=> (if-let [value (:whatever x)] value \"Not found\")\n1\n\n=> (if-let [value (:no-match x)] value \"Not found\")\n\"Not found\"", :_id "5525f39ce4b033f34014b76a"} {:updated-at 1587464733428, :created-at 1469577276189, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body ";; if-let multiple bindings version\n;; Edited: Else branch did not work with expressions.\n\n(defmacro if-let*\n ([bindings then]\n `(if-let* ~bindings ~then nil))\n ([bindings then else]\n (if (seq bindings)\n `(if-let [~(first bindings) ~(second bindings)]\n (if-let* ~(drop 2 bindings) ~then ~else)\n ~else)\n then)))\n\n(if-let* [a 1\n b (+ a 1) ]\n b)\n;;=> 2\n\n(if-let* [a 1\n b (+ a 1)\n c false] ;;false or nil - does not matter\n b\n a)\n;;=> 1\n\n;; Note that this implementation short-curcuits on false so that the prn form \n;; is _not_ evaluated in the below form.\n(if-let* [a false\n b (prn \"Do we evaluate this?\")]\n true\n false)\n;;=> false", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3", :account-source "github", :login "ertugrulcetin"} {:login "LukasRychtecky", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/585068?v=3"} {:avatar-url "https://avatars2.githubusercontent.com/u/632775?v=4", :account-source "github", :login "Rovanion"}], :_id "5797f83ce4b0bafd3e2a04b9"} {:updated-at 1499190178133, :created-at 1499190178133, :author {:login "claresudbery", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/8990232?v=3"}, :body ";; (if-let [definition condition] then else):\n;; if the value of condition is truthy, then that value is assigned to the definition, \n;; and \"then\" is evaluated.\n;; Otherwise the value is NOT assigned to the definition, and \"else\" is evaluated.\n\n;; Although you can use this structure with booleans, \n;; there's not much point unless you only want to\n;; use the resulting boolean if it's true - as evidenced in the first example below.\n;; if-let is mostly useful when checking for nil.\n\n;; In this first example if Clare is old, it outputs \"Clare is old\".\n;; (the let part of the statement is rather pointless, \n;; as the definition old-clare-age is never used).\n\n(def clare-age 47)\n(if-let [old-clare-age (> clare-age 100)] \n \"Clare is old\" \n \"Clare is not old\")\n;;=> Clare is not old\n\n;; In the next two examples, it only outputs Clare's age if it is valid (ie not nil)\n\n(def clare-age nil)\n(if-let [valid-clare-age clare-age] \n (str \"Clare has a valid age: \" valid-clare-age) \n \"Clare's age is invalid\")\n;;=> Clare's age is invalid\n\n(def clare-age 47)\n(if-let [valid-clare-age clare-age] \n (str \"Clare has a valid age: \" valid-clare-age) \n \"Clare's age is invalid\")\n;;=> Clare has a valid age: 47", :_id "595bd3a2e4b06e730307db4d"} {:updated-at 1534962715587, :created-at 1534962715587, :author {:login "midnio", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/36359066?v=4"}, :body "(if-let [value true]\n \"The expression is true!\"\n \"Sorry, it's not true.\")", :_id "5b7dac1be4b00ac801ed9e6c"} {:updated-at 1535296034148, :created-at 1535296034148, :author {:login "cuspymd", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/8870299?v=4"}, :body ";; Destructuring maps\n(def x {:it 1 :that 2})\n(def y {:that 2}\n(if-let [{value :it} x] value \"Not found\") ;;=> 1\n(if-let [{value :it} nil] value \"Not found\") ;;=> \"Not found\"\n(if-let [{value :it} false] value \"Not found\") ;;=> \"Not found\"\n(if-let [{value :it} y] value \"Not found\") ;;=> nil\n(if-let [{value :it} {}] value \"Not found\") ;;=> nil\n(if-let [{value :it} 1] value \"Not found\") ;;=> nil", :_id "5b82c222e4b00ac801ed9e78"} {:editors [{:login "arlicle", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/153773?v=4"} {:avatar-url "https://avatars2.githubusercontent.com/u/632775?v=4", :account-source "github", :login "Rovanion"}], :body ";; if-let multiple bindings version\n(defmacro if-let*\n ([bindings-vec then] `(if-let* ~bindings-vec ~then nil))\n ([bindings-vec then else]\n (if (seq bindings-vec)\n `(let ~bindings-vec\n (if (and ~@(take-nth 2 bindings-vec))\n ~then\n ~else)))))\n\n\n(if-let* [a 1\n b (+ a 1) ]\n b)\n;;=> 2\n\n(if-let* [a 1\n b (+ a 1)\n c false] ;;false or nil - does not matter\n b\n a)\n;;=> 1 \n\n;; Note that this implementation does _not_ short-circuit on falsey forms.\n(if-let* [a false\n b (prn \"Do we evaluate this?\")]\n true\n false)\n;; \"Do we evaluate this?\"\n;;=> false\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/153773?v=4", :account-source "github", :login "arlicle"}, :created-at 1536027516561, :updated-at 1587464633192, :_id "5b8deb7ce4b00ac801ed9e81"} {:updated-at 1565305899936, :created-at 1565305899936, :author {:login "metacritical", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/760429?v=4"}, :body ";; Check if the value is true print it otherwise not.\n\n(def log-output \"\") \n\n;; Assume log-output could be the result of another operation like\n;; (def log-output (Gl/ShaderInfoLog shader))\n;; The Following will only print, when logout is not empty.\n\n(if-let [out (not-empty logout)]\n (println out))\n", :_id "5d4cac2be4b0ca44402ef794"} {:updated-at 1590171632153, :created-at 1590171632153, :author {:login "themustafabasit", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/24441401?v=4"}, :body ";; fun of if-let \n(defn some-condition\n [data]\n true)\n\n(let [result (some-condition \"ABC\")]\n (if (true? result)\n \"Success\"\n \"Failure\"))\n;; => \"success\"\n\n;; if-let in Action\n(if-let [result (some-condition \"ABC\")]\n \"Success\"\n \"Failure\")\n;; => \"success\"\n", :_id "5ec817f0e4b087629b5a1911"}], :macro true, :notes [{:updated-at 1299054285000, :body "The difference between when-let and if-let is that when-let doesn't have an else clause and and also accepts multiple forms so you don't need to use a (do...).", :created-at 1299054285000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fb5"} {:updated-at 1326335082000, :body "I wonder what motivates the restriction of only one binding, e.g. many Schemes implement an `and-let*` form which allows multiple bindings, evaluating them in order and breaking out on the first binding that evaluates to false. Can somebody shed some light on this?", :created-at 1326335082000, :author {:login "DerGuteMoritz", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/66bba784787f4f725b1568ec69a616cc?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fd6"}], :arglists ["bindings then" "bindings then else & oldform"], :doc "bindings => binding-form test\n\n If test is true, evaluates then with binding-form bound to the value of \n test, if not, yields else", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/if-let"} {:added "1.0", :ns "clojure.core", :name "underive", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1524236415414, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "derive", :ns "clojure.core"}, :_id "5ada007fe4b045c27b7fac49"}], :line 5664, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body ";; create a simple hierarchy using the global hierarchy\n;; and demonstrate how underive is used\n\nuser=> (derive ::dog ::animal)\nnil\nuser=> (derive ::spaniel ::dog)\nnil\nuser=> (derive ::tabby ::dog)\nnil\nuser=> (ancestors ::tabby)\n#{:user/dog :user/animal}\nuser=> (underive ::tabby ::dog)\nnil\nuser=> (ancestors ::tabby)\nnil", :created-at 1313962237000, :updated-at 1423522531628, :_id "542692cdc026201cdc326d0f"}], :notes nil, :arglists ["tag parent" "h tag parent"], :doc "Removes a parent/child relationship between parent and\n tag. h must be a hierarchy obtained from make-hierarchy, if not\n supplied defaults to, and modifies, the global hierarchy.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/underive"} {:added "1.1", :ns "clojure.core", :name "ref-max-history", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1323973069000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ecf"} {:created-at 1364770314000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref-min-history", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ed0"} {:created-at 1364770319000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref-history-count", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ed1"}], :line 2479, :examples nil, :notes nil, :arglists ["ref" "ref n"], :doc "Gets the max-history of a ref, or sets it and returns the ref", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ref-max-history"} {:added "1.7", :ns "clojure.core", :name "Throwable->map", :file "clojure/core_print.clj", :type "function", :column 1, :see-alsos [{:created-at 1538988481625, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ex-data", :ns "clojure.core"}, :_id "5bbb19c1e4b00ac801ed9eb7"}], :line 471, :examples [{:updated-at 1450285594446, :created-at 1450285594446, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=3"}, :body "(def trace (try (/ 1 0) (catch Throwable t (Throwable->map t))))\n(keys trace)\n;; (:cause :via :trace)\n(:cause trace)\n;; \"Divide by zero\"\n(count (:trace trace))\n;; 33 (this stack trace is 33 invocations deep) ", :_id "56719a1ae4b08a391679537c"}], :notes nil, :arglists ["o"], :doc "Constructs a data representation for a Throwable with keys:\n :cause - root cause message\n :phase - error phase\n :via - cause chain, with cause keys:\n :type - exception class symbol\n :message - exception message\n :data - ex-data\n :at - top stack element\n :trace - root cause stack elements", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/Throwable->map"} {:added "1.0", :ns "clojure.core", :name "false?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1375213349000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "not", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521efc"}], :line 505, :examples [{:author {:login "samaaron", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ee3512261f38df2541b9adca77f025cb?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "(false? false) ;=> true\n(false? true) ;=> false\n(false? nil) ;=> false\n(false? \"foo\") ;=> false", :created-at 1278738764000, :updated-at 1332950044000, :_id "542692c7c026201cdc32699d"}], :notes nil, :tag "java.lang.Boolean", :arglists ["x"], :doc "Returns true if x is the value false, false otherwise.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/false_q"} {:added "1.0", :ns "clojure.core", :name "*print-readably*", :type "var", :see-alsos nil, :examples [{:updated-at 1620478814999, :created-at 1620478814999, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :body ";; Showing how *print-readably* is used internally to escape/unescape control\n;; characters:\n\n(binding [*print-readably* false]\n (pr \"a\\nb\\nc\"))\n;; a\n;; b\n;; cnil\n\n;; Only use to change behaviour of code you don't control.\n;; Otherwise, it's equivalent to `print`:\n(print \"a\\nb\\nc\")\n;; a\n;; b\n;; cnil\n", :_id "60968b5ee4b0b1e3652d74f6"}], :notes nil, :arglists [], :doc "When set to logical false, strings and characters will be printed with\n non-alphanumeric characters converted to the appropriate escape sequences.\n\n Defaults to true", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*print-readably*"} {:added "1.0", :ns "clojure.core", :name "ints", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1299221089000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "int-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bc6"}], :line 5373, :examples [{:updated-at 1656672965213, :created-at 1656672965213, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body "(def my-floats (float-array [1.1 2.2 3.3]));; => #'user/my-floats\n\n;; int-array will convert where possible\n(int-array my-floats);; => [1, 2, 3]\n\n;; ints will not\n(try (ints my-floats)\n (catch ClassCastException e (ex-message e)));; => \"[F cannot be cast to [I\"\n", :_id "62bed2c5e4b0b1e3652d7613"} {:updated-at 1682268162146, :created-at 1682268162146, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; Casting avoids expensive reflection, so to see the benefit, enable warning:\n(set! *warn-on-reflection* true)\n\n;; We'll def an int-array but won't type-hint the var:\n(def my-array (int-array [10 20 30 40 50 60]))\n\n;; and try to amap over it without using `ints` or type hinting:\n(amap my-array i _ (unchecked-inc-int (aget my-array i)))\n;; Reflection warning… call to static method alength on clojure.lang.RT can't be resolved (argument types: unknown).\n;; Reflection warning… call to static method aclone on clojure.lang.RT can't be resolved (argument types: unknown).\n;; Reflection warning… call to static method aget on clojure.lang.RT can't be resolved (argument types: unknown, int).\n;; Reflection warning… call to static method aset on clojure.lang.RT can't be resolved (argument types: unknown, int, int).\n;; => [11, 21, 31, 41, 51, 61]\n\n;; We can use `ints` to avoid reflection:\n(amap (ints my-array) i _ (unchecked-inc-int (aget (ints my-array) i)))\n;; => [11, 21, 31, 41, 51, 61]\n\n;; Just as we can type hint in place:\n(amap ^ints my-array i _ (unchecked-inc-int (aget ^ints my-array i)))\n;; => [11, 21, 31, 41, 51, 61]\n\n;; Or type hint the var:\n(def ^\"[I\" my-array (int-array [10 20 30 40 50 60]))\n(amap my-array i _ (unchecked-inc-int (aget my-array i)))\n;; => [11, 21, 31, 41, 51, 61]\n", :_id "64456002e4b08cf8563f4b8e"}], :notes nil, :arglists ["xs"], :doc "Casts to int[]", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ints"} {:added "1.0", :ns "clojure.core", :name "class", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1281949437000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "type", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a95"} {:created-at 1325041755000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "class?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a96"} {:created-at 1357883208000, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "instance?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a97"}], :line 3460, :examples [{:updated-at 1451352065851, :created-at 1280546296000, :body "user=> (class 1)\njava.lang.Long\n\nuser=> (class [1 2 3])\nclojure.lang.PersistentVector\n\nuser=> (class (String. \"foo\"))\njava.lang.String", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "rtoal", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/538615?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon", :account-source "clojuredocs", :login "dakrone"}, :_id "542692cac026201cdc326b68"} {:editors [{:login "rtoal", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/538615?v=3"}], :body "user=> (class class)\nclojure.core$class", :author {:avatar-url "https://avatars.githubusercontent.com/u/538615?v=3", :account-source "github", :login "rtoal"}, :created-at 1451352054083, :updated-at 1451352297752, :_id "5681dff6e4b01f598e267e93"} {:updated-at 1474629795271, :created-at 1474629795271, :author {:login "jfacorro", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1522569?v=3"}, :body "user=> (class nil)\nnil", :_id "57e510a3e4b0709b524f0509"}], :notes nil, :arglists ["x"], :doc "Returns the Class of x", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/class"} {:added "1.3", :ns "clojure.core", :name "some-fn", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1348529537000, :author {:login "hugoduncan", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/80fa2a15219b987664e4d6f5c78b4c27?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "every-pred", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ecd"} {:created-at 1374512408000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "some", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ece"} {:created-at 1461817364964, :author {:login "bkovitz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "some->", :ns "clojure.core"}, :_id "57219014e4b0fc95a97eab5f"} {:created-at 1461817376595, :author {:login "bkovitz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "some->>", :ns "clojure.core"}, :_id "57219020e4b0fc95a97eab60"} {:created-at 1582756004670, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "or", :ns "clojure.core"}, :_id "5e56f0a4e4b087629b5a18ac"} {:created-at 1609357926155, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "fnil", :ns "clojure.core"}, :_id "5fecda66e4b0b1e3652d7425"}], :line 7436, :examples [{:updated-at 1462556528065, :created-at 1321364478000, :body "\nuser=> ((some-fn even?) 1)\nfalse\nuser=> ((some-fn even?) 2)\ntrue\nuser=> ((some-fn even?) 1 2)\ntrue\n", :editors [{:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/e7869fe1a48cb1814c657eaca6bea3eb?r=PG&default=identicon", :account-source "clojuredocs", :login "replore"}, :_id "542692d5c026201cdc32708b"} {:author {:login "uvtc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/34f159f89cbd1d9beac0276f5a7af552?r=PG&default=identicon"}, :editors [], :body ";; `some-fn` is useful for when you'd use `some` (to find out if any\n;; values in a given coll satisfy some predicate), but have more than\n;; one predicate. For example, to check if any values in a coll are\n;; either even or less than 10:\n\n(or (some even? [1 2 3])\n (some #(< % 10) [1 2 3]))\n\n;; but `some-fn` can save you some duplication here:\n\n((some-fn even? #(< % 10)) 1 2 3)\n\n;; Minor note: the former returns nil if it doesn't find\n;; what it's looking for. The latter returns false.", :created-at 1343775095000, :updated-at 1343775095000, :_id "542692d5c026201cdc32708c"} {:updated-at 1477665180894, :created-at 1399749753000, :body ";;; http://en.wikipedia.org/wiki/Fizz_buzz\n(def fizzbuzz\n (some-fn #(and (= (mod % 3) 0) (= (mod % 5) 0) \"FizzBuzz\")\n #(and (= (mod % 3) 0) \"Fizz\")\n #(and (= (mod % 5) 0) \"Buzz\")\n str))\n\n(run! println (map fizzbuzz (range 1 18)))\n\n1\n2\nFizz\n4\nBuzz\nFizz\n7\n8\nFizz\nBuzz\n11\nFizz\n13\n14\nFizzBuzz\n16\n17", :editors [{:login "GordonGustafson", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6244646?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon", :account-source "clojuredocs", :login "ryo"}, :_id "542692d5c026201cdc32708d"} {:updated-at 1461825756902, :created-at 1461820011453, :author {:login "bkovitz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3"}, :body ";; Here's an easy way to apply several functions in succession to the same\n;; value and get the first true result. Note the double parentheses at the\n;; beginning: because some-fn returns a function, you have to apply it.\n\n((some-fn :a :b :c :d) {:c 3 :d 4})\n;=> 3\n\n;; Here's how to do the same thing but with a vector of functions. Note\n;; the 'apply' as well as the double parentheses, since you have to make\n;; some-fn take its arguments from the vector.\n\n(def parsers\n [parse-custom-command\n parse-basic-command\n parse-weird-command\n reject-command])\n\n((apply some-fn parsers) text-from-user)\n\n;; Each element of parsers is a function that returns a data structure if\n;; it successfully parses its argument or nil if it fails. reject-command\n;; always succeeds, returning a representation of an error.\n\n;; Note the technique of putting a catch-all function for errors last.\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3", :account-source "github", :login "bkovitz"}], :_id "57219a6be4b0f8c89e75b111"}], :notes nil, :arglists ["p" "p1 p2" "p1 p2 p3" "p1 p2 p3 & ps"], :doc "Takes a set of predicates and returns a function f that returns the first logical true value\n returned by one of its composing predicates against any of its arguments, else it returns\n logical false. Note that f is short-circuiting in that it will stop execution on the first\n argument that triggers a logical true result against the original predicates.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/some-fn"} {:added "1.2", :ns "clojure.core", :name "case", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1294148893000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "cond", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d1e"} {:created-at 1294148897000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "condp", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d1f"}], :line 6697, :examples [{:author {:login "jneira", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2c8ecc24181d171df85a26458b9cd5f?r=PG&default=identicon"}, :editors [{:login "jneira", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2c8ecc24181d171df85a26458b9cd5f?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "dale", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a7a1eca257c6cea943fea41e5cc3e9a3?r=PG&default=identicon"} {:login "dale", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a7a1eca257c6cea943fea41e5cc3e9a3?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(let [mystr \"hello\"]\n (case mystr\n \"\" 0\n \"hello\" (count mystr)))\n;;=> 5\n\n(let [mystr \"no match\"]\n (case mystr\n \"\" 0\n \"hello\" (count mystr)))\n;; No matching clause: no match\n;; [Thrown class java.lang.IllegalArgumentException]\n\n(let [mystr \"no match\"]\n (case mystr\n \"\" 0\n \"hello\" (count mystr)\n \"default\"))\n;;=> \"default\"\n\n;; You can give multiple values for the same condition by putting\n;; those values in a list.\n(case 'y\n (x y z) \"x, y, or z\"\n \"default\")\n;;=> \"x, y, or z\"\n\n(let [myseq '(1 2)]\n (case myseq\n (()) \"empty seq\"\n ((1 2)) \"my seq\"\n \"default\"))\n;;=> \"my seq\"\n\n;; \"The test-constants are not evaluated.They must be compile-time\n;; literals, and need not be quoted.\" \n(let [myvec [1 2]]\n (case myvec\n [] \"empty vec\"\n (vec '(1 2)) \"my vec\"\n \"default\"))\n;;=> \"default\"\n", :created-at 1278987914000, :updated-at 1422376846462, :_id "542692ccc026201cdc326c89"} {:editors [{:login "rmprescott", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/224805?v=4"}], :body ";; From: The Clojure Style Guide \n;; https://github.com/bbatsov/clojure-style-guide#case\n;; License: Creative Commons Attribution 3.0 Unported License\n;;\n;; Prefer case instead of cond or condp when test expressions are compile-time constants.\n\n;; good\n(cond\n (= x 10) :ten\n (= x 20) :twenty\n (= x 30) :forty\n :else :dunno)\n\n;; better\n(condp = x\n 10 :ten\n 20 :twenty\n 30 :forty\n :dunno)\n\n;; best\n(case x\n 10 :ten\n 20 :twenty\n 30 :forty\n :dunno)", :author {:avatar-url "https://avatars1.githubusercontent.com/u/224805?v=4", :account-source "github", :login "rmprescott"}, :created-at 1539061331613, :updated-at 1539061466913, :_id "5bbc3653e4b00ac801ed9ecc"} {:updated-at 1575502428174, :created-at 1575502355101, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :body ";; test-constants are not evaluated, so the symbols should NOT be quoted\n(let [x 'a-symbol] ; quoted\n (case x \n a-symbol :a ; not quoted\n b-symbol :b)) ; not quoted\n;;=> :a", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4", :account-source "github", :login "huahaiy"}], :_id "5de84213e4b0ca44402ef7f1"} {:updated-at 1582540498084, :created-at 1582540498084, :author {:login "bnii", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/22633514?v=4"}, :body ";; Other example on\n;; \"The test-constants are not evaluated. They must be compile-time\n;; literals, and need not be quoted.\" \n\n(def one 1)\n;;=> #'user/one\n(case 1 \n one :one \n :not-one)\n;;=> :not-one", :_id "5e53a6d2e4b087629b5a18a1"} {:updated-at 1587638962866, :created-at 1587638962866, :author {:login "uosl", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/3865590?v=4"}, :body ";; You can use a macro to inline test-constants you wish to define separately.\n\n(def ops-single '(\"=\" \"!=\" \"<\" \"<=\" \">\" \">=\"))\n\n(def ops-multi '(\"ONE OF\" \"NONE OF\"))\n\n(defmacro ops-type [op]\n `(case ~op\n ~ops-single :single\n ~ops-multi :multi))", :_id "5ea172b2e4b087629b5a18df"} {:updated-at 1587918490021, :created-at 1587918490021, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/8271291?v=4"}, :body "(case :blocking\n (:blocking :compute) :block-or-compute\n :async :async)\n\n;;=> :block-or-compute\n\n\n(case :async\n (:blocking :compute) :block-or-compute\n :async :async)\n\n;;=> :async", :_id "5ea5b69ae4b087629b5a18e9"} {:updated-at 1629037974768, :created-at 1615140525278, :author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :body ";; I timed rmprescott's example:\n\n(let [x 30] \n ;; \"good\"\n (time (cond\n (= x 10) :ten\n (= x 20) :twenty\n (= x 30) :thirty\n :else :dunno)) ;;=> \"Elapsed time: 0.0666 msecs\"\n\n ;; \"better\"\n (time (condp = x\n 10 :ten\n 20 :twenty\n 30 :thirty\n :dunno)) ;;=> \"Elapsed time: 0.4197 msecs\"\n\n ;; best in performance if else statement is executed (not shown)\n ;; best in readability\n (time (case x\n 10 :ten\n 20 :twenty\n 30 :thirty\n :dunno)) ;;=> \"Elapsed time: 0.0032 msecs\"\n \n ;; best in performance if known branches are executed\n ;; worst in readability\n (time (if (= x 10)\n :ten\n (if (= x 20)\n :twenty\n (if (= x 30)\n :thirty\n :dunno)))))) ;;=> \"Elapsed time: 0.0021 msecs\" \n\n;;=> :thirty", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4", :account-source "github", :login "Crowbrammer"}], :_id "604516ade4b0b1e3652d746d"} {:updated-at 1643907667427, :created-at 1643907667427, :author {:login "fdhenard", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/884972?v=4"}, :body ";; demonstrates inclusion on the test\n;; ... could be one of \"what\" or \"why\"\n\n(case \"what\"\n (\"what\" \"why\") :question\n :something-else)\n\n;;=> :question", :_id "61fc0a53e4b0b1e3652d75a6"}], :macro true, :notes [{:updated-at 1290270646000, :body "the third example describing myseq may be incorrect. I think we have to use vectors for comparing list of compile time constants.\r\n
    \r\n(let [myseq [1 2]]\r\n (case myseq\r\n  [] \"empty seq\"\r\n  [1 2] \"my seq\"\r\n  \"default\"))\r\n
    \r\n\r\nThe parenthesized test conditions are used when multiple test conditions give the same output (output expression). In my case , since both [true, true] and [false, false] return true, i have put them within parenthesis.\r\n\r\n
    \r\n(defn equ\r\n [a b]\r\n (case [a b]\r\n   ([true true] [false false]) true\r\n   true))\r\n\r\n(equ true true) ;; returns true\r\n(equ false false) ;; returns true\r\n(equ false true) ;; return false\r\n(equ true false) ;; returns false\r\n
    ", :created-at 1290269788000, :author {:login "dpani", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3229d0eee8f780b9baa64657ff561fd3?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fa4"} {:updated-at 1290655074000, :body "I updated that example with myseq to reflect behavior of Clojure 1.2.0 on my machine. I also added an additional example to explicitly demonstrate multiple values for the same condition.", :created-at 1290655074000, :author {:login "dale", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a7a1eca257c6cea943fea41e5cc3e9a3?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fa6"} {:body "Java enums are not compile-time literals.", :created-at 1613272178203, :updated-at 1613272197403, :author {:avatar-url "https://avatars.githubusercontent.com/u/6383047?v=4", :account-source "github", :login "beluchin"}, :_id "60289472e4b0b1e3652d7455"} {:body "Keep in mind this is not quite like pattern matching.\n\n```\n(case [:a :b]\n [:a :b] \"a b combo\"\n [_ :b] \"at least b\" \n)\n```\n\nWill not work. Instead install and use core.match:\n\n```\n(clojure.core.match/match [:a :b]\n [:a :b] \"a b combo\"\n [_ :b] \"at least b\")\n```\n(Thanks to potetm and Martin Půda on Clojurians Slack)", :created-at 1648411010714, :updated-at 1648411421228, :author {:avatar-url "https://avatars.githubusercontent.com/u/590297?v=4", :account-source "github", :login "eccentric-j"}, :_id "6240c182e4b0b1e3652d75c3"} {:author {:login "KingMob", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/946421?v=4"}, :updated-at 1680176304321, :created-at 1680176304321, :body "Reminder: compile-time *literals* are not the same thing as compile-time *constants*. The Clojure macro/compiler is not smart enough to work with things like Java constants or `^:const` vars.\n\nE.g.: \n\n```\n(case Math/PI\n Math/PI :pi\n Math/E :e\n :default)\n=> :default\n\n\n\n(def ^:const pi Math/PI)\n=> #'user/pi\n(case Math/PI\n pi :pi\n Math/E :e\n :default)\n=> :default\n```\n\nwill not work.", :_id "642574b0e4b08cf8563f4b87"}], :arglists ["e & clauses"], :doc "Takes an expression, and a set of clauses.\n\n Each clause can take the form of either:\n\n test-constant result-expr\n\n (test-constant1 ... test-constantN) result-expr\n\n The test-constants are not evaluated. They must be compile-time\n literals, and need not be quoted. If the expression is equal to a\n test-constant, the corresponding result-expr is returned. A single\n default expression can follow the clauses, and its value will be\n returned if no clause matches. If no default expression is provided\n and no clause matches, an IllegalArgumentException is thrown.\n\n Unlike cond and condp, case does a constant-time dispatch, the\n clauses are not considered sequentially. All manner of constant\n expressions are acceptable in case, including numbers, strings,\n symbols, keywords, and (Clojure) composites thereof. Note that since\n lists are used to group multiple constants that map to the same\n expression, a vector can be used to match a list if needed. The\n test-constants need not be all of the same type.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/case"} {:added "1.0", :ns "clojure.core", :name "*flush-on-newline*", :type "var", :see-alsos nil, :examples nil, :notes nil, :arglists [], :doc "When set to true, output will be flushed whenever a newline is printed.\n\n Defaults to true.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*flush-on-newline*"} {:added "1.0", :ns "clojure.core", :name "to-array", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1329377518000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "alength", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ba2"} {:created-at 1329377602000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "char-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ba3"} {:created-at 1329377609000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "int-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ba4"} {:created-at 1329377615000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "long-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ba5"} {:created-at 1374150114000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "into-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ba6"} {:created-at 1374150319000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "make-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ba7"} {:created-at 1375613635000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "to-array-2d", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ba8"}], :line 338, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user=> (to-array [1 2 3])\n#", :created-at 1285922749000, :updated-at 1423279139981, :_id "542692cfc026201cdc326e1e"} {:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "(def hello (to-array \"Hello World!\"))\n\n(aget hello 1)\n;; => \\e\n\n(aset hello 1 \\b) ;;Mutability! Watch out!\n;; => \\b\n\n(dotimes [n (alength hello)] (print (aget hello n)))\n;; => Hbllo World!\n\n;; Calling `to-array` on array returns the original, not a copy\n(identical? (to-array hello) hello)\n;; => true", :created-at 1329377512000, :updated-at 1423279331082, :_id "542692d5c026201cdc3270a9"} {:editors [{:login "luiszambon", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/41161270?v=4"}], :body "user> (class '(1 2 3 4))\n;=> clojure.lang.PersistentList\n\nuser> (class (to-array '(1 2 3 4)))\n;=> [Ljava.lang.Object;\n\nuser> (get (to-array '(1 2 3 4)) 0)\n;=> 1\n", :author {:avatar-url "https://avatars0.githubusercontent.com/u/41161270?v=4", :account-source "github", :login "luiszambon"}, :created-at 1599766069962, :updated-at 1600132120029, :_id "5f5a7e35e4b0b1e3652d73b8"}], :notes nil, :tag "[Ljava.lang.Object;", :arglists ["coll"], :doc "Returns an array of Objects containing the contents of coll, which\n can be any Collection. Maps to java.util.Collection.toArray().", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/to-array"} {:added "1.0", :ns "clojure.core", :name "bigdec", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1374317032000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "decimal?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ec2"} {:created-at 1514475884312, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "with-precision", :ns "clojure.core"}, :_id "5a45116ce4b0a08026c48ce7"} {:created-at 1579780078637, :author {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "bigint", :ns "clojure.core"}, :_id "5e2987eee4b0ca44402ef81e"} {:created-at 1579780089811, :author {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "double", :ns "clojure.core"}, :_id "5e2987f9e4b0ca44402ef81f"} {:created-at 1579780098355, :author {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "float", :ns "clojure.core"}, :_id "5e298802e4b0ca44402ef820"}], :line 3647, :examples [{:updated-at 1321355928000, :created-at 1280814320000, :body "user=> (bigdec 3.0)\n3.0M\n\nuser=> (bigdec 5)\n5M\n\nuser=> (bigdec -1)\n-1M\n\nuser=> (bigdec -1.0)\n-1.0M\n\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/e7869fe1a48cb1814c657eaca6bea3eb?r=PG&default=identicon", :account-source "clojuredocs", :login "replore"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692cec026201cdc326d80"} {:updated-at 1535909835189, :created-at 1535909835189, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/7083783?v=4"}, :body "; It also works for strings:\n(bigdec \"123.45\") => 123.45M\n", :_id "5b8c1fcbe4b00ac801ed9e7d"} {:updated-at 1598220594241, :created-at 1598220594241, :author {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}, :body ";; Works with ratios too\n\nuser => (bigdec 1/2)\n;; 0.5M", :_id "5f42e932e4b0b1e3652d73a6"} {:updated-at 1605204244578, :created-at 1605204244578, :author {:login "Arvantos", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/74289274?v=4"}, :body "user=> (+ 0.1 0.1 0.1)\n0.30000000000000004\nuser=> (def a (bigdec 0.1))\n#'user/a\nuser=> (+ a a a)\n0.3M", :_id "5fad7914e4b0b1e3652d7404"}], :notes nil, :tag "java.math.BigDecimal", :arglists ["x"], :doc "Coerce to BigDecimal", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bigdec"} {:added "1.0", :ns "clojure.core", :name "list?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1318710916000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "seq?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b5e"} {:created-at 1356063872000, :author {:login "hugoduncan", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/80fa2a15219b987664e4d6f5c78b4c27?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sequential?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b5f"} {:created-at 1356066804000, :author {:login "hugoduncan", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/80fa2a15219b987664e4d6f5c78b4c27?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "coll?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b60"} {:created-at 1414509201213, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "map?", :library-url "https://github.com/clojure/clojure"}, :_id "544fb291e4b0dc573b892fac"} {:created-at 1414509214198, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "set?", :library-url "https://github.com/clojure/clojure"}, :_id "544fb29ee4b0dc573b892fad"} {:created-at 1414509226885, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "vector?", :library-url "https://github.com/clojure/clojure"}, :_id "544fb2aae4b03d20a1024287"}], :line 6219, :examples [{:updated-at 1414509176872, :created-at 1279074216000, :body ";; an idiomatic persistent-list is a list\n(list? '(1 2 3))\n;;=> true\n\n;; a persistent-list is a list\n;; (list? (list 1 2))\n;;=> true\n\n;; a numeric value (long) is not a list\n(list? 0)\n;;=> false\n\n;; a persistent-array-map is not a list\n(list? {})\n;;=> false\n\n;; a persistent-vector is not a list\n(list? [])\n;;=> false\n\n;; a lazy-sequence is not always a list\n(list? (range 10))\n;;=> false\n", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"} {:avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon", :account-source "clojuredocs", :login "steveminer"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=2", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/147981?v=3", :account-source "github", :login "dpritchett"}, :_id "542692cbc026201cdc326b9d"} {:editors [{:login "muhuk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/40178?v=3"}], :body ";; not all lists are lists\n(cons 1 '(2 3))\n;; => (1 2 3)\n(= '(1 2 3) (cons 1 '(2 3)))\n;; => true\n(list? (cons 1 '(2 3)))\n;; => false\n\n;; good news is:\n(seq? (cons 1 '(2 3)))\n;; => true\n(seq? [1 2 3])\n;; => false\n\n;; So seq? might be what you are looking \n;; for when you want to test listness.\n\n\n\n\n\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/40178?v=3", :account-source "github", :login "muhuk"}, :created-at 1448895002974, :updated-at 1455541780305, :_id "565c621ae4b0be225c0c47a3"}], :notes [{:updated-at 1318711577000, :body "You may want to use `seq?` instead of `list?`, especially if you might be dealing with a lazy sequence as returned by `filter`, `range`, etc.", :created-at 1318711577000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fcf"}], :arglists ["x"], :doc "Returns true if x implements IPersistentList", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/list_q"} {:added "1.9", :ns "clojure.core", :name "simple-ident?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495714925553, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ident?", :ns "clojure.core"}, :_id "5926cc6de4b093ada4d4d755"} {:created-at 1495714934749, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "qualified-ident?", :ns "clojure.core"}, :_id "5926cc76e4b093ada4d4d756"} {:created-at 1596595008529, :author {:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "simple-symbol?", :ns "clojure.core"}, :_id "5f2a1b40e4b0b1e3652d736b"} {:created-at 1596595016865, :author {:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "simple-keyword?", :ns "clojure.core"}, :_id "5f2a1b48e4b0b1e3652d736c"}], :line 1617, :examples [{:updated-at 1596595653208, :created-at 1596595653208, :author {:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}, :body "(simple-ident? 'asymbol)\n;;=> true\n\n(simple-ident? :akeyword)\n;;=> true\n\n(simple-ident? 'clojure.core/asymbol)\n;;=> false\n\n(simple-ident? ::akeyword)\n;;=> false\n\n(simple-ident? \"hello\")\n;;=> false\n\n(simple-ident? 7)\n;;=> false\n\n(simple-ident? nil)\n;;=> false", :_id "5f2a1dc5e4b0b1e3652d736d"}], :notes nil, :arglists ["x"], :doc "Return true if x is a symbol or keyword without a namespace", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/simple-ident_q"} {:added "1.0", :ns "clojure.core", :name "bit-not", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 1286, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (bit-not 2r0111)\n-8 \n\nuser=> (bit-not -2r1000)\n7", :created-at 1280338423000, :updated-at 1332951542000, :_id "542692cac026201cdc326b50"}], :notes nil, :arglists ["x"], :doc "Bitwise complement", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bit-not"} {:added "1.0", :ns "clojure.core", :name "io!", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1554127057477, :author {:login "daveliepmann", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/974443?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "dosync", :ns "clojure.core"}, :_id "5ca218d1e4b0ca44402ef6f6"}], :line 2512, :examples [{:author {:login "mstoeckli", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/271f1fe6c39e19db5714ce29b64d3ad5?r=PG&default=identicon"}, :editors [], :body "user=> (def a (ref 0))\n#'user/a\n\nuser=> (dosync\n (io! (println \"hello\"))\n (alter a inc))\nIllegalStateException I/O in transaction\n\nuser=> (dosync\n (println \"hello\")\n (alter a inc))\n\"hello\"\n1\n\nuser=> (defn fn-with-io []\n (io! (println \"hello\")))\n#'user/fn-with-io\n\nuser=> (dosync\n (fn-with-io)\n (alter a inc))\nIllegalStateException I/O in transaction", :created-at 1337147168000, :updated-at 1337147168000, :_id "542692d3c026201cdc326fdc"}], :macro true, :notes nil, :arglists ["& body"], :doc "If an io! block occurs in a transaction, throws an\n IllegalStateException, else runs body in an implicit do. If the\n first expression in body is a literal string, will use that as the\n exception message.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/io!"} {:added "1.0", :ns "clojure.core", :name "xml-seq", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 4958, :examples [{:author {:login "ed-g", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9b506528a954f5a5e83bd7041d287f68?r=PG&default=identicon"}, :editors [{:login "biggert", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ebd5e5aaf54f2bb5b8b01872d8ffe5d0?r=PG&default=identicon"} {:login "biggert", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ebd5e5aaf54f2bb5b8b01872d8ffe5d0?r=PG&default=identicon"} {:login "biggert", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ebd5e5aaf54f2bb5b8b01872d8ffe5d0?r=PG&default=identicon"}], :body ";; data.xml from https://github.com/clojure/data.xml/\n(use '[clojure.data.xml :only [parse-str]])\n\nuser=> (let [xml-text \"\n 123\"]\n (let [root (parse-str xml-text)]\n (xml-seq root)))\n\n({:tag :foo, \n :attrs {:key \"val\"}, \n :content (\"1\" {:tag :bar, :attrs {}, :content (\"2\")} \"3\")} \n \"1\" \n {:tag :bar, :attrs {}, :content (\"2\")} \n \"2\" \n \"3\") \n", :created-at 1357886858000, :updated-at 1367460525000, :_id "542692d6c026201cdc3270c6"} {:updated-at 1474877368412, :created-at 1367493904000, :body "(use '[clojure.data.xml :only [parse]])\n\n;; clojure.xml/parse requires string to be ByteArrayInputStream\nuser-> (let [xml-text \"\n 123\"]\n (let [input (java.io.ByteArrayInputStream. \n (.getBytes xml-text))]\n (let [root (parse input)]\n (xml-seq root))))\n\n({:tag :foo, \n :attrs {:key \"val\"}, \n :content (\"1\" {:tag :bar, :attrs {}, :content (\"2\")} \"3\")} \n \"1\" \n {:tag :bar, :attrs {}, :content (\"2\")} \n \"2\" \n \"3\")", :editors [{:login "pho-coder", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6576686?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/ebd5e5aaf54f2bb5b8b01872d8ffe5d0?r=PG&default=identicon", :account-source "clojuredocs", :login "biggert"}, :_id "542692d6c026201cdc3270ca"} {:updated-at 1580661283196, :created-at 1519297750007, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Any breaking news today?\n(require '[clojure.java.io :as io])\n(require '[clojure.xml :as xml])\n\n(def feeds\n [[:guardian \"https://www.theguardian.com/world/rss\"]\n [:wash-post \"http://feeds.washingtonpost.com/rss/rss_blogpost\"]\n [:nytimes \"https://rss.nytimes.com/services/xml/rss/nyt/World.xml\"]\n [:wsj \"https://feeds.a.dj.com/rss/RSSWorldNews.xml\"]\n [:reuters \"http://feeds.reuters.com/reuters/UKTopNews\"]])\n\n(pmap\n (fn [[feed url]]\n (let [content (comp first :content)]\n [feed\n (sequence\n (comp\n (filter (comp string? content))\n (filter (comp #{:title} :tag))\n (filter #(re-find #\"(?i)breaking\" (content %)))\n (map content))\n (xml-seq (xml/parse url)))]))\n feeds)\n\n;; Only a false positive...\n;;([:guardian (\"Climate change 'will push European cities towards breaking point'\")]\n;; [:wash-post ()]\n;; [:nytimes ()]\n;; [:wsj ()]\n;; [:reuters ()])", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5a8ea4d6e4b0316c0f44f8eb"}], :notes nil, :arglists ["root"], :doc "A tree seq on the xml elements as per xml/parse", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/xml-seq"} {:added "1.0", :ns "clojure.core", :name "byte", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1334358069000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "byte-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e67"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "bytes", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917284000, :_id "542692ebf6e94c6970521e68"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "short", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917760000, :_id "542692ebf6e94c6970521e69"} {:created-at 1496262181439, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unchecked-byte", :ns "clojure.core"}, :_id "592f2625e4b06e730307db1d"}], :line 3504, :examples [{:author {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}, :editors [{:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}], :body "user=> (def x (byte-array [(byte 0x43) \n (byte 0x6c)\n (byte 0x6f)\n (byte 0x6a)\n (byte 0x75)\n (byte 0x72)\n (byte 0x65)\n (byte 0x21)]))\n#'user/x\n\nuser=> (String. x)\n\"Clojure!\"\n", :created-at 1283813146000, :updated-at 1287791649000, :_id "542692cbc026201cdc326c11"} {:updated-at 1596590375648, :created-at 1596572702674, :author {:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}, :body ";; Casting a string does not work\n(byte \"123\")\n;;=> Execution error (ClassCastException) at user/eval157 (REPL:1).\n;;java.lang.String cannot be cast to java.lang.Number\n\n;; Use Java interop instead\n(Byte/parseByte \"123\")\n;;=> 123\n\n;; Content originally posted by u/didibus on https://clojuredocs.org/clojure.core/num", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4", :account-source "github", :login "wdhowe"}], :_id "5f29c41ee4b0b1e3652d735d"}], :notes nil, :arglists ["x"], :doc "Coerce to byte", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/byte"} {:added "1.0", :ns "clojure.core", :name "max", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1343257166000, :author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "max-key", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cf7"} {:created-at 1371841162000, :author {:login "adereth", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5ad11b4e208a6cdb3bd45fe01dea59b7?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "min", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cf8"}], :line 1115, :examples [{:updated-at 1411918995332, :created-at 1279417705000, :body ";; `max` returns the largest of its arguments\nuser=> (max 1 2 3 4 5) \n5\n\n;; regardless of order of those arguments\nuser=> (max 5 4 3 2 1)\n5\n\nuser=> (max 100)\n100", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"}, :_id "542692ccc026201cdc326c99"} {:author {:login "mydoghasworms", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e1e4692b0c0b2fcc1844f11cb43191da?r=PG&default=identicon"}, :editors [], :body ";; If elements are already in a sequence, use apply\nuser=> (apply max [1 2 3 4 3])\n4\nuser=> (apply max '(4 3 5 6 2))\n6", :created-at 1367237523000, :updated-at 1367237523000, :_id "542692d4c026201cdc32700b"} {:updated-at 1482367699298, :created-at 1482367699298, :author {:login "zjliu1984", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1556007?v=3"}, :body "user> (reduce max [1 2 3 4 5 6 7 6 5 4 3])\n7", :_id "585b22d3e4b004d3a355e2d5"}], :notes [{:body "As of 1.6, `max`'s behavior differs when it's passed single / multiple non-numeric arguments:\n\n```\n(max \"foo\") ;;=> \"foo\"\n\n(max \"foo\" \"bar\") ;;=> ClassCastException thrown\n```", :created-at 1411919387514, :updated-at 1411919387514, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :_id "54282e1be4b0ba57bdbcf25d"} {:author {:login "burbma", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/7841889?v=4"}, :updated-at 1553102150973, :created-at 1553102150973, :body "```\n;; Be warned\nuser=> (max 1 nil)\njava.lang.NullPointerException\n```", :_id "5c927546e4b0ca44402ef6bb"}], :arglists ["x" "x y" "x y & more"], :doc "Returns the greatest of the nums.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/max"} {:added "1.0", :ns "clojure.core", :name "==", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1287469513000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "=", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e4b"} {:created-at 1350778281000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "identical?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f34"} {:created-at 1548959844037, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "compare", :ns "clojure.core"}, :_id "5c534064e4b0ca44402ef65f"}], :line 1100, :examples [{:author {:login "james", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4b163432c99a124feee4be046a3f9d66?r=PG&default=identicon"}, :editors [{:login "james", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4b163432c99a124feee4be046a3f9d66?r=PG&default=identicon"} {:login "james", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4b163432c99a124feee4be046a3f9d66?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :body ";; true:\n(== 1)\n(== 1 1) \n(== 1/1, 2/2, 3/3, 4/4) \n(== 1, 1.0, 1/1)\n(== :foo)\n\n\n;; false:\n(== 1 2)\n\n;; ClassCastException\n(== 1 \\1)\n(== 1 \"1\")", :created-at 1283399494000, :updated-at 1412882998472, :_id "542692c6c026201cdc3268dd"} {:body "user=> (= 0.0 0)\nfalse\nuser=> (== 0.0 0)\ntrue", :author {:login "h3x3d", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1663557?v=2"}, :created-at 1415298297003, :updated-at 1415298297003, :_id "545bbcf9e4b0dc573b892fbe"} {:body ";; Just what you would expect\n(== 2.0 1.9999999)\n;;=> false\n\n;; a suprising result\n(== 2.0 2 6/3 1.9999999999999999)\n;;=> true ??!?\n;; Yes, there is some rounding off going on.\n;; if you take off just one of the repeating 9 (on my machine) these compare.\n", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1415650668901, :updated-at 1415650668901, :_id "54611d6ce4b0dc573b892fc1"} {:editors [{:login "wontheone1", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/11784756?v=4"}], :body "\n;; When floating point numbers are far enough from each other\n(== 2.0 1.9999999)\n;;=> false\n(- 100.0 100.00000000000001) ;13(Thirteen) 0s after floating point in the last number\n;;=> -1.4210854715202004E-14\n\n;; When two floating point numbers are too close some basic algebraic properties don't strictly hold.\n(== 2.0 1.9999999999999999)\n;;=> true\n\n(* 100 (- 1.0 1.0000000000000001)) ;15(fifteen) 0s after floating point in the last number\n;;=> 0.0\n\n;; They are still different types\n(= 2 1.9999999999999999)\n;;=> false\n\n;; see more from https://en.wikibooks.org/wiki/Floating_Point/Epsilon\n;; I found above example was distracting by putting 6/3 and 2 in the equality check that is why I decided to write up a similar but new example.", :author {:avatar-url "https://avatars1.githubusercontent.com/u/11784756?v=4", :account-source "github", :login "wontheone1"}, :created-at 1504857100867, :updated-at 1504857144266, :_id "59b24c0ce4b09f63b945ac62"} {:editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}], :body ";; See the Clojure Equality guide for more details:\n;; https://clojure.org/guides/equality\n\n;; == returns false whenever comparing the special \"not a number\" value to any\n;; number, including itself.\n\nuser=> (== 1 ##NaN)\nfalse ;; this result you probably expect\n\nuser=> (== ##NaN ##NaN)\nfalse ;; this one may surprise you\n", :author {:avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4", :account-source "github", :login "jafingerhut"}, :created-at 1548789636747, :updated-at 1565641625053, :_id "5c50a784e4b0ca44402ef659"} {:updated-at 1598156432612, :created-at 1598156432612, :author {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}, :body "user => (= 1/2 0.5)\n;; => false\n\nuser => (== 1/2 0.5)\n;; => true", :_id "5f41ee90e4b0b1e3652d738f"}], :notes [{:updated-at 1287470809000, :body "There is a difference between \"=\" and \"==\". For primitives you definitely want to use \"==\" as \"=\" will result in a cast to the wrapped types for it's arguments.\r\n\r\nThis may not be the case come Clojure 1.3 (see [1])\r\n\r\n[1] http://github.com/clojure/clojure/commit/df8c65a286e90e93972bb69392bc106128427dde", :created-at 1287470809000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f9c"} {:updated-at 1363156271000, :body "So what is difference with =? ", :created-at 1363156271000, :author {:login "popopome", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f764e6667c2664b9979227fc40be024e?r=PG&default=identicon"}, :_id "542692edf6e94c6970521ffe"} {:updated-at 1363512387000, :body "'== is defined only for numbers, where '= is general equality. The example showing (== :foo) as true is a bit misleading because (== :foo :foo) produces an exception. Unary == always returns true as an optimization.", :created-at 1363512387000, :author {:login "mattharden", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a0f377e9263784a0036c5417d0a18aef?r=PG&default=identicon"}, :_id "542692edf6e94c6970521fff"}], :arglists ["x" "x y" "x y & more"], :doc "Returns non-nil if nums all have the equivalent\n value (type-independent), otherwise false", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/=="} {:added "1.0", :ns "clojure.core", :name "*agent*", :type "var", :see-alsos [{:created-at 1399893914000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "agent", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d10"}], :examples [{:author {:login "goodmike", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/42e0998c3077ba0ac435423941a3978e?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; *agent* is often used with send or send-off to set up a repeated\n;; transformation of an agent's value. For example, to repeatedly \n;; increment the integer value of an agent 'myagent' until some \n;; flag value 'running' evaluates to false:\n\n;; Create an agent set to an initial value of 0:\n(def myagent (agent 0))\n\n;; Define a variable to act as a boolean flag:\n(def running true)\n\n;; Define a function to increment agent value repeatedly:\n(defn inc-while-running [agent-value]\n (when running\n (send-off *agent* inc-while-running)) ;sets up another call\n (inc agent-value))\n\n;; Dereference myagent to confirm it is set to value 0:\nuser=> @myagent\n0\n\n;; Start the fun:\nuser=> (send-off myagent inc-while-running)\n#<Agent@5fb9f88b: 20>\n\n;; The agent has already been incremented many times (20 when I ran this)\n;; by the time the REPL prints.\n\n;; Redefine running as false to stop repeated send-off:\n(def running false)\n\n;; Dereference myagent to find its new value:\nuser=> @myagent\n848167\n\n;; Dereference again to make sure incrementation has stopped:\nuser=> @myagent\n848167", :created-at 1279046895000, :updated-at 1285502273000, :_id "542692cec026201cdc326d88"}], :notes nil, :tag "clojure.lang.Agent", :arglists [], :doc "The agent currently running an action on this thread, else nil", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*agent*"} {:added "1.0", :ns "clojure.core", :name "lazy-cat", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1318396486000, :author {:login "haplo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/890d46f8c0e24dd6fb8546095b1144e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "lazy-seq", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cfe"} {:created-at 1318396500000, :author {:login "haplo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/890d46f8c0e24dd6fb8546095b1144e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "concat", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cff"} {:created-at 1464035689604, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "conj", :ns "clojure.core"}, :_id "57436969e4b0d7ce46a59c3c"} {:created-at 1550609183419, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "mapcat", :ns "clojure.core"}, :_id "5c6c6b1fe4b0ca44402ef69b"}], :line 4614, :examples [{:author {:login "pashields", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/6ff7e838d2c47adf942be6df4d22b452?r=PG&default=identicon"}, :editors [], :body "user=> (lazy-cat [1 2 3] [4 5 6])\n(1 2 3 4 5 6)\n", :created-at 1295304229000, :updated-at 1295304229000, :_id "542692c7c026201cdc3269d5"} {:author {:login "kij", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/153ba8c871d2f98e6683850790f27f60?r=PG&default=identicon"}, :editors [{:login "kij", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/153ba8c871d2f98e6683850790f27f60?r=PG&default=identicon"} {:login "bmabey", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1837?v=2"}], :body ";; N.B. this example holds onto the head of a lazy seq which should generally be avoided\n(def fib-seq\n (lazy-cat [0 1] (map + (rest fib-seq) fib-seq)))\n\n(take 10 fib-seq)", :created-at 1332777683000, :updated-at 1347405980000, :_id "542692d3c026201cdc326fe4"} {:author {:login "guruma", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ade3cfcd37c594a590528e352528bba2?r=PG&default=identicon"}, :editors [{:login "guruma", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ade3cfcd37c594a590528e352528bba2?r=PG&default=identicon"} {:login "guruma", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ade3cfcd37c594a590528e352528bba2?r=PG&default=identicon"} {:login "rahulpilani", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3c3585fc1c6bf074ed5f268c9ebcb2f?r=PG&default=identicon"}], :body ";; When the producer function produces a collection, not an element,\n;; lazy-cat is usable.\nuser=> (defn n-repeat [n] (lazy-cat (repeat n n) (n-repeat (inc n))))\n#'user/n-repeat\n\nuser=> (take 6 (n-repeat 1))\n(1 2 2 3 3 3)\n\nuser=> (take 12 (n-repeat 1))\n(1 2 2 3 3 3 4 4 4 4 5 5)\n", :created-at 1355523910000, :updated-at 1360760950000, :_id "542692d3c026201cdc326fe7"} {:updated-at 1441150658101, :created-at 1441150658101, :author {:login "mattvvhat", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/367789?v=3"}, :body "(lazy-cat (seq [\"lazy-cat\" \"is\" \"my\" \"favorite\" \"function\"]))", :_id "55e636c2e4b072d7f27980f6"} {:updated-at 1490842223357, :created-at 1490842223357, :author {:login "parkeristyping", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/9487556?v=3"}, :body "user=> (defn loop-endlessly\n \"Block thread with endless loop when evaluated\"\n []\n (while true))\n#'user/loop-endlessly\n\nuser=> (take 3 (lazy-cat [\"will\" \"it\" \"return?\"] (loop-endlessly)))\n(\"will\" \"it\" \"return?\")\n\nuser=> (take 4 (lazy-cat [\"will\" \"it\" \"return?\"] (loop-endlessly)))\n;; This gets stuck on loop-endlessly and never returns", :_id "58dc726fe4b01f4add58fe7f"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; Prefer lazy-cat to build a lazy seq out of \n;; non-lazy collections with different creation costs\n\n(time (first (concat (sort > (range 10)) (sort > (range 1e7)))))\n;; \"Elapsed time: 17442.084309 msecs\"\n(time (first (lazy-cat (sort > (range 10)) (sort > (range 1e7)))))\n;; \"Elapsed time: 0.458283 msecs\"", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1520442196806, :updated-at 1520457888627, :_id "5aa01b54e4b0316c0f44f910"}], :macro true, :notes [{:body "It looks like `lazy-cat` is on deprecation path in favor of `lazy-seq`.", :created-at 1423002660607, :updated-at 1423002660607, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :_id "54d14c24e4b081e022073c48"}], :arglists ["& colls"], :doc "Expands to code which yields a lazy sequence of the concatenation\n of the supplied colls. Each coll expr is not evaluated until it is\n needed. \n\n (lazy-cat xs ys zs) === (concat (lazy-seq xs) (lazy-seq ys) (lazy-seq zs))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/lazy-cat"} {:added "1.0", :ns "clojure.core", :name "comment", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos nil, :line 4711, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; The commented forms do not get executed\nuser=> (comment\n (functioncall-1)\n (functioncall-2))\nnil", :created-at 1279395666000, :updated-at 1285500093000, :_id "542692cac026201cdc326b64"} {:editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "zk", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/7194?v=4"}], :updated-at 1600227856975, :created-at 1416432947075, :author {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}, :body ";; What is inside the (comment ...) form is not completely ignored. Clojure\n;; still tries to use the normal reader to read it, so it must consist of\n;; a sequence of readable forms with balanced parens, braces, square brackets,\n;; with no unreadable elements.\n\n;; If you want lines to be completely ignored, you must use a ; to comment from\n;; the ; until the end of the line. If you want to quickly comment or uncomment\n;; a range of consecutive lines, most text editors have special commands\n;; specifically for that. e.g. Emacs has comment-region\n;; http://www.gnu.org/software/emacs/manual/html_node/emacs/Comment-Commands.html\n;; Vim has visual commands to do this, and probably many other text editors.\n;; (Feel free to edit this text to add links to docs for other editors).\n\n;; What is inside the (comment ...) is readable, so no error for this,\n;; and no code will be generated by the compiler.\n(comment\n(defn foo [x]\n (inc x))\n)\n\n;; What is inside the (comment ...) is NOT readable, so this will give an error\n(comment\na : b\n)", :_id "546d0d33e4b03d20a10242b0"} {:body ";; Another thing to watch out for: the comment form IS a form, and is usually\n;; the wrong way to comment out code. For example, let's say that you want to\n;; try out a new \"then\" form in an \"if\":\n(if true (comment :old-then) :new-then) ;;=> nil (Oops, :new-then was desired.)\n\n;; Instead, use the \"ignore next form\" reader macro #_:\n(if true #_(:old-then) :new-then) ;;=> :new-then\n\n;; Note that #_ also allows non-readable code:\n#_(a : b) 1 ;;=> 1 (contrast to (comment a : b) which doesn't compile.)\n", :author {:login "fordsfords", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7671908?v=3"}, :created-at 1416776582477, :updated-at 1416776582477, :_id "54724b86e4b03d20a10242b1"} {:updated-at 1591912144471, :created-at 1562932314262, :author {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/24317401?v=4"}, :body ";; You can use comment to work with a journal\n;; (but beware if you want to denote it as a journal)\n\n(comment) ;; works\n(comment ^:journal []) ;; works\n\n;; Doesn't work\n(comment\n ^:journal \n ;; I did some really cool stuff\n)\nERROR Could not Read: Unmatched delimiter ).", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/24317401?v=4", :account-source "github", :login "loeschzwerg"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}], :_id "5d28745ae4b0ca44402ef783"}], :macro true, :notes [{:updated-at 1389835580000, :body "it doesn't 100% ignore the body. If your comment has a map in it, for example, and that map isn't 100% correct it will fail to compile in some environments. I found that using Light Table. I am certain it would fail on other platforms that won't know to exclude it before parsing.\r\n\r\nExample:\r\n(comment\r\n here is some TeX: \\frac{\\sum_{m=1}^{m}x_{m}}{x_{s}}\r\n)\r\n\r\nThat will produce an error.", :created-at 1389835580000, :author {:login "Pete", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8e398ff59e0c0073ccb6770938de769e?r=PG&default=identicon"}, :_id "542692edf6e94c6970522019"}], :arglists ["& body"], :doc "Ignores body, yields nil", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/comment"} {:added "1.0", :ns "clojure.core", :name "parents", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1341101519000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "descendants", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521be0"} {:created-at 1341101522000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ancestors", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521be1"} {:created-at 1341101538000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "derive", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521be2"} {:created-at 1341101540000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "underive", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521be3"} {:created-at 1341101544000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "make-hierarchy", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521be4"} {:created-at 1341101631000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "isa?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521be5"}], :line 5585, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; simple example showing single parented derivation\n;; then adding another parent\n\nuser=> (derive ::toy_poodle ::poodle)\nnil\nuser=> (parents ::toy_poodle)\n#{:user/poodle}\nuser=> (derive ::toy_poodle ::toy_dogs)\nnil\nuser=> (parents ::toy_poodle)\n#{:user/poodle :user/toy_dogs}\nuser=>", :created-at 1313967813000, :updated-at 1313967813000, :_id "542692cbc026201cdc326bde"} {:updated-at 1678607760647, :created-at 1678607760647, :author {:login "KingMob", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/946421?v=4"}, :body ";; This works on Java classes as well. Note that\n;; it will only show direct parents, not the entire\n;; ancestor hierarchy.\n\n(parents CompletableFuture)\n=> #{java.util.concurrent.Future java.lang.Object java.util.concurrent.CompletionStage}\n\n(parents ConcurrentHashMap)\n=> #{java.io.Serializable java.util.AbstractMap java.util.concurrent.ConcurrentMap}", :_id "640d8590e4b08cf8563f4b7d"}], :notes nil, :arglists ["tag" "h tag"], :doc "Returns the immediate parents of tag, either via a Java type\n inheritance relationship or a relationship established via derive. h\n must be a hierarchy obtained from make-hierarchy, if not supplied\n defaults to the global hierarchy", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/parents"} {:added "1.0", :ns "clojure.core", :name "count", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1467307156453, :author {:login "miner", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25400?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "counted?", :ns "clojure.core"}, :_id "57755494e4b0bafd3e2a049b"}], :line 874, :examples [{:updated-at 1424124841816, :created-at 1279416590000, :body "(count nil)\n;;=> 0\n\n(count [])\n;;=> 0\n\n(count [1 2 3])\n;;=> 3\n\n(count {:one 1 :two 2})\n;;=> 2\n\n(count [1 \\a \"string\" [1 2] {:foo :bar}])\n;;=> 5\n\n(count \"string\")\n;;=> 6", :editors [{:avatar-url "https://www.gravatar.com/avatar/b29dd31d183124d9e87d8037bb30e326?r=PG&default=identicon", :account-source "clojuredocs", :login "matthewg"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"}, :_id "542692cbc026201cdc326bf9"} {:author {:login "rquinn", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3f3b40ea11b41b503df93d8b4a17043?r=PG&default=identicon"}, :editors [{:login "Noneo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e66c8f6c768e29808bddd38ed2f21349?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(count '(1 2 3 3 1))\n;;=> 5\n\n;; and as a koan\n(= (count '(1 2 3 3 1)) 5)\n;;=> true", :created-at 1389437673000, :updated-at 1424124671851, :_id "542692d2c026201cdc326f75"} {:updated-at 1579258350735, :created-at 1579258350735, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; count can't count beyond (Integer/MAX_VALUE)\n;; (in partial compliance with Java's Collection::size() returning int)\n\n(count (range (inc (Integer/MAX_VALUE))))\n;; Execution error (ArithmeticException)\n;; integer overflow", :_id "5e2191eee4b0ca44402ef818"} {:updated-at 1656427246940, :created-at 1656427246940, :author {:login "JeniferDalcin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/83920579?v=4"}, :body "(def items-to-buy {:milk 2 :bread 10 :chocolate 1})\n\n(count items-to-buy)\n\n;;=> 3", :_id "62bb12eee4b0b1e3652d760e"}], :notes nil, :arglists ["coll"], :doc "Returns the number of items in the collection. (count nil) returns\n 0. Also works on strings, arrays, and Java Collections and Maps", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/count"} {:added "1.0", :ns "clojure.core", :name "supers", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1285511319000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "type", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d64"} {:created-at 1285513946000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "instance?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d65"} {:created-at 1307530958000, :author {:login "stand", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d7f9ed2753f8b3517f1539f6129f0a17?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bases", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d66"} {:created-at 1374150792000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ancestors", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d67"}], :line 5553, :examples [{:author {:login "stand", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d7f9ed2753f8b3517f1539f6129f0a17?r=PG&default=identicon"}, :editors [], :body ";;find superclasses and interfaces of Java objects...\nuser> (supers Object)\nnil\n\nuser> (supers String)\n#{java.lang.Comparable java.lang.CharSequence java.io.Serializable java.lang.Object}\n\n;;...or Java interfaces\nuser> (supers javax.naming.Name)\n#{java.lang.Cloneable java.lang.Comparable java.io.Serializable}\n\n;;Also with clojure types...\nuser> (defrecord MyThing [a b c])\nuser.MyThing\n\nuser> (supers MyThing)\n#{clojure.lang.Counted java.lang.Iterable clojure.lang.IKeywordLookup clojure.lang.IObj clojure.lang.IPersistentMap clojure.lang.Associative clojure.lang.Seqable java.util.Map clojure.lang.IMeta java.io.Serializable java.lang.Object clojure.lang.IPersistentCollection clojure.lang.ILookup}\n", :created-at 1307530922000, :updated-at 1307530922000, :_id "542692cdc026201cdc326cce"} {:updated-at 1546970349060, :created-at 1546970349060, :author {:login "mikebohdan", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/9021802?v=4"}, :body ";; get all superclasses and interfaces for functions\nuser> (defn foo [x] (+ x 1))\nuser> (supers (class foo))\n#{java.lang.Runnable java.util.Comparator java.io.Serializable java.util.concurrent.Callable clojure.lang.AFn clojure.lang.IFn clojure.lang.Fn java.lang.Object clojure.lang.IMeta clojure.lang.AFunction clojure.lang.IObj}", :_id "5c34e4ede4b0ca44402ef618"}], :notes nil, :arglists ["class"], :doc "Returns the immediate and indirect superclasses and interfaces of c, if any", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/supers"} {:ns "clojure.core", :name "*fn-loader*", :type "var", :see-alsos nil, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*fn-loader*"} {:added "1.0", :ns "clojure.core", :name "sorted-map-by", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1281961885000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sorted-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e6b"} {:created-at 1330671660000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "subseq", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e6c"} {:created-at 1330671664000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rsubseq", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e6d"} {:created-at 1353458254000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "sorted-set-by", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e6e"} {:created-at 1427316125890, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :to-var {:ns "clojure.core", :name "compare", :library-url "https://github.com/clojure/clojure"}, :_id "55131d9de4b08eb9aa0a8d38"} {:created-at 1427316135655, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :to-var {:ns "clojure.core", :name "comparator", :library-url "https://github.com/clojure/clojure"}, :_id "55131da7e4b08eb9aa0a8d39"}], :line 407, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "STeveShary", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5167622?v=3"} {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}], :body "; The basic function requires discrete elements, and cannot accept a \n; pre-existing map:\nuser=> (sorted-map-by > 1 \"a\", 2 \"b\", 3 \"c\")\n{3 \"c\", 2 \"b\", 1 \"a\"}\n\n; We can use the syntax \"(sorted-map >)\" to create an empty sorted map that sorts \n; in reverse order (i.e. the opposite of \"(sorted-map)\"). It we can then fill\n; it using (into ...) with a pre-existing map:\nuser=> (into (sorted-map-by >) {1 :a 2 :b 3 :c} )\n{3 :c, 2 :b, 1 :a}\n\n; This two are the same\nuser=> (into (sorted-map-by <) {1 :a 2 :b 3 :c} )\n{1 :a, 2 :b, 3 :c}\nuser=> (into (sorted-map) {1 :a 2 :b 3 :c} )\n{1 :a, 2 :b, 3 :c}\n\n", :created-at 1286955811000, :updated-at 1423716874311, :_id "542692cac026201cdc326b5e"} {:updated-at 1548548894859, :created-at 1331260029000, :body ";; If you wish to sort the map according to the values, instead of by keys \n;; the following code WILL NOT WORK! This is because the map values are not unique.\n\nuser=> (let [results {:A 1 :B 2 :C 2 :D 5 :E 1 :F 1}]\n (into (sorted-map-by (fn [key1 key2]\n (compare (get results key2)\n (get results key1))))\n results))\n\n=> {:D 5, :C 2, :A 1}\n\n;; To make sure that the sorting works, we can make sure that the comparator \n;; works on unique values\n\nuser=> (let [results {:A 1 :B 2 :C 2 :D 5 :E 1 :F 1}]\n (into (sorted-map-by (fn [key1 key2]\n (compare [(get results key2) key2]\n [(get results key1) key1])))\n results))\n\n=> {:D 5, :C 2, :B 2, :F 1, :E 1, :A 1}\n\n;; See this article for more details: https://clojure.org/guides/comparators", :editors [{:avatar-url "https://www.gravatar.com/avatar/24b2f585e6df92df9885e37b3b285c43?r=PG&default=identicon", :account-source "clojuredocs", :login "defiantt"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/24b2f585e6df92df9885e37b3b285c43?r=PG&default=identicon", :account-source "clojuredocs", :login "defiantt"}, :_id "542692d5c026201cdc327094"} {:editors [{:login "aarkerio", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/226965?v=4"}], :body ";; Ordering using nested values\n\n(def rows {:45 {:ordnen 5} :55 {:ordnen 8} :66 {:ordnen 3} :68 {:ordnen 90} :13 {:ordnen 1}})\n\n(into (sorted-map-by (fn [key1 key2]\n (compare\n (get-in rows [key1 :ordnen])\n (get-in rows [key2 :ordnen]))))\n rows)\n\n{:13 {:ordnen 1},\n :66 {:ordnen 3},\n :45 {:ordnen 5},\n :55 {:ordnen 8},\n :68 {:ordnen 90}}\n ", :author {:avatar-url "https://avatars1.githubusercontent.com/u/226965?v=4", :account-source "github", :login "aarkerio"}, :created-at 1585685462057, :updated-at 1585685482087, :_id "5e83a3d6e4b087629b5a18c8"} {:updated-at 1588694823302, :created-at 1588694823302, :author {:login "ejschoen", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10605666?v=4"}, :body ";; Note that when querying values from the map, the comparator will be called, \n;; and must work on values that are not keys in the map:\n\nuser=> (get (into (sorted-map-by (fn [a b] (println a b) (compare a b))) \n {\"a\" 1 \"b\" 2})) \n \"c\")\nb a\nc a\nc b\n=> nil\n\n;; If the comparator looks into an auxiliary data structure for a comparison\n;; value, ensure that the comparator can handle a missing value in that data\n;; structure:\n\nuser=> (let [other {\"a\" 10 \"b\" 1}\n m (into (sorted-map-by (fn [a b] (< (get other a) (get other b)))) \n {\"a\" 1 \"b\" 2})]\n (println (get m \"a\"))\n (println (get m \"b\"))\n (println (get m \"c\")))\n1\n2\nNullPointerException clojure.lang.Numbers.ops (Numbers.java:1013)\nuser=>", :_id "5eb18f27e4b087629b5a1900"}], :notes [{:author {:login "noisesmith", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/169654?v=4"}, :updated-at 1517725988658, :created-at 1517725696549, :body "an unstable sorting function will give nonsense results:\n\n
    \nuser=> (into (sorted-map-by (fn [_ _] (rand-int Integer/MAX_VALUE))) [[:a 0] [:a 1] [:a 2]])\n\n{:a 0, :a 1, :a 2}\n
    ", :_id "5a76a800e4b0e2d9c35f7416"} {:author {:login "elias94", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8095533?v=4"}, :updated-at 1659590612300, :created-at 1659589967366, :body "As previously noted, using an unstable sorting function could lead to unexpected results and hard to find bug. The `PersistentTreeMap` object returned by `sorted-map-by`, stores the `comparator` function and will reuse it in consecutive operations as `assoc`.\n\n```\n(def ord [:a :b :c])\n(def m (into (sorted-map-by (fn [a b] \n                              (compare (.indexOf ord a) \n                                       (.indexOf ord b))))  \n             {:a 1 :b 2 :c 3}))\n(assoc m :d 4) ; => {:d 4, :a 1, :b 2, :c 3}\n(-> (assoc m :d 4)\n    (assoc :e 5)) ; => {:d 5, :a 1, :b 2, :c 3} WRONG\n```\n\n[Source reference](https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/PersistentTreeMap.java#L28)\n", :_id "62eb554fe4b0b1e3652d7637"}], :arglists ["comparator & keyvals"], :doc "keyval => key val\n  Returns a new sorted map with supplied mappings, using the supplied\n  comparator.  If any keys are equal, they are handled as if by\n  repeated uses of assoc.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/sorted-map-by"} {:added "1.0", :ns "clojure.core", :name "apply", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1285116731000, :author {:login "gregg-williams", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/58610a64fc8638eec8d2239d80d4046f?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eae"} {:created-at 1289278196000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "eval", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eaf"} {:created-at 1289278244000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.template", :name "apply-template", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eb1"} {:created-at 1411938673196, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "reduce", :library-url "https://github.com/clojure/clojure"}, :_id "54287971e4b0ba57bdbcf25f"} {:created-at 1598160814660, :author {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "partial", :ns "clojure.core"}, :_id "5f41ffaee4b0b1e3652d739d"}], :line 660, :examples [{:updated-at 1422053574794, :created-at 1279062643000, :body "(def *strings* [\"str1\" \"str2\" \"str3\"])\n;; #'user/*strings*\n\n;; Oops!\n(str *strings*)\n;;=> \"[\\\"str1\\\" \\\"str2\\\" \\\"str3\\\"]\"\n\n;; Yay!\n(apply str *strings*)\n;;=> \"str1str2str3\"\n\n;; Note the equivalence of the following two forms\n(apply str [\"str1\" \"str2\" \"str3\"])  ;;=> \"str1str2str3\"\n(str \"str1\" \"str2\" \"str3\")          ;;=> \"str1str2str3\"\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/58610a64fc8638eec8d2239d80d4046f?r=PG&default=identicon", :account-source "clojuredocs", :login "gregg-williams"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692cdc026201cdc326d46"} {:author {:login "Jacolyte", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon"}, :editors [{:login "gregg-williams", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/58610a64fc8638eec8d2239d80d4046f?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; If you were to try\n(max [1 2 3])\n;;=> [1 2 3]\n\n;; You would get '[1 2 3]' for the result. In this case, 'max' has received one\n;; vector argument, and the largest of its arguments is that single vector.\n\n;; If you would like to find the largest item **within** the vector, you would need\n;; to use `apply`\n\n(apply max [1 2 3])\n;;=> 3\n\n;; which is the same as \n(max 1 2 3)\n;;=> 3\n", :created-at 1280207658000, :updated-at 1422053637350, :_id "542692cdc026201cdc326d49"} {:updated-at 1647518010897, :created-at 1285120582000, :body ";; Here's an example that uses a optional second argument, x:\n\n(apply map vector [[:a :b] [:c :d]])\n;;=> ([:a :c] [:b :d])\n\n;; In this example, 'f' = 'map', 'x' = 'vector', and args = '[:a :b] [:c :d]',\n;; making the above code equivalent to\n\n(map vector [:a :b] [:c :d])\n;;=> ([:a :c] [:b :d]) ;Same answer as above\n\n;; It might help to think of 'map' and 'vector' as \"slipping inside\" the argument\n;; list ( '[[:a :b] [:c :d]]' ) to give '[map vector [:a :b] [:c :d]]' , which \n;; then becomes the executable form '(map vector [:a :b] [:c :d])' .", :editors [{:avatar-url "https://www.gravatar.com/avatar/58610a64fc8638eec8d2239d80d4046f?r=PG&default=identicon", :account-source "clojuredocs", :login "gregg-williams"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/200617?v=3", :account-source "github", :login "bsima"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "gunnarx", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7410653?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/58610a64fc8638eec8d2239d80d4046f?r=PG&default=identicon", :account-source "clojuredocs", :login "gregg-williams"}, :_id "542692cdc026201cdc326d4d"} {:updated-at 1543265664647, :created-at 1288763486000, :body ";; only functions can be used with apply.  'and' is a macro\n;; because it needs to evaluate its arguments lazily and so\n;; does not work with apply.\n(apply and (list true true false true))\n;; RuntimeException : cannot take value of a macro\n\n;; This can be circumvented with another macro.\n;; But understand what is happening\n;; http://stackoverflow.com/questions/5531986/treat-clojure-macro-as-a-function\n(defmacro make-fn [m] \n `(fn [& args#]\n    (eval \n      (cons '~m args#))))\n\n(apply (make-fn and) '(true true false true))\n;;=> false\n\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "mdave16", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/15642321?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon", :account-source "clojuredocs", :login "gstamp"}, :_id "542692cdc026201cdc326d50"} {:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [{:login "jasonrudolph.com", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c4e34ac0818591402a41b2e9cfb4747b?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; 'apply' is used to apply an operator to its operands. \n(apply + '(1 2))  ; equivalent to (+ 1 2)\n;;=> 3\n\n\n;; You can also put operands before the list of \n;; operands and they'll be consumed in the list of operands\n\n(apply + 1 2 '(3 4))  ; equivalent to (apply + '(1 2 3 4))\n;;=> 10", :created-at 1289278192000, :updated-at 1422054628109, :_id "542692cdc026201cdc326d51"} {:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; You can use map and apply together to drill one level deep in a collection\n;; of collections, in this case returning a collection of the max of each\n;; nested collection\n\n(map #(apply max %) [[1 2 3][4 5 6][7 8 9]])\n;;=> (3 6 9)", :created-at 1310850474000, :updated-at 1422054659726, :_id "542692cdc026201cdc326d53"} {:author {:login "Jeff Terrell", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/658b2643cf2a8192286b5bb1ecb62cf8?r=PG&default=identicon"}, :editors [], :body ";; Using `apply` with optional keyword parameters:\n\n(defn add2 [a & {:keys [plus] :or {plus 0}}]\n  (+ 2 plus a))\n\n(add2 4)                    ; => 6\n(add2 4 :plus 1)            ; => 7\n(apply add2 [4])            ; => 6\n(apply add2 [4 {:plus 1}])  ; => IllegalArgumentException\n(apply add2 [4 :plus 1])    ; => 7\n", :created-at 1409438218000, :updated-at 1409438218000, :_id "542692d2c026201cdc326f4a"} {:editors [{:login "nbren12", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1386642?v=3"}], :body ";; Transpose a matrix\n(def A [[1 2]\n        [3 4]])\n\n(apply map vector A) ;  ([1 3] [2 4])\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/1386642?v=3", :account-source "github", :login "nbren12"}, :created-at 1437005741779, :updated-at 1437005816540, :_id "55a6f7ade4b0080a1b79cda1"} {:updated-at 1447364097315, :created-at 1447364097315, :author {:login "bsima", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/200617?v=3"}, :body ";; Use apply to map a function over a collection of pairs of arguments\n\n(map (partial apply +) [[1 2] [3 4]]) ; => (3 7)\n\n;; this is equivalent to '((+ 1 2) (+ 3 4))", :_id "56450601e4b053844439826e"} {:updated-at 1487799337630, :created-at 1487799337630, :author {:login "smnplk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/380618?v=3"}, :body "; Remove elements from a set with disj\n\n(disj #{1 2 3} 2 3) \n=> #{1}\n\n; Relative complement of two sets (difference)\n\n(apply disj #{2 3 4} #{1 2 3})\n=> #{4}\n\n; the above is same as calling\n(disj #{2 3 4} 1 2 3)", :_id "58ae0429e4b01f4add58fe5d"} {:updated-at 1517124285557, :created-at 1517124285557, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;practical example\n\n(def entries [{:month 1 :val 12}\n              {:month 2 :val 3}\n              {:month 3 :val 32}\n              {:month 4 :val 18}\n              {:month 5 :val 32}\n              {:month 6 :val 62}\n              {:month 7 :val 12}\n              {:month 8 :val 142}\n              {:month 9 :val 52}\n              {:month 10 :val 18}\n              {:month 11 :val 23}\n              {:month 12 :val 56}])\n\n(apply max (map\n            #(:val %)\n            entries))\n;;return 142\n;;this translates into (max 12 3 32 18 32 62 12 142 52 18 23 56)", :_id "5a6d7abde4b0c974fee49d10"} {:editors [{:login "Okwori", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/16775439?v=4"}], :body "(apply + [2 3 4])\n;;9\n\n(apply + 1 [2 3 4])\n;;10\n\n(apply max [1 3 2])\n;;3\n\n(apply max 4 [1 3 2])\n;;4\n\n(apply str [\"a\" \"b\" \"c\"])\n;;\"abc\"\n\n(apply str \"d\" [\"a\" \"b\" \"c\"])\n;;\"dabc\"\n\n(str \"Hi, here: \" (apply str (for [i (range 5)] i)) \" Cheers!\")\n;; \"Hi, here: 01234 Cheers!\"", :author {:avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4", :account-source "github", :login "ibercode"}, :created-at 1518885671189, :updated-at 1627950640374, :_id "5a885b27e4b0316c0f44f8c9"} {:updated-at 1535318272487, :created-at 1535318272487, :author {:login "hadielmougy", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1223207?v=4"}, :body "(reduce #(apply assoc %1 %2) {} [[:a 1] [:b 2]])\n\n;;{:a 1, :b 2}", :_id "5b831900e4b00ac801ed9e79"} {:updated-at 1550289947317, :created-at 1550285729081, :author {:login "jdf-id-au", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/9016301?v=4"}, :body "(defn chunks\n  \"Lazily break up map of colls into maps of chunks of n records (default 100 000).\n  Truncates at shortest coll (chunk-wise).\"\n  ([m] (chunks 100000 m))\n  ([n m] (apply map merge (repeatedly sorted-map)\n           (for [[k v] m]\n             (for [part (partition-all n v)]\n               {k part})))))\n\n(chunks 2 {:b [1 2 3] :a [1 2 3 4] :c [1 2 3 4 5]})\n=> ({:a (1 2), :b (1 2), :c (1 2)}\n    {:a (3 4), :b (3), :c (3 4)})\n\n(defn non-truncating-chunks\n  ([m] (chunks 100000 m))\n  ([n m] (let [partitioned-lists\n               ;; '(({k0 part0} {k0 part1} ... nil nil ...)\n               ;;   ({k1 part0} {k1 part1} ... nil nil ...)\n               ;;   ...)\n               (for [[k v] m]\n                 ;; '({k part0} {k part1} ... nil nil ... )\n                 (concat ; append nils to prevent map truncating at shortest\n                   (for [part (partition-all n v)]\n                     {k part})\n                   (repeat nil)))]\n           ;; '(({k0 part0} {k1 part0} ...)\n           ;;   ({k0 part1} {k1 part1} ...)\n           ;;   ...)\n           (for [ls (apply map list partitioned-lists)\n                 :while (not-every? nil? ls)]\n             (apply merge (sorted-map) ls)))))\n\n(non-truncating-chunks 2 {:b [1 2 3] :a [1 2 3 4] :c [1 2 3 4 5]})\n=> ({:a (1 2), :b (1 2), :c (1 2)}\n    {:a (3 4), :b (3), :c (3 4)}\n    {:c (5)})", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/9016301?v=4", :account-source "github", :login "jdf-id-au"}], :_id "5c677ba1e4b0ca44402ef688"} {:editors [{:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}], :body ";; Based in the example from the great book CLOJURE for the BRAVE and TRUE\n;; https://www.braveclojure.com/core-functions-in-depth/\n\n(def countries [:peru :mexico])\n\n(defn add-first\n   [target addition]\n   (apply conj [addition] target))\n\n(add-first countries :brazil)\n\n;; [:brazil :peru :mexico]", :author {:avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4", :account-source "github", :login "berczeck"}, :created-at 1598163155919, :updated-at 1598165224331, :_id "5f4208d3e4b0b1e3652d739f"} {:editors [{:login "jimka2001", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6414129?v=4"}], :body ";; If `apply` is called on a function having optional arguments as shown in\n;; `function-2`, you must pre-manipulate the arguments before calling `apply`\n\n(defn function-2\n  [arg1 & {:keys [a b c]\n           :as all-optionals\n           :or {a 42}}]\n  (list arg1 a b c all-optionals))\n\n;; Suppose you'd like to call `function-2` from `function-1` passing along \n;; the *same* optional arguments.\n\n;; In this example, the call-site of `function-1` may contain any keyword \n;; argument for `function-1` or for `function-2`.\n\n(defn function-1\n  [arg1 & {:keys [c d e]\n           :as all-optionals\n           :or {d 42}}]\n  (apply function-2 arg1 (mapcat identity all-optionals)))\n\n(function-1 1)\n;; [arg1 1 a 42 b nil c nil all-optionals nil]\n\n(function-1 1 :c 2)\n;; [arg1 1 a 42 b nil c 2 all-optionals {:c 2}]\n\n(function-1 1 :c 2 :a 3)\n;; [arg1 1 a 3 b nil c 2 all-optionals {:c 2, :a 3}]\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/6414129?v=4", :account-source "github", :login "jimka2001"}, :created-at 1626948876981, :updated-at 1626949139811, :_id "60f9450ce4b0b1e3652d7519"} {:editors [{:login "pradeepbishnoi", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1634146?v=4"}], :body "(def input-2 [\"P1\" \"R2\" \"A3\" \"D4\" \"E5\" \"e6\" \"p7\"])\n\n(apply map vector input-2)\n;; => ([\\P \\R \\A \\D \\E \\e \\p] [\\1 \\2 \\3 \\4 \\5 \\6 \\7])\n\nis same as writing using map form :\n\n(map vector (nth input-2 0)\n     (nth input-2 1)\n     (nth input-2 2)\n     (nth input-2 3)\n     (nth input-2 4)\n     #_(nth input-2 5)\n     ,)\n;; => ([\\P \\R \\A \\D \\E] [\\1 \\2 \\3 \\4 \\5])\n\n(apply map #(println %&) input-2)\n;; => (P R A D E e p)\n;;    (nil(1 2 3 4 5 6 7)\n;;     nil)\n\nfurther playaround like below to get more comfortable\n(map vector \"P1\" \"R2\")\n;; => ([\\P \\R] [\\1 \\2])\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/1634146?v=4", :account-source "github", :login "pradeepbishnoi"}, :created-at 1638598080447, :updated-at 1638598196914, :_id "61ab05c0e4b0b1e3652d7580"}], :notes [{:author {:login "virajpurang", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1843638?v=3"}, :updated-at 1444440195862, :created-at 1444440123734, :body "The first example on the page, does not work on the REPL. It gives the following error: \n
     (def *strings* [\"str1\" \"str2\" \"str3\"])\" 
    \n\n*Warning: *strings* not declared dynamic and thus is not dynamically rebindable, but its name suggests otherwise. Please either indicate ^:dynamic *strings* or change the name.*\n\nShould this be prefixed by - \"^:dynamic\"?\n", :_id "5618683be4b084e61c76ecc0"} {:author {:login "didibus", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/601540?v=4"}, :updated-at 1534908180799, :created-at 1534906692760, :body "It looks like apply when used with a lazy sequence forces the realization of the first four elements.\n\n```\n(take 1\n (apply concat\n (repeatedly #(do\n (println \"called\")\n (range 1 10)))))\n\n=> \"called\"\n=> \"called\"\n=> \"called\"\n=> \"called\"\n```\n\nSee: https://stackoverflow.com/questions/51959298/clojure-apply-that-does-not-realize-the-first-four-elements-of-a-lazy-sequence", :_id "5b7cd144e4b00ac801ed9e69"}], :arglists ["f args" "f x args" "f x y args" "f x y z args" "f a b c d & args"], :doc "Applies fn f to the argument list formed by prepending intervening arguments to args.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/apply"} {:added "1.0", :ns "clojure.core", :name "interpose", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1293096431000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "interleave", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bbb"} {:created-at 1334733658000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.string", :name "join", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bbc"}], :line 5206, :examples [{:updated-at 1598971367289, :created-at 1278174751000, :body ";; The quintessential interpose example:\nuser> (def my-strings [\"one\" \"two\" \"three\"])\n\nuser> (interpose \", \" my-strings)\n=> (\"one\" \", \" \"two\" \", \" \"three\")\n\nuser> (apply str (interpose \", \" my-strings))\n=> \"one, two, three\"\n\n;; Might use clojure.string/join if the plan is to join\n(require '[clojure.string :as str])\nuser> (str/join \", \" my-strings)\n=> \"one, two, three\"", :editors [{:avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon", :account-source "clojuredocs", :login "philos99"} {:avatar-url "https://www.gravatar.com/avatar/c889e0a95a3bb07f90ab28ad442f1127?r=PG&default=identicon", :account-source "clojuredocs", :login "Iceland_jack"} {:avatar-url "https://www.gravatar.com/avatar/c889e0a95a3bb07f90ab28ad442f1127?r=PG&default=identicon", :account-source "clojuredocs", :login "Iceland_jack"} {:avatar-url "https://www.gravatar.com/avatar/c889e0a95a3bb07f90ab28ad442f1127?r=PG&default=identicon", :account-source "clojuredocs", :login "Iceland_jack"} {:avatar-url "https://www.gravatar.com/avatar/c889e0a95a3bb07f90ab28ad442f1127?r=PG&default=identicon", :account-source "clojuredocs", :login "Iceland_jack"} {:login "daveliepmann", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/974443?v=4"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}, :_id "542692cdc026201cdc326d31"} {:updated-at 1519242639737, :created-at 1352930917000, :body ";; This example converts what would be comma-separated values into pipe '|'\n;; separated values for alternate database loads. By switching delimiters, \n;; quotes can be eliminated from each sequence element, which are not \n;; needed for some databases.\n\n(def test-data-in '((\"43\" \"MORRISON, VAN X DMD\" \"43 ROADWAY\" \\;)\n (\"25\" \"JANE SMITH N\" \"25 GARDEN PATH\" \\!)))\n\n(def test-data-out (map #(concat (interpose \\| %) (list \\| \"\\n\"))\n test-data-in))\n\ntest-data-out\n\n=> ((\"43\" \\| \"MORRISON, VAN X DMD\" \\| \"43 ROADWAY\" \\| \\; \\| \"\\n\")\n (\"25\" \\| \"JANE SMITH N\" \\| \"25 GARDEN PATH\" \\| \\! \\| \"\\n\"))\n\n(doseq [in-seq test-data-out]\n (doseq [val in-seq]\n (spit \"temp1.csv\" val :append true)))\n\n;; cat temp1.csv:\n\n;; 43|MORRISON, VAN X DMD|43 ROADWAY|;|\n;; 25|JANE SMITH N|25 GARDEN PATH|!|", :editors [{:avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon", :account-source "clojuredocs", :login "octopusgrabbus"} {:avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon", :account-source "clojuredocs", :login "octopusgrabbus"} {:avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon", :account-source "clojuredocs", :login "octopusgrabbus"} {:avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon", :account-source "clojuredocs", :login "octopusgrabbus"} {:login "dosbol", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/6149147?v=4"} {:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"}], :author {:avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon", :account-source "clojuredocs", :login "octopusgrabbus"}, :_id "542692d3c026201cdc326fd3"}], :notes nil, :arglists ["sep" "sep coll"], :doc "Returns a lazy seq of the elements of coll separated by sep.\n Returns a stateful transducer when no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/interpose"} {:added "1.0", :ns "clojure.core", :name "deref", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1343082385000, :author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "atom", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e70"} {:created-at 1343082392000, :author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "agent", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e71"} {:created-at 1343082402000, :author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e72"} {:created-at 1423531286944, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=2"}, :to-var {:ns "clojure.core", :name "realized?", :library-url "https://github.com/clojure/clojure"}, :_id "54d95d16e4b081e022073c8a"} {:created-at 1510406134570, :author {:login "l3nz", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1101849?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "future", :ns "clojure.core"}, :_id "5a06f7f6e4b0a08026c48caf"}], :line 2306, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (def a (atom 0))\n#'user/a\nuser=> @a\n0\nuser=> (deref a)\n0\n\nuser=> (def b (ref 1))\n#'user/b\nuser=> @b\n1\nuser=> (deref b)\n1\n\nuser=> (def c (agent 2))\n#'user/c\nuser=> @c\n2\nuser=> (deref c)\n2\n\nuser=> (def d (future 3))\n#'user/d\nuser=> @d\n3\nuser=> (deref d)\n3", :created-at 1280548071000, :updated-at 1332951465000, :_id "542692c8c026201cdc326a12"} {:body "user=> (def a (promise))\n#'user/a\nuser=> (deref a) ;; blocking until a delivery occurs \n\nuser=> (deref a 100 :timeout) ;; block for at most 100ms\n:timeout", :author {:login "kgann", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1098962?v=2"}, :created-at 1421253947329, :updated-at 1421253947329, :_id "54b69d3be4b081e022073c0b"} {:updated-at 1534311765139, :created-at 1534311765139, :author {:login "viebel", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/955710?v=4"}, :body "user=> (def b 1)\n#'user/b\nuser=> (var b)\n#'user/b\nuser=> (deref (var b))\n1", :_id "5b73bd55e4b00ac801ed9e5a"}], :notes nil, :arglists ["ref" "ref timeout-ms timeout-val"], :doc "Also reader macro: @ref/@agent/@var/@atom/@delay/@future/@promise. Within a transaction,\n returns the in-transaction-value of ref, else returns the\n most-recently-committed value of ref. When applied to a var, agent\n or atom, returns its current state. When applied to a delay, forces\n it if not already forced. When applied to a future, will block if\n computation not complete. When applied to a promise, will block\n until a value is delivered. The variant taking a timeout can be\n used for blocking references (futures and promises), and will return\n timeout-val if the timeout (in milliseconds) is reached before a\n value is available. See also - realized?.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/deref"} {:added "1.0", :ns "clojure.core", :name "assoc", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1291975387000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "assoc-in", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ef1"} {:created-at 1295211937000, :author {:login "pauldoo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5cb916d3c8abc9f45a093209e72489fb?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "dissoc", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ef2"} {:created-at 1320356554000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "merge", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ef3"} {:created-at 1551138257703, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "update", :ns "clojure.core"}, :_id "5c747dd1e4b0ca44402ef6a7"} {:created-at 1570520695399, :author {:login "xmo-odoo", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/7571158?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "associative?", :ns "clojure.core"}, :_id "5d9c3e77e4b0ca44402ef7c9"}], :line 181, :examples [{:updated-at 1582579932440, :created-at 1278953718000, :body "(assoc {} :key1 \"value\" :key2 \"another value\")\n;;=> {:key2 \"another value\", :key1 \"value\"}\n\n;; Here we see an overwrite by a second entry with the same key\n(assoc {:key1 \"old value1\" :key2 \"value2\"} \n :key1 \"value1\" :key3 \"value3\")\n;;=> {:key3 \"value3\", :key2 \"value2\", :key1 \"value1\"}\n\n;; We see a nil being treated as an empty map\n(assoc nil :key1 4)\n;;=> {:key1 4}\n\n;; 'assoc' can be used on a vector (but not a list), in this way: \n;; (assoc vec index replacement)\n(assoc [1 2 3] 0 10) ;;=> [10 2 3]\n(assoc [1 2 3] 2 '(4 6)) ;;=> [1 2 (4 6)]\n;; Next, 0 < index <= n, so the following will work\n(assoc [1 2 3] 3 10) ;;=> [1 2 3 10]\n;; However, when index > n, an error is thrown\n(assoc [1 2 3] 4 10)\n;; java.lang.IndexOutOfBoundsException (NO_SOURCE_FILE:0)\n\n;; From http://clojure-examples.appspot.com/clojure.core/assoc", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon", :account-source "clojuredocs", :login "franks42"} {:avatar-url "https://www.gravatar.com/avatar/497a50e2eb50bb7a8dbb839adc473f1f?r=PG&default=identicon", :account-source "clojuredocs", :login "MikeT"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "Eleonore9", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2502761?v=3"} {:login "borkdude", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/284934?v=4"} {:avatar-url "https://avatars2.githubusercontent.com/u/36526095?v=4", :account-source "github", :login "adanhawth"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}, :_id "542692c9c026201cdc326acd"} {:author {:login "octopusgrabbus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :body ";; here is an example of updating a field in a map.\n(def test-map {:account-no 12345678 :lname \"Jones\" :fnam \"Fred\"})\n(assoc test-map :fnam \"Sue\")\n;;=> {:account-no 12345678, :lname \"Jones\", :fnam \"Sue\"}\n\n;; notice that test-map is unchanged\ntest-map\n;;=> {:account-no 12345678 :lname \"Jones\" :fnam \"Fred\"})", :created-at 1366772136000, :updated-at 1412883533397, :_id "542692d2c026201cdc326f4b"} {:updated-at 1439568723313, :created-at 1439568723313, :author {:login "nickzam", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/89377?v=3"}, :body ";; beware of this\n(assoc {} nil nil)\n;;=> {nil nil}", :_id "55ce1353e4b0831e02cddf14"} {:updated-at 1516724671337, :created-at 1516724671337, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;transform a map´s values using reduce and assoc\n\n(defn transform\n [coll]\n (reduce (fn [ncoll [k v]]\n (assoc ncoll k (* 10 v)))\n {}\n coll))\n\n(transform {:a 1 :b 2 :c 3})\n;;{:a 10 :b 20 :c 30}\n", :_id "5a6761bfe4b09621d9f53a75"} {:updated-at 1518707659300, :created-at 1518707659300, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;assoc applied to a vector\n\n(def my-vec [1 2 5 6 8 9])\n\n(assoc my-vec 0 77)\n;;[77 2 5 6 8 9]\n", :_id "5a85a3cbe4b0316c0f44f8bf"} {:updated-at 1535116887042, :created-at 1535116887042, :author {:login "eddy147", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1145595?v=4"}, :body ";; convert a vector into a set with assoc\n\n(def book-city {:awards [\"Hugo\" \"World Fantasy Award\" \"Arthur C. Clarke Award\"\n \"British Science Fiction Award\"]\n :title \"The City and the City\"\n :authors [{:birth-year 1972, :name \"China Miéville\"}]})\n\n(assoc book-city :authors (set (:authors book-city)))\n\n;; {:awards [\"Hugo\" \"World Fantasy Award\" \"Arthur C. Clarke Award\" \"British Science Fiction Award\"], :title \"The City and the City\", :authors #{{:birth-year 1972, :name \"China Miéville\"}}}", :_id "5b800657e4b00ac801ed9e73"} {:updated-at 1562960552703, :created-at 1562960552703, :author {:login "victorb", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/459764?v=4"}, :body ";; You can also change multiple keys at once\n\n(def my-map {:name \"Victor\" :age 27 :city \"Barcelona\"})\n\n(assoc my-map :name \"Tom\" :age 47)\n\n;; {:name \"Tom\", :age 47, :city \"Barcelona\"}\n", :_id "5d28e2a8e4b0ca44402ef785"} {:updated-at 1582580850878, :created-at 1582580850878, :author {:login "adanhawth", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/36526095?v=4"}, :body ";; You can add some more fields (kvs) to your map\n(assoc {:type \"chicken\"} :home \"Kentucky\" :cooking-method \"fried\" :tasty \"definitely\")", :_id "5e544472e4b087629b5a18a6"} {:updated-at 1593400361528, :created-at 1593400361528, :author {:login "kimim", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/5523431?v=4"}, :body ";; add new key-value from original key value\n(let [contact {:name \"kimim\" :home \"Hangzhou\"}\n new-name \"ivy\"]\n (assoc contact :modified? (not (= (contact :name) new-name)) :name new-name))\n;; {:name \"ivy\" :home \"Hangzhou\" :modified? true}\n", :_id "5ef95c29e4b0b1e3652d7319"}], :notes [{:updated-at 1352836452000, :body "Here is a version that will create a vector when the key is numerical.\r\nThis may be useful instead of throwing an IndexOutOfBoundsException.\r\n\r\n
    \r\n(defn assoc-in-idx [m [k & ks] v]\r\n  (let [value (get m k (when (number? (first ks)) []))\r\n\tm (if (and (vector? m) (number? k) (-> m count (< k)))\r\n\t    (reduce (fn [m _] (conj m nil)) m (range (count m) k))\r\n\t    m)\r\n\tv (if ks\r\n\t    (assoc-in-idx value ks v)\r\n\t    v)]\r\n    (assoc m k v)))\r\n
    \r\n", :created-at 1352836452000, :author {:login "l0st3d", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cc23d1f40d9cfa1c5015ea972759cbf4?r=PG&default=identicon"}, :_id "542692edf6e94c6970521ff4"} {:updated-at 1378937381000, :body "the API is blurry When applied to a vector\r\n\r\n
    \r\n;; should indicate following\r\n(assoc vector index val) 
    ", :created-at 1378937381000, :author {:login "simlegate", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/313f9e3c2c4d3492222c1efd2fd955a4?r=PG&default=identicon"}, :_id "542692edf6e94c697052200b"}], :arglists ["map key val" "map key val & kvs"], :doc "assoc[iate]. When applied to a map, returns a new map of the\n same (hashed/sorted) type, that contains the mapping of key(s) to\n val(s). When applied to a vector, returns a new vector that\n contains val at index. Note - index must be <= (count vector).", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/assoc"} {:added "1.0", :ns "clojure.core", :name "rational?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 3612, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"} {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"} {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (rational? 1)\ntrue\nuser=> (rational? 1.0)\nfalse\nuser=> (class 1.0)\njava.lang.Double\n\n;; Note that decimal? only returns true if n is a BigDecimal.", :created-at 1279074804000, :updated-at 1285501218000, :_id "542692cec026201cdc326dc9"} {:editors [{:login "TradeIdeasPhilip", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/18409827?v=3"}], :body ";; Both True\nuser=> (ratio? 22/7) \n;; => true\nuser=> (rational? 22/7)\n;; => true\n\n;; Different\nuser=> (ratio? 22)\n;; => false\nuser=> (rational? 22)\n;; => true\n\n;; Both False\nuser=> (ratio? 0.5)\n;; => false\nuser=> (rational? 0.5)\n;; => false", :author {:avatar-url "https://avatars.githubusercontent.com/u/18409827?v=3", :account-source "github", :login "TradeIdeasPhilip"}, :created-at 1463237386081, :updated-at 1463237705871, :_id "57373b0ae4b05449374f52ed"}], :notes nil, :arglists ["n"], :doc "Returns true if n is a rational number", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/rational_q"} {:added "1.1", :ns "clojure.core", :name "transient", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1286870150000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "persistent!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521da8"} {:created-at 1286870156000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "conj!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521da9"} {:created-at 1321399323000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "assoc!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521daa"} {:created-at 1321399624000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pop!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dab"} {:created-at 1324959569000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "dissoc!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dac"} {:created-at 1358908056000, :author {:login "jjcomer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ef581bba2f97adb539c67a35465b3e1b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "disj!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dad"}], :line 3342, :examples [{:updated-at 1577917667056, :created-at 1286870136000, :body ";; As seen on http://clojure.org/transients\n;; array is initially made transient, modified, then finally made persistent.\n;; See assoc! for further discussion of why it must be done this way.\n;; Also see one example for conj! that contains a detailed example\n;; of a wrong result that can occur if you do not use its return value.\n\n(defn vrange2 [n]\n (loop [i 0 v (transient [])]\n (if (< i n)\n (recur (inc i) (conj! v i))\n (persistent! v))))\n\nuser=> (vrange2 10)\n[0 1 2 3 4 5 6 7 8 9]", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}], :author {:avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon", :account-source "clojuredocs", :login "gstamp"}, :_id "542692cbc026201cdc326bb5"} {:author {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}, :editors [{:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user> (def foo (transient [1 2 3]))\n#'user/foo\nuser> (get foo 0)\n1\nuser> (count foo)\n3\nuser> (nth foo 0)\n1\nuser> (def bar (transient {:honda 7 :kagawa 23 :ienaga 14}))\n#'user/bar\nuser> (get bar :kagawa)\n23\nuser> (count bar)\n3\n\n;; There is a known bug in Clojure 1.3 thru 1.6 where contains? always returns\n;; false for transients. http://dev.clojure.org/jira/browse/CLJ-700\n;; contains? works fine for persistent data structures.\nuser> (contains? bar :kagawa) ; Caution! \nfalse\nuser> (def bar2 (persistent! bar))\n#'user/bar2\nuser> (contains? bar2 :kagawa) ; Caution!\ntrue\n", :created-at 1307738808000, :updated-at 1417201029755, :_id "542692cbc026201cdc326bb6"}], :notes nil, :arglists ["coll"], :doc "Returns a new, transient version of the collection, in constant time.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/transient"} {:added "1.0", :ns "clojure.core", :name "clojure-version", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1458928229284, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "*clojure-version*", :ns "clojure.core"}, :_id "56f57a65e4b0103e9c7d9d25"}], :line 7081, :examples [{:author {:login "mattdw", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ee24aacb65359196b0a1bad050f9a62f?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (clojure-version)\n\"1.2.0-master-SNAPSHOT\"", :created-at 1280323117000, :updated-at 1332951038000, :_id "542692cec026201cdc326da5"}], :notes nil, :arglists [""], :doc "Returns clojure version as a printable string.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/clojure-version"} {:ns "clojure.core", :name "chunk-cons", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1443936300090, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-buffer", :ns "clojure.core"}, :_id "5610b82ce4b0686557fcbd4e"} {:created-at 1443936308702, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk", :ns "clojure.core"}, :_id "5610b834e4b08e404b6c1c9c"} {:created-at 1443936314187, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-append", :ns "clojure.core"}, :_id "5610b83ae4b08e404b6c1c9d"} {:created-at 1443936320194, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-rest", :ns "clojure.core"}, :_id "5610b840e4b08e404b6c1c9e"} {:created-at 1443936325789, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-next", :ns "clojure.core"}, :_id "5610b845e4b08e404b6c1c9f"} {:created-at 1443936329931, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-first", :ns "clojure.core"}, :_id "5610b849e4b08e404b6c1ca0"}], :line 710, :examples [{:editors [{:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}], :body "(let [chunked-cons (-> (chunk-buffer 32)\n (chunk)\n (chunk-cons (seq (range 42))))]\n\n chunked-cons\n ;; => (0 1 2 3 4 5 6 7 8 9 10\n ;; 11 12 13 14 15 16 17 18\n ;; 19 20 21 22 23 24 25 26\n ;; 27 28 29 30 31 32 33 34\n ;; 35 36 37 38 39 40 41)\n\n (class chunked-cons)\n ;; => clojure.lang.ChunkedCons\n\n)", :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :created-at 1443936277294, :updated-at 1443936290379, :_id "5610b815e4b08e404b6c1c9b"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; byte-seq creates a lazy chunked sequence of bytes from an InputStream.\n;; It takes the optimal chunk \"size\" to model a physical resource \n;; (for a disk this would be the block size).\n\n(import '[java.io FileInputStream InputStream])\n\n(defn byte-seq [^InputStream is size]\n (let [ib (byte-array size)]\n ((fn step []\n (lazy-seq\n (let [n (.read is ib)]\n (when (not= -1 n)\n (let [cb (chunk-buffer size)]\n (dotimes [i size] (chunk-append cb (aget ib i)))\n (chunk-cons (chunk cb) (step))))))))))\n\n;; Example with a text file and block size 4096.\n(with-open [is (FileInputStream. \"/usr/share/dict/words\")]\n (let [bs (byte-seq is 4096)]\n (String. (byte-array (take 20 bs)))))\n;; \"A\\na\\naa\\naal\\naalii\\naam\"", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1522963811986, :updated-at 1522966589373, :_id "5ac69563e4b045c27b7fac37"}], :notes nil, :arglists ["chunk rest"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/chunk-cons"} {:added "1.0", :ns "clojure.core", :name "comparator", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1668766070221, :author {:login "holyjak", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/624958?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "compare", :ns "clojure.core"}, :_id "63775976e4b0b1e3652d7685"}], :line 3094, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}], :body ";; simple example to create an ArrayList, initially [1,2,0]\n;; and sort it in descending order\n\nuser=> (def a (new java.util.ArrayList [1 2 0]))\n#'user/a\nuser=> (def compx (comparator (fn [x y] (> x y))))\n#'user/compx\nuser=> (java.util.Collections/sort a compx)\nnil\nuser=> a\n#\n\n;; Note however that 'comparator' is rarely (never?) needed because if\n;; the fn returns a boolean, the .compare implementation Clojure provides\n;; causes it to behave the same as if 'comparator' were wrapped around it:\n\n(sort (comparator (fn [x y] (> x y))) [1 2 0]) ;=> (2 1 0)\n(sort (fn [x y] (> x y)) [1 2 0]) ;=> (2 1 0)\n(sort > [1 2 0]) ;=> (2 1 0)\n(sort < [1 2 0]) ;=> (0 1 2)", :created-at 1313490576000, :updated-at 1345156531000, :_id "542692cdc026201cdc326cfd"}], :notes nil, :arglists ["pred"], :doc "Returns an implementation of java.util.Comparator based upon pred.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/comparator"} {:added "1.0", :ns "clojure.core", :name "sorted-map", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1281961873000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sorted-map-by", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cbd"} {:created-at 1330671636000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "subseq", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cbe"} {:created-at 1330671641000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rsubseq", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cbf"} {:created-at 1330671776000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sorted-set", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cc0"} {:created-at 1397669012000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "array-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cc1"} {:created-at 1397669018000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "hash-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cc2"} {:created-at 1494705692726, :author {:login "miner", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/25400?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "sorted?", :ns "clojure.core"}, :_id "5917661ce4b01920063ee05b"} {:created-at 1548549104189, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "compare", :ns "clojure.core"}, :_id "5c4cfbf0e4b0ca44402ef644"}], :line 398, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "clojureking", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/92625b8a6be91bb8c688d0d07b4e2a32?r=PG&default=identicon"} {:login "clojureking", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/92625b8a6be91bb8c688d0d07b4e2a32?r=PG&default=identicon"} {:login "clojureking", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/92625b8a6be91bb8c688d0d07b4e2a32?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:avatar-url "https://avatars2.githubusercontent.com/u/10404?v=4", :account-source "github", :login "delonnewman"} {:login "olfal", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/7503672?v=4"}], :body ";; Sorted maps are sorted by their keys, not their values.\n\nuser=> (sorted-map :z 0, :a 28, :b 35)\n{:a 28, :b 35, :z 0}\nuser=> (into (sorted-map) {:a 2 :b 1})\n{:a 2, :b 1}\n\n;; (sorted-map ...) is equivalent in behavior to (sorted-map-by compare ...)\n;; where compare is Clojure's default comparator function clojure.core/compare\n;; See the documentation of compare for more details on its behavior.\n\n;; For a map sorted by values, see the priority-map data structure:\n;; https://github.com/clojure/data.priority-map\n\n;; For a map sorted by the order that key/value pairs were added,\n;; see ordered-map: https://github.com/clj-commons/ordered\n\n;; Another sorted map variant is the ordering-map:\n;; https://github.com/clj-commons/useful/blob/master/src/flatland/useful/map.clj#L243-L245\n\n;; If you deal with many large maps where the keys are all integers, and\n;; want a faster data structure for those, see int-map:\n;; https://github.com/clojure/data.int-map", :created-at 1280746350000, :updated-at 1548623801809, :_id "542692c6c026201cdc3268c0"} {:body "; 'seq' can be used to turn a map into a list of vectors\n; notice how the list is built in the sorted order as with vectors.\n(seq (into (sorted-map) {:key1 \"value1\" :key2 \"value2\"}))\n;;=> ([:key1 \"value1\"] [:key2 \"value2\"])", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1422039046100, :updated-at 1426562359420, :editors [{:login "InSuperposition", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/433871?v=3"}], :_id "54c29806e4b081e022073c28"} {:updated-at 1548623900767, :created-at 1446961734028, :author {:login "chrismurrph", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10278575?v=3"}, :body "; sorting on integer keys\n; also notice how each pair becomes a `MapEntry` ('key' 'val')\n(into (sorted-map) [[23 :x] [17 :y]])\n;;=> {17 :y, 23 :x}", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/10278575?v=3", :account-source "github", :login "chrismurrph"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}], :_id "563ee246e4b04b157a6648e7"} {:updated-at 1494705953587, :created-at 1457752219009, :author {:login "fasiha", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/37649?v=3"}, :body ";; clojure doesn't have a `sorted-map?` function to distinguish a sorted-map\n;; from a regular map. use `instance?`:\n(def unremarkable-map {:k1 \"v1\" :k2 \"v2\"})\n(def very-remarkable-map (into (sorted-map) unremarkable-map))\n(instance? clojure.lang.PersistentTreeMap unremarkable-map)\n;;=> false\n(instance? clojure.lang.PersistentTreeMap very-remarkable-map)\n;;=> true\n\n;; This works because:\n(type unremarkable-map)\n;;=> clojure.lang.PersistentArrayMap (PersistentHashMap if many key-val-pairs)\n(type very-remarkable-map)\n;;=> clojure.lang.PersistentTreeMap\n\n;; Clojure does have a `sorted?` predicate so you could define `sorted-map?`\n(def sorted-map? (every-pred map? sorted?))\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/37649?v=3", :account-source "github", :login "fasiha"} {:login "miner", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/25400?v=3"}], :_id "56e3889be4b0ce130120e038"} {:updated-at 1564573338675, :created-at 1564573338675, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/8271291?v=4"}, :body ";; Sort hash map by it's keys\n(def data {\"k\" 11 \"z\" 12 \"a\" 13 \"d\" 14 })\n\n(into (sorted-map) (sort-by first (seq data)))\n\n;;=> {\"a\" 13, \"d\" 14, \"k\" 11, \"z\" 12}", :_id "5d417e9ae4b0ca44402ef790"} {:updated-at 1610531070746, :created-at 1610531070746, :author {:login "dupuchba", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/911705?v=4"}, :body ";; (from previous comment) clojure doesn't have a `sorted-map?` function to distinguish a sorted-map\n;; from a regular map. use `instance?`:\n\n;;You can indeed check if the sorted-map is an instance of a clojure.lang.PersistentTreeMap but it won't work for cljs/cljc code.\n\n;; +1 for the use of `map?` and `sorted?` \n\n(and (sorted? m) (map? m))", :_id "5ffec0fee4b0b1e3652d742f"} {:updated-at 1665400786595, :created-at 1665400754728, :author {:login "CapableWeb", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/112625454?v=4"}, :body ";; In ClojureScript, no exception gets thrown if you pass it a map\n;; rather than keyvals, leading to potentially unexpected data\n\n;; In Clojure (1.11.1):\n\n(sorted-map {:b 1 :a 2})\n\n;; Execution error (IllegalArgumentException) at user/eval1 (REPL:1).\n;; No value supplied for key: {:b 1, :a 2}\n\n;; In ClojureScript (1.8.40):\n\n(sorted-map {:b 1 :a 2})\n\n;; => {{:b 1, :a 2} nil}\n\n;; ^ is a sorted map, containing the passed in map as the key, with nil as the value\n\n;; What you probably want instead, as illustrated by the other examples:\n\n(into (sorted-map) {:b 1 :a 2})\n\n;; => {:a 2, :b 1}", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/112625454?v=4", :account-source "github", :login "CapableWeb"}], :_id "6343ffb2e4b0b1e3652d7674"} {:updated-at 1685115685170, :created-at 1685115685170, :author {:login "hoodr", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/15623686?v=4"}, :body ";; sorted-map requires that all keys are of the same type, otherwise the default\n;; clojure compare will throw a ClassCastException when attempt to get/insert\n\n(sorted-map :b \"bar\" :a \"foo\")\n;;=> {:a \"foo\" :b \"bar\"}\n\n(sorted-map \"b\" \"bar\" :a \"foo\")\n;;=> Execution error (ClassCastException) at user/eval1 (REPL:1).\n;;=> class java.lang.String cannot be cast to class clojure.lang.Keyword\n\n;; In addition, if you attempt to access keys of a different type from those\n;; that exist in the sorted-map you'll also get a ClassCastException from the\n;; default compare fn\n\n(def m (sorted-map :b \"bar\" :a \"foo\"))\n\n(get m :a) ;;=> \"foo\"\n\n(get m :b) ;;=> \"bar\"\n\n(get m \"a\")\n;;=> Execution error (ClassCastException) at user/eval1 (REPL:1).\n;; class java.lang.String cannot be cast to class clojure.lang.Keyword\n\n;; If you find yourself in a situation where you cannot guarantee the type of\n;; the key to lookup, you will need to write a custom compare fn and use\n;; sorted-map-by to have the same behavior as PersistentArrayMap and avoid an\n;; exception being thrown.\n\n(def p (sorted-map-by (fn [a b] (try (compare a b) (catch Exception _ 1)))\n :b \"bar\"\n :a \"foo\"))\n\n(get p :a) ;;=> \"foo\"\n\n(get p \"a\") ;;=> nil", :_id "6470d325e4b08cf8563f4bbe"}], :notes [{:body "If transient operations are needed for sorted-map, use [data.avl](https://github.com/clojure/data.avl) instead of this built-in one.", :created-at 1648838946843, :updated-at 1648838981619, :author {:avatar-url "https://avatars.githubusercontent.com/u/889685?v=4", :account-source "github", :login "huahaiy"}, :_id "62474922e4b0b1e3652d75c6"}], :arglists ["& keyvals"], :doc "keyval => key val\n Returns a new sorted map with supplied mappings. If any keys are\n equal, they are handled as if by repeated uses of assoc.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/sorted-map"} {:added "1.0", :ns "clojure.core", :name "send", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1282635091000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "shutdown-agents", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d0a"} {:created-at 1282635102000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "send-off", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d0b"} {:created-at 1282635125000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "agent", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d0c"}], :line 2111, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (def my-agent (agent 100))\n#'user/my-agent\nuser=> @my-agent\n100\n\n;; Note the following happens asynchronously in a thread\n;; pool\nuser=> (send my-agent + 100)\n#\n\n;; Assuming the addition has completed the value will\n;; now be updated when we look at it.\nuser=> @my-agent\n200", :created-at 1282635077000, :updated-at 1332951644000, :_id "542692cbc026201cdc326bf5"} {:updated-at 1508861291847, :created-at 1508861291847, :author {:login "elect000", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/18697629?v=4"}, :body ";; update agent value\nuser => (def foo (agent 100)) \n#'user/my-agent\nuser => @foo\n100\n\n;; function get \"old value\"\nuser => (send foo (fn [old-foo] \n (println old-foo \"foo will change\")\n (+ old-foo 100)))\n100 foo will change\n#agent[{:status :ready, :val 200} 0x000000]\n\nuser => @foo\n200", :_id "59ef656be4b0a08026c48c74"}], :notes [{:body "See \"send-off\" for the differences between \"send\" and \"send-off\".", :created-at 1417371874620, :updated-at 1417371874620, :author {:login "fordsfords", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7671908?v=3"}, :_id "547b60e2e4b03d20a10242ba"}], :arglists ["a f & args"], :doc "Dispatch an action to an agent. Returns the agent immediately.\n Subsequently, in a thread from a thread pool, the state of the agent\n will be set to the value of:\n\n (apply action-fn state-of-agent args)", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/send"} {:added "1.0", :ns "clojure.core", :name "drop-while", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1301365967000, :author {:login "pauldoo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5cb916d3c8abc9f45a093209e72489fb?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "take-while", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e46"} {:created-at 1347077852000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "split-with", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e47"} {:created-at 1473454505566, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "some", :ns "clojure.core"}, :_id "57d321a9e4b0709b524f04f3"}], :line 2952, :examples [{:updated-at 1331882398000, :created-at 1279378804000, :body ";; Note: Documentation should be \"starting from the first item for which\n;; (pred item) returns logical false, i.e. either of the values false or nil.\n\nuser=> (drop-while neg? [-1 -2 -6 -7 1 2 3 4 -5 -6 0 1])\n(1 2 3 4 -5 -6 0 1)\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692cfc026201cdc326e45"} {:updated-at 1518209200339, :created-at 1518209200339, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body "(def my-vec [1 2 3 4 5 6])\n\n(drop-while #(> 3 %) my-vec)\n;;(3 4 5 6)\n\n(drop-while #(>= 3 %) my-vec)\n;;(4 5 6)\n\n;;Returns a lazy sequence of the items in coll starting from the\n;;first item for which (pred item) returns logical FALSE", :_id "5a7e08b0e4b0316c0f44f8b3"}], :notes [{:updated-at 1280202567000, :body "The description of this function is throwing me off. I think it should say: returns a sequence of items from `coll` dropping the initial items that evaluate to true when passed to `pred`, once a non-true value is encountered, the rest of the list is returned.", :created-at 1280202567000, :author {:login "Jacolyte", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f8c"}], :arglists ["pred" "pred coll"], :doc "Returns a lazy sequence of the items in coll starting from the\n first item for which (pred item) returns logical false. Returns a\n stateful transducer when no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/drop-while"} {:ns "clojure.core", :name "proxy-call-with-super", :file "clojure/core_proxy.clj", :type "function", :column 1, :see-alsos nil, :line 384, :examples nil, :notes nil, :arglists ["call this meth"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/proxy-call-with-super"} {:added "1.3", :ns "clojure.core", :name "realized?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1334256253000, :author {:login "tcrawley", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9262893211442b0081f2bcd75bfd47f3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "promise", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c53"} {:created-at 1334256260000, :author {:login "tcrawley", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9262893211442b0081f2bcd75bfd47f3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "delay", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c54"} {:created-at 1334256266000, :author {:login "tcrawley", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9262893211442b0081f2bcd75bfd47f3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "future", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c55"}], :line 7533, :examples [{:author {:login "neotyk", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/366ff985977b3aab09510bc335cd44a4?r=PG&default=identicon"}, :editors [], :body ";; Create a promise\nuser> (def p (promise))\n#'user/p ; p is our promise\n\n;; Check if was delivered/realized\nuser> (realized? p)\nfalse ; No yet\n\n;; Delivering the promise\nuser> (deliver p 42)\n#\n\n;; Check again if it was delivered\nuser> (realized? p)\ntrue ; Yes!\n\n;; Deref to see what has been delivered\nuser> @p\n42\n\n;; Note that @ is shorthand for deref\nuser> (deref p)\n42", :created-at 1329847539000, :updated-at 1329847539000, :_id "542692d5c026201cdc327063"} {:body ";; For lazy sequences\n\nuser=> (def r (range 5))\n#'user/r\nuser=> (realized? r)\nfalse\nuser=> (first r)\n0\nuser=> (realized? r)\ntrue\n\n; As of Clojure 1.7.0 range may return things other than a LazySeq.\n; see https://groups.google.com/forum/#!topic/clojure/NFwHkZxUFuY\n; and another example here.\n\nuser=> (def r (lazy-seq (range 5)))\n#'user/r\nuser=> (realized? r)\nfalse\nuser=> (first r)\n0\nuser=> (realized? r)\ntrue", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423041981596, :updated-at 1646323852599, :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/6127708?v=3", :account-source "github", :login "mhuerster"} {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}], :_id "54d1e5bde4b081e022073c56"} {:updated-at 1609789065763, :created-at 1609789065763, :author {:login "timrobinson33", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/57178390?v=4"}, :body ";; Note that for delay (but not future), if the body is currently executing\n;; realized? will block until it completes.", :_id "5ff36e89e4b0b1e3652d7427"} {:editors [{:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}], :body ";; realized? does not work with all lazy sequences (since Clojure 1.7.0),\n;; and some functions that return lazy sequences might not always return\n;; a sequence to which realized? is applicable.\n\n;; realized? works with a bare call to range:\nuser=> (realized? (range))\ntrue\nuser=> (realized? (rest (range)))\nfalse\n;; but not when range is given an argument:\nuser=> (realized? (range 10000))\nExecution error (ClassCastException) at user/eval2036 (form-init1890379966749060098.clj:1).\nclojure.lang.LongRange cannot be cast to clojure.lang.IPending\n\n;; The reason is that range returns instances of different classes:\nuser=> (class (range))\nclojure.lang.Iterate\nuser=> (class (range 10000))\nclojure.lang.LongRange\n\n;; repeat is another example:\nuser=> (realized? (repeat 10000))\nExecution error (ClassCastException) at user/eval5991 (form-init1890379966749060098.clj:1).\nclojure.lang.Repeat cannot be cast to clojure.lang.IPending\nuser=> (class (repeat 10000))\nclojure.lang.Repeat\n\n;; All of the sequences returned above behave lazily, however.\n\n;; The upshot is that realized? is not considered an important tool for use\n;; with lazy sequences and probably shouldn't be depended on, except in \n;; special cases.\n\n;; As noted in another example, there's an old discussion here:\n;; https://groups.google.com/forum/#!topic/clojure/NFwHkZxUFu", :author {:avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4", :account-source "github", :login "mars0i"}, :created-at 1646325203994, :updated-at 1646325368517, :_id "6220edd3e4b0b1e3652d75b1"}], :notes nil, :arglists ["x"], :doc "Returns true if a value has been produced for a promise, delay, future or lazy sequence.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/realized_q"} {:added "1.1", :ns "clojure.core", :name "char-array", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1293675171000, :author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "into-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bd9"} {:created-at 1293675177000, :author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "to-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bda"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "chars", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917444000, :_id "542692eaf6e94c6970521bdb"}], :line 5301, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [], :body "user> (char-array \"asdf\")\n#\n\nuser> (seq (char-array \"asdf\"))\n(\\a \\s \\d \\f)\n\nuser> (seq (char-array 10))\n(\\^@ \\^@ \\^@ \\^@ \\^@ \\^@ \\^@ \\^@ \\^@ \\^@)", :created-at 1293675165000, :updated-at 1293675165000, :_id "542692c7c026201cdc32698c"} {:updated-at 1563833139082, :created-at 1563833139082, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; `slurp` is polymorphic and supports many types. Sometimes you \n;; need to `slurp` a generic argument that could be already a string\n;; (perhaps it was loaded somewhere else). Use `char-array` to convert\n;; the string into a format suitable for `slurp`:\n\n(defn fetch [x]\n (slurp (if (string? x) (char-array x) x)))\n \n(take 10 (fetch \"http://clojure.org\"))\n;;(\\h \\t \\t \\p \\: \\/ \\/ \\c \\l \\o)\n(take 10 (fetch \"Also loading from a string\"))\n;; (\\A \\l \\s \\o \\space \\l \\o \\a \\d \\i)", :_id "5d363333e4b0ca44402ef78a"}], :notes nil, :arglists ["size-or-seq" "size init-val-or-seq"], :doc "Creates an array of chars", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/char-array"} {:added "1.0", :ns "clojure.core", :name "resolve", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1289660999000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ns-resolve", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c5e"} {:created-at 1450428036535, :author {:login "blx", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/887504?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "symbol", :ns "clojure.core"}, :_id "5673c684e4b09a2675a0ba7a"} {:created-at 1571179430280, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "deref", :ns "clojure.core"}, :_id "5da64ba6e4b0ca44402ef7ce"} {:created-at 1654081047171, :author {:login "PEZ", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/30010?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "requiring-resolve", :ns "clojure.core"}, :_id "62974617e4b0b1e3652d75f5"}], :line 4372, :examples [{:author {:login "jonase", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5e0b0bd287633db6fccf32a2aa5efd42?r=PG&default=identicon"}, :editors [{:login "jonase", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5e0b0bd287633db6fccf32a2aa5efd42?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> ((-> \"first\" symbol resolve) [1 2 3])\n1", :created-at 1280971203000, :updated-at 1332950641000, :_id "542692cdc026201cdc326cde"} {:author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :editors [], :body ";; See also http://clojure.org/namespaces for information on namespaces in Clojure and how to inspect and manipulate them", :created-at 1348479395000, :updated-at 1348479395000, :_id "542692d5c026201cdc327074"} {:body "user=> (resolve 'x)\nnil\nuser=> (def x 1)\n#'user/x\nuser=> (resolve 'x)\n#'user/x\n\nuser=> (resolve 'join)\nnil\nuser=> (use '[clojure.string :only [join]])\nnil\nuser=> (resolve 'join)\n#'clojure.string/join\n\nuser=> (join \", \" [\"a\" \"b\"])\n\"a, b\"\nuser=> ((resolve 'join) \", \" [\"a\" \"b\"])\n\"a, b\"", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423094803389, :updated-at 1423094803389, :_id "54d2b413e4b081e022073c61"} {:updated-at 1533277711352, :created-at 1533277711352, :author {:login "philoskim", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/5637280?v=4"}, :body "user=> (resolve 'Exception)\njava.lang.Exception\n\nuser=> (type (resolve 'Exception))\njava.lang.Class\n", :_id "5b63f60fe4b00ac801ed9e46"} {:updated-at 1545993870224, :created-at 1545992641368, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Also resolve Array classes\n(resolve (symbol \"[I\"))\n;; [I", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5c25f9c1e4b0ca44402ef5f9"} {:updated-at 1545994118006, :created-at 1545994118006, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Also takes a set/map of symbols to ignore while resolving.\n\n(defn replace-var [name value]\n (let [protected #{'+ '- '* '/}]\n (when (resolve protected name)\n (intern *ns* name value))))\n\n(replace-var 'first last)\n(first [1 2 3 4])\n;; 4\n\n;; plus is protected.\n(replace-var '+ -)\n(+ 1 1)\n;; 2", :_id "5c25ff86e4b0ca44402ef5fe"} {:updated-at 1645559019391, :created-at 1645559019391, :author {:login "tekacs", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/63247?v=4"}, :body ";; Also works fine on namespaced symbols\n\n;; some-ns\n(def x 1)\n\n;; other-ns\n@(resolve 'some-ns/x)\n;; 1", :_id "62153cebe4b0b1e3652d75ad"}], :notes nil, :arglists ["sym" "env sym"], :doc "same as (ns-resolve *ns* symbol) or (ns-resolve *ns* &env symbol)", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/resolve"} {:added "1.0", :ns "clojure.core", :name "compare", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1361334293000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sort-by", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e7f"} {:created-at 1361334307000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sorted-set-by", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e80"} {:created-at 1361334315000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sorted-map-by", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e81"} {:created-at 1548959861545, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "==", :ns "clojure.core"}, :_id "5c534075e4b0ca44402ef660"}], :line 831, :examples [{:updated-at 1450882235668, :created-at 1313565230000, :body ";; various examples\n;; comparing vectors of different sizes does not work as you may expect\n;; the longer vector is always \"greater\" regardless of contents \n\nuser=> (compare [0 1 2] [0 1 2])\n0\nuser=> (compare [1 2 3] [0 1 2 3])\n-1\nuser=> (compare [0 1 2] [3 4])\n1\nuser=> (compare nil [1 2 3])\n-1\nuser=> (compare [1 2 3] nil)\n1\nuser=> (compare [2 11] [99 1])\n-1\nuser=> (compare \"abc\" \"def\")\n-3\nuser=> (compare \"abc\" \"abd\")\n-1", :editors [{:avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon", :account-source "clojuredocs", :login "shockbob"} {:avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon", :account-source "clojuredocs", :login "shockbob"} {:login "liango2", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5696817?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon", :account-source "clojuredocs", :login "shockbob"}, :_id "542692ccc026201cdc326cc6"} {:editors [{:login "nwallace", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1614172?v=3"}], :body ";; number comparisons give results of either 1, 0 or -1\n(compare 1 0) ;; => 1\n(compare 1 1) ;; => 0\n(compare 1 2) ;; => -1\n(compare 1 3) ;; => -1\n\n;; string comparisons give results of the distance between the first characters\n(compare \"B\" \"A\") ;; => 1\n(compare \"B\" \"B\") ;; => 0\n(compare \"B\" \"C\") ;; => -1\n(compare \"AA\" \"ZZ\") ;; => -25\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/1614172?v=3", :account-source "github", :login "nwallace"}, :created-at 1458443574384, :updated-at 1458443996870, :_id "56ee1536e4b09295d75dbf2e"} {:updated-at 1490657533575, :created-at 1490657533575, :author {:login "ercliou", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/6700692?v=3"}, :body "(compare true false)\n;;=> 1\n(compare false true)\n;;=> -1\n(compare true true)\n;;=> 0\n(compare false false)\n;;=> 0", :_id "58d9a0fde4b01f4add58fe79"} {:editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}], :body ";; `compare` is the default comparator for sorting with `sort` and\n;; `sort-by`, for ordering the elements of a `sorted-set`, and for\n;; ordering the keys of a `sorted-map`.\n\n;; See https://clojure.org/guides/comparators for advice on writing\n;; your own custom comparators.\n\n;; As for all 3-way comparators, compare takes two arguments `x` and\n;; `y`. It returns an int (i.e. a Java 32-bit Integer) that is\n;; negative if `x` should come before `y`, positive if `x` should come\n;; after `y`, or 0 if they are equal.\n\n;; `compare` works for many types of values, ordering values as\n;; follows.\n\n;; Numbers are sorted in increasing numeric order, returning 0 if two\n;; numbers are numerically equal by `==`, even if `=` returns false\n\nuser=> (sort [22/7 2.71828 ##-Inf 1 55 3N])\n(##-Inf 1 2.71828 3N 22/7 55)\n\n;; Regular sets use `=` for detecting duplicates, so all of the\n;; numbers in this example are considered distinct elements. Numbers\n;; in different \"categories\" (integer & ratio, floating point,\n;; BigDecimal) are never `=` to each other.\nuser=> (set [1.5 1.5M 3/2])\n#{1.5 3/2 1.5M}\n\n;; Sorted sets use `compare` for detecting duplicates, which is more\n;; like `==` for determining when numbers have the same numeric value\n;; regardless of \"category\", so all of the numbers in this example are\n;; considered equal. Thus only the first one is added.\nuser=> (sorted-set 1.5 1.5M 3/2)\n#{1.5}\n\n;; An oddity: (compare ##NaN x) and (compare x ##NaN) returns 0 (equal) for any\n;; number x, including ##NaN, but (== ##NaN x) and (== x ##NaN) returns false\n\nuser=> (== 1 ##NaN)\nfalse\nuser=> (compare 1 ##NaN)\n0\nuser=> (== ##NaN ##NaN)\nfalse\nuser=> (compare ##NaN ##NaN)\n0", :author {:avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4", :account-source "github", :login "jafingerhut"}, :created-at 1548617891609, :updated-at 1548789812583, :_id "5c4e08a3e4b0ca44402ef647"} {:updated-at 1548617914105, :created-at 1548617914105, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :body ";; Strings are sorted in lexicographic order, aka dictionary order\n;; (http://en.wikipedia.org/wiki/Lexicographical_order) by their\n;; representation as sequences of UTF-16 code units. This is\n;; alphabetical order (case-sensitive) for strings restricted to the\n;; ASCII subset. See Java documentation of String's `compareTo`\n;; method for additional details on `String` comparison.\n;; https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#compareTo-java.lang.String-\n\nuser=> (sorted-set \"aardvark\" \"boo\" \"a\" \"Antelope\" \"bar\")\n#{\"Antelope\" \"a\" \"aardvark\" \"bar\" \"boo\"}\n\n;; Symbols are sorted by their representation as strings, sorting\n;; first by their namespace name, and if they are in the same\n;; namespace, then by their name. If no namespace is included, those\n;; symbols will be sorted before any symbol with a namespace.\nuser=> (sorted-set 'user/foo 'clojure.core/pprint 'bar\n 'clojure.core/apply 'user/zz)\n#{bar clojure.core/apply clojure.core/pprint user/foo user/zz}\n\n;; Keywords are sorted similarly to symbols.\nuser=> (sorted-map :map-key 10, :amp [3 2 1], :blammo \"kaboom\")\n{:amp [3 2 1], :blammo \"kaboom\", :map-key 10}", :_id "5c4e08bae4b0ca44402ef648"} {:updated-at 1548617930499, :created-at 1548617930499, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :body ";; Vectors are sorted by their length first, from shortest to longest,\n;; then lexicographically among equal-length vectors.\n\nuser=> (sort [[-8 2 5] [-5 -1 20] [1 2] [1 -5] [10000]])\n([10000] [1 -5] [1 2] [-8 2 5] [-5 -1 20])", :_id "5c4e08cae4b0ca44402ef649"} {:updated-at 1548791137396, :created-at 1548617944751, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :body ";; All Java types implementing the `Comparable` interface such as\n;; characters, booleans, `File`, `URI`, and `UUID` are compared via\n;; their `compareTo` methods.\n;; https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html\n\nuser=> (import '(java.util UUID))\njava.util.UUID\nuser=> (def u1 (UUID. 5 10))\n#'user/u1\nuser=> (def u2 (UUID. 5 17))\n#'user/u2\nuser=> (def u3 (UUID. 10 0))\n#'user/u3\nuser=> u1\n#uuid \"00000000-0000-0005-0000-00000000000a\"\nuser=> u2\n#uuid \"00000000-0000-0005-0000-000000000011\"\nuser=> u3\n#uuid \"00000000-0000-000a-0000-000000000000\"\n\nuser=> (sort [u3 u2 u1])\n(#uuid \"00000000-0000-0005-0000-00000000000a\"\n #uuid \"00000000-0000-0005-0000-000000000011\"\n #uuid \"00000000-0000-000a-0000-000000000000\")\n\n;; `nil` can be compared to all values above, and is considered less\n;; than anything else.\n\nuser=> (sort [:ns2/kw1 :ns2/kw2 :ns1/kw2 :kw2 nil])\n(nil :kw2 :ns1/kw2 :ns2/kw1 :ns2/kw2)", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4", :account-source "github", :login "jafingerhut"}], :_id "5c4e08d8e4b0ca44402ef64a"} {:updated-at 1548617960867, :created-at 1548617960867, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :body ";; `compare` throws an exception if given two values whose types are\n;; \"too different\", e.g. it can compare integers, longs, and doubles\n;; to each other, but not strings to keywords or keywords to symbols.\n;; It cannot compare lists, sequences, sets, or maps at all.\n;; See https://clojure.org/guides/comparators for advice on writing\n;; your own custom comparators.\n\nuser=> (sort [5 \"a\"])\nExecution error (ClassCastException) at java.lang.String/compareTo (String.java:111).\njava.lang.Long cannot be cast to java.lang.String\n\nuser=> (sort [:foo 'bar])\nExecution error (ClassCastException) at java.util.TimSort/countRunAndMakeAscending (TimSort.java:355).\nclojure.lang.Keyword cannot be cast to clojure.lang.Symbol\n\nuser=> (sort [#{1 2} #{2 4}])\nExecution error (ClassCastException) at java.util.TimSort/countRunAndMakeAscending (TimSort.java:355).\nclojure.lang.PersistentHashSet cannot be cast to java.lang.Comparable\n\nuser=> (sort [{:a 1 :b 3} {:c -2 :d 4}])\nExecution error (ClassCastException) at java.util.TimSort/countRunAndMakeAscending (TimSort.java:355).\nclojure.lang.PersistentArrayMap cannot be cast to java.lang.Comparable\n\nuser=> (sort [[1 2] '(3 4)])\nExecution error (ClassCastException) at java.util.TimSort/countRunAndMakeAscending (TimSort.java:355).\nclojure.lang.PersistentList cannot be cast to java.lang.Comparable\n\nuser=> (sort [[1 2] (seq [3 4])])\nExecution error (ClassCastException) at java.util.TimSort/countRunAndMakeAscending (TimSort.java:355).\nclojure.lang.PersistentVector$ChunkedSeq cannot be cast to java.lang.Comparable", :_id "5c4e08e8e4b0ca44402ef64b"} {:updated-at 1595864314210, :created-at 1595864314210, :author {:login "uosl", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/3865590?v=4"}, :body ";; You can reverse the sort order returned by `compare` by swapping its arguments.\n\n#(compare %2 %1)\n\nuser=> (sort #(compare %2 %1) [3 2 4 1])\n(4 3 2 1)\n\n;; Source: https://clojure.org/guides/comparators#_reverse_order", :_id "5f1ef4fae4b0b1e3652d7325"}], :notes [{:author {:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}, :updated-at 1526151376043, :created-at 1526151376043, :body "It is clear what `compare` does, but how do you turn its output into an answer to questions like ‘is x less than y’ or ‘is x greater than or equal to y’?\n\nWhile the numeric `<` `<=` `=` `>=` `>` provide that answer in Boolean form right away, with `compare` a second step is required.\n\n ((juxt < <= = >= >) 2 3)\n ;;=> [true true false false false]\n\nHere is a listing of the same relations using `compare`:\n\n ((juxt (comp neg? compare)\n (comp not pos? compare)\n (comp zero? compare)\n (comp not neg? compare)\n (comp pos? compare))\n \"2\" \"3\")\n ;;=> [true true false false false]\n", :_id "5af738d0e4b045c27b7fac66"}], :arglists ["x y"], :doc "Comparator. Returns a negative number, zero, or a positive number\n when x is logically 'less than', 'equal to', or 'greater than'\n y. Same as Java x.compareTo(y) except it also works for nil, and\n compares numbers and collections in a type-independent manner. x\n must implement Comparable", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/compare"} {:added "1.0", :ns "clojure.core", :name "complement", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1301366589000, :author {:login "pauldoo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5cb916d3c8abc9f45a093209e72489fb?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "not", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b3f"}], :line 1433, :examples [{:author {:login "mattdw", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ee24aacb65359196b0a1bad050f9a62f?r=PG&default=identicon"}, :editors [{:login "mattdw", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ee24aacb65359196b0a1bad050f9a62f?r=PG&default=identicon"} {:login "mattdw", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ee24aacb65359196b0a1bad050f9a62f?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; a simple not-empty? predicate\n(def not-empty? (complement empty?))\n;; #'user/not-empty?\n\n(not-empty? []) ;;=> false\n(not-empty? [1 2]) ;;=> true\n\n\n;; a slightly more complex example\n;; this function takes two arguments, and sometimes returns nil\n(defn contains-char? [the-string, the-char]\n (some #(= the-char %) the-string))\n;; #'user/contains-char?\n\n(contains-char? \"abc\" \\b) ;;=> true\n(contains-char? \"abc\" \\j) ;;=> nil\n\n;; define the complement, to check if a char is absent\n(def does-not-contain-char? (complement contains-char?))\n;; #'user/does-not-contain-char?\n\n;; our complement does exactly what we expect\n(does-not-contain-char? \"abc\" \\b) ;;=> false\n(does-not-contain-char? \"abc\" \\j) ;;=> true\n", :created-at 1280324273000, :updated-at 1420648560124, :_id "542692c7c026201cdc3269b7"} {:updated-at 1583065242138, :created-at 1503907232338, :author {:login "MokkeMeguru", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/30849444?v=4"}, :body "(map (complement even?) '(1 2 3 4))\n\n;; return...\n;; (true false true false)\n\n;; see also ...\n(map even? '(1 2 3 4))\n;; (false true false true)\n\n;; WARNING\n;; This function returns ERROR!!!\n(map (not even?) '(1 2 3 4))\n\n(map #(not (even? %)) '(1 2 3 4)) ; This works\n", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/655969?v=4", :account-source "github", :login "kopos"} {:login "wplj", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/12292887?v=4"}], :_id "59a3cda0e4b09f63b945ac53"} {:editors [{:login "kopos", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/655969?v=4"}], :body "(def not-empty? (complement empty?))\n\n(not-empty? \"abcde\")\n;;true\n\n(not-empty? \"\")\n;;false", :author {:avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4", :account-source "github", :login "ibercode"}, :created-at 1518787297119, :updated-at 1542283642709, :_id "5a86dae1e4b0316c0f44f8c8"} {:updated-at 1583065367049, :created-at 1583065367049, :author {:login "wplj", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/12292887?v=4"}, :body ";; flatten function from Clojure core:\n(defn flatten\n \"Takes any nested combination of sequential things (lists, vectors,\n etc.) and returns their contents as a single, flat lazy sequence.\n (flatten nil) returns an empty sequence.\"\n {:added \"1.2\"\n :static true}\n [x]\n (filter (complement sequential?)\n (rest (tree-seq sequential? seq x))))", :_id "5e5ba917e4b087629b5a18af"}], :notes nil, :arglists ["f"], :doc "Takes a fn f and returns a fn that takes the same arguments as f,\n has the same effects, if any, and returns the opposite truth value.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/complement"} {:added "1.4", :ns "clojure.core", :name "*compiler-options*", :type "var", :see-alsos nil, :examples [{:updated-at 1483010010444, :created-at 1483010010444, :author {:login "PetrGlad", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/124476?v=3"}, :body ";; Toggle locals clearing (set it to true to aid with debugging)\n(alter-var-root #'clojure.core/*compiler-options* \n update :disable-locals-clearing not)", :_id "5864efdae4b0fd5fb1cc964a"} {:updated-at 1615669432545, :created-at 1615140629289, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :body ";; If example.clj is on the classpath and contains something like:\n;; (ns example)\n;; (def ^{:t1 \"secret metadata\"\n;; :doc \"here's some useful info\"}\n;; foo 1))\n\n(binding [*compiler-options* {:elide-meta [:doc :t1]}]\n (compile 'example))\n\n;; AOT-compiles \"example.clj\" removing \":doc\" and \":t1\" values from\n;; the constant pool of the generated class.\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "60451715e4b0b1e3652d746f"}], :notes nil, :arglists [], :doc "A map of keys to options.\n Note, when binding dynamically make sure to merge with previous value.\n Supported options:\n :elide-meta - a collection of metadata keys to elide during compilation.\n :disable-locals-clearing - set to true to disable clearing, useful for using a debugger\n Alpha, subject to change.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*compiler-options*"} {:added "1.0", :ns "clojure.core", :name "*print-dup*", :type "var", :see-alsos nil, :examples [{:updated-at 1522749214303, :created-at 1281149003000, :body ";; `*print-dup*` is very handy when we want to write clojure code/data\n;; to a file to read it in later.\n\n(defn serialize\n \"Print a data structure to a file so that we may read it in later.\"\n [data-structure #^String filename]\n (with-out-writer\n (java.io.File. filename)\n (binding [*print-dup* true] (prn data-structure))))\n\n\n;; This allows us to then read in the structure at a later time, like so:\n(defn deserialize [filename]\n (with-open [r (PushbackReader. (FileReader. filename))]\n (read r)))\n\n\nuser=> (deserialize \"config.clj\")\n{:name \"Fred\", :age \"23\"}\n", :editors [{:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/57126d684344e156ede4592945b54366?r=PG&default=identicon", :account-source "clojuredocs", :login "bmillare"} {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692cec026201cdc326da7"}], :notes [{:author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :created-at 1281149184000, :body "It is sometimes preferable (depending on the size of the structure you're serializing) to wrap the `(with-out-writer ...)` inside a `(dorun (with-out-writer ...) nil)` in order to suppress the output at your REPL.", :updated-at 1281149184000, :_id "542692ecf6e94c6970521f93"} {:updated-at 1293075429000, :body "Note, I'm making changes to deserialize, there are a few typos.", :created-at 1293075226000, :author {:login "bmillare", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/57126d684344e156ede4592945b54366?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521faf"}], :arglists [], :doc "When set to logical true, objects will be printed in a way that preserves\n their type when read in later.\n\n Defaults to false.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*print-dup*"} {:added "1.2", :ns "clojure.core", :name "defrecord", :file "clojure/core_deftype.clj", :type "macro", :column 1, :see-alsos [{:created-at 1289817120000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "deftype", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d16"} {:created-at 1289817125000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defstruct", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d17"} {:created-at 1289817134000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defprotocol", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d18"} {:created-at 1416251002018, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:ns "clojure.core", :name "instance?", :library-url "https://github.com/clojure/clojure"}, :_id "546a467ae4b0dc573b892fdb"} {:created-at 1439234754688, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "record?", :ns "clojure.core"}, :_id "55c8fac2e4b0080a1b79cdb8"}], :line 312, :examples [{:author {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"}, :editors [{:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"} {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"} {:login "pvesna", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a9e4f72971f946e55c71222a37d8e947?r=PG&default=identicon"}], :body ";; from Stu's examples:\n\n(defrecord Person [fname lname address])\n-> user.Person\n\n(defrecord Address [street city state zip])\n-> user.Address\n\n(def stu (Person. \"Stu\" \"Halloway\"\n (Address. \"200 N Mangum\"\n \"Durham\"\n \"NC\"\n 27701)))\n-> #'user/stu\n\n(:lname stu)\n-> \"Halloway\"\n\n(-> stu :address :city)\n-> \"Durham\"\n\n(assoc stu :fname \"Stuart\")\n-> #:user.Person{:fname \"Stuart\", :lname \"Halloway\", :address #:user.Address{:street \"200 N Mangum\", :city \"Durham\", :state \"NC\", :zip 27701}}\n\n(update-in stu [:address :zip] inc)\n-> #:user.Person{:fname \"Stu\", :lname \"Halloway\", :address #:user.Address{:street \"200 N Mangum\", :city \"Durham\", :state \"NC\", :zip 27702}}", :created-at 1286314411000, :updated-at 1359584504000, :_id "542692c8c026201cdc326a32"} {:author {:login "puredanger", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/89c8afd032c7b3473f67c9b00d3acd5a?r=PG&default=identicon"}, :editors [{:login "puredanger", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/89c8afd032c7b3473f67c9b00d3acd5a?r=PG&default=identicon"} {:login "puredanger", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/89c8afd032c7b3473f67c9b00d3acd5a?r=PG&default=identicon"} {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"} {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"} {:login "pvesna", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a9e4f72971f946e55c71222a37d8e947?r=PG&default=identicon"}], :body ";; This example shows how to implement a Java interface in defrecord.\n;; We'll implement FileNameMap (because it has a simple interface, \n;; not for its real purpose). \n\n(import java.net.FileNameMap)\n-> java.net.FileNameMap\n\n;; Define a record named Thing with a single field a. Implement\n;; FileNameMap interface and provide an implementation for the single\n;; method: String getContentTypeFor(String fileName)\n(defrecord Thing [a]\n FileNameMap\n (getContentTypeFor [this fileName] (str a \"-\" fileName)))\n-> user.Thing\n\n;; construct an instance of the record\n(def thing (Thing. \"foo\"))\n-> #'user/thing\n\n;; check that the instance implements the interface\n(instance? FileNameMap thing)\n-> true\n\n;; get all the interfaces for the record type\n(map #(println %) (.getInterfaces Thing))\n-> java.net.FileNameMap\n-> clojure.lang.IObj\n-> clojure.lang.ILookup\n-> clojure.lang.IKeywordLookup\n-> clojure.lang.IPersistentMap\n-> java.util.Map\n-> java.io.Serializable\n\n;; actually call the method on the thing instance and pass \"bar\"\n(.getContentTypeFor thing \"bar\")\n-> \"foo-bar\"", :created-at 1290599788000, :updated-at 1359589207000, :_id "542692c8c026201cdc326a36"} {:author {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"}, :editors [{:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"} {:avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3", :account-source "github", :login "bkovitz"} {:login "green-coder", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4"} {:avatar-url "https://avatars.githubusercontent.com/u/4068533?v=4", :account-source "github", :login "lmartelli"}], :body ";; prepare a protocol\nuser=> (defprotocol Fun-Time (drinky-drinky [_]))\nFun-Time\n\n;; define a record and extend the previous protocol, implementing its function\nuser=> (defrecord Someone [nick-name preferred-drink] \n Fun-Time \n (drinky-drinky [_] (str nick-name \"(having \" preferred-drink \"): uuumm\")))\nuser.Someone\n;; NOTE how 'nick-name' and 'preferred-drink' are symbols\n;; that are not declared anywhere, they are 'provided' inside the function\n\n;; instantiate the protocol once and store it\nuser=> (def dude (->Someone \"belun\" \"daiquiri\"))\n#'user/dude\n\n;; use the function defined inside the protocol on the protocol instance\nuser=> (drinky-drinky dude)\n\"belun(having daiquiri): uuumm\"\n\n\n;; courtesy of Howard Lewis Ship - http://java.dzone.com/articles/changes-cascade-and-cautionary", :created-at 1317098332000, :updated-at 1672591553613, :_id "542692d2c026201cdc326f82"} {:updated-at 1442089153715, :created-at 1319420075000, :body "; If you define a defrecord in one namespace and want to use it\n; from another, there are 2 options:\n; 1. use the constructor (->Record) \n; (only available in clojure >= 1.4)\n;\n; 2. first require the namespace and then import\n; the record as a regular class.\n; The require+import order makes sense if you consider that first\n; the namespace has to be compiled--which generates a class for\n; the record--and then the generated class must be imported.\n; (Thanks to raek in #clojure for the explanations!)\n\n; Namespace \"my/data.clj\", where a defrecord is declared\n(ns my.data)\n\n(defrecord Employee [name surname])\n\n; Option 1: \n; Namescape \"my/queries-option-one.clj\", where a defrecord is used\n(ns my-queries-one\n (:use [my.data]))\n\n(println\n \"Employees named Albert:\"\n (filter #(= \"Albert\" (.name %))\n [(->Employee \"Albert\" \"Smith\")\n (->Employee \"John\" \"Maynard\")\n (->Employee \"Albert\" \"Cheng\")]))\n\n; Option 2:\n; Namescape \"my/queries-option-two.clj\", where a defrecord is used\n(ns my.queries-option-two\n (:require my.data)\n (:import [my.data Employee]))\n\n(println\n \"Employees named Albert:\"\n (filter #(= \"Albert\" (.name %))\n [(Employee. \"Albert\" \"Smith\")\n (Employee. \"John\" \"Maynard\")\n (Employee. \"Albert\" \"Cheng\")]))", :editors [{:avatar-url "https://www.gravatar.com/avatar/fea4948490b77a00b8c10bffd792f9d8?r=PG&default=identicon", :account-source "clojuredocs", :login "albertcardona"} {:avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon", :account-source "clojuredocs", :login "Ljos"} {:avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon", :account-source "clojuredocs", :login "Ljos"} {:login "edeustace", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/101623?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/fea4948490b77a00b8c10bffd792f9d8?r=PG&default=identicon", :account-source "clojuredocs", :login "albertcardona"}, :_id "542692d2c026201cdc326f87"} {:author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :editors [], :body ";; The map->Recordclass form works only in Clojure 1.3 or higher\n\n(defrecord Foo [a b])\n\n(defrecord Bar [a b c])\n\n(defrecord Baz [a c])\n\n(def f (Foo. 10 20))\n(println f)\n-> #user.Foo{:a 10, :b 20}\n\n(def r (map->Bar (merge f {:c 30})))\n(println r)\n-> #user.Bar{:a 10, :b 20, :c 30}\n\n(def z (map->Baz (merge f {:c 30})))\n(println z)\n-> #user.Baz{:a 10, :c 30, :b 20}", :created-at 1335392908000, :updated-at 1335392908000, :_id "542692d2c026201cdc326f8b"} {:body ";; Construct a record from a vector.\n(def info [\"Carl\" 20])\n\n(defrecord Person [name age])\n\n(apply ->Person info)\n-> #user.Person{:name \"Carl\", :age 20}\n\n;; This is particularly useful for mapping parsed CSV files to records\n(map #(apply ->Person %) parsed-csv-file)", :author {:login "EduardoMRB", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2163269?v=3"}, :created-at 1419039522858, :updated-at 1419039522858, :_id "5494d322e4b04e93c519ffaa"} {:updated-at 1444173053403, :created-at 1444173053403, :author {:login "minutetominute", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3320594?v=3"}, :body ";; Destructuring a record\n\n(defrecord Cat [age weight])\n\n(def Jasper (Cat. 2 10))\n\n(defn about-cat [{:keys [age weight]}] \n (str age \" yrs old and \" weight \" lbs\"))\n\n(about-cat Jasper)\n->\"2 yrs old and 10 lbs\"", :_id "561454fde4b0b41dac04c953"} {:updated-at 1479124081391, :created-at 1479124081391, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body "(defrecord Person [name age])\n;;=> user.Person\n\n(def ertu (->Person \"Ertu\" 24))\n;;=> #'user/ertu\n\n(record? ertu)\n;;=> true\n\n(record? (assoc ertu :address \"Somewhere\"))\n;;=> true\n\n;;removing base fields converts record to regular map\n(record? (dissoc ertu :name))\n;;=> false", :_id "5829a471e4b0782b632278c0"} {:updated-at 1486752453677, :created-at 1486752453677, :author {:login "bunbutter", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5318739?v=3"}, :body ";;iterate over the keys\n\n;;define the record\n(defrecord record-class [alplha beta])\n\n;;create a defrecord variable\n(def record (record-class. 1 2))\n\n;;iterate over the keys\n(for [key (keys record)]\n (println (key record)))", :_id "589e0ac5e4b01f4add58fe45"} {:updated-at 1510128100976, :created-at 1510128100976, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;define Address record\n(defrecord Address [city state])\n\n;;define Person record\n(defrecord Person [firstname lastname ^Address address])\n\n;;buid the constructor\n(defn make-person ([fname lname city state]\n (->Person fname lname (->Address city state))))\n\n;;create a person\n(def person1 (make-person \"John\" \"Doe\" \"LA\" \"CA\"))\n\n;;retrieve values\n(:firstname person1)\n(:city (:address person1))", :_id "5a02b9e4e4b0a08026c48ca3"} {:updated-at 1649147987152, :created-at 1528333981519, :author {:login "jennydickinson", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1972655?v=4"}, :body ";; Binary Search Tree (variation on implementation by Edd Mann)\n\n(defrecord Node [value left right])\n\n(defn insert [{:keys [value left right] :as node} item]\n (cond\n (nil? node) (->Node item nil nil)\n (< item value) (->Node value (insert left item) right)\n (> item value) (->Node value left (insert right item))\n :else (update node :count (fnil inc 1)))) ; Use of :count, not in defrecord\n\n(defn coll->bst [coll] (reduce insert nil coll))\n\n(coll->bst [10 5 20 10 10])\n=> #example.bst.Node{:value 10,\n :left #example.bst.Node{:value 5, :left nil, :right nil},\n :right #example.bst.Node{:value 20, :left nil, :right nil},\n :count 3}\n", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/1972655?v=4", :account-source "github", :login "jennydickinson"} {:login "mjul", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/142868?v=4"}], :_id "5b18869de4b00ac801ed9e0f"} {:updated-at 1658250170033, :created-at 1658250170033, :author {:login "quoll", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/358875?v=4"}, :body "(defrecord Person [first-name last-name age]\n ;; Provide a default string representation\n Object\n (toString [_] (format \"%s, %s (%d)\" last-name first-name age)))\n\n;; Construct a person with the auto-generated construction function\n(def p (->Person \"Alice\" \"Smith\" 22))\n\n;; use this object in a string\n(str \"The person is: \" p)\n\n;; output:\n;; \"The person is: Smith, Alice (22)\"", :_id "62d6e3bae4b0b1e3652d7628"}], :macro true, :notes [{:updated-at 1302904571000, :body "http://tech.puredanger.com/2010/11/23/implementing-java-interfaces-with-clojure-records/", :created-at 1302904571000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fb9"}], :arglists ["name [& fields] & opts+specs"], :doc "(defrecord name [fields*] options* specs*)\n\n Options are expressed as sequential keywords and arguments (in any order).\n\n Supported options:\n :load-ns - if true, importing the record class will cause the\n namespace in which the record was defined to be loaded.\n Defaults to false.\n\n Each spec consists of a protocol or interface name followed by zero\n or more method bodies:\n\n protocol-or-interface-or-Object\n (methodName [args*] body)*\n\n Dynamically generates compiled bytecode for class with the given\n name, in a package with the same name as the current namespace, the\n given fields, and, optionally, methods for protocols and/or\n interfaces.\n\n The class will have the (immutable) fields named by\n fields, which can have type hints. Protocols/interfaces and methods\n are optional. The only methods that can be supplied are those\n declared in the protocols/interfaces. Note that method bodies are\n not closures, the local environment includes only the named fields,\n and those fields can be accessed directly.\n\n Method definitions take the form:\n\n (methodname [args*] body)\n\n The argument and return types can be hinted on the arg and\n methodname symbols. If not supplied, they will be inferred, so type\n hints should be reserved for disambiguation.\n\n Methods should be supplied for all methods of the desired\n protocol(s) and interface(s). You can also define overrides for\n methods of Object. Note that a parameter must be supplied to\n correspond to the target object ('this' in Java parlance). Thus\n methods for interfaces will take one more argument than do the\n interface declarations. Note also that recur calls to the method\n head should *not* pass the target object, it will be supplied\n automatically and can not be substituted.\n\n In the method bodies, the (unqualified) name can be used to name the\n class (for calls to new, instance? etc).\n\n The class will have implementations of several (clojure.lang)\n interfaces generated automatically: IObj (metadata support) and\n IPersistentMap, and all of their superinterfaces.\n\n In addition, defrecord will define type-and-value-based =,\n and will defined Java .hashCode and .equals consistent with the\n contract for java.util.Map.\n\n When AOT compiling, generates compiled bytecode for a class with the\n given name (a symbol), prepends the current ns as the package, and\n writes the .class file to the *compile-path* directory.\n\n Two constructors will be defined, one taking the designated fields\n followed by a metadata map (nil for none) and an extension field\n map (nil for none), and one taking only the fields (using nil for\n meta and extension fields). Note that the field names __meta,\n __extmap, __hash and __hasheq are currently reserved and should not\n be used when defining your own records.\n\n Given (defrecord TypeName ...), two factory functions will be\n defined: ->TypeName, taking positional parameters for the fields,\n and map->TypeName, taking a map of keywords to field values.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/defrecord"} {:added "1.3", :ns "clojure.core", :name "with-redefs-fn", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1322088065000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-redefs", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d81"}], :line 7498, :examples [{:author {:login "johnnyluu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ba99f2dc1064733c7badbb16db9254a?r=PG&default=identicon"}, :editors [{:login "johnnyluu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ba99f2dc1064733c7badbb16db9254a?r=PG&default=identicon"} {:login "avasenin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/154699?v=3"}], :body "(ns http)\n\n(defn post [url]\n {:body \"Hello world\"})\n\n(ns app\n (:require [clojure.test :refer [run-tests]]))\n\n(deftest is-a-fn\n (with-redefs-fn {#'http/post (fn [url] {:body \"Hello world again\"})}\n #(is (= {:body \"Hello world again\"} (http/post \"http://service.com/greet\")))))\n\n(run-tests) ;; test is passing", :created-at 1350024230000, :updated-at 1352471467000, :_id "542692d6c026201cdc3270c2"} {:author {:login "tonsky", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4188c62c28a196e3e82363217c56fca5?r=PG&default=identicon"}, :editors [], :body "=> (defn f [] false)\n\n=> (println (f))\n;; false\n\n=> (with-redefs-fn {#'f (fn [] true)} \n #(println (f)))\n;; true", :created-at 1352394593000, :updated-at 1352394593000, :_id "542692d6c026201cdc3270c5"} {:updated-at 1452611657323, :created-at 1452611657323, :author {:login "Sangdol", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/803223?v=3"}, :body "(defn add-5 [n] (+ n 5))\n(with-redefs-fn {#'add-5 (fn [n] (+ n 50))}\n #(is (= 60 (add-5 10))))\n\n;; Cannot redefine the reference in the partial function\n(def partial-add-5 (partial add-5))\n(with-redefs-fn {#'add-5 (fn [n] (+ n 50))}\n #(is (= 15 (partial-add-5 10)))) \n", :_id "56951849e4b051fe5ede7753"}], :notes nil, :arglists ["binding-map func"], :doc "Temporarily redefines Vars during a call to func. Each val of\n binding-map will replace the root value of its key which must be\n a Var. After func is called with no args, the root values of all\n the Vars will be set back to their old values. These temporary\n changes will be visible in all threads. Useful for mocking out\n functions during testing.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/with-redefs-fn"} {:added "1.0", :ns "clojure.core", :name "sequence", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1374149058000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "seq", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a7e"} {:created-at 1520634654207, :author {:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "eduction", :ns "clojure.core"}, :_id "5aa30b1ee4b0316c0f44f91a"}], :line 2647, :examples [{:author {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user> (sequence [1 2 3])\n(1 2 3)\nuser> (class (sequence '(1 2 3)))\nclojure.lang.PersistentList", :created-at 1307740020000, :updated-at 1423275662256, :_id "542692c8c026201cdc326a16"} {:updated-at 1477624741486, :created-at 1477624741486, :author {:login "G1enY0ung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/15034155?v=3"}, :body ";; let us make a transducer\nuser=> (def xf (comp (filter odd?) (take 5)))\n#'user/xf\nuser=> (sequence xf (range 1 10))\n(1 3 5 7 9)", :_id "5812c3a5e4b024b73ca35a1c"} {:updated-at 1519251895765, :created-at 1519251895765, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :body ";; turns a string into a sequence of characters:\n(sequence \"abc\")\n=> (\\a \\b \\c)", :_id "5a8df1b7e4b0316c0f44f8e4"} {:updated-at 1646145858679, :created-at 1519691165450, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body ";; combine a bunch of collections together\n(sequence cat [[1 2 3] [5 6 7] [8 9 0]])\n;=> (1 2 3 5 6 7 8 9 0) \n(sequence cat [ '(1 2 3) '(5 6 7) '(8 9 0) ])\n;=> (1 2 3 5 6 7 8 9 0)", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"} {:login "siddharthjain-in", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6537820?v=4"}], :_id "5a94a59de4b0316c0f44f8fb"} {:updated-at 1585287974225, :created-at 1585287974225, :author {:login "green-coder", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4"}, :body ";; When called with multiples collections.\n\n(sequence (map vector) [1 2 3] [:a :b :c])\n;=> ([1 :a] [2 :b] [3 :c])", :_id "5e7d9326e4b087629b5a18c4"} {:updated-at 1614561640162, :created-at 1614561640162, :author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :body ";; Comparison to seq\n(def v [1 2 3])\n(def l '(1 2 3))\n(def ss (sorted-set 1 2 3))\n(= (seq [1 2 3]) (sequence [1 2 3])) ;;=> true\n(= (sequence v) (seq v)) ;;=> true\n(= (sequence l) (seq l)) ;;=> true\n(= (sequence ss) (seq ss)) ;;=> true\n\n;; Comparison for non-ordered stuff\n(def m {:a 1 :b 2 :c 3})\n(def s #{1 2 3})\n(sequence m) ;;=> ([:a 1] [:b 2] [:c 3])\n(seq m) ;;=> ([:a 1] [:b 2] [:c 3])\n(sequence s) ;;=> (1 3 2)\n(seq s) ;;=> (1 3 2)", :_id "603c4168e4b0b1e3652d7469"}], :notes [{:author {:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}, :updated-at 1520634679847, :created-at 1520634679847, :body "Interesting background about `sequence` versus `eduction`: https://groups.google.com/d/msg/clojure/9I6MtgOTD0w/NiG5PimBCP8J", :_id "5aa30b37e4b0316c0f44f91b"}], :arglists ["coll" "xform coll" "xform coll & colls"], :doc "Coerces coll to a (possibly empty) sequence, if it is not already\n one. Will not force a lazy seq. (sequence nil) yields (), When a\n transducer is supplied, returns a lazy sequence of applications of\n the transform to the items in coll(s), i.e. to the set of first\n items of each coll, followed by the set of second\n items in each coll, until any one of the colls is exhausted. Any\n remaining items in other colls are ignored. The transform should accept\n number-of-colls arguments", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/sequence"} {:added "1.0", :ns "clojure.core", :name "constantly", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1345605389000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "repeatedly", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aa4"} {:created-at 1544362994989, :author {:login "Ramblurr", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/14830?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "identity", :ns "clojure.core"}, :_id "5c0d1bf2e4b0ca44402ef5ea"}], :line 1445, :examples [{:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (def boring (constantly 10))\n#'user/boring\n\nuser=> (boring 1 2 3)\n10\n\nuser=> (boring)\n10\n\nuser=> (boring \"Is anybody home?\")\n10\n", :created-at 1282320404000, :updated-at 1413580544498, :_id "542692cbc026201cdc326c18"} {:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4", :account-source "github", :login "green-coder"}], :body ";; A really goofy way to find the size of a collection\nuser=> (reduce + (map (constantly 1) [:a :b :c]))\n3", :created-at 1310850642000, :updated-at 1554005351294, :_id "542692cbc026201cdc326c1a"} {:author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :editors [{:login "donkey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b1c297c3ac97ef732eb689213c3337b9?r=PG&default=identicon"} {:login "donkey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b1c297c3ac97ef732eb689213c3337b9?r=PG&default=identicon"}], :body ";; constantly returns a function which always returns the same value\n(map (constantly 9) [1 2 3])\nuser=> (9 9 9)\n\n(map (constantly (rand-int 100)) [:a :b :c])\nuser=> (43 43 43)", :created-at 1342722368000, :updated-at 1345367153000, :_id "542692d2c026201cdc326f72"} {:editors [{:avatar-url "https://avatars.githubusercontent.com/u/9038715?v=2", :account-source "github", :login "icemaze"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:login "Jjunior130", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7597818?v=3"}], :updated-at 1483822847346, :created-at 1412612363149, :author {:avatar-url "https://avatars.githubusercontent.com/u/9038715?v=2", :account-source "github", :login "icemaze"}, :body ";; 'Removed' example that was more about transducers than `constantly`.\n\n:O", :_id "5432c10be4b0069c44347255"}], :notes [{:updated-at 1291196938000, :body "any examples of when this would be useful? I think it is weird to want a function that always returns \"x\" regardless of the number of arguments passed to it - however since this exists in core I'm sure it is sensible, more a case of I've not enough experience to appreciate its value.", :created-at 1291196938000, :author {:login "ossareh", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9d0f447aca573ecf21a45c9272211140?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fa7"} {:updated-at 1292309493000, :body "I asked about use cases for this function in #clojure and got a good response from amalloy:\r\n\r\nSay you want to call a library function that asks you to pass it a function; it's going to call that function ten times with different arguments to decide how to populate a list it gives you. But your program is really simple and you want the list to just be full of zeroes. So you call:\r\n\r\n (libfn (constantly 0))\r\n\r\nHope that's useful!", :created-at 1292309381000, :author {:login "clizzin", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/555813697e5dc358bb27d5efd3ffa23?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fae"} {:author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :created-at 1306502622000, :body "(constantly 1) is often useful when it comes to testing. You can think of it like you would a \"stub\".", :updated-at 1306502622000, :_id "542692ecf6e94c6970521fbe"} {:updated-at 1403826661000, :body "constantly is typically used as an argument to a higher order function when a constant value is needed. ", :created-at 1403826661000, :author {:login "phreed", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a0c739cf289be18be932dc3022e6fd3?r=PG&default=identicon"}, :_id "542692edf6e94c697052202b"} {:body "It is also quite useful in unit tests:\n\n
    \n(deftest foo\n  (testing \"Clojure tweets only\"\n    (with-redefs [twitter/get-tweets\n                  (constantly [\"#clojure is awesome!\" \"Yay! #winning\"])]\n      (is (= [\"#clojure is awesome!\"]\n             (only-clojure \"@happyguy\"))))))\n
    \n", :created-at 1413545107841, :updated-at 1413545107841, :author {:login "jmglov", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/224070?v=2"}, :_id "5440fc93e4b049fc676849cc"} {:body "Basically, when you already know the result of a function that you would need\nto pass to a higher order function, you can simply wrap it in a constantly to\navoid creating a variadic anonymous function.\n\n (defn hof [f]\n (do-something-with (f ...))\n\n (def x \"result\")\n\n (hof (constantly x)) ", :created-at 1428223494135, :updated-at 1428223494135, :author {:login "dexterous", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94739?v=3"}, :_id "5520f606e4b0b96203a0d59c"} {:author {:login "bradleesand", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/810411?v=3"}, :updated-at 1484963377505, :created-at 1484963377505, :body "I've used this to create a `no-op` function.\n\n```clojure\n(let [handler (if (some? value)\n #(do-something-with value)\n ; else no-op\n (constantly nil))]\n ; call handler\n (handler \"foo\" \"bar\"))\n```", :_id "5882be31e4b01f4add58fe2c"} {:author {:login "defHLT", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1539296?v=4"}, :updated-at 1517096514668, :created-at 1517096514668, :body "Just a shortcut to
    (fn [& args] x)
    \n", :_id "5a6d0e42e4b0c974fee49d0f"}], :arglists ["x"], :doc "Returns a function that takes any number of arguments and returns x.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/constantly"} {:added "1.0", :ns "clojure.core", :name "get-proxy-class", :file "clojure/core_proxy.clj", :type "function", :column 1, :see-alsos [{:created-at 1539820739801, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "construct-proxy", :ns "clojure.core"}, :_id "5bc7ccc3e4b00ac801ed9edd"}], :line 276, :examples [{:updated-at 1539820731584, :created-at 1539820731584, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; generates a new Java class extending/implementing the given classes/interfaces:\n;; See \"construct-proxy\" on how to get an instance.\n\n(import '[clojure.lang IDeref IObj])\n(def DocumentException (get-proxy-class Exception IDeref))\n\n(type DocumentException)\n;; java.lang.Class\n\n(ancestors DocumentException)\n;; #{java.io.Serializable \n;; clojure.lang.IProxy \n;; java.lang.Exception \n;; clojure.lang.IDeref \n;; java.lang.Object \n;; java.lang.Throwable}\n", :_id "5bc7ccbbe4b00ac801ed9edc"}], :notes nil, :arglists ["& bases"], :doc "Takes an optional single class followed by zero or more\n interfaces. If not supplied class defaults to Object. Creates an\n returns an instance of a proxy class derived from the supplied\n classes. The resulting value is cached and used for any subsequent\n requests for the same class set. Returns a Class object.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/get-proxy-class"} {:added "1.0", :ns "clojure.core", :name "make-array", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1299713235000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "int-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f6c"} {:created-at 1299713241000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "double-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f6d"} {:created-at 1299713244000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "float-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f6e"} {:created-at 1299713281000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "short-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f6f"} {:created-at 1299713289000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "long-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f70"} {:created-at 1299713301000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "char-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f71"} {:created-at 1299713305000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "byte-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f72"} {:created-at 1299713311000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "boolean-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f73"} {:created-at 1299713319000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "object-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f74"} {:created-at 1299713350000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "to-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f75"} {:created-at 1299713355000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "to-array-2d", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f76"} {:created-at 1299713359000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "into-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f77"} {:created-at 1299713411000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "aget", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f78"} {:created-at 1299713415000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "aset", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f79"} {:created-at 1299713422000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "alength", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f7a"} {:created-at 1299713425000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "amap", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f7b"} {:created-at 1299713428000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "areduce", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f7c"}], :line 3986, :examples [{:author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :editors [{:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}], :body "(make-array Integer/TYPE 3)\n\n; Types are defined in clojure/genclass.clj:\n; Boolean/TYPE\n; Character/TYPE\n; Byte/TYPE\n; Short/TYPE\n; Integer/TYPE\n; Long/TYPE\n; Float/TYPE\n; Double/TYPE\n; Void/TYPE", :created-at 1299713202000, :updated-at 1423783350038, :_id "542692cec026201cdc326dfb"} {:author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :editors [{:login "kawas44", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbe17f4245ddacea6f46aaff3b051429?r=PG&default=identicon"}], :body "user=> (pprint (make-array Double/TYPE 3))\n[0.0, 0.0, 0.0]\n\nuser=> (pprint (make-array Integer/TYPE 2 3))\n[[0, 0, 0], [0, 0, 0]]\n\n\n;; Create an array of Threads, then show content and type\nuser=> (def ar (make-array Thread 3))\n#'user/ar\n\nuser=> (pprint ar)\n[nil, nil, nil]\n\nuser=> (type ar)\n[Ljava.lang.Thread;\n", :created-at 1299713210000, :updated-at 1331510349000, :_id "542692cec026201cdc326dfc"}], :notes nil, :arglists ["type len" "type dim & more-dims"], :doc "Creates and returns an array of instances of the specified class of\n the specified dimension(s). Note that a class object is required.\n Class objects can be obtained by using their imported or\n fully-qualified name. Class objects for the primitive types can be\n obtained using, e.g., Integer/TYPE.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/make-array"} {:added "1.1", :ns "clojure.core", :name "shorts", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "short-array", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917710000, :_id "542692ebf6e94c6970521f31"}], :line 5363, :examples [{:updated-at 1656674521947, :created-at 1656674521947, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; short-array will convert where possible\n(short-array [32767 32768 32769]);; => [32767, -32768, -32767]\n\n;; shorts will not\n(try (shorts [32767 32768 32769])\n (catch ClassCastException e (ex-message e)))\n;; => \"clojure.lang.PersistentVector cannot be cast to [S\"\n", :_id "62bed8d9e4b0b1e3652d7619"} {:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; Casting avoids expensive reflection, so to see the benefit, enable warning:\n(set! *warn-on-reflection* true)\n\n;; We'll def a short-array but won't type-hint the var:\n(def my-array (short-array [10 20 30 40 50 60]))\n\n;; and try to amap over it without using `shorts` or type hinting:\n(amap my-array i _ (unchecked-short (unchecked-inc (aget my-array i))))\n;; Reflection warning… call to static method alength on clojure.lang.RT can't be resolved (argument types: unknown).\n;; Reflection warning… call to static method aclone on clojure.lang.RT can't be resolved (argument types: unknown).\n;; Reflection warning… call to static method aget on clojure.lang.RT can't be resolved (argument types: unknown, int).\n;; Reflection warning… call to static method aset on clojure.lang.RT can't be resolved (argument types: unknown, int, short).\n;; => [11, 21, 31, 41, 51, 61]\n\n;; We can use `shorts` to avoid reflection:\n(amap (shorts my-array) i _ (unchecked-short (unchecked-inc (aget (shorts my-array) i))))\n;; => [11, 21, 31, 41, 51, 61]\n\n;; Just as we can type hint in place:\n(amap ^shorts my-array i _ (unchecked-short (unchecked-inc (aget ^shorts my-array i))))\n;; => [11, 21, 31, 41, 51, 61]\n\n;; Or type hint the var:\n(def ^\"[S\" my-array (short-array [10 20 30 40 50 60]))\n(amap my-array i _ (unchecked-short (unchecked-inc (aget my-array i))))\n;; => [11, 21, 31, 41, 51, 61]\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4", :account-source "github", :login "tomdl89"}, :created-at 1682270458965, :updated-at 1682271131562, :_id "644568fae4b08cf8563f4b8f"}], :notes nil, :arglists ["xs"], :doc "Casts to shorts[]", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/shorts"} {:added "1.7", :ns "clojure.core", :name "completing", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1510099302386, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "transduce", :ns "clojure.core"}, :_id "5a024966e4b0a08026c48c9c"}], :line 6858, :examples [{:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}], :body ";; Fix apparently inconsistent behaviour of \"-\" (minus) with transduce:\n(transduce (map inc) - 0 (range 10))\n;; 55\n(transduce (map inc) (completing -) 0 (range 10))\n;; -55", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1509576734100, :updated-at 1620508070476, :_id "59fa501ee4b0a08026c48c8d"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; the reducing fn arity-1 executes the last transformation in transduce.\n;; completing defaults to \"identity\" but you can change it.\n;; Use this fact for example with transients and go back to persistent once done.\n(require '[clojure.string :refer [lower-case]])\n(transduce\n (comp\n (remove nil?)\n (map lower-case))\n (completing #(assoc! %1 %2 (inc (get %1 %2 0))) persistent!)\n (transient {})\n [\"hi\" \"ho\" \"Hello\" \"hoi\" \"Hi\" \"Ha\" \"ha\" \"hello\"])\n;; {\"hi\" 2, \"ho\" 1, \"hello\" 2, \"hoi\" 1, \"ha\" 2}", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1510933087748, :updated-at 1510936504930, :_id "5a0f025fe4b0a08026c48cbe"} {:updated-at 1670417339254, :created-at 1670417339254, :author {:login "naxels", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3195443?v=4"}, :body ";; Example calculating the average from \n;; https://aphyr.com/posts/360-loopr-a-loop-reduction-macro-for-clojure#comment-3800\n\n(transduce (map inc)\n (completing (fn [[sum cnt] x] [(+ sum x) (inc cnt)])\n (fn [[sum cnt]] (/ sum cnt)))\n [0 0]\n (range 7))\n\n;; 4", :_id "63908bbbe4b0b1e3652d7696"}], :notes nil, :arglists ["f" "f cf"], :doc "Takes a reducing function f of 2 args and returns a fn suitable for\n transduce by adding an arity-1 signature that calls cf (default -\n identity) on the result argument.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/completing"} {:added "1.0", :ns "clojure.core", :name "update-proxy", :file "clojure/core_proxy.clj", :type "function", :column 1, :see-alsos [{:created-at 1539943028356, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "init-proxy", :ns "clojure.core"}, :_id "5bc9aa74e4b00ac801ed9ee8"}], :line 308, :examples [{:author {:login "jneira", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2c8ecc24181d171df85a26458b9cd5f?r=PG&default=identicon"}, :editors [], :body ";; from http://groups.google.com/group/clojure/msg/71702435ccd1d189\nuser> (import java.util.Date)\njava.util.Date\n\nuser> (def d (proxy [Date] [] (toString [] \"hello\")))\n#'user/d\n\nuser> d\n#\n\nuser> (.toString d)\n\"hello\"\n\nuser> (.toGMTString d)\n\"17 Nov 2010 12:57:28 GMT\"\n\nuser> (update-proxy d {\"toGMTString\" (fn [this] \"goodbye\")})\nnil\n\nuser> (.toGMTString d)\n\"goodbye\" ", :created-at 1290029291000, :updated-at 1290029291000, :_id "542692cdc026201cdc326d30"}], :notes nil, :arglists ["proxy mappings"], :doc "Takes a proxy instance and a map of strings (which must\n correspond to methods of the proxy superclass/superinterfaces) to\n fns (which must take arguments matching the corresponding method,\n plus an additional (explicit) first arg corresponding to this, and\n updates (via assoc) the proxy's fn map. nil can be passed instead of\n a fn, in which case the corresponding method will revert to the\n default behavior. Note that this function can be used to update the\n behavior of an existing instance without changing its identity.\n Returns the proxy.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/update-proxy"} {:added "1.0", :ns "clojure.core", :name "unchecked-negate-int", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 1177, :examples [{:author {:login "Jens", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7f9a46b88f30d9461fea5670fd185f65?r=PG&default=identicon"}, :editors [], :body "user=> (unchecked-negate-int 4)\n-4\nuser=> (unchecked-negate-int 0)\n0\nuser=> (unchecked-negate-int -7)\n7\nuser=> (unchecked-negate-int Integer/MAX_VALUE)\n-2147483647\nuser=> (unchecked-negate-int Integer/MIN_VALUE) ;overflow\n-2147483648", :created-at 1331729438000, :updated-at 1331729438000, :_id "542692d5c026201cdc3270ae"}], :notes nil, :arglists ["x"], :doc "Returns the negation of x, an int.\n Note - uses a primitive operator subject to overflow.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-negate-int"} {:added "1.6", :ns "clojure.core", :name "hash-unordered-coll", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1495647921750, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "hash", :ns "clojure.core"}, :_id "5925c6b1e4b093ada4d4d735"} {:created-at 1495647929367, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "hash-ordered-coll", :ns "clojure.core"}, :_id "5925c6b9e4b093ada4d4d736"}], :line 5195, :examples [{:editors [{:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}], :body ";;;; Clojure's (hash-unordered-coll) ALWAYS produces the same hash code EVEN:\n;;;; (1) for different collection types\n;;;; (2) for differently ordered collections of the same type\n;;;; AS LONG AS the collections contain the same elements \n\n(hash-unordered-coll #{1 2})\n;;=> 460223544\n(hash-unordered-coll (sorted-set 1 2))\n;;=> 460223544\n(hash-unordered-coll (doto (new java.util.HashSet) (.add 1) (.add 2)))\n;;=> 460223544\n(hash-unordered-coll (doto (new java.util.TreeSet) (.add 1) (.add 2)))\n;;=> 460223544\n(hash-unordered-coll [1 2])\n;;=> 460223544\n(hash-unordered-coll [2 1])\n;;=> 460223544\n(hash-unordered-coll (doto (new java.util.ArrayList) (.add 1) (.add 2)))\n;;=> 460223544\n(hash-unordered-coll (doto (new java.util.ArrayList) (.add 2) (.add 1)))\n;;=> 460223544\n\n;;;; On the other hand: both Clojure's (hash) and Java's .hashCode()\n;;;; CAN (and often WILL) produce different hash codes:\n;;;; (1) for different collection types\n;;;; (2) for differently ordered collections of the same type\n;;;; EVEN if the collections contain the same elements\n\n(hash #{1 2})\n;;=> 460223544\n(hash (sorted-set 1 2))\n;;=> 460223544\n(hash (doto (new java.util.HashSet) (.add 1) (.add 2)))\n;;=> 3\n(hash (doto (new java.util.TreeSet) (.add 1) (.add 2)))\n;;=> 3\n(hash [1 2])\n;;=> 156247261\n(hash [2 1])\n;;=> -1994590503\n(hash (doto (new java.util.ArrayList) (.add 1) (.add 2)))\n;;=> 994\n(hash (doto (new java.util.ArrayList) (.add 2) (.add 1)))\n;;=> 1024\n\n(.hashCode #{1 2})\n;;=> 3\n(.hashCode (sorted-set 1 2))\n;;=> 3\n(.hashCode (doto (new java.util.HashSet) (.add 1) (.add 2)))\n;;=> 3\n(.hashCode (doto (new java.util.TreeSet) (.add 1) (.add 2)))\n;;=> 3\n(.hashCode [1 2])\n;;=> 994\n(.hashCode [2 1])\n;;=> 1024\n(.hashCode (doto (new java.util.ArrayList) (.add 1) (.add 2)))\n;;=> 994\n(.hashCode (doto (new java.util.ArrayList) (.add 2) (.add 1)))\n;;=> 1024\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3", :account-source "github", :login "svenschoenung"}, :created-at 1495647903722, :updated-at 1495649000733, :_id "5925c69fe4b093ada4d4d734"} {:updated-at 1495657051233, :created-at 1495657051233, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body ";;;;\n;;;; Only accepts implementations of java.lang.Iterable\n;;;;\n\n(hash-unordered-coll true)\n;;=> ClassCastException java.lang.Boolean cannot be cast to java.lang.Iterable\n(hash-unordered-coll 1)\n;;=> ClassCastException java.lang.Long cannot be cast to java.lang.Iterable\n(hash-unordered-coll \\c)\n;;=> ClassCastException java.lang.Character cannot be cast to java.lang.Iterable\n\n;;;;\n;;;; Being seqable is not sufficient!\n;;;;\n\n(hash-unordered-coll \"12\")\n;;=> ClassCastException java.lang.String cannot be cast to java.lang.Iterable\n(hash-unordered-coll (int-array [1 2]))\n;;=> ClassCastException [I cannot be cast to java.lang.Iterable\n(hash-unordered-coll nil)\n;;=> NullPointerException", :_id "5925ea5be4b093ada4d4d746"}], :notes nil, :arglists ["coll"], :doc "Returns the hash code, consistent with =, for an external unordered\n collection implementing Iterable. For maps, the iterator should\n return map entries whose hash is computed as\n (hash-ordered-coll [k v]).\n See http://clojure.org/data_structures#hash for full algorithms.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/hash-unordered-coll"} {:added "1.0", :ns "clojure.core", :name "repeat", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1286195040000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "repeatedly", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dae"} {:created-at 1291970208000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "cycle", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521daf"} {:created-at 1302045956000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "constantly", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521db0"} {:created-at 1327501829000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "dotimes", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521db1"}], :line 2999, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}], :body "user=> (take 5 (repeat \"x\"))\n(\"x\" \"x\" \"x\" \"x\" \"x\")\n\n;; which is the same as:\nuser=> (repeat 5 \"x\")\n(\"x\" \"x\" \"x\" \"x\" \"x\")\n\n;; It should be noted that repeat simply repeats the value n number of times.\n;; If you wish to execute a function to calculate the value each time you \n;; probably want the repeatedly function.\n\n", :created-at 1279092799000, :updated-at 1343165038000, :_id "542692c7c026201cdc3269a5"} {:updated-at 1520873825360, :created-at 1520873825360, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body "(defn tally [n]\n (apply str\n (concat\n (repeat (quot n 5) \"卌\")\n (repeat (mod n 5) \"|\"))))\n\n(map tally (range 1 11))\n;; (\"|\" \"||\" \"|||\" \"||||\" \"卌\" \"卌|\" \"卌||\" \"卌|||\" \"卌||||\" \"卌卌\")", :_id "5aa6b161e4b0316c0f44f922"}], :notes nil, :arglists ["x" "n x"], :doc "Returns a lazy (infinite!, or length n if supplied) sequence of xs.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/repeat"} {:added "1.0", :ns "clojure.core", :name "unchecked-inc", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1289217232000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-add", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ba9"} {:created-at 1289217236000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-dec", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521baa"} {:created-at 1289217238000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-inc", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bab"} {:created-at 1289217241000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-negate", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bac"} {:created-at 1289217244000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-divide", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bad"} {:created-at 1289217247000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-subtract", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bae"} {:created-at 1289217251000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-multiply", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521baf"} {:created-at 1289217253000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-remainder", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bb0"} {:created-at 1488018916400, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "inc", :ns "clojure.core"}, :_id "58b15de4e4b01f4add58fe60"} {:created-at 1488018923070, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "inc'", :ns "clojure.core"}, :_id "58b15debe4b01f4add58fe61"}], :line 1156, :examples [{:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [], :body "users=> (unchecked-inc Integer/MAX_VALUE)\n-2147483648\n\nusers=> (unchecked-inc 0)\n1", :created-at 1289217223000, :updated-at 1289217223000, :_id "542692c8c026201cdc326a14"} {:updated-at 1488018795920, :created-at 1488018795920, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :body ";; Illustrates the difference between (inc), (inc') and (unchecked-inc)\n\n;; The \"N\" suffix denotes a BigInt instance\n;; https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/BigInt.java\n\nLong/MAX_VALUE\n;;=> 9223372036854775807\n\n(inc Long/MAX_VALUE)\n;;=> ArithmeticException integer overflow clojure.lang.Numbers.throwIntOverflow (Numbers.java:1501)\n\n(inc' Long/MAX_VALUE)\n;;=> 9223372036854775808N\n\n;; Notice how the resulting number becomes NEGATIVE:\n(unchecked-inc Long/MAX_VALUE)\n;;=> -9223372036854775808", :_id "58b15d6be4b01f4add58fe5f"}], :notes nil, :arglists ["x"], :doc "Returns a number one greater than x, a long.\n Note - uses a primitive operator subject to overflow.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-inc"} {:ns "clojure.core", :name "*reader-resolver*", :type "var", :see-alsos nil, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*reader-resolver*"} {:added "1.0", :ns "clojure.core", :name "nthnext", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1303125684000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "nth", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ca9"} {:created-at 1303125696000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "drop", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521caa"} {:created-at 1356088874000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "nthrest", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cab"}], :line 3164, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(nthnext (range 10) 3)\n;;=> (3 4 5 6 7 8 9)\n\n(nthnext [] 3)\n;;=> nil\n\n(nthnext [1 2 3 4 5 6 7] 4)\n;;=> (5 6 7)\n\n", :created-at 1281033770000, :updated-at 1420736472299, :_id "542692cec026201cdc326d86"} {:body ";; drop is also similar, but different \n(nthnext (range 10) 5) ;;=> (5 6 7 8 9)\n(drop 5 (range 10)) ;;=> (5 6 7 8 9)\n\n;; here is a case where the results differ\n(nthnext [] 3) ;;=> nil\n(drop 3 []) ;;=> () ; a lazy sequence", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1420737401357, :updated-at 1420737401357, :_id "54aebb79e4b0e2ac61831c97"}], :notes [{:updated-at 1306331938000, :body "`nthnext` is similar to `drop`.\r\nBut `nthnext` is eager, while `drop` is lazy.

    \r\nAlso parameters are in opposite order.", :created-at 1306324912000, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :_id "542692ecf6e94c6970521fbd"}], :arglists ["coll n"], :doc "Returns the nth next of coll, (seq coll) when n is 0.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/nthnext"} {:added "1.0", :ns "clojure.core", :name "and", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1286508452000, :author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "or", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eb2"} {:created-at 1334293964000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "if", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eb3"} {:created-at 1592404851986, :author {:login "lunik1", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/13547699?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "every-pred", :ns "clojure.core"}, :_id "5eea2b73e4b0b1e3652d7305"}], :line 842, :examples [{:updated-at 1479826446023, :created-at 1286508448000, :body "user=> (and true true)\ntrue\n\nuser=> (and true false)\nfalse\n\nuser=> (and false false)\nfalse\n\nuser=> (and '() '())\n()\n\nuser=> (and '[] '[])\n[]\n\nuser=> (and 0 1) ; Note that this is *not* bitwise 'and'\n1\n\nuser=> (and 1 0)\n0\n", :editors [{:login "mlanza", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/39192?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon", :account-source "clojuredocs", :login "dakrone"}, :_id "542692cdc026201cdc326d0a"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; See examples for \"if\" explaining Clojure's idea of logical true\n;; and logical false.", :created-at 1334293968000, :updated-at 1334293968000, :_id "542692d2c026201cdc326f49"} {:updated-at 1569963753241, :created-at 1472792960038, :author {:login "Lacty", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7412474?v=3"}, :body "; Note that, and does not evaluate if the first value is false\nuser=> (and false nil)\nfalse\n\nuser=> (and nil false)\nnil\n\nuser=> (and false (println \"foo\"))\nfalse\n\nuser=> (and (println \"foo\") false)\nfoo\nnil\n\nuser=> (and nil nil)\nnil", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/5894926?v=3", :account-source "github", :login "slipset"} {:login "allmonty", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/4502764?v=4"}], :_id "57c90980e4b0709b524f04e0"} {:updated-at 1490369604947, :created-at 1490369604947, :author {:login "Rovanion", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/632775?v=3"}, :body "; From the Clojure 1.9 source code.\n(defn qualified-keyword?\n \"Return true if x is a keyword with a namespace\"\n [x] (and (keyword? x) (namespace x) true))\n\n; Note how the return value of and is value of the last expression.\nuser=> (qualified-keyword? :hi/there)\ntrue\n\n; If we instead define the function as:\n(defn qualified-keyword?\n [x] (and (keyword? x) (namespace x)))\n; we get the namespace as return value:\nuser=> (qualified-keyword? :hi/there)\n\"hi\"", :_id "58d53c44e4b01f4add58fe78"}], :macro true, :notes [{:updated-at 1305106125000, :body "Note add is a macro, so you cannot apply it. For example, there is a vector of some Boolean values [true true false true], which you want to test to see if they are all true. The code below will not work:

    (apply add [true true false true]) ;won't work
    \r\nInstead, use this:
    (every? identity [true  true false true])
    More discussion can be found at http://osdir.com/ml/clojure/2010-01/msg01242.html", :created-at 1305106125000, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=2"}, :_id "542692ecf6e94c6970521fbb"} {:author {:login "dilipd", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/164585?v=4"}, :updated-at 1635725779315, :created-at 1635725779315, :body "typo: 'and' instead of 'add'?", :_id "617f31d3e4b0b1e3652d7568"}], :arglists ["" "x" "x & next"], :doc "Evaluates exprs one at a time, from left to right. If a form\n returns logical false (nil or false), and returns that value and\n doesn't evaluate any of the other expressions, otherwise it returns\n the value of the last expr. (and) returns true.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/and"} {:added "1.0", :ns "clojure.core", :name "create-struct", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1468878705351, :author {:login "bradcypert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1455979?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "struct", :ns "clojure.core"}, :_id "578d4f71e4b0bafd3e2a04a5"} {:created-at 1468878716309, :author {:login "bradcypert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1455979?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defstruct", :ns "clojure.core"}, :_id "578d4f7ce4b0bafd3e2a04a6"} {:created-at 1468878831043, :author {:login "bradcypert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1455979?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defrecord", :ns "clojure.core"}, :_id "578d4fefe4b0bafd3e2a04a8"}], :line 4038, :examples [{:updated-at 1468878648375, :created-at 1468878648375, :author {:login "bradcypert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1455979?v=3"}, :body ";;Creates a person structure\n(def person (create-struct :name :age))\n\n;;Creates a structure with the given values associated with the structure keys\n(struct person \"Brad Cypert\" 23)\n{:name \"Brad Cypert\", :age 23}", :_id "578d4f38e4b0bafd3e2a04a4"}], :notes [{:author {:login "bradcypert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1455979?v=3"}, :updated-at 1468878818445, :created-at 1468878818445, :body "Structs are becoming obsolete. Use records instead. See defrecord.", :_id "578d4fe2e4b0bafd3e2a04a7"} {:author {:login "metasoarous", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/88556?v=4"}, :updated-at 1605646130347, :created-at 1605646130347, :body "In _general_, records should be preferred over structs. However, structs aren't _entirely_ obsolete.\n\nThey can still be useful when you need/want to create record-like objects dynamically; That is, when you don't know the field names at compile time. A typical example of this might be loading rows from a CSV (as [semantic-csv](https://github.com/metasoarous/semantic-csv) does). The advantage in this case over using regular maps is significantly improved performance creating and using these objects.", :_id "5fb43732e4b0b1e3652d740c"}], :arglists ["& keys"], :doc "Returns a structure basis object.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/create-struct"} {:added "1.0", :ns "clojure.core", :name "get-validator", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1553694544702, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "set-validator!", :ns "clojure.core"}, :_id "5c9b7f50e4b0ca44402ef6e3"}], :line 2400, :examples [{:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body "(require '[clojure.repl :refer [demunge]])\n\n(def a 1)\n\n(get-validator #'a) ; no validator set yet\n;; nil\n\n(set-validator! #'a pos?) ; \"a\" should be positive number\n\n(-> (get-validator #'a) ; get-validator returns the function object\n class ; get the Class instance\n .getSimpleName ; access the inner class name, no package\n demunge ; demunge is the opposite of munge\n symbol) ; back to a symbol\n;; core/pos?\n\n(def a 0) ; this is now unacceptable\n;; IllegalStateException Invalid reference state\n\n(set-validator! #'a nil) ; make it ok again", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1553694538283, :updated-at 1553771408277, :_id "5c9b7f4ae4b0ca44402ef6e2"}], :notes nil, :arglists ["iref"], :doc "Gets the validator-fn for a var/ref/agent/atom.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/get-validator"} {:added "1.0", :ns "clojure.core", :name "number?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "num", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917515000, :_id "542692eaf6e94c6970521b4d"} {:created-at 1440146030366, :author {:login "muhuk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/40178?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "integer?", :ns "clojure.core"}, :_id "55d6e26ee4b0831e02cddf16"}], :line 3559, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "benjiiiiii", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd1adaf32d9dc6531d6041dbc379efb0?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "xantheon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10231554?v=3"}], :body "user=> (number? 1)\ntrue\nuser=> (number? 1.0)\ntrue\nuser=> (number? :a)\nfalse\nuser=> (number? nil)\nfalse\nuser=> (number? \"23\")\nfalse\n\n", :created-at 1279074614000, :updated-at 1421848806945, :_id "542692c8c026201cdc326a1e"} {:body ";; map number? over the vector\n(map number? [1 0.44 3e6 0xFF])\n;;=> (true true true true)\n\n;; map number? over the vector created by converting a list into a vector \n;; with the function \"into\"\n(map number? (into [] '(1 0.44 3e6 0xFF)))\n;;=> (true true true true)\n\n", :author {:login "xantheon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10231554?v=3"}, :created-at 1421848794036, :updated-at 1421850409437, :editors [{:login "xantheon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10231554?v=3"}], :_id "54bfb0dae4b0e2ac61831cc5"} {:editors [{:login "sixofhearts", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/283702?v=4"}], :body ";; Works for rationals\nuser=> (number? (/ 2 3))\ntrue", :author {:avatar-url "https://avatars.githubusercontent.com/u/283702?v=4", :account-source "github", :login "sixofhearts"}, :created-at 1638921869968, :updated-at 1638921911526, :_id "61aff68de4b0b1e3652d7584"}], :notes nil, :arglists ["x"], :doc "Returns true if x is a Number", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/number_q"} {:added "1.0", :ns "clojure.core", :name "await-for", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1298860372000, :author {:login "ninjudd", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7ced25585a7556e9b9b975c1f9e136e3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "await", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ced"}], :line 3296, :examples [{:updated-at 1616191765486, :created-at 1616191540527, :author {:login "gs", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/79596?v=4"}, :body ";; construct simple agent\n(def agnt (agent 5))\n\n;; increment agent\n(send agnt inc) \n\n;; system does not wait for the value change\n(println @agnt) \n;; => 5 \n\n;; increment agent\n(send agnt inc)\n\n;; wait for maximum 1000 ms\n(await-for 1000 agnt) \n\n;; print out the value of the agent \n(println @agnt) \n;; => 7", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/79596?v=4", :account-source "github", :login "gs"}], :_id "60552034e4b0b1e3652d74a4"}], :notes nil, :arglists ["timeout-ms & agents"], :doc "Blocks the current thread until all actions dispatched thus\n far (from this thread or agent) to the agents have occurred, or the\n timeout (in milliseconds) has elapsed. Returns logical false if\n returning due to timeout, logical true otherwise.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/await-for"} {:ns "clojure.core", :name "chunk-next", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1443933552687, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-first", :ns "clojure.core"}, :_id "5610ad70e4b0686557fcbd40"} {:created-at 1443933558893, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-rest", :ns "clojure.core"}, :_id "5610ad76e4b08e404b6c1c8e"} {:created-at 1443933581024, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-cons", :ns "clojure.core"}, :_id "5610ad8de4b08e404b6c1c90"} {:created-at 1443933589741, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-buffer", :ns "clojure.core"}, :_id "5610ad95e4b0686557fcbd41"} {:created-at 1443933597715, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk", :ns "clojure.core"}, :_id "5610ad9de4b0686557fcbd42"} {:created-at 1443933620082, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-append", :ns "clojure.core"}, :_id "5610adb4e4b08e404b6c1c91"} {:created-at 1443933691622, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunked-seq?", :ns "clojure.core"}, :_id "5610adfbe4b08e404b6c1c92"}], :line 707, :examples [{:updated-at 1443934272580, :created-at 1443934272580, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :body "(let [chunked-cons (seq (range 1 42))]\n\n (class chunked-cons)\n ;; => clojure.lang.ChunkedCons\n\n ;; Returns the next chunk when there are more than 32 elements\n ;; in the ChunkedCons.\n (chunk-next chunked-cons)\n ;; => (33 34 35 36 37 38 39 40 41)\n\n)", :_id "5610b040e4b0686557fcbd43"}], :notes nil, :tag "clojure.lang.ISeq", :arglists ["s"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/chunk-next"} {:added "1.0", :ns "clojure.core", :name "print-str", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1297554870000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "println-str", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f5d"} {:created-at 1374264258000, :author {:login "lbeschastny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/416170465e4045f810f09a9300dda4dd?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "print", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f5e"}], :line 4754, :examples [{:author {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}, :editors [{:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"} {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"} {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"} {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"} {:login "matthewg", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b29dd31d183124d9e87d8037bb30e326?r=PG&default=identicon"}], :body ";; Create a string from the given items and store it in x.\nuser=> (def x (print-str 1 \"foo\" \\b \\a \\r {:a 2}))\n#'user/x\n\n;; It's a string.\nuser=> (string? x)\ntrue\n\n;; Notice that each item is separated by a space.\nuser=> x\n\"1 foo b a r {:a 2}\"\n\n", :created-at 1284257174000, :updated-at 1323233208000, :_id "542692c9c026201cdc326aea"}], :notes nil, :tag "java.lang.String", :arglists ["& xs"], :doc "print to a string, returning it", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/print-str"} {:added "1.0", :ns "clojure.core", :name "not-any?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1330526858000, :author {:login "kisielk", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/55fd56dfef815d7aa543be09ad3ed3e9?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "some", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d5b"} {:created-at 1369837609000, :author {:login "avasenin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/154699?v=3"}, :to-var {:ns "clojure.core", :name "every?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d5c"}], :line 2703, :examples [{:updated-at 1566222779775, :created-at 1279074514000, :body "user=> (not-any? odd? '(2 4 6))\ntrue\n\nuser=> (not-any? odd? '(1 2 3))\nfalse\n\nuser=> (not-any? nil? [true false false])\ntrue\n\nuser=> (not-any? nil? [true false nil])\nfalse\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "cromptone", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11131392?v=4"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/147981?v=3", :account-source "github", :login "dpritchett"}, :_id "542692cbc026201cdc326ba8"}], :notes [{:author {:login "bsima", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/200617?v=3"}, :updated-at 1454193022420, :created-at 1454193022420, :body "Why is there a `not-any?` but no `any?`?", :_id "56ad397ee4b0ceed88ce8d1f"} {:author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :updated-at 1454445515187, :created-at 1454445515187, :body "You can use this for any?:\n\n(def any?\n (complement not-any?))", :_id "56b113cbe4b0ceed88ce8d20"} {:author {:login "chendesheng", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2094891?v=3"}, :updated-at 1459589289487, :created-at 1459589289487, :body "You can also use some for any?", :_id "56ff90a9e4b09295d75dbf44"} {:body "`some` is not quite the same as `any?` because the latter returns a Boolean\n\n```\nuser> (def any? (complement not-any?))\n#'user/any?\nuser> (some #{:a} [:a :b :c])\n:a\nuser> (any? #{:a} [:a :b :c])\ntrue\nuser> (some #{:d} [:a :b :c])\nnil\nuser> (any? #{:d} [:a :b :c])\nfalse\n```\n\nI also find `one-of?` handy:\n\n```\n(defn one-of? [x coll]\n (any? #{x} coll))\n```", :created-at 1464895655850, :updated-at 1464895698716, :author {:avatar-url "https://avatars.githubusercontent.com/u/200617?v=3", :account-source "github", :login "bsima"}, :_id "575088a7e4b0bafd3e2a0473"} {:body "
     \n(not-any?   #(= \"query\"  %)   (list \"hola\" \"query\" \"fin\"))   ;false\n(not-any?   #(= \"query\"  %)   (list \"hola\" \"fin\"))           ;true\n(not-any?   #(= \"query\"  %)   (list))                        ;true\n(not-any?   #(= \"query\"  %)   nil)                           ;true\n(not-any?   #(= \"query\"  %)   '())                           ;true\n", :created-at 1505952377693, :updated-at 1505952747406, :author {:avatar-url "https://avatars0.githubusercontent.com/u/31183833?v=4", :account-source "github", :login "abibilonilombardi"}, :_id "59c30279e4b03026fe14ea47"} {:author {:login "naxels", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3195443?v=4"}, :updated-at 1674408880024, :created-at 1674408880024, :body "Here's another version for `any?`\n\n
    (def any? (comp boolean some))
    ", :_id "63cd73b0e4b08cf8563f4b69"}], :tag "java.lang.Boolean", :arglists ["pred coll"], :doc "Returns false if (pred x) is logical true for any x in coll,\n else true.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/not-any_q"} {:added "1.0", :ns "clojure.core", :name "into-array", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1374150173000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "to-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aa7"} {:created-at 1374150354000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "make-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aa8"}], :line 3443, :examples [{:author {:login "ysph", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/eed512f3595f1baa31fd91f3b297ebbf?r=PG&default=identicon"}, :editors [{:login "ysph", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/eed512f3595f1baa31fd91f3b297ebbf?r=PG&default=identicon"} {:login "Ambrose Bonnaire-Sergeant", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f4b6f2ea0cd9cac02ecd8101c482a41f?r=PG&default=identicon"} {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"} {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"} {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"} {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"}], :body ";; Array's component type is set to (class 2), cannot add Strings.\n;; This will result in an IllegalArgumentException\nuser=> (into-array [2 \"4\" \"8\" 5])\n;; Evaluation aborted.\n\n;; However, if the common type is specified, aforementioned values can be put into an array\nuser=> (into-array Object [2 \"4\" \"8\" 5])\n#\n\nuser=> (into-array (range 4))\n#\n\n;; if you assign a type, you still have to coerce values\nuser=> (into-array Byte/TYPE (range 4))\n;; Evaluation aborted.\n\nuser=> (into-array Byte/TYPE (map byte (range 4)))\n#", :created-at 1294395323000, :updated-at 1368810887000, :_id "542692c8c026201cdc326a25"} {:author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :editors [], :body ";; java.nio.file.Paths#get takes (String, String...)\nuser=> (java.nio.file.Paths/get \"/Users\" (into-array [\"username\" \"dev\" \"clojure\"]))\n#", :created-at 1337936915000, :updated-at 1337936915000, :_id "542692d3c026201cdc326fda"} {:author {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"}, :editors [], :body ";; Creating an empty array defaults to Object[]\nuser=> (into-array [])\n#\n\n;; However, the type of an empty array can be coerced\nuser=> (into-array String [])\n#\n", :created-at 1368810750000, :updated-at 1368810750000, :_id "542692d3c026201cdc326fdb"}], :notes nil, :arglists ["aseq" "type aseq"], :doc "Returns an array with components set to the values in aseq. The array's\n component type is type if provided, or the type of the first value in\n aseq if present, or Object. All values in aseq must be compatible with\n the component type. Class objects for the primitive types can be obtained\n using, e.g., Integer/TYPE.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/into-array"} {:added "1.9", :ns "clojure.core", :name "qualified-symbol?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495715117333, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "symbol?", :ns "clojure.core"}, :_id "5926cd2de4b093ada4d4d75f"} {:created-at 1495715125414, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "simple-symbol?", :ns "clojure.core"}, :_id "5926cd35e4b093ada4d4d760"} {:created-at 1507247303395, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "namespace", :ns "clojure.core"}, :_id "59d6c4c7e4b03026fe14ea50"}], :line 1632, :examples [{:updated-at 1495723309613, :created-at 1495723309613, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body "(qualified-symbol? 'clojure.core/symbol)\n;;=> true\n\n(qualified-symbol? 'symbol)\n;;=> nil\n\n(qualified-symbol? \"string\")\n;;=> false\n(qualified-symbol? 42)\n;;=> false\n(qualified-symbol? nil)\n;;=> false", :_id "5926ed2de4b093ada4d4d76b"}], :notes nil, :arglists ["x"], :doc "Return true if x is a symbol with a namespace", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/qualified-symbol_q"} {:added "1.0", :ns "clojure.core", :name "init-proxy", :file "clojure/core_proxy.clj", :type "function", :column 1, :see-alsos [{:created-at 1539824483366, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "construct-proxy", :ns "clojure.core"}, :_id "5bc7db63e4b00ac801ed9ee2"} {:created-at 1539824665309, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "update-proxy", :ns "clojure.core"}, :_id "5bc7dc19e4b00ac801ed9ee3"}], :line 297, :examples [{:updated-at 1539824459461, :created-at 1539824459461, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Used as a one-off initialization for the proxy overrides when the\n;; instance was built with \"construct-proxy\".\n\n(import 'clojure.lang.IDeref)\n\n(def MyException (get-proxy-class Exception IDeref))\n\n(defn bail\n ([ex s]\n (-> ex\n (construct-proxy s)\n (init-proxy\n {\"deref\" (fn [this] (str \"Cause: \" s))})))\n ([ex s e]\n (-> ex\n (construct-proxy s e)\n (init-proxy\n {\"deref\" (fn [this] (str \"Root: \" (.getMessage e)))}))))\n\n@(bail MyException \"error\")\n;; \"Cause: error\"\n\n@(bail MyException \"s\" (RuntimeException. \"caused by root\"))\n;; \"Root: caused by root\"", :_id "5bc7db4be4b00ac801ed9ee1"}], :notes nil, :arglists ["proxy mappings"], :doc "Takes a proxy instance and a map of strings (which must\n correspond to methods of the proxy superclass/superinterfaces) to\n fns (which must take arguments matching the corresponding method,\n plus an additional (explicit) first arg corresponding to this, and\n sets the proxy's fn map. Returns the proxy.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/init-proxy"} {:ns "clojure.core", :name "chunk-buffer", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1443936382766, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-append", :ns "clojure.core"}, :_id "5610b87ee4b08e404b6c1ca1"} {:created-at 1443936387934, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk", :ns "clojure.core"}, :_id "5610b883e4b0686557fcbd4f"}], :line 692, :examples [{:updated-at 1443936790331, :created-at 1443936790331, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :body "(chunk-buffer 32)\n;; => #\n\n;; Coerce to an ArrayChunk via clojure.core/chunk, cons\n;; a chunked sequence onto it resulting in a\n;; clojure.lang.PersistentVector$ChunkedSeq, grab the first\n;; chunk to get an ArrayChunk, and pull the first element out\n;; using .nth/nth.\n(-> (chunk-buffer 32)\n (chunk)\n (chunk-cons (seq [1 2 3]))\n (chunk-first)\n (.nth 0))\n;; => 1", :_id "5610ba16e4b08e404b6c1ca2"}], :notes nil, :tag "clojure.lang.ChunkBuffer", :arglists ["capacity"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/chunk-buffer"} {:added "1.9", :ns "clojure.core", :name "seqable?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495638669315, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "seq", :ns "clojure.core"}, :_id "5925a28de4b093ada4d4d725"} {:created-at 1495638679916, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "seq?", :ns "clojure.core"}, :_id "5925a297e4b093ada4d4d726"}], :line 6225, :examples [{:editors [{:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}], :body ";;;; nil is seqable\n\n(seqable? nil)\n;;=> true\n\n;;;; Anything that implements CharSequence is seqable\n\n(seqable? \"\")\n;;=> true\n(seqable? (java.lang.StringBuilder.))\n;;=> true\n(seqable? (java.lang.StringBuffer.))\n;;=> true\n\n;;;; Anything that implements Seqable is seqable\n\n(seqable? [])\n;;=> true\n(seqable? {})\n;;=> true\n(seqable? #{})\n;;=> true\n(seqable? '())\n;;=> true\n(seqable? (lazy-seq))\n;;=> true\n\n;;;; Anything that implements Iterable is seqable\n\n(seqable? (java.util.ArrayList.))\n;;=> true\n(seqable? (java.util.HashMap.))\n;;=> true\n(seqable? (java.util.HashSet.))\n;;=> true\n\n;;;; Arrays are seqable\n\n(seqable? (int-array 5 1))\n;;=> true\n(seqable? (double-array 5 1.0))\n;;=> true\n(seqable? (char-array 5 \\c))\n;;=> true\n\n;;;; Some stuff that isn't seqable\n\n(seqable? true)\n;;=> false\n(seqable? \\c)\n;;=> false\n(seqable? 1)\n;;=> false\n(seqable? 1.0)\n;;=> false\n(seqable? (fn f []))\n;;=> false\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3", :account-source "github", :login "svenschoenung"}, :created-at 1495638659807, :updated-at 1495638914391, :_id "5925a283e4b093ada4d4d724"}], :notes nil, :arglists ["x"], :doc "Return true if the seq function is supported for x", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/seqable_q"} {:added "1.0", :ns "clojure.core", :name "symbol?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1495715056369, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "simple-symbol?", :ns "clojure.core"}, :_id "5926ccf0e4b093ada4d4d75b"} {:created-at 1495715063170, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "qualified-symbol?", :ns "clojure.core"}, :_id "5926ccf7e4b093ada4d4d75c"}], :line 562, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (symbol? 'a)\ntrue\nuser=> (symbol? 1)\nfalse\nuser=> (symbol? :a)\nfalse", :created-at 1279075212000, :updated-at 1332949799000, :_id "542692c8c026201cdc3269e7"}], :notes nil, :arglists ["x"], :doc "Return true if x is a Symbol", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/symbol_q"} {:added "1.6", :ns "clojure.core", :name "when-some", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1417641526852, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:ns "clojure.core", :name "if-some", :library-url "https://github.com/clojure/clojure"}, :_id "547f7e36e4b0dc573b892fea"} {:created-at 1440455751477, :author {:login "brunchboy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2228869?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "when-let", :ns "clojure.core"}, :_id "55db9c47e4b072d7f27980ee"} {:created-at 1602614544032, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "some", :ns "clojure.core"}, :_id "5f85f510e4b0b1e3652d73e0"} {:created-at 1602614575703, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "let", :ns "clojure.core"}, :_id "5f85f52fe4b0b1e3652d73e1"}], :line 1896, :examples [{:body "user=> (when-some [x 1] [x :ok])\n[1 :ok]\n\nuser=> (when-some [x nil] [x :ok])\nnil", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423524396612, :updated-at 1423524396612, :_id "54d9422ce4b0e2ac61831d3f"} {:body "user=> (when-some [x \"Hello\"] (println x))\n\"Hello\"\nnil\n\nuser=> (when-some [x nil] (println x))\nnil", :author {:login "viper110110", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1243583?v=3"}, :created-at 1432756309762, :updated-at 1432756318672, :editors [{:login "viper110110", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1243583?v=3"}], :_id "55662055e4b01ad59b65f4db"} {:editors [{:login "brunchboy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2228869?v=3"}], :body ";; In contrast with when-let, when-some evaluates the body for false values:\n(when-some [x false] {:x x}) ; => {:x false}\n\n;; While when-let suppresses evaluation for false values:\n(when-let [x false] {:x x}) ; => nil", :author {:avatar-url "https://avatars.githubusercontent.com/u/2228869?v=3", :account-source "github", :login "brunchboy"}, :created-at 1440455542027, :updated-at 1440455687597, :_id "55db9b76e4b0831e02cddf20"}], :macro true, :notes nil, :arglists ["bindings & body"], :doc "bindings => binding-form test\n\n When test is not nil, evaluates body with binding-form bound to the\n value of test", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/when-some"} {:added "1.3", :ns "clojure.core", :name "unchecked-char", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 3528, :examples nil, :notes nil, :arglists ["x"], :doc "Coerce to char. Subject to rounding or truncation.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-char"} {:added "1.1", :ns "clojure.core", :name "->>", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1293436689000, :author {:login "0x89", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/56bc4acd59315ed4dc1cb99c3be71102?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "->", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521deb"} {:created-at 1436359153901, :author {:login "jw-00000", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2936?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "some->>", :ns "clojure.core"}, :_id "559d19f1e4b00f9508fd66fe"} {:created-at 1510096703930, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "comp", :ns "clojure.core"}, :_id "5a023f3fe4b0a08026c48c9a"} {:created-at 1526843259499, :author {:login "boxxxie", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/440034?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "cond->>", :ns "clojure.core"}, :_id "5b01c77be4b045c27b7fac71"} {:created-at 1526843274587, :author {:login "boxxxie", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/440034?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "cond->", :ns "clojure.core"}, :_id "5b01c78ae4b045c27b7fac72"} {:created-at 1526843342457, :author {:login "boxxxie", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/440034?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "as->", :ns "clojure.core"}, :_id "5b01c7cee4b045c27b7fac73"}], :line 1693, :examples [{:author {:login "tomoj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/854f0ed52f56be27c9919c2afaa665c2?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "tomoj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/854f0ed52f56be27c9919c2afaa665c2?r=PG&default=identicon"} {:login "tomoj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/854f0ed52f56be27c9919c2afaa665c2?r=PG&default=identicon"} {:login "uvtc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/34f159f89cbd1d9beac0276f5a7af552?r=PG&default=identicon"}], :body ";; An example of using the \"thread-last\" macro to get\n;; the sum of the first 10 even squares.\nuser=> (->> (range)\n (map #(* % %))\n (filter even?)\n (take 10)\n (reduce +))\n1140\n\n;; This expands to:\nuser=> (reduce +\n (take 10\n (filter even?\n (map #(* % %)\n (range)))))\n1140\n", :created-at 1279952064000, :updated-at 1347320971000, :_id "542692c8c026201cdc326a52"} {:author {:login "BertrandDechoux", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/528360?v=3"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"} {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"} {:login "zenog", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8528397254e98a159c68bb0ce20eae71?r=PG&default=identicon"}], :body "user=> (def c 5)\nuser=> (->> c (+ 3) (/ 2) (- 1)) \n3/4\n\n;; and if you are curious why\nuser=> (use 'clojure.walk)\nuser=> (macroexpand-all '(->> c (+ 3) (/ 2) (- 1)))\n(- 1 (/ 2 (+ 3 c)))\n\n", :created-at 1339250191000, :updated-at 1343663486000, :_id "542692d1c026201cdc326f40"} {:body ";; let's compare thread first (->) and thread last ( ->> )\nuser=> (macroexpand '(-> 0 (+ 1) (+ 2) (+ 3)))\n(+ (+ (+ 0 1) 2) 3)\nuser=> (macroexpand '(->> 0 (+ 1) (+ 2) (+ 3)))\n(+ 3 (+ 2 (+ 1 0)))", :author {:login "deddu", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3534263?v=3"}, :created-at 1430351285440, :updated-at 1430351388761, :editors [{:login "deddu", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3534263?v=3"}], :_id "55416db5e4b01bb732af0a8c"} {:updated-at 1447795396746, :created-at 1447795396746, :author {:login "rsachdeva", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/232903?v=3"}, :body ";; ->> and -> by simple string concatenation\n\n;; Effectively (str \" jmd\" \"hello\")\nuser=> (->> \"hello\" (str \" jmd\"))\n\" jmdhello\"\n\n;; Effectively (str \"hello\" \" jmd\")\nuser=> (-> \"hello\" (str \" jmd\"))\n=> \"hello jmd\"", :_id "564b9ac4e4b0538444398271"} {:editors [{:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=3"}], :body ";; It is OK to omit the parentheses if a function takes only one argument\n(->> [1 2 [3 4] 5]\n flatten ; no parenthesis\n (map inc))\n=> (2 3 4 5 6)\n ", :author {:avatar-url "https://avatars.githubusercontent.com/u/889685?v=3", :account-source "github", :login "huahaiy"}, :created-at 1464376531961, :updated-at 1464377329122, :_id "57489cd3e4b0bafd3e2a0468"} {:editors [{:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=3"}], :body ";; It's OK to include anonymous function in the thread, but don't forget\n;; to put in an extra pair of parentheses to call the function\n(->> [1 2 3 4 5]\n ((fn [coll] (map inc coll))) ; double parentheses\n (apply +)) \n=> 20\n\n;; the short hand form of the anonymous function works the same\n(->> [1 2 3 4 5]\n (#(map inc %)) ; double parentheses\n (apply +)) ", :author {:avatar-url "https://avatars.githubusercontent.com/u/889685?v=3", :account-source "github", :login "huahaiy"}, :created-at 1464378181434, :updated-at 1465362467394, :_id "5748a345e4b0bafd3e2a046a"} {:editors [{:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"}], :body ";; For large threads you can use commas (interpreted as whitespaces) \n;; to visualize where the items are going to be inserted.\n\n;; Takes the first 5 even numbers\nuser=> (->> (range)\n (filter even?)\n (take 5))\n=> (0 2 4 6 8)\n\n;; with two commas (you can use one if you prefer)\nuser=> (->> (range)\n (filter even? ,,)\n (take 5 ,,))\n=> (0 2 4 6 8)\n\n;; For instance:\n;; (filter even? ,,)\n;; means\n;; (filter even? (range))", :author {:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"}, :created-at 1464761492810, :updated-at 1464761589711, :_id "574e7c94e4b0bafd3e2a046f"} {:editors [{:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}], :body ";;practical example\n\n(def entries [{:month 1 :val 12}\n {:month 2 :val 3}\n {:month 3 :val 32}\n {:month 4 :val 18}\n {:month 5 :val 32}\n {:month 6 :val 62}\n {:month 7 :val 12}\n {:month 8 :val 142}\n {:month 9 :val 52}\n {:month 10 :val 18}\n {:month 11 :val 23}\n {:month 12 :val 56}])\n(defn get-result\n [coll m]\n (->> coll\n (take-while\n #(<= (:month %) m))))\n\n(defn get-total\n [coll m]\n (->>\n (get-result coll m)\n (map #(:val %))\n (reduce +)))\n\n(get-total entries 3)\n", :author {:avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4", :account-source "github", :login "ibercode"}, :created-at 1517039587642, :updated-at 1517039791585, :_id "5a6c2fe3e4b076dac5a728a9"} {:updated-at 1518895069987, :created-at 1518895069987, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body "(defn new-map\n [coll]\n (->>\n coll\n (map\n (fn [[k v]]\n [k (inc v)]))\n (into {})))\n\n(new-map {:a 1 :b 2 :c 3})\n", :_id "5a887fdde4b0316c0f44f8ca"} {:updated-at 1561789924650, :created-at 1561789924650, :author {:login "ningDr", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/38251752?v=4"}, :body "(defn f [front a1 a2 end] (str front \"-\" a1 \"-\" a2 \"-\" end))\n(println (f 1 2 3 4))\n;; => 1-2-3-4\n(println (-> 1 (f 2 3 4)))\n;; => 1-2-3-4\n(println (->> 1 (f 2 3 4)))\n;; => 2-3-4-1", :_id "5d1705e4e4b0ca44402ef77b"} {:updated-at 1630497911164, :created-at 1630497911164, :author {:login "harelix", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2310608?v=4"}, :body "(->> (str \"A\") (str \"B\") (str \"C\"))\n;; => \"CBA\"\n(-> (str \"A\") (str \"B\") (str \"C\"))\n;; => \"ABC\"\n", :_id "612f6c77e4b0b1e3652d7537"}], :macro true, :notes [{:updated-at 1280212250000, :body "I'm getting: `Exception in thread \"main\" java.lang.Exception: Unable to resolve symbol: ->> in this context (11.clj:25)`\r\n\r\nIt's also extremely hard to Google this method. It'd be nice if there was a non-symbol name for this that one could search for.\r\n\r\n**Update**\r\n\r\nThe name of this operator is called a thrush.", :created-at 1280193441000, :author {:login "Jacolyte", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f8b"} {:updated-at 1280208986000, :body "See also -> which is similar but threads the first expr as the second argument of the forms.", :created-at 1280208986000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f8f"} {:updated-at 1280211630000, :body "My error was due to using an old version of Clojure. I was using 1.0.0.", :created-at 1280211630000, :author {:login "Jacolyte", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f90"} {:updated-at 1400187256000, :body "There is something I don't get : in the case \"form\" is a seq, why should we write\r\n... (with-meta `(~(first form) ~@(next form) ~x) (meta form))\r\n\r\nand not \r\n... (with-meta `(~@form ~x) (meta form))\r\n\r\nas items order in \"form\" is not changed ?\r\n\r\n", :created-at 1400187256000, :author {:login "nmichel", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7c68edbc73c1d48f86e5c5f642fff93f?r=PG&default=identicon"}, :_id "542692edf6e94c6970522026"} {:author {:login "nzl-nott", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/458621?v=3"}, :updated-at 1445935991335, :created-at 1445935991335, :body "\"See also -> which is similar but threads the first expr as the second argument of the forms.\"\n\nThis is incorrect, it is not the second ARGUMENT, but the second ITEM.", :_id "562f3b77e4b04b157a6648da"}], :arglists ["x & forms"], :doc "Threads the expr through the forms. Inserts x as the\n last item in the first form, making a list of it if it is not a\n list already. If there are more forms, inserts the first form as the\n last item in second form, etc.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/->>"} {:added "1.1", :ns "clojure.core", :name "future-cancel", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "future", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1339252235000, :_id "542692eaf6e94c6970521afb"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "future?", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1339252240000, :_id "542692eaf6e94c6970521afc"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "future-cancelled?", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1339252246000, :_id "542692eaf6e94c6970521afd"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "future-done?", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1339252256000, :_id "542692eaf6e94c6970521afe"}], :line 7000, :examples [{:updated-at 1339252267000, :created-at 1339252267000, :body "\nuser=> (def f (future (Thread/sleep 5000) (inc 0)))\n#'user/f\n\nuser=> (future-cancel f) \ntrue\n\nuser=> (future-cancelled? f) \ntrue", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :_id "542692d3c026201cdc326fb3"} {:updated-at 1339252313000, :created-at 1339252313000, :body "\nuser=> (def f (future (inc 0)))\n#'user/f\n\nuser=> (future-cancel f) \nfalse\n\nuser=> (future-cancelled? f) \nfalse", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :_id "542692d3c026201cdc326fb4"}], :notes nil, :arglists ["f"], :doc "Cancels the future, if possible.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/future-cancel"} {:added "1.0", :ns "clojure.core", :name "var-get", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1331249138000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "with-local-vars", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521da4"} {:created-at 1461815751940, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "var-set", :ns "clojure.core"}, :_id "572189c7e4b0fc95a97eab5d"} {:created-at 1550004152087, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "var", :ns "clojure.core"}, :_id "5c632fb8e4b0ca44402ef67e"}], :line 4327, :examples [{:editors [{:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}], :updated-at 1550004271931, :created-at 1423523052402, :author {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"}, :body "user=> map\n#\n\nuser=> #'map ;; The reader macro #'x expands to (var x).\n#'clojure.core/map\n\nuser=> (var-get #'map)\n#", :_id "54d93cece4b0e2ac61831d3a"} {:updated-at 1550004358930, :created-at 1550004358930, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :body "user=> ((var-get (var inc)) 1)\n2", :_id "5c633086e4b0ca44402ef680"} {:updated-at 1648664740399, :created-at 1648664740399, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=4"}, :body ";; var-get is the same as @\nuser> (def a-var 1)\n#'user/a-var\nuser> (var-get #'a-var)\n1\nuser> @#'a-var\n1\nuser> (var-get (resolve 'a-var))\n1\nuser> @(resolve 'a-var)\n1", :_id "6244a0a4e4b0b1e3652d75c5"}], :notes nil, :arglists ["x"], :doc "Gets the value in the var object", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/var-get"} {:added "1.0", :ns "clojure.core", :name "commute", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1364879943000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b4c"} {:created-at 1432239819741, :author {:login "Kejia", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1039073?v=3"}, :to-var {:ns "clojure.core", :name "alter", :library-url "https://github.com/clojure/clojure"}, :_id "555e3ecbe4b03e2132e7d16a"} {:created-at 1432239835490, :author {:login "Kejia", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1039073?v=3"}, :to-var {:ns "clojure.core", :name "dosync", :library-url "https://github.com/clojure/clojure"}, :_id "555e3edbe4b03e2132e7d16b"}], :line 2422, :examples [{:author {:login "leifp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d2f37720f063404ef83b987d2824353d?r=PG&default=identicon"}, :editors [], :body "user=> (def counter (ref 0))\n#'user/counter\n\n;; deciding whether to increment the counter takes the terribly long time\n;; of 100 ms -- it is decided by committee.\nuser=> (defn commute-inc! [counter]\n (dosync (Thread/sleep 100) (commute counter inc)))\n#'user/commute-inc!\nuser=> (defn alter-inc! [counter]\n (dosync (Thread/sleep 100) (alter counter inc)))\n#'user/alter-inc!\n\n;; what if n people try to hit the counter at once?\nuser=> (defn bombard-counter! [n f counter]\n (apply pcalls (repeat n #(f counter))))\n#'user/bombard-counter!\n\n;; first, use alter. Everyone is trying to update the counter, and\n;; stepping on each other's toes, so almost every transaction is getting \n;; retried lots of times:\nuser=> (dosync (ref-set counter 0))\n0\nuser=> (time (doall (bombard-counter! 20 alter-inc! counter)))\n\"Elapsed time: 2007.049224 msecs\"\n(3 1 2 4 7 10 5 8 6 9 13 14 15 12 11 16 17 20 18 19)\n;; note that it took about 2000 ms = (20 workers * 100 ms / update)\n\n;; now, since it doesn't matter what order people update a counter in, we\n;; use commute:\nuser=> (dosync (ref-set counter 0))\n0\nuser=> (time (doall (bombard-counter! 20 commute-inc! counter)))\n\"Elapsed time: 401.748181 msecs\"\n(1 2 3 4 5 9 10 6 7 8 11 15 13 12 14 16 19 17 18 20)\n;; notice that we got actual concurrency this time.", :created-at 1342530933000, :updated-at 1342530933000, :_id "542692d2c026201cdc326f63"} {:editors [{:login "danielgerigk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/9052027?v=3"}], :body "; Note that commute will ALWAYS run the update function TWICE. \n; Example courtesy of \"Clojure for the Brave and True\"\n; https://github.com/flyingmachine/brave-clojure-web\n\n(defn sleep-print-update\n [sleep-time thread-name update-fn]\n (fn [state]\n (Thread/sleep sleep-time)\n (println (str thread-name \": \" state))\n (update-fn state)))\n\n(def counter (ref 0))\n(future (dosync (commute counter (sleep-print-update 100 \"Commute Thread A\" inc))))\n(future (dosync (commute counter (sleep-print-update 150 \"Commute Thread B\" inc))))\n\n; printed output is:\nCommute Thread A: 0 ; (after 100ms)\nCommute Thread B: 0 ; (after 150ms)\nCommute Thread A: 0 ; (after 200ms)\nCommute Thread B: 1 ; (after 300ms)\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3", :account-source "github", :login "cloojure"}, :created-at 1446615365082, :updated-at 1451344876442, :_id "56399945e4b04b157a6648e5"}], :notes [{:updated-at 1295818063000, :body "Note to understand the difference to 'alter':\r\n\r\nCommute should be used when it doesn't matter whether anyone else has changed (altered or commuted) the ref using a successful transaction. This often implies that this ref is not affected by any conditions, i.e. it should be changed the same way no matter what. (thanks to raek for clarifying that for me)", :created-at 1295818063000, :author {:login "dedeibel", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e89e54d864f1e584c5ef4102f98bc83?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fb1"} {:updated-at 1316668674000, :body "In the concurrency video RH explains that commute is useful for actions where the order in which they alter the value doesn't matter, e.g. incrementing a counter.", :created-at 1316668674000, :author {:login "m0wfo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f4e90ce9fdf9e968587c7f9bec94721e?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fcd"}], :arglists ["ref fun & args"], :doc "Must be called in a transaction. Sets the in-transaction-value of\n ref to:\n\n (apply fun in-transaction-value-of-ref args)\n\n and returns the in-transaction-value of ref.\n\n At the commit point of the transaction, sets the value of ref to be:\n\n (apply fun most-recently-committed-value-of-ref args)\n\n Thus fun should be commutative, or, failing that, you must accept\n last-one-in-wins behavior. commute allows for more concurrency than\n ref-set.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/commute"} {:added "1.0", :ns "clojure.core", :name "coll?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1357786211000, :author {:login "juan.facorro", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d6f59d93cc17c698f16e550034a2d1ad?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "seq?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f37"} {:created-at 1357786229000, :author {:login "juan.facorro", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d6f59d93cc17c698f16e550034a2d1ad?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "list?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f38"} {:created-at 1357786244000, :author {:login "juan.facorro", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d6f59d93cc17c698f16e550034a2d1ad?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sequential?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f39"} {:created-at 1414509285263, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "map?", :library-url "https://github.com/clojure/clojure"}, :_id "544fb2e5e4b0dc573b892fae"} {:created-at 1414509297944, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "vector?", :library-url "https://github.com/clojure/clojure"}, :_id "544fb2f1e4b03d20a1024289"} {:created-at 1414509320242, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "set?", :library-url "https://github.com/clojure/clojure"}, :_id "544fb308e4b0dc573b892faf"}], :line 6213, :examples [{:updated-at 1444295715914, :created-at 1280775820000, :body ";; a map is a collection\n(coll? {})\n;;=> true\n\n;; a set is a collection\n(coll? #{})\n;;=> true\n\n;; a vector is a collection\n(coll? [])\n;;=> true\n\n;; a list is a collection \n(coll? '())\n;;=> true\n\n;; a number (long) is not a collection\n(coll? 4)\n;;=> false\n\n;; a string is not a collection\n(coll? \"fred\")\n;;=> false\n\n;; ...but a string sequence is a collection\n(coll? (seq \"fred\"))\n;;=> true\n\n;; a boolean is not a collection\n(coll? true)\n;;=> false\n\n;; nil is not a collection\n(coll? nil)\n;;=> false\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"} {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=2", :account-source "github", :login "phreed"} {:avatar-url "https://avatars.githubusercontent.com/u/40178?v=3", :account-source "github", :login "muhuk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692cfc026201cdc326e40"} {:author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :editors [], :body "user=> (coll? {:a 10 :b 20}) ; map is a collection of map-entries\ntrue", :created-at 1290278420000, :updated-at 1290278420000, :_id "542692cfc026201cdc326e44"} {:author {:login "gregginca", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bad5f5cb177b0968d4288596691ec3cd?r=PG&default=identicon"}, :editors [{:login "dcj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c18c35f1747ce57b4c1114cb12d600b1?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=3"}], :body ";; contrast to example code for sequential?\n;;\nuser> (coll? '(1 2 3))\ntrue\nuser> (coll? [1 2 3])\ntrue\nuser> (coll? (range 1 5))\ntrue\nuser> (coll? 1)\nfalse\nuser> (coll? {:a 2 :b 1}) \ntrue\nuser> (coll? {:a 2 :b 1}) ; in contrast to sequential?, coll? returns true for\n ; a hash map\ntrue\nuser> (sequential? {:a 2 :b 1})\nfalse", :created-at 1334018852000, :updated-at 1423811493909, :_id "542692d2c026201cdc326f61"} {:editors [{:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/19522656?v=4"}], :body ";; I had major bugs before I realized `seq?` doesn't like vectors.\n\nuser=> (seq? [1 2 3])\nfalse\nuser=> (coll? [1 2 3])\ntrue\n", :author {:avatar-url "https://avatars0.githubusercontent.com/u/19522656?v=4", :account-source "github", :login "Crowbrammer"}, :created-at 1611002403798, :updated-at 1611002470366, :_id "6005f223e4b0b1e3652d7436"}], :notes nil, :arglists ["x"], :doc "Returns true if x implements IPersistentCollection", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/coll_q"} {:added "1.2", :ns "clojure.core", :name "get-in", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1318010512000, :author {:login "jks", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/de50bee3396570d25f900873303c98f1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "assoc-in", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ce6"} {:created-at 1318010548000, :author {:login "jks", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/de50bee3396570d25f900873303c98f1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "update-in", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ce7"} {:created-at 1360286942000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "find", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ce8"} {:created-at 1360286946000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "get", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ce9"} {:created-at 1412262512260, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "->", :library-url "https://github.com/clojure/clojure"}, :_id "542d6a70e4b05f4d257a2989"} {:created-at 1602017675512, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "some->", :ns "clojure.core"}, :_id "5f7cd98be4b0b1e3652d73ca"}], :line 6142, :examples [{:author {:login "tomoj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/854f0ed52f56be27c9919c2afaa665c2?r=PG&default=identicon"}, :editors [{:login "tomoj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/854f0ed52f56be27c9919c2afaa665c2?r=PG&default=identicon"} {:login "tomoj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/854f0ed52f56be27c9919c2afaa665c2?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; We can use get-in for reaching into nested maps:\nuser=> (def m {:username \"sally\"\n :profile {:name \"Sally Clojurian\"\n :address {:city \"Austin\" :state \"TX\"}}})\n#'user/m\n\nuser=> (get-in m [:profile :name])\n\"Sally Clojurian\"\nuser=> (get-in m [:profile :address :city])\n\"Austin\"\nuser=> (get-in m [:profile :address :zip-code])\nnil\nuser=> (get-in m [:profile :address :zip-code] \"no zip code!\")\n\"no zip code!\"\n\n\n;; Vectors are also associative:\nuser=> (def v [[1 2 3]\n [4 5 6]\n [7 8 9]])\n#'user/v\nuser=> (get-in v [0 2])\n3\nuser=> (get-in v [2 1])\n8\n\n\n;; We can mix associative types:\nuser=> (def mv {:username \"jimmy\"\n :pets [{:name \"Rex\"\n :type :dog}\n {:name \"Sniffles\"\n :type :hamster}]})\n#'user/mv\nuser=> (get-in mv [:pets 1 :type])\n:hamster\n", :created-at 1279953166000, :updated-at 1285497184000, :_id "542692c7c026201cdc3269af"} {:author {:login "octopusgrabbus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon"}, :editors [], :body "(def s1 [[:000-00-0000 \"TYPE 1\" \"JACKSON\" \"FRED\"]\n [:000-00-0001 \"TYPE 2\" \"SIMPSON\" \"HOMER\"]\n [:000-00-0002 \"TYPE 4\" \"SMITH\" \"SUSAN\"]])\n\n(def cols [0 2 3])\n\n(defn f1 \n [s1 col] \n (map #(get-in s1 [% col] nil) (range (count s1))))\n\n(apply interleave (map (partial f1 s1) cols))\n\n(:000-00-0000 \"JACKSON\" \"FRED\" :000-00-0001 \"SIMPSON\" \"HOMER\" :000-00-0002 \"SMITH\" \"SUSAN\")", :created-at 1334887763000, :updated-at 1334887763000, :_id "542692d3c026201cdc326fc1"} {:author {:login "fitswell", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/12550cf0cd2d5a801d70ec1bf282e8ba?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; spam link removed", :created-at 1377540628000, :updated-at 1379291978000, :_id "542692d3c026201cdc326fc2"} {:body ";; Introduction of references is jarring to get-in usage\n\n(def owners [{:owner \"Jimmy\"\n :pets (ref [{:name \"Rex\"\n :type :dog}\n {:name \"Sniffles\"\n :type :hamster}])} \n {:owner \"Jacky\" \n :pets (ref [{:name \"Spot\" \n :type :mink}\n {:name \"Puff\" \n :type :magic-dragon}])}])\n;;=> 'user/owners\n\n(get-in owners [0 :pets])\n;;=> #\n\n;; In order to go deeper the get needs to be split \n;; as the deref cannot be used as part of the get.\n(-> (get-in owners [0 :pets]) deref (get-in [1 :type]))\n;;=> :hamster\n\n;; At this point it clear that the thread operator \n;; can be used to produce similar results. \n(-> owners (nth 0) :pets deref (nth 1) :type)\n;;=> :hamster", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1412262392950, :updated-at 1412262454783, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :_id "542d69f8e4b05f4d257a2986"} {:body ";; If the nested structure contains list, it does not work, because list is \n;; not an associative structure.\n(def a {:a '({:b1 2} {:b2 4}) :c 3})\n;;=> 'user/a\n(get-in a [:a 0 :b1])\n;;=> nil\n\n;; However, if the nested structure contains a vector then it does work.\n(def a1 {:a [{:b1 2} {:b2 4}] :c 3})\n;; => 'user/a1\n\n(get-in a1 [:a 0 :b1])\n;; => 2", :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=3"}, :created-at 1416104154689, :updated-at 1583283192336, :editors [{:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=3"} {:avatar-url "https://avatars2.githubusercontent.com/u/4922694?v=4", :account-source "github", :login "Jeel-Shah"}], :_id "546808dae4b03d20a10242a7"} {:updated-at 1514431489291, :created-at 1514431489291, :author {:login "titonbarua", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/13497834?v=4"}, :body ";; If an empty sequence is used as keys, the whole structure is returned.\n(get-in {:a 1 :b 2} [])\n;;=> {:a 1, :b 2}\n(get-in {:a 1, :b 2} '())\n;;=> {:a 1, :b 2}\n\n;; nil also counts as an empty sequence!\n(get-in {:a 1 :b 2} nil)\n;;=> {:a 1, :b 2}\n\n;; Be careful if you use a nill-able key sequence with not-found value.\n;; This can be a source of bug.\n(get-in {:a 1 :b 2} nil :nothing)\n;;=> {:a 1, :b 2}", :_id "5a446401e4b0a08026c48ce3"} {:editors [{:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}], :body ";;practical example\n\n(def employee\n {:name \"John\"\n :details {:email \"info@domain.com\"\n :phone \"555-144-300\"}})\n\n(get-in employee [:details :email])\n;;\"info@domain.com\"", :author {:avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4", :account-source "github", :login "ibercode"}, :created-at 1518296458140, :updated-at 1524762235792, :_id "5a7f5d8ae4b0316c0f44f8b6"} {:editors [{:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}], :body ";; Difference between nil values vs non-existing keys, and default values\n;; In this case, we don't know what will be the `:b` in our map,\n;; so attempting to guard with a 0 default value.\n(pos? (get-in {:a {:b 42}} [:a :b] 0)) ;=> 42 -> true (as expected)\n(pos? (get-in {:a nil} [:a :b] 0)) ;=> 0 -> false, no key (as expected)\n(pos? (get-in {:a {:b nil}} [:a :b] 0)) ;=> nil -> NPE (misleading code)\n(pos? (or (get-in {:a {:b nil}} [:a :b]) 0)) ;=> false (works but ugly)\n\n;; Better to use `some->` for such situations\n(some-> {:a {:b nil}} :a :b pos?) ;=> nil (YAY!)\n(some-> {:a {}} :a :b pos?) ;=> nil\n(some-> {:a {:b 42}} :a :b pos?) ;=> true\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4", :account-source "github", :login "MicahElliott"}, :created-at 1602017645815, :updated-at 1602017774458, :_id "5f7cd96de4b0b1e3652d73c9"}], :notes nil, :arglists ["m ks" "m ks not-found"], :doc "Returns the value in a nested associative structure,\n where ks is a sequence of keys. Returns nil if the key\n is not present, or the not-found value if supplied.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/get-in"} {:added "1.0", :ns "clojure.core", :name "fnext", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1348637428000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ffirst", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d68"} {:created-at 1374512076000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "second", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d69"} {:created-at 1437661659830, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "next", :ns "clojure.core"}, :_id "55b0f9dbe4b0080a1b79cda9"} {:created-at 1482183723442, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nnext", :ns "clojure.core"}, :_id "5858542be4b004d3a355e2bd"} {:created-at 1482183735219, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nfirst", :ns "clojure.core"}, :_id "58585437e4b004d3a355e2be"} {:created-at 1482184193486, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "first", :ns "clojure.core"}, :_id "58585601e4b004d3a355e2c7"}], :line 112, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (fnext ['(a b c) '(b a c)])\n(b a c) \n\nuser=> (fnext '([a b c] [b a c]))\n[b a c] \n\nuser=> (fnext {:a 1 :b 2 :c 3})\n[:b 2] \n\nuser=> (fnext [])\nnil \n\nuser=> (fnext [1])\nnil", :created-at 1280347120000, :updated-at 1332952453000, :_id "542692ccc026201cdc326ca5"}], :notes [{:author {:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}, :updated-at 1520169710053, :created-at 1520169710053, :body "Synonym of `second`.", :_id "5a9bf2eee4b0316c0f44f90a"}], :arglists ["x"], :doc "Same as (first (next x))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/fnext"} {:added "1.2", :ns "clojure.core", :name "denominator", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1401510175000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "numerator", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b91"}], :line 3590, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; denominator always returns the denominator of the reduced fraction\n;;\nuser=> (denominator (/ 2 3))\n3\nuser=> (denominator (/ 3 6))\n2\nuser=> (map denominator [(/ 3 2) (/ 2 3) (/ 4 5) (/ 4 6)])\n(2 3 5 3)\nuser=>", :created-at 1313489509000, :updated-at 1313489509000, :_id "542692ccc026201cdc326c35"}], :notes nil, :tag "java.math.BigInteger", :arglists ["r"], :doc "Returns the denominator part of a Ratio.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/denominator"} {:added "1.1", :ns "clojure.core", :name "bytes", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1334358122000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "byte-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c11"} {:created-at 1590885248124, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "bytes?", :ns "clojure.core"}, :_id "5ed2fb80e4b087629b5a1921"}], :line 5353, :examples [{:author {:login "leifp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d2f37720f063404ef83b987d2824353d?r=PG&default=identicon"}, :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"} {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; for fast interop\n(bytes (byte-array (map (comp byte int) \"ascii\")))\n;=> #\n(def the-bytes *1)\n;=> #'user/the-bytes\n(set! *warn-on-reflection* true)\n(defn get-byte [the-bytes i] (aget the-bytes i))\n;=> #'user/get-byte Reflection warning, NO_SOURCE_PATH:1 - call to aget can't be resolved.\n\n(defn get-byte [the-bytes i] \n (let [the-bytes (bytes the-bytes)] \n (aget the-bytes i)))\n;=> #'user/get-byte\n(get-byte the-bytes 0)\n;=> 97\n", :created-at 1342528870000, :updated-at 1683029591856, :_id "542692d2c026201cdc326f5e"} {:updated-at 1656674284283, :created-at 1656674284283, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; byte-array will convert where possible\n(byte-array [127 128 129]);; => [127, -128, -127]\n\n;; bytes will not\n(try (bytes [127 128 129])\n (catch ClassCastException e (ex-message e)))\n;; => \"clojure.lang.PersistentVector cannot be cast to [B\"\n", :_id "62bed7ece4b0b1e3652d7618"}], :notes [{:updated-at 1369546475000, :body "Why is the `(comp byte int)` required in the example? This seems to work just as well:\r\n\r\n
    \r\nuser=> (def b (bytes (byte-array (map byte \"ascii\"))))\r\nuser=> (String. b)\r\n\"ascii\"\r\n
    ", :created-at 1369546475000, :author {:login "Brian Marick", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon"}, :_id "542692edf6e94c6970522002"} {:updated-at 1369546620000, :body "For that matter, why is the `bytes` needed? Consider:\r\n\r\n
    \r\nuser=> (String. (byte-array (map byte \"ascii\")))\r\n\"ascii\"\r\n
    \r\n", :created-at 1369546620000, :author {:login "Brian Marick", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon"}, :_id "542692edf6e94c6970522003"} {:updated-at 1402388003000, :body "AFAIK, `bytes` is used for referring to `bytes[].class` from JAVA\r\n\r\nExample (midje):\r\n\r\n (fact (class (.getBytes \"test\")) => bytes) ; true\r\n", :created-at 1402388003000, :author {:login "xcthulhu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81c9adff485c35b7fdbbefe29589585a?r=PG&default=identicon"}, :_id "542692edf6e94c6970522028"}], :arglists ["xs"], :doc "Casts to bytes[]", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bytes"} {:added "1.0", :ns "clojure.core", :name "refer-clojure", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1327515371000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "refer", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f4c"}], :line 5822, :examples [{:author {:login "juergenhoetzel", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2736dfffc803c704dcf25b45ff63cede?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Prevent namespace conflicts like:\n\n;; `WARNING: time already refers to: #'clojure.core/time in namespace: \n;; time, being replaced by: #'time/time`\n\nuser=> (ns time\n (:refer-clojure :exclude [time]))\n\n(defn time []\n (System/nanoTime))\n", :created-at 1279945839000, :updated-at 1285497447000, :_id "542692c8c026201cdc326a5f"} {:updated-at 1472145548582, :created-at 1472145548582, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :body ";; Copied from https://gist.github.com/jkk/284230 (ns-cheatsheet.clj):\n\n;; Excludes built-in print\n(:refer-clojure :exclude [print])\n\n;; Excludes all built-ins except print\n(:refer-clojure :only [print])\n\n;; Renames built-in print to core-print\n(:refer-clojure :rename {print core-print})", :_id "57bf288ce4b0709b524f04d4"}], :macro true, :notes nil, :arglists ["& filters"], :doc "Same as (refer 'clojure.core )", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/refer-clojure"} {:ns "clojure.core.async", :name "Pub", :file "clojure/core/async.clj", :type "var", :column 1, :see-alsos nil, :line 838, :examples nil, :notes nil, :arglists [], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/Pub"} {:ns "clojure.core.async", :name "reduce", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1449944303196, :author {:login "jhn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/678798?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "merge", :ns "clojure.core.async"}, :_id "566c64efe4b08a3916795379"} {:created-at 1449944322632, :author {:login "jhn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/678798?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "map", :ns "clojure.core.async"}, :_id "566c6502e4b08a391679537a"} {:created-at 1449944389839, :author {:login "jhn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/678798?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "into", :ns "clojure.core.async"}, :_id "566c6545e4b09a2675a0ba75"}], :line 596, :examples [{:editors [{:login "jhn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/678798?v=3"}], :body "(require '[clojure.core.async :as async])\n\n;; some expensive io call\n(defn expensive-call [m] \n (Thread/sleep 2000) m)\n\n(->> [{:a 1} {:b 2} {:c 3} {:d 4}]\n (map (fn [m] \n (async/thread \n (expensive-call m)))) ; creates a thread per call\n (async/merge) ; merges the 4 chans returned into 1\n (async/reduce merge {}) ; reduces items in chan with merge\n (async/ {:a 1, :c 3, :b 2, :d 4}", :author {:avatar-url "https://avatars.githubusercontent.com/u/678798?v=3", :account-source "github", :login "jhn"}, :created-at 1449944130683, :updated-at 1449944487124, :_id "566c6442e4b09a2675a0ba74"} {:updated-at 1449945764111, :created-at 1449945764111, :author {:login "jhn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/678798?v=3"}, :body "(require '[clojure.core.async :as async])\n\n(def c \n (async/to-chan (range 10)))\n\n(async/ 45", :_id "566c6aa4e4b08a391679537b"} {:updated-at 1528275453855, :created-at 1528275453855, :author {:login "agodde", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/18694682?v=4"}, :body "(require '[clojure.core.async :as async])\n\n; define a channel which yields a predefined value after a timeout\n; (function 'f' of async/reduce won't be called)\n(def c\n (async/reduce f :predefined-value (async/timeout 10000)))\n\n(async/ :predefined-value", :_id "5b17a1fde4b00ac801ed9e0e"}], :notes nil, :arglists ["f init ch"], :doc "f should be a function of 2 arguments. Returns a channel containing\n the single result of applying f to init and the first item from the\n channel, then applying f to that result and the 2nd item, etc. If\n the channel closes without yielding items, returns init and f is not\n called. ch must close before reduce produces a result.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/reduce"} {:ns "clojure.core.async", :name "remove>", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 1065, :examples nil, :deprecated "0.1.319.0-6b1aca-alpha", :notes nil, :arglists ["p ch"], :doc "Deprecated - this function will be removed. Use transducer instead", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/remove>"} {:ns "clojure.core.async", :name "timeout", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 101, :examples [{:body "user=> (go-loop [seconds (atom 0)\n add-seconds! #(swap! seconds + %)]\n (println \"Waiting 1 second\")\n (\n\n;; Waiting 1 second\n\n;; Waiting 2 seconds\n\n;; Waited 3 seconds\n", :author {:login "runexec", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1487241?v=2"}, :created-at 1412204562718, :updated-at 1412204562718, :_id "542c8812e4b05f4d257a2979"} {:body "user=> (doseq [n (range 10)\n :let [i (-> n\n inc\n range\n rand-nth)]] \n (go\n ( #'user/t \n(poll! t) ;; before AND after timeout\n;;=> nil\n\n(a/put! t 'foo) ;; before timeout\n=> true\n(a/poll! t)\n=> foo\n(a/poll! t)\n=> nil\n(a/put! t 'foo) ;; after timeout\n=> false\n\n;; You COULD use a timeout-channel as a normal channel.\n;; The preferred option however would be using alts!!\n(let [timout-chan (timeout 1000)\n comms-chan (chan 10 (map inc) #(log/error % \"whoops\")) ;; genuine channel\n [val port] (alts!! [timeout-chan\n some-other-chan])]\n (cond\n (= port timeout-chan)\n (throw (TimeoutException. \"Tooooo late.\"))\n\n (and (= port comms-chan) (int? val))\n (log/infof \"SMOOOoooth %d\" val)\n \n :else\n (throw (IllegalStateException. \"Well.. shit.\")))))", :_id "619ba064e4b0b1e3652d7579"}], :notes [{:body "*Never* close! the channel returned by timeout -- this is an unwritten rule. \n\nThe implementation sometimes will use an existing timeout channel, if it is within a few ms of the desired timeout. Closing the channel will affect multiple otherwise unrelated CSPs that may be blocked/parked waiting for the channel to close.\n\nIn our application, we saw this as spurious \"timed out after waiting X ms\" messages when the logged timestamps didn't support this possibility.\n\nThanks to Ryan Neufeld for identifying this!", :created-at 1418342154119, :updated-at 1418342154119, :author {:login "hlship", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/52660?v=3"}, :_id "548a2f0ae4b04e93c519ffa3"} {:author {:login "raymcdermott", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/120437?v=3"}, :updated-at 1454937406809, :created-at 1454937406809, :body "Might be obvious but this construct is preferred in go blocks over Thread/sleep as it does not block", :_id "56b8953ee4b060004fc217be"}], :arglists ["msecs"], :doc "Returns a channel that will close after msecs", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/timeout"} {:ns "clojure.core.async", :name "unsub*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["p v ch"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/unsub*"} {:ns "clojure.core.async", :name "admix*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["m ch"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/admix*"} {:ns "clojure.core.async", :name "unmix*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["m ch"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/unmix*"} {:ns "clojure.core.async", :name "mix", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1414157132485, :author {:login "jw-00000", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2936?v=2"}, :to-var {:ns "clojure.core.async", :name "merge", :library-url "https://github.com/clojure/clojure"}, :_id "544a534ce4b03d20a1024278"} {:created-at 1477622634105, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "admix", :ns "clojure.core.async"}, :_id "5812bb6ae4b024b73ca35a17"} {:created-at 1477622639828, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unmix", :ns "clojure.core.async"}, :_id "5812bb6fe4b024b73ca35a18"} {:created-at 1477622650504, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unmix-all", :ns "clojure.core.async"}, :_id "5812bb7ae4b024b73ca35a19"} {:created-at 1477622656517, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "toggle", :ns "clojure.core.async"}, :_id "5812bb80e4b024b73ca35a1a"} {:created-at 1477622662278, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "solo-mode", :ns "clojure.core.async"}, :_id "5812bb86e4b024b73ca35a1b"}], :line 736, :examples [{:body "user=> (def ch-out (chan))\n#'user/ch-out\n\nuser=> (def mix-out (mix ch-out))\n#'user/mix-out\n\nuser=> (def ch-example1 (chan))\n#'user/ch-example1\n\nuser=> (def ch-example2 (chan))\n#'user/ch-example2\n\nuser=> (admix mix-out ch-example1)\ntrue\n\nuser=> (admix mix-out ch-example2)\ntrue\n\nuser=> (put! ch-example1 \"sent to chan 1\")\ntrue\n\nuser=> (put! ch-example2 \"sent to chan 2\")\ntrue\n\nuser=> ( ( (def c (chan 1))\n#'user/c\n\nuser=> (def sub-c (pub c :route))\n#'user/sub-c\n\nuser=> (def cx (chan 1))\n#'user/cx\n\nuser=> (sub sub-c :up-stream cx)\n#\n\nuser=> (def cy (chan 1))\n#'user/cy\n\nuser=> (sub sub-c :down-stream cy)\n#\n\nuser=> (go-loop [_ (\n\nuser=> (go-loop [_ (\n\nuser=> (put! c {:route :up-stream :data 123})\ntrue\nGot something coming up!\n\nuser=> (put! c {:route :down-stream :data 123})\nGot something going down!\ntrue\n", :author {:login "runexec", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1487241?v=2"}, :created-at 1412174292506, :updated-at 1412188913552, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :_id "542c11d4e4b05f4d257a2964"} {:updated-at 1475768259165, :created-at 1475768259165, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :body "(def news (chan 1))\n(def shouter (pub news :topics))\n\n(def alice (chan 1))\n(def bob (chan 1))\n(def clyde (chan 1))\n\n(sub shouter :celebrity-gossip alice)\n(sub shouter :space-x bob)\n(sub shouter :space-x clyde)\n\n(go-loop [heard ( nil\n:alice - Alice says Hi!\n:bob - Bob says Hi!\n:alice - Alice says Hi again", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/156290?v=4", :account-source "github", :login "milelo"}], :_id "5f93ef45e4b0b1e3652d73ed"} {:editors [{:login "jdf-id-au", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/9016301?v=4"}], :body "(defn pub-test\n \"Check how one topic subscription can block others.\"\n [bufsize]\n (let [out (chan)\n out-pub (if (zero? bufsize)\n (async/pub out first)\n (async/pub out first (fn [topic] (async/buffer bufsize))))\n blocking-sub (chan)\n blocked-sub (chan)]\n (async/sub out-pub :blocking blocking-sub)\n (async/sub out-pub :blocked blocked-sub)\n ; no sub so doesn't block pub:\n (doseq [n (range 5)] (async/put! out [:ignored n]))\n ; blocking-sub blocks blocked-sub until consumed or buffered:\n (doseq [n (range 5)] (async/put! out [:blocking n]))\n (doseq [n (range 5)] (async/put! out [:blocked n]))\n ; don't consume last three put!s on blocking-sub:\n (dotimes [n 2] (async/take! blocking-sub tap>))\n ; close!ing blocking-sub here unblocks blocked-sub\n ; (async/close! blocking-sub)\n (dotimes [n 5] (async/take! blocked-sub tap>))))\n\n(pub-test 0) ; blocks because 5 pub - 0 buffer - 1 on inner chan - 2 take > 0 left\n[:blocking 0]\n[:blocking 1]\n=> nil\n(pub-test 1) ; blocks because 5 - 1 - 1 - 2 > 0\n[:blocking 0]\n[:blocking 1]\n=> nil\n(pub-test 2) ; doesn't block because 5 - 2 - 1 - 2 = 0\n[:blocking 0]\n[:blocking 1]\n[:blocked 0]\n[:blocked 1]\n[:blocked 2]\n[:blocked 3]\n[:blocked 4]\n=> nil", :author {:avatar-url "https://avatars.githubusercontent.com/u/9016301?v=4", :account-source "github", :login "jdf-id-au"}, :created-at 1618977551159, :updated-at 1618977807505, :_id "607fa30fe4b0b1e3652d74c7"} {:updated-at 1655787209524, :created-at 1655787209524, :author {:login "CalebMacdonaldBlack", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5868450?v=4"}, :body "(def news (chan 1))\n\n(def shouter (pub news :topics))\n\n(def alice (chan 1))\n(def bob (chan 1))\n(def clyde (chan 1))\n\n(sub shouter :gossip alice)\n(sub shouter :space bob)\n(sub shouter :space clyde)\n\n(go-loop []\n (prn \"Alice heard: \" (!", :ns "clojure.core.async"}, :_id "571e7b43e4b0fc95a97eab56"}], :line 116, :examples [{:body "user=> (def c (chan 1))\n#'user/c\n\nuser=> (go-loop [data ( \" data)\n (println \"No recur. Won't print again\"))\n\n#\n\nuser=> (put! c \"Example Async Data\")\n\nnil\n\nWaited for => Example Async Data\nNo recur. Won't print again\n\nuser=> (put! c \"Example Async Data\")\nnil\n", :author {:login "runexec", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1487241?v=2"}, :created-at 1412145281681, :updated-at 1412197165245, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :_id "542ba081e4b05f4d257a2956"} {:body ";; Clojure 1.7\nuser=> (let [c (chan 1 (filter pos?))]\n \n (go-loop []\n (let [nums ( (def cx\n (to-chan\n (range 10)))\n#'user/cx\n\nuser=> (def cy\n (to-chan\n (range -10 0)))\n#'user/cy\n\nuser=> (def mapped-chans\n (clojure.core.async/map + [cx cy]))\n#'user/mapped-chans\n\n;;\nuser=> ( ( ( ( ( ( ( ( ( ( (", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 1111, :examples nil, :deprecated "0.1.319.0-6b1aca-alpha", :notes nil, :arglists ["f out" "f out buf-or-n"], :doc "Deprecated - this function will be removed. Use transducer instead", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/mapcat>"} {:ns "clojure.core.async", :name "buffer", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1451399869777, :author {:login "ljosa", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/197881?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "dropping-buffer", :ns "clojure.core.async"}, :_id "56829abde4b01f598e267e96"} {:created-at 1464291617409, :author {:login "eduardobull", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6353416?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "sliding-buffer", :ns "clojure.core.async"}, :_id "57475121e4b0bafd3e2a0460"} {:created-at 1464291767701, :author {:login "eduardobull", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6353416?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chan", :ns "clojure.core.async"}, :_id "574751b7e4b0bafd3e2a0463"}], :line 49, :examples [{:body "user=> (def c (chan (buffer 3)))\n#'user/c\n\nuser=> (go (\n\nuser=> (doseq [_ (range 5)] (println (>!! c true)))\ntrue\ntrue\ntrue\nUnblocking buffer\ntrue\ntrue\nnil", :author {:login "runexec", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1487241?v=2"}, :created-at 1412149213685, :updated-at 1412188866844, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :_id "542bafdde4b05f4d257a295d"}], :notes nil, :arglists ["n"], :doc "Returns a fixed buffer of size n. When full, puts will block/park.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/buffer"} {:ns "clojure.core.async", :name "close!", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1464291803969, :author {:login "eduardobull", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6353416?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chan", :ns "clojure.core.async"}, :_id "574751dbe4b0af2c9436d1f7"}], :line 177, :examples [{:editors [{:login "cloojure", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/7083783?v=4"}], :body "(let [c (chan 2) ]\n (>!! c 1)\n (>!! c 2)\n (close! c)\n (println (!! c 1))", :author {:avatar-url "https://avatars1.githubusercontent.com/u/8271291?v=4", :account-source "github", :login "ertugrulcetin"}, :created-at 1521203986699, :updated-at 1537832241555, :_id "5aabbb12e4b0316c0f44f927"} {:editors [{:login "nvseenu", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4986865?v=4"}], :body ";; Below example demonstrates go processes can take values (which were already put)\n;; from the unbuffered channel even after closing it.\n\n (let [c (chan)]\n (go (>! c 1))\n (go (>! c 2))\n ;; channel is closed even before \"2\" value is taken out. \n (go ( nil (it does not block even though there is no buffer!)\n\n(let [c (chan 1)]\n (offer! c 42))\n;;=> true", :author {:avatar-url "https://avatars1.githubusercontent.com/u/8271291?v=4", :account-source "github", :login "ertugrulcetin"}, :created-at 1521204479205, :updated-at 1569062333646, :_id "5aabbcffe4b0316c0f44f929"}], :notes nil, :arglists ["port val"], :doc "Puts a val into port if it's possible to do so immediately.\n nil values are not allowed. Never blocks. Returns true if offer succeeds.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/offer!"} {:ns "clojure.core.async", :name "chan", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1412171784700, :author {:login "halgari", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/654621?v=2"}, :to-var {:ns "clojure.core.async", :name "buffer", :library-url "https://github.com/clojure/clojure"}, :_id "542c0808e4b05f4d257a295f"} {:created-at 1412171799578, :author {:login "halgari", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/654621?v=2"}, :to-var {:ns "clojure.core.async", :name "dropping-buffer", :library-url "https://github.com/clojure/clojure"}, :_id "542c0817e4b05f4d257a2960"} {:created-at 1412171810126, :author {:login "halgari", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/654621?v=2"}, :to-var {:ns "clojure.core.async", :name "sliding-buffer", :library-url "https://github.com/clojure/clojure"}, :_id "542c0822e4b05f4d257a2961"} {:created-at 1632011320526, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/601540?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "promise-chan", :ns "clojure.core.async"}, :_id "61468438e4b0b1e3652d7541"}], :line 73, :examples [{:body "user=> (def c (chan))\n#'user/c\nuser=> (def c (chan 1))\n#'user/c\nuser=> (def c (chan (buffer 2)))\n#'user/c\n;; Clojure 1.7\nuser=> (def c (chan 1 (filter string?)))\n#'user/c\n\n", :author {:login "runexec", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1487241?v=2"}, :created-at 1412149437066, :updated-at 1412149437066, :_id "542bb0bde4b05f4d257a295e"} {:updated-at 1521204822665, :created-at 1521204822665, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/8271291?v=4"}, :body "(let [c (chan 3 (map inc))] ;; providing transducer which increments values by one\n (>!! c 1)\n (>!! c 2)\n (>!! c 3)\n (println ( nil", :_id "5aabbe56e4b0316c0f44f92c"} {:updated-at 1611141061096, :created-at 1611141061096, :author {:login "liuchong", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/236058?v=4"}, :body "(def c (chan (buffer 1)\n (fn [xf] (fn [_ data]\n (throw (Exception. (when (= data \"hehe\")\n \"xform error\")))))\n (fn [e] (.getMessage e))))\n\n(>!! c \"hehe\")\n;;=> true\n\n;; any non-nil return value from transducer will be placed in the channel\n( \"xform error\"\n\n(>!! c \"haha\")\n;;=> true\n\n;; nil return value from transducer will NOT be placed in the channel\n( #'user/c\n(>!! c (range 3))\n;;=> true\n\n(loop [x ( #object[clojure.core.async.impl.channels.ManyToManyChannel...\n\n;; When provisioning more items than the channel buffer allows,\n;; mapcat will still put all items\n\n(>!! c (range 5))\n;;=> true\n;;0\n;;1\n;;2\n;;3\n;;4\n\n;; Avoid that with a dropping/sliding buffer:\n(def c (chan (sliding-buffer 3) (mapcat identity)))\n;;=> #'user/c\n(go-loop ...)\n;;=> #object[clojure.core.async.impl.channels.ManyToManyChannel...\n(>!! c (range 5))\n;;=> true\n;;2\n;;3\n;;4", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4", :account-source "github", :login "loeschzwerg"}], :_id "617ac388e4b0b1e3652d755d"}], :notes nil, :arglists ["" "buf-or-n" "buf-or-n xform" "buf-or-n xform ex-handler"], :doc "Creates a channel with an optional buffer, an optional transducer\n (like (map f), (filter p) etc or a composition thereof), and an\n optional exception-handler. If buf-or-n is a number, will create\n and use a fixed buffer of that size. If a transducer is supplied a\n buffer must be specified. ex-handler must be a fn of one argument -\n if an exception occurs during transformation it will be called with\n the Throwable as an argument, and any non-nil return value will be\n placed in the channel.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/chan"} {:ns "clojure.core.async", :name "solo-mode*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["m mode"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/solo-mode*"} {:ns "clojure.core.async", :name "tap", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1420501362780, :author {:login "schmee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3405586?v=3"}, :to-var {:ns "clojure.core.async", :name "mult", :library-url "https://github.com/clojure/clojure"}, :_id "54ab2172e4b09260f767ca88"} {:created-at 1420501451535, :author {:login "schmee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3405586?v=3"}, :to-var {:ns "clojure.core.async", :name "untap", :library-url "https://github.com/clojure/clojure"}, :_id "54ab21cbe4b09260f767ca8b"}], :line 712, :examples [{:body "user=> (def sz 20)\n#'user/sz\n\nuser=> (def c (chan sz))\n#'user/c\n\nuser=> (def mult-c (mult c))\n#'user/mult-c\n\nuser=> (def cx (chan sz))\n#'user/cx\n\nuser=> (def cy (chan sz))\n#'user/cy\n\nuser=> (def cz (chan sz))\n#'user/cz\n\nuser=> (tap mult-c cx)\n#\n\nuser=> (tap mult-c cy)\n#\n\nuser=> (tap mult-c cz)\n#\n\nuser=> (put! c \"sent to all\")\ntrue\n\nuser=> ( ( ( (doseq [n (range 10)\n :let [i (-> n\n inc\n range\n rand-nth)]] \n (go\n ( (.getPlacePredictions ^js/google.maps.places.AutocompleteService \n svc {:input x})\n (get-place-predictions {:input x})\n ! and alt!/alts!\n channel operations within the body will block (if necessary) by\n 'parking' the calling thread rather than tying up an OS thread (or\n the only JS thread when in ClojureScript). Upon completion of the\n operation, the body will be resumed.\n\n Returns a channel which will receive the result of the body when\n completed", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/go"} {:ns "clojure.core.async", :name "admix", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1477622395408, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unmix", :ns "clojure.core.async"}, :_id "5812ba7be4b024b73ca35a0b"} {:created-at 1477622401065, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unmix-all", :ns "clojure.core.async"}, :_id "5812ba81e4b024b73ca35a0c"} {:created-at 1477622405500, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "mix", :ns "clojure.core.async"}, :_id "5812ba85e4b024b73ca35a0d"}], :line 806, :examples [{:body "user=> (def ch-out (chan))\n#'user/ch-out\n\nuser=> (def mix-out (mix ch-out))\n#'user/mix-out\n\nuser=> (def ch-example1 (chan))\n#'user/ch-example1\n\nuser=> (def ch-example2 (chan))\n#'user/ch-example2\n\nuser=> (admix mix-out ch-example1)\ntrue\n\nuser=> (admix mix-out ch-example2)\ntrue\n\nuser=> (put! ch-example1 \"sent to chan 1\")\ntrue\n\nuser=> (put! ch-example2 \"sent to chan 2\")\ntrue\n\nuser=> ( ( 11\n\n;; Similar to `promise` and `future`, after a value has been delivered to the\n;; promise-chan, taking from it will continue to return that value immediately\n;; over and over\n\n(def inc-promise (inc-async 10))\n\n( 11\n( 11\n( 11\n\n;; That means unlike other channels, only one value can be put into a promise-chan, and \n;; taking from it afterwards will always return that value which is cached by the \n;; promise-chan, similar to what a promise or a future would.\n\n;; This makes using `promise-chan` very similar to async/await style of programming.\n;; You can create an async function by having a function return a promise-chan\n;; where it will `put!` (deliver) the value to it asynchronously as I showed with\n;; inc-async.\n\n;; You can then use `go` blocks like you'd mark `async` functions, and inside them\n;; use ` (def c (chan))\n#'user/c\n\nuser=> (onto-chan c (range 100))\n#\n\nuser=> ( ( ( false\n(identical? in-ch out-ch)\n;; => false\n", :author {:avatar-url "https://avatars1.githubusercontent.com/u/590297?v=4", :account-source "github", :login "jayzawrotny"}, :created-at 1516398991682, :updated-at 1516399003356, :_id "5a62698fe4b0a08026c48d05"}], :notes nil, :arglists ["ch coll" "ch coll close?"], :doc "Puts the contents of coll into the supplied channel.\n\n By default the channel will be closed after the items are copied,\n but can be determined by the close? parameter.\n\n Returns a channel which will close after the items are copied.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/onto-chan"} {:ns "clojure.core.async", :name "to-chan", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 648, :examples [{:body "user=> (def c (to-chan (range 10)))\n#'user/c\nuser=> ( ( ( (!! c x)\n (println \"Sent: \" x)))\n (println \"Done\")\n (future (dotimes [x 3]\n (println \"Got: \" ( (def c\n (clojure.core.async/into [:a :b :c]\n (to-chan\n (range 10))))\n#'user/c\n\nuser=> (!!", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1458597749932, :author {:login "royalaid", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2439803?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name ">!", :ns "clojure.core.async"}, :_id "56f06f75e4b09295d75dbf39"} {:created-at 1458597770460, :author {:login "royalaid", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2439803?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "put!", :ns "clojure.core.async"}, :_id "56f06f8ae4b07ac9eeceed12"} {:created-at 1461615278468, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name " (>!! c \"Blocking - not in go-block\")\ntrue\nuser=> (!!:\n\"...Use the clojure.core.async.go-checking flag to detect invalid use (see\n namespace docs).\" see [github](https://github.com/clojure/core.async/blob/6450a57caa69b0eabee2e648893ee8f44ed7ac33/src/main/clojure/clojure/core/async.clj#L303)", :_id "63055985e4b0b1e3652d764a"}], :arglists ["port val"], :doc "puts a val into port. nil values are not allowed. Will block if no\n buffer space is available. Returns true unless port is already closed.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/>!!"} {:ns "clojure.core.async", :name "alt!", :file "clojure/core/async.clj", :type "macro", :column 1, :see-alsos [{:created-at 1417715418353, :author {:login "hlship", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/52660?v=3"}, :to-var {:ns "clojure.core.async", :name "alts!", :library-url "https://github.com/clojure/clojure"}, :_id "54809edae4b03d20a10242c1"}], :line 347, :examples [{:body ";; attempts to put trade on channel trade-ch within 1 second.\n;; yields :timed-out or :sent.\n\n(let [timeout-ch (timeout 1000)]\n (alt!\n timeout-ch :timed-out\n ;; note use of double-nested vector; [trade-ch trade]\n ;; would be interpreted as two channels to take from, resulting\n ;; in an odd error.\n [[trade-ch trade]] :sent))", :author {:login "hlship", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/52660?v=3"}, :created-at 1415724033428, :updated-at 1415724033428, :_id "54623c01e4b0dc573b892fc3"} {:body "(def trade-ch (chan))\n\n(go-loop []\n (\n (alt!\n [[trade-ch trade]] :sent\n timeout-ch :timed-out)\n print))) ;;eval this at will\n\n\n;;printout example\ncore.js[38]:\t\n:sent\ncore.js[38]:\t\n100\ncore.js[38]:\t\n100\ncore.js[38]:\t\n:sent\ncore.js[38]:\t\n:timed-out\ncore.js[38]:\t\n:timed-out\ncore.js[38]:\t\n:timed-out\ncore.js[38]:\t\n:timed-out\ncore.js[38]:\t\n:timed-out\ncore.js[38]:\t\n:timed-out\ncore.js[38]:\t\n:sent\ncore.js[38]:\t\n100\n\n\n\n", :author {:login "boxxxie", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/440034?v=3"}, :created-at 1418228084201, :updated-at 1418228084201, :_id "54887174e4b09260f767ca75"} {:editors [{:avatar-url "https://avatars.githubusercontent.com/u/1293832?v=3", :account-source "github", :login "spiralman"} {:login "liuchong", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/236058?v=4"}], :updated-at 1636540050398, :created-at 1420914102914, :author {:avatar-url "https://avatars.githubusercontent.com/u/1293832?v=3", :account-source "github", :login "spiralman"}, :body ";; Reading from multiple channels, handling whichever gets data first\n(use 'clojure.core.async)\n\n(def result-chan (chan))\n\n(def error-chan (chan))\n\n(def dont-care-chan (chan))\n\n(go\n (alt!\n result-chan ([result] (println (str \"Success: \" result)))\n error-chan ([error] (println (str \"Error: \" error)))\n dont-care-chan (println \"Don't care about the value!\")))\n\n;; Given\n(put! result-chan \"Some result\")\n\n;; Output\n;; Success: Some result\n\n;; Given\n(put! error-chan \"Some error\")\n\n;; Output\n;; Error: Some error\n\n;; Given\n(put! dont-care-chan \"Some value\")\n\n;; Output\n;; Don't care about the value!", :_id "54b16db6e4b0e2ac61831ca5"}], :macro true, :notes [{:author {:login "jzwolak", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/285725?v=4"}, :updated-at 1661540240745, :created-at 1661540240745, :body "alt! does not take a vector of ports as per alts!. alts! takes a vector of ports. alt! takes a _literal_ vector of ports _only_. Any symbol containing a value that is a vector of ports will not work with alt! even though such a value will work with alts!.\n\n
    \n(ns examples.failing-async\n  (:require [clojure.core.async :refer [chan go alt! >! alts!]]))\n\n(def c1 (chan))\n(def c2 (chan))\n(def two-chans [c1 c2])\n\n(println (vector? two-chans))\n\n; Fails\n(go (loop []\n      (alt! two-chans ([v c] (println \"got v =\" v)))\n      (recur)))\n\n(go (>! c1 \"hi on alt! two-chans\"))\n\n; Succeeds (must comment out above failing code for this to work)\n(go (loop []\n      (alt! [c1 c2] ([v c] (println \"got v =\" v)))\n      (recur)))\n\n(go (>! c1 \"hi on alt! [c1 c2]\"))\n\n; Succeeds\n(go (loop []\n      (let [[v c] (alts! two-chans)]\n        (println \"got v =\" v))\n      (recur)))\n\n(go (>! c1 \"hi on alts! two-chans\"))\n
    \n", :_id "63091790e4b0b1e3652d7653"}], :arglists ["& clauses"], :doc "Makes a single choice between one of several channel operations,\n as if by alts!, returning the value of the result expr corresponding\n to the operation completed. Must be called inside a (go ...) block.\n\n Each clause takes the form of:\n\n channel-op[s] result-expr\n\n where channel-ops is one of:\n\n take-port - a single port to take\n [take-port | [put-port put-val] ...] - a vector of ports as per alts!\n :default | :priority - an option for alts!\n\n and result-expr is either a list beginning with a vector, whereupon that\n vector will be treated as a binding for the [val port] return of the\n operation, else any other expression.\n\n (alt!\n [c t] ([val ch] (foo ch val))\n x ([v] v)\n [[out val]] :wrote\n :default 42)\n\n Each option may appear at most once. The choice and parking\n characteristics are those of alts!.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/alt!"} {:ns "clojure.core.async", :name "pipeline", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1462612004334, :author {:login "tyano", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/271573?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pipeline-async", :ns "clojure.core.async"}, :_id "572db024e4b0b27c121b214b"} {:created-at 1462612021225, :author {:login "tyano", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/271573?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pipeline-blocking", :ns "clojure.core.async"}, :_id "572db035e4b039e78aadabfa"}], :line 536, :examples [{:editors [{:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}], :body ";; SIMPLE EXAMPLE -----------------------\n\n(def ca (chan 1))\n(def cb (chan 1))\n\n(pipeline\n 4 ; thread count, i prefer egyptian cotton\n cb ; to\n (filter even?) ; transducer\n ca ; from\n )\n\n(doseq [i (range 10)]\n (go (>! ca i)))\n(go-loop []\n (println ( prints even numbers in 0-10, note: not necessarily in order\n\n\n\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3", :account-source "github", :login "freckletonj"}, :created-at 1475709906229, :updated-at 1475710233062, :_id "57f58bd2e4b0709b524f0521"} {:editors [{:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}], :body ";; EXTENDED EXAMPLE ---------------------------\n\n(def ca (chan 1))\n(def cb (chan 1))\n\n(pipeline\n 4 \n cb \n (filter (fn [x]\n (if (> x 100)\n (throw (Throwable. \"too big!\"))\n (even? x)))) \n ca \n false ; should it close when `from` runs out?\n (fn [error] (println \"ahhh: \" (.getMessage error))))\n\n\n(doseq [i (range 10)]\n (go (>! ca i)))\n(go-loop []\n (println (! ca 101)) ; this one throws an error\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3", :account-source "github", :login "freckletonj"}, :created-at 1475710315800, :updated-at 1475710444653, :_id "57f58d6be4b0709b524f0523"}], :notes nil, :arglists ["n to xf from" "n to xf from close?" "n to xf from close? ex-handler"], :doc "Takes elements from the from channel and supplies them to the to\n channel, subject to the transducer xf, with parallelism n. Because\n it is parallel, the transducer will be applied independently to each\n element, not across elements, and may produce zero or more outputs\n per input. Outputs will be returned in order relative to the\n inputs. By default, the to channel will be closed when the from\n channel closes, but can be determined by the close? parameter. Will\n stop consuming the from channel if the to channel closes. Note this\n should be used for computational parallelism. If you have multiple\n blocking operations to put in flight, use pipeline-blocking instead,\n If you have multiple asynchronous operations to put in flight, use\n pipeline-async instead.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/pipeline"} {:ns "clojure.core.async", :name "sub", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1414157561892, :author {:login "jw-00000", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2936?v=2"}, :to-var {:ns "clojure.core.async", :name "pub", :library-url "https://github.com/clojure/clojure"}, :_id "544a54f9e4b03d20a1024279"}], :line 898, :examples [{:body "user=> (def c (chan 1))\n#'user/c\n\nuser=> (def sub-c (pub c :route))\n#'user/sub-c\n\nuser=> (def cx (chan 1))\n#'user/cx\n\nuser=> (sub sub-c :up-stream cx)\n#\n\nuser=> (def cy (chan 1))\n#'user/cy\n\nuser=> (sub sub-c :down-stream cy)\n#\n\nuser=> (go-loop [_ (\n\nuser=> (go-loop [_ (\n\nuser=> (put! c {:route :up-stream :data 123})\ntrue\nGot something coming up!\n\nuser=> (put! c {:route :down-stream :data 123})\nGot something going down!\ntrue\n", :author {:login "runexec", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1487241?v=2"}, :created-at 1412174270351, :updated-at 1412188965721, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :_id "542c11bee4b05f4d257a2963"} {:updated-at 1603550036673, :created-at 1603550036673, :author {:login "milelo", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/156290?v=4"}, :body "(defn monitor! [publisher topic]\n (let [ nil\n:alice - Alice says Hi!\n:bob - Bob says Hi!\n:alice - Alice says Hi again", :_id "5f943b54e4b0b1e3652d73f4"}], :notes nil, :arglists ["p topic ch" "p topic ch close?"], :doc "Subscribes a channel to a topic of a pub.\n\n By default the channel will be closed when the source closes,\n but can be determined by the close? parameter.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/sub"} {:ns "clojure.core.async", :name "go-loop", :file "clojure/core/async.clj", :type "macro", :column 1, :see-alsos [{:created-at 1435079791878, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:ns "clojure.core", :name "loop", :library-url "https://github.com/clojure/clojure"}, :_id "5589946fe4b05f167dcf2340"} {:created-at 1506702187689, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "go", :ns "clojure.core.async"}, :_id "59ce736be4b03026fe14ea4e"}], :line 457, :examples [{:body "(go-loop [seconds 1]\n ( (def c (chan 1))\n#'user/c\n\nuser=> (go-loop []\n (let [x (\n\nuser=> (doseq [n (range 3)] (put! c n))\nnil\nGot a value in this loop: 0\nGot a value in this loop: 1\nGot a value in this loop: 2\n", :author {:login "runexec", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1487241?v=2"}, :created-at 1412204771239, :updated-at 1412204771239, :_id "542c88e3e4b05f4d257a297b"}], :macro true, :notes nil, :arglists ["bindings & body"], :doc "Like (go (loop ...))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/go-loop"} {:ns "clojure.core.async", :name "map>", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 1031, :examples nil, :deprecated "0.1.319.0-6b1aca-alpha", :notes nil, :arglists ["f ch"], :doc "Deprecated - this function will be removed. Use transducer instead", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/map>"} {:ns "clojure.core.async", :name "pipe", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 462, :examples [{:body "user=> (def cx (chan 1))\n#'user/cx\n\nuser=> (def cy (chan 1))\n#'user/cy\n\nuser=> (pipe cx cy)\n#\n\nuser=> (put! cx \"Going into CX\")\ntrue\n\nuser=> ( (def ch-1 (async/chan 10))\n#'user/ch-1\n\nuser> (def ch-2 (async/chan 10))\n#'user/ch-2\n\n;; start a thread that takes from channel 1, sleeping after each take\nuser> (async/thread\n (loop []\n (when-let [v (async/ (async/thread\n (loop []\n (when-let [v (async/ (async/pipe ch-1 ch-2)\n#object[clojure.core.async.impl.channels.ManyToManyChannel ...]\n\n;; lets try to add a new listener to channel 1.\nuser> (async/thread\n (loop []\n (when-let [v (async/ (async/thread\n (doseq [x (range 10)]\n (async/>!! ch-1 x)\n (Thread/sleep 500)))\n#object[clojure.core.async.impl.channels.ManyToManyChannel ...]\n\nch-1 taker got 0\nch-2 taker got 1\nsecond ch-1 taker got 2\nch-2 taker got 3\nch-1 taker got 4\nch-2 taker got 5\nsecond ch-1 taker got 6\nch-2 taker got 7\nch-1 taker got 8\nch-2 taker got 9\n\n;; so a pipe is just a listener that tries to take from the from channel\n;; and put onto the to channel, a pipe does dot restrict the ability to \n;; *take* from the *from* channel.", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/1413969?v=4", :account-source "github", :login "beoliver"}], :_id "59f59c41e4b0a08026c48c85"} {:editors [{:login "ferdinand-beyer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/23474334?v=4"}], :body ";;;; pipe is especially useful in combination with channel transducers,\n;;;; to transform items in a channel.\n\n;; Some input channel.\n(def input (to-chan (range 10)))\n\n;; Create a channel with all items from input transformed. Here, we\n;; create a transducer that multiplies by 5.\n;; Note that pipe returns the to channel.\n(def transformed (pipe input (chan 1 (map (partial * 5)))))\n\n;; Read transformed channel into a vector.\n(as/ [0 5 10 15 20 25 30 35 40 45]", :author {:avatar-url "https://avatars.githubusercontent.com/u/23474334?v=4", :account-source "github", :login "ferdinand-beyer"}, :created-at 1627285655574, :updated-at 1627285703564, :_id "60fe6897e4b0b1e3652d751e"}], :notes [{:author {:login "jayzawrotny", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/590297?v=4"}, :updated-at 1517207457129, :created-at 1517207457129, :body "Returns the `to` channel argument.", :_id "5a6ebfa1e4b0c974fee49d12"}], :arglists ["from to" "from to close?"], :doc "Takes elements from the from channel and supplies them to the to\n channel. By default, the to channel will be closed when the from\n channel closes, but can be determined by the close? parameter. Will\n stop consuming the from channel if the to channel closes", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/pipe"} {:ns "clojure.core.async", :name "unmix", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1477622125589, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unmix-all", :ns "clojure.core.async"}, :_id "5812b96de4b024b73ca35a08"} {:created-at 1477622170416, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "admix", :ns "clojure.core.async"}, :_id "5812b99ae4b024b73ca35a09"} {:created-at 1477622241225, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "mix", :ns "clojure.core.async"}, :_id "5812b9e1e4b024b73ca35a0a"} {:created-at 1477622605184, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "toggle", :ns "clojure.core.async"}, :_id "5812bb4de4b024b73ca35a15"} {:created-at 1477622612305, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "solo-mode", :ns "clojure.core.async"}, :_id "5812bb54e4b024b73ca35a16"}], :line 811, :examples nil, :notes nil, :arglists ["mix ch"], :doc "Removes ch as an input to the mix", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/unmix"} {:ns "clojure.core.async", :name "filter<", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 1071, :examples nil, :deprecated "0.1.319.0-6b1aca-alpha", :notes [{:author {:login "jngbng", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/552977?v=4"}, :updated-at 1642583596457, :created-at 1642583596457, :body "For posterity's sake, below is an alternative implementation.\nSee https://stackoverflow.com/questions/31286167/how-to-create-a-channel-from-another-with-transducers\n
    \n(defn filter< [p ch]\n (let [co (chan 1 (filter p)]\n    (pipe ch co)\n    co))\n
    ", :_id "61e7d62ce4b0b1e3652d759f"}], :arglists ["p ch" "p ch buf-or-n"], :doc "Deprecated - this function will be removed. Use transducer instead", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/filter<"} {:ns "clojure.core.async", :name "sub*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["p v ch close?"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/sub*"} {:ns "clojure.core.async", :name "remove<", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 1086, :examples nil, :deprecated "0.1.319.0-6b1aca-alpha", :notes nil, :arglists ["p ch" "p ch buf-or-n"], :doc "Deprecated - this function will be removed. Use transducer instead", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/remove<"} {:ns "clojure.core.async", :name "alt!!", :file "clojure/core/async.clj", :type "macro", :column 1, :see-alsos [{:created-at 1465302937238, :author {:login "Kejia", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1039073?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "alt!", :ns "clojure.core.async"}, :_id "5756bf99e4b0bafd3e2a0479"} {:created-at 1465302967905, :author {:login "Kejia", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1039073?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "alts!!", :ns "clojure.core.async"}, :_id "5756bfb7e4b0bafd3e2a047a"} {:created-at 1465302980860, :author {:login "Kejia", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1039073?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "alts!", :ns "clojure.core.async"}, :_id "5756bfc4e4b0bafd3e2a047b"}], :line 340, :examples [{:updated-at 1469659872470, :created-at 1469659872470, :author {:login "xiongtx", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1624090?v=3"}, :body ";; This example is taken from Timothy Baldridge's `core.async` course on Udemy\n;; https://www.udemy.com/communicating-sequential-processes-with-coreasync/learn/v4/overview\n\n;; Create two channels, c1 and c2\n(let [c1 (chan 1)\n c2 (chan 1)]\n ;; Put a value in each channel\n (>!! c1 42)\n (>!! c2 44)\n (thread\n ;; Take a value from one of the channels.\n ;; - If the value is taken from c1, return the keyword :c1 and channel c1\n ;; - Analogously for c2\n (let [[v c] (alt!! [c1] [:c1 c1]\n [c2] [:c2 c2])]\n ;; Print the returned keyword and whether the value was taken from c1 or c2\n (println \"Value: \" v)\n (println \"Chan 1?: \" (= c1 c))\n (println \"Chan 1?: \" (= c2 c)))))", :_id "57993ae0e4b0bafd3e2a04c2"}], :macro true, :notes nil, :arglists ["& clauses"], :doc "Like alt!, except as if by alts!!, will block until completed, and\n not intended for use in (go ...) blocks.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/alt!!"} {:ns "clojure.core.async", :name "untap*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["m ch"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/untap*"} {:ns "clojure.core.async", :name "!!", :ns "clojure.core.async"}, :_id "571e7ad5e4b012fe4fb18b39"}], :line 106, :examples [{:body "user=> (>!! c \"Blocking - not in go-block\")\ntrue\nuser=> ( channel-state-map. A\n channel-state-map is a map of attrs -> boolean, where attr is one or\n more of :mute, :pause or :solo. Any states supplied are merged with\n the current state.\n\n Note that channels can be added to a mix via toggle, which can be\n used to add channels in a particular (e.g. paused) state.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/toggle"} {:ns "clojure.core.async", :name "untap-all*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["m"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/untap-all*"} {:ns "clojure.core.async", :name "sliding-buffer", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1464291652174, :author {:login "eduardobull", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6353416?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "buffer", :ns "clojure.core.async"}, :_id "57475144e4b0af2c9436d1f5"} {:created-at 1464291665676, :author {:login "eduardobull", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6353416?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "dropping-buffer", :ns "clojure.core.async"}, :_id "57475151e4b0af2c9436d1f6"} {:created-at 1464291782443, :author {:login "eduardobull", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6353416?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chan", :ns "clojure.core.async"}, :_id "574751c6e4b0bafd3e2a0465"}], :line 60, :examples [{:updated-at 1448692514966, :created-at 1448692514966, :author {:login "srazzaque", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/810842?v=3"}, :body "(require '[clojure.core.async :refer [go-loop !! sliding-buffer chan]])\n\n;; Sliding buffers can be used to discard old values on a chan\n\n;; Define a chan with a sliding buffer of 1 (i.e. we care mainly\n;; about the latest value)\n(def sliding-chan (chan (sliding-buffer 1)))\n\n;; Print the values on the chan forever\n(go-loop []\n (println \"Received:\" (!! sliding-chan n))\n\n;;=> Received: 0 ;; <-- see note below\n;;=> Received: 99\n\n;; Results may vary for values from 0 to n-1\n;; but you should ALWAYS see 'Received: '", :_id "56594b22e4b0be225c0c479f"}], :notes nil, :arglists ["n"], :doc "Returns a buffer of size n. When full, puts will complete, and be\n buffered, but oldest elements in buffer will be dropped (not\n transferred).", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/sliding-buffer"} {:ns "clojure.core.async", :name "partition", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 1138, :examples nil, :deprecated "0.1.319.0-6b1aca-alpha", :notes nil, :arglists ["n ch" "n ch buf-or-n"], :doc "Deprecated - this function will be removed. Use transducer instead", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/partition"} {:ns "clojure.core.async", :name "Mult", :file "clojure/core/async.clj", :type "var", :column 1, :see-alsos nil, :line 664, :examples nil, :notes nil, :arglists [], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/Mult"} {:ns "clojure.core.async", :name "merge", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1414157124197, :author {:login "jw-00000", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2936?v=2"}, :to-var {:ns "clojure.core.async", :name "mix", :library-url "https://github.com/clojure/clojure"}, :_id "544a5344e4b0dc573b892fa7"}], :line 954, :examples [{:body "user=> (def cx (chan))\n#'user/cx\n\nuser=> (def cy (chan))\n#'user/cy\n\nuser=> (def mc (clojure.core.async/merge [cx cy]))\n#'user/mc\n\nuser=> (put! cx \"Going to x\")\ntrue\n\nuser=> (put! cy \"Goint to y\")\ntrue\n\nuser=> ( ( ((1 1) (2) (1 1 1) (3 3))", :author {:login "princesspanda", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/120405?v=3"}, :created-at 1426133159296, :updated-at 1426133187178, :editors [{:login "princesspanda", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/120405?v=3"}], :_id "550110a7e4b08a4fe1ef7150"}], :deprecated "0.1.319.0-6b1aca-alpha", :notes nil, :arglists ["f ch" "f ch buf-or-n"], :doc "Deprecated - this function will be removed. Use transducer instead", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/partition-by"} {:ns "clojure.core.async", :name "unsub-all", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 911, :examples nil, :notes nil, :arglists ["p" "p topic"], :doc "Unsubscribes all channels from a pub, or a topic of a pub", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/unsub-all"} {:ns "clojure.core.async", :name ">!", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1461613777584, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name ">!!", :ns "clojure.core.async"}, :_id "571e74d1e4b012fe4fb18b36"} {:created-at 1461614301689, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "put!", :ns "clojure.core.async"}, :_id "571e76dde4b0fc95a97eab53"} {:created-at 1461615245628, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name " (let [c (chan 1)]\n #_=> (go (>! c 1)\n #_=> (println \"Got => \" ( 1\n\n#\n", :author {:login "runexec", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1487241?v=2"}, :created-at 1412147143085, :updated-at 1412147143085, :_id "542ba7c7e4b05f4d257a2958"}], :notes nil, :arglists ["port val"], :doc "puts a val into port. nil values are not allowed. Must be called\n inside a (go ...) block. Will park if no buffer space is available.\n Returns true unless port is already closed.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/>!"} {:ns "clojure.core.async", :name "unmix-all*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["m"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/unmix-all*"} {:ns "clojure.core.async", :name "split", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 575, :examples [{:updated-at 1457189785017, :created-at 1457189785017, :author {:login "ryoakg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/23413?v=3"}, :body "(require '[clojure.core.async :refer :all])\n\n(def c (chan))\n\n(let [[c1 c2] (split odd? c)]\n (go-loop []\n (println \"c1: \" (!! c n))\n\n;; will prints\nc2: c1: 01\nc2: 2\nc1: 3\nc2: 4\nc1: 5\nc2: 6\nc1: 7\nc2: 8\nc1: 9", :_id "56daf399e4b0b41f39d96cdc"}], :notes nil, :arglists ["p ch" "p ch t-buf-or-n f-buf-or-n"], :doc "Takes a predicate and a source channel and returns a vector of two\n channels, the first of which will contain the values for which the\n predicate returned true, the second those for which it returned\n false.\n\n The out channels will be unbuffered by default, or two buf-or-ns can\n be supplied. The channels will close after the source channel has\n closed.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/split"} {:ns "clojure.core.async", :name "unmix-all", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1477622473868, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unmix", :ns "clojure.core.async"}, :_id "5812bac9e4b024b73ca35a0f"} {:created-at 1477622482943, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "admix", :ns "clojure.core.async"}, :_id "5812bad2e4b024b73ca35a10"} {:created-at 1477622487430, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "mix", :ns "clojure.core.async"}, :_id "5812bad7e4b024b73ca35a11"} {:created-at 1477622570483, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "toggle", :ns "clojure.core.async"}, :_id "5812bb2ae4b024b73ca35a12"} {:created-at 1477622582934, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "solo-mode", :ns "clojure.core.async"}, :_id "5812bb36e4b024b73ca35a14"}], :line 816, :examples nil, :notes nil, :arglists ["mix"], :doc "removes all inputs from the mix", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/unmix-all"} {:ns "clojure.core.async", :name "filter>", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 1047, :examples nil, :deprecated "0.1.319.0-6b1aca-alpha", :notes nil, :arglists ["p ch"], :doc "Deprecated - this function will be removed. Use transducer instead", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/filter>"} {:ns "clojure.core.async", :name "tap*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["m ch close?"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/tap*"} {:ns "clojure.core.async", :name "untap", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1420501460660, :author {:login "schmee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3405586?v=3"}, :to-var {:ns "clojure.core.async", :name "tap", :library-url "https://github.com/clojure/clojure"}, :_id "54ab21d4e4b04e93c519ffb4"} {:created-at 1420501464732, :author {:login "schmee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3405586?v=3"}, :to-var {:ns "clojure.core.async", :name "mult", :library-url "https://github.com/clojure/clojure"}, :_id "54ab21d8e4b09260f767ca8c"} {:created-at 1420501510125, :author {:login "schmee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3405586?v=3"}, :to-var {:ns "clojure.core.async", :name "untap-all", :library-url "https://github.com/clojure/clojure"}, :_id "54ab2206e4b09260f767ca8d"}], :line 720, :examples [{:body "(def c (chan))\n(def m (mult c))\n\n(def d (chan))\n(tap m d)\n\n\n(put! c 5)\n(go (println ( (let [chans (partition-all 2\n (interleave\n [\"Bob\"\n \"Jane\"\n \"GuyGirl22\"]\n (repeatedly 3 chan)))]\n (go\n (let [[owner port] (rand-nth chans)\n chans-only (mapv second chans)]\n\n (go\n (! port\n (str owner \": First!!!\")))\n\n (let [[v p] (alts! chans-only)]\n (println \"Message: \" v \"\\nFrom Object: \" p)))))\n\n;; Returns => #\n\n;; 1.5 seconds later =>\n;; Message: Bob: First!!! \n;; From Object: #\n", :_id "543232b4e4b0e5600098acc3"} {:editors [{:login "harrigan", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/140753?v=4"}], :body ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;;\n;; THIS example shows `:default`s and `:priority`s\n\n(let [f (fn [x ch] (go (Thread/sleep (rand 100))\n (>! ch x)))\n a (chan)\n b (chan)\n c (chan)]\n (println \"----------\")\n (f 1 a)\n (f 2 b)\n (f 3 c)\n (Thread/sleep 200) ; if this is commented out, it returns the\n ; `:default` every time. If the thread *does*\n ; sleep, then it returns the `a` channel's `1`\n ; every time\n (let [[n ch2] (alts!! [a b c]\n :default 42\n :priority true\n )]\n (println \"received: \" n)))", :author {:avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3", :account-source "github", :login "freckletonj"}, :created-at 1478496465164, :updated-at 1504778601998, :_id "582010d1e4b024b73ca35a23"}], :notes nil, :arglists ["ports & {:as opts}"], :doc "Completes at most one of several channel operations. Must be called\n inside a (go ...) block. ports is a vector of channel endpoints,\n which can be either a channel to take from or a vector of\n [channel-to-put-to val-to-put], in any combination. Takes will be\n made as if by !. Unless\n the :priority option is true, if more than one port operation is\n ready a non-deterministic choice will be made. If no operation is\n ready and a :default value is supplied, [default-val :default] will\n be returned, otherwise alts! will park until the first operation to\n become ready completes. Returns [val port] of the completed\n operation, where val is the value taken for takes, and a\n boolean (true unless already closed, as per put!) for puts.\n\n opts are passed as :key val ... Supported options:\n\n :default val - the value to use if none of the operations are immediately ready\n :priority true - (default nil) when true, the operations will be tried in order.\n\n Note: there is no guarantee that the port exps or val exprs will be\n used, nor in what order should they be, so they should not be\n depended upon for side effects.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/alts!"} {:ns "clojure.core.async", :name "unsub", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 906, :examples nil, :notes nil, :arglists ["p topic ch"], :doc "Unsubscribes a channel from a topic of a pub", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/unsub"} {:ns "clojure.core.async", :name "poll!", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1464291718503, :author {:login "eduardobull", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6353416?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "offer!", :ns "clojure.core.async"}, :_id "57475186e4b0bafd3e2a0462"}], :line 396, :examples [{:updated-at 1521204570897, :created-at 1521204570897, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/8271291?v=4"}, :body "(let [c (chan)]\n (println (poll! c)))\n\n;; nil\n;;=> nil (it does not block even though there is no buffer!)\n\n(let [c (chan 1)]\n (println (offer! c 10))\n (println (poll! c)))\n;; true\n;; 10\n;;=> nil", :_id "5aabbd5ae4b0316c0f44f92a"}], :notes nil, :arglists ["port"], :doc "Takes a val from port if it's possible to do so immediately.\n Never blocks. Returns value if successful, nil otherwise.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/poll!"} {:ns "clojure.core.async", :name "thread", :file "clojure/core/async.clj", :type "macro", :column 1, :see-alsos [{:created-at 1477621753853, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "thread-call", :ns "clojure.core.async"}, :_id "5812b7f9e4b024b73ca35a05"} {:created-at 1477621759508, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "go", :ns "clojure.core.async"}, :_id "5812b7ffe4b024b73ca35a06"}], :line 448, :examples [{:editors [{:login "fmnoise", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/4033391?v=4"} {:login "saitouena", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/40712240?v=4"}], :body "(defn fake-fetch []\n (thread \n (Thread/sleep 5000) \n \"Ready!\"))\n\n;; returns immediately, prints \"Ready!\" after 5 secs\n(let [c (fake-fetch)]\n (go (println ( (chan 1))\n(def cb> (chan 1))\n(defn c-af [val result] ; notice the signature is different for `pipeline-async`, it includes a channel\n (go (! result (str val \"!!!\"))\n (close! result)))\n(pipeline-async\n 1\n cb>\n c-af\n ca>)\n(go (println ()))\n(go (>! ca> \"hello\"))", :_id "57f66c0ee4b0709b524f0528"}], :notes [{:author {:login "dmarkhas", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/16191105?v=4"}, :updated-at 1575466231681, :created-at 1575466231681, :body "I think the phrase `af must close! the channel before returning.` is confusing, and should be changed to something along the lines of `af must close! the channel before the async operation completes`.", :_id "5de7b4f7e4b0ca44402ef7f0"}], :arglists ["n to af from" "n to af from close?"], :doc "Takes elements from the from channel and supplies them to the to\n channel, subject to the async function af, with parallelism n. af\n must be a function of two arguments, the first an input value and\n the second a channel on which to place the result(s). af must close!\n the channel before returning. The presumption is that af will\n return immediately, having launched some asynchronous operation\n (i.e. in another thread) whose completion/callback will manipulate\n the result channel. Outputs will be returned in order relative to\n the inputs. By default, the to channel will be closed when the from\n channel closes, but can be determined by the close? parameter. Will\n stop consuming the from channel if the to channel closes. See also\n pipeline, pipeline-blocking.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/pipeline-async"} {:ns "clojure.core.async", :name "Mix", :file "clojure/core/async.clj", :type "var", :column 1, :see-alsos nil, :line 729, :examples nil, :notes nil, :arglists [], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/Mix"} {:ns "clojure.core.async", :name "toggle*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["m state-map"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/toggle*"} {:ns "clojure.core.async", :name "mult", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1420501383575, :author {:login "schmee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3405586?v=3"}, :to-var {:ns "clojure.core.async", :name "tap", :library-url "https://github.com/clojure/clojure"}, :_id "54ab2187e4b09260f767ca89"} {:created-at 1420501439113, :author {:login "schmee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3405586?v=3"}, :to-var {:ns "clojure.core.async", :name "untap", :library-url "https://github.com/clojure/clojure"}, :_id "54ab21bfe4b09260f767ca8a"} {:created-at 1653095539882, :author {:login "rgkirch", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6143833?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "mix", :ns "clojure.core.async"}, :_id "62883c73e4b0b1e3652d75f0"}], :line 669, :examples [{:body "user=> (def sz 20)\n#'user/sz\n\nuser=> (def c (chan sz))\n#'user/c\n\nuser=> (def mult-c (mult c))\n#'user/mult-c\n\nuser=> (def cx (chan sz))\n#'user/cx\n\nuser=> (def cy (chan sz))\n#'user/cy\n\nuser=> (def cz (chan sz))\n#'user/cz\n\nuser=> (tap mult-c cx)\n#\n\nuser=> (tap mult-c cy)\n#\n\nuser=> (tap mult-c cz)\n#\n\nuser=> (put! c \"sent to all\")\ntrue\n\nuser=> ( ( ( (def a (chan))\nuser> (def m (mult a))\nuser> (def b (chan))\nuser> (tap m b)\nuser> (go-loop [] (when-let [v ( (go-loop [] (when-let [v ( (put! a \"Hello \")\nb got Hello \nuser> (put! a \" World\")\na(source) got World\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/5214601?v=3", :account-source "github", :login "cuneoPauloCesar"}], :_id "563432f8e4b0290a56055d17"}], :notes nil, :arglists ["ch"], :doc "Creates and returns a mult(iple) of the supplied channel. Channels\n containing copies of the channel can be created with 'tap', and\n detached with 'untap'.\n\n Each item is distributed to all taps in parallel and synchronously,\n i.e. each tap must accept before the next item is distributed. Use\n buffering/windowing to prevent slow taps from holding up the mult.\n\n Items received when there are no taps get dropped.\n\n If a tap puts to a closed channel, it will be removed from the mult.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/mult"} {:ns "clojure.core.async", :name "thread-call", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1477621565889, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "thread", :ns "clojure.core.async"}, :_id "5812b73de4b024b73ca35a03"} {:created-at 1477621729989, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "go", :ns "clojure.core.async"}, :_id "5812b7e1e4b024b73ca35a04"}], :line 430, :examples [{:editors [{:login "earthfail", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/21296448?v=4"}], :body "(defn fake-fetch []\n (Thread/sleep 5000) \n \"Ready!\")\n\n;; returns immediately, prints \"Ready!\" after 5 secs\n(let [c (thread-call fake-fetch)]\n (println ( (let [chans (partition-all 2\n (interleave\n [\"Bob\"\n \"Jane\"\n \"GuyGirl22\"]\n (for [_ (range 3)] \n (chan))))\n [owner port] (rand-nth chans)\n chans-only (mapv second chans)]\n \n (go\n (! port\n (str owner \": First!!!\")))\n\n (let [[v p] (alts!! chans-only)]\n (println \"Message: \" v \"\\nFrom Object: \" p)))\n\n;; Message: Bob: First!!! \n;; From Object: #\n;; nil\n", :author {:login "runexec", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1487241?v=2"}, :created-at 1412576406866, :updated-at 1412576646175, :editors [{:login "runexec", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1487241?v=2"}], :_id "54323496e4b0e5600098acc4"} {:editors [{:login "quackingduck", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/9556?v=3"}], :body "(require '[clojure.core.async :as async])\n\n;; n.b. alts!! returns a *pair* of [value channel-where-value-came-from]\n\n; a channel with a single value ready in the queue\n(def c (async/chan))\n(async/put! c \"foo\")\n\n(println (async/alts!! [(async/timeout 2000) c]))\n;; => [\"foo\" ]\n\n; no more values, so we will timeout\n(println (async/alts!! [(async/timeout 2000) c]))\n;; => [nil ]\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/9556?v=3", :account-source "github", :login "quackingduck"}, :created-at 1466646608720, :updated-at 1466812798643, :_id "576b4050e4b0bafd3e2a048e"}], :notes nil, :arglists ["ports & {:as opts}"], :doc "Like alts!, except takes will be made as if by !!, will block until completed, and not intended\n for use in (go ...) blocks.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/alts!!"} {:ns "clojure.core.async", :name "mapcat<", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 1102, :examples nil, :deprecated "0.1.319.0-6b1aca-alpha", :notes nil, :arglists ["f in" "f in buf-or-n"], :doc "Deprecated - this function will be removed. Use transducer instead", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/mapcat<"} {:ns "clojure.core.async", :name "ioc-alts!", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 378, :examples nil, :notes nil, :arglists ["state cont-block ports & {:as opts}"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/ioc-alts!"} {:ns "clojure.core.async", :name "unblocking-buffer?", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 67, :examples nil, :notes nil, :arglists ["buff"], :doc "Returns true if a channel created with buff will never block. That is to say,\n puts into this buffer will never cause the buffer to be full. ", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/unblocking-buffer_q"} {:ns "clojure.core.async", :name "do-alt", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 302, :examples nil, :notes nil, :arglists ["alts clauses"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/do-alt"} {:ns "clojure.core.async", :name "put!", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1458597697805, :author {:login "royalaid", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2439803?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "take!", :ns "clojure.core.async"}, :_id "56f06f41e4b09295d75dbf38"} {:created-at 1458597821489, :author {:login "royalaid", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2439803?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name ">!", :ns "clojure.core.async"}, :_id "56f06fbde4b09295d75dbf3b"} {:created-at 1458597828313, :author {:login "royalaid", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2439803?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name ">!!", :ns "clojure.core.async"}, :_id "56f06fc4e4b07ac9eeceed14"}], :line 157, :examples [{:body "user=> (def c (chan 1))\n#'user/c\n\nuser=> (take! c\n (fn [x]\n (println \"Clojure callback value \" x)))\nnil\n\nuser=> (put! c \"XYZ\") ; return true unless the channel is closed.\nClojure callback value XYZ\ntrue\n\nuser=> (put! c \"XYZ\")\ntrue\n", :author {:login "runexec", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1487241?v=2"}, :created-at 1412203179922, :updated-at 1451943835304, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/1039073?v=3", :account-source "github", :login "Kejia"}], :_id "542c82abe4b05f4d257a2975"}], :notes [{:author {:login "hlship", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/52660?v=3"}, :updated-at 1437168807833, :created-at 1437168807833, :body "The documentation here is somewhat out of date, the real documentation for more recent versions of core.async (0.1.346.0-17112a-alpha, at the time of this note) removes the bit about throwing when the channel is closed. \n\nInstead, put! returns true unless the port is already closed, in which case false is returned.\n\nAn exception *is* thrown is you attempt to put! nil.", :_id "55a974a7e4b0080a1b79cda7"}], :arglists ["port val" "port val fn1" "port val fn1 on-caller?"], :doc "Asynchronously puts a val into port, calling fn1 (if supplied) when\n complete, passing false iff port is already closed. nil values are\n not allowed. If on-caller? (default true) is true, and the put is\n immediately accepted, will call fn1 on calling thread. Returns\n true unless port is already closed.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/put!"} {:ns "clojure.core.async", :name "take!", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1458597672855, :author {:login "royalaid", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2439803?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "put!", :ns "clojure.core.async"}, :_id "56f06f28e4b09295d75dbf37"} {:created-at 1458597792127, :author {:login "royalaid", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2439803?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name " (def c (chan 1))\n#'user/c\n\nuser=> (take! c\n (fn [x]\n (println \"Clojure callback value \" x)))\nnil\n\nuser=> (put! c \"XYZ\")\nClojure callback value XYZ\ntrue\n\nuser=> (put! c \"XYZ\")\ntrue\n", :author {:login "runexec", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1487241?v=2"}, :created-at 1412203153682, :updated-at 1412203153682, :_id "542c8291e4b05f4d257a2974"} {:updated-at 1516398462305, :created-at 1516398462305, :author {:login "jayzawrotny", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/590297?v=4"}, :body "(require '[clojure.core.async :refer [chan take! put!]])\n\n(def input-channel (chan 1))\n\n;; Take the first message from a channel and print it\n(take! input-channel println)\n\n(put! input-channel \"A\")\n;; => \"A\"\n\n(put! input-channel \"B\")\n;; Does not output anything because take only takes the first message\n", :_id "5a62677ee4b0a08026c48d04"}], :notes nil, :arglists ["port fn1" "port fn1 on-caller?"], :doc "Asynchronously takes a val from port, passing to fn1. Will pass nil\n if closed. If on-caller? (default true) is true, and value is\n immediately available, will call fn1 on calling thread.\n Returns nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/take!"} {:ns "clojure.core.logic", :name "run-db*", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1252, :examples nil, :macro true, :notes nil, :arglists ["db bindings & goals"], :doc "Executes goals until results are exhausted. Uses a specified logic database.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/run-db*"} {:ns "clojure.core.logic", :name "choice", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1102, :examples nil, :notes nil, :arglists ["a f"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/choice"} {:ns "clojure.core.logic", :name "-conjo", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2768, :examples nil, :notes nil, :arglists ["coll args out"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/-conjo"} {:ns "clojure.core.logic", :name "to-subst-val", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 604, :examples nil, :notes nil, :arglists ["v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/to-subst-val"} {:ns "clojure.core.logic", :name "conde", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos [{:created-at 1651392672424, :author {:login "shenlebantongying", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20123683?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "conda", :ns "clojure.core.logic"}, :_id "626e40a0e4b0b1e3652d75dd"}], :line 1175, :examples [{:updated-at 1562865825354, :created-at 1562865825354, :author {:login "kannangce", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/8754040?v=4"}, :body ";; conde accepts vectors of goals.\n;; makes 'or' of all the goals represented by each vector\n;; Where within each of those goals all condition must be met \n\n(run*\n [x y]\n (conde\n \t [(conso x y [1 2 3 4]) (== x 1)] ;; (conso x y [1 2 3 4]) and (== x 1)\n \t \t ;; OR\n \t [(== x y) (== x 2)])) \t ;; (== x y) and (== x 2)\n\n;; ([1 (2 3 4)] [2 2])", :_id "5d2770a1e4b0ca44402ef781"}], :macro true, :notes nil, :arglists ["& clauses"], :doc "Logical disjunction of the clauses. The first goal in\n a clause is considered the head of that clause. Interleaves the\n execution of the clauses.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/conde"} {:ns "clojure.core.logic", :name "master", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1976, :examples nil, :notes nil, :arglists ["argv cache"], :doc "Take the argument to the goal and check that we don't\n have an alpha equivalent cached answer term in the cache.\n If it doesn't already exist in the cache add the new\n answer term.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/master"} {:ns "clojure.core.logic", :name "sort-by-member-count", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2218, :examples nil, :notes nil, :arglists ["a"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/sort-by-member-count"} {:ns "clojure.core.logic", :name "matche", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos [{:created-at 1612485988783, :author {:login "cheukyin699", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6824907?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "conde", :ns "clojure.core.logic"}, :_id "601c9564e4b0b1e3652d7448"}], :line 1705, :examples [{:updated-at 1460222471941, :created-at 1460222150971, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :body ";; Taken from: https://github.com/frenchy64/Logic-Starter/wiki#matche\n;; These are equivalent:\n(run* [q]\n (conde\n ((== 'extra q) succeed)\n ((== 'virgin q) succeed)\n ((== 'olive q) succeed)\n ((== 'oil q) succeed)))\n;=> (extra virgin olive oil)\n\n(run* [q]\n (matche [q]\n (['extra] succeed)\n (['virgin] succeed)\n (['olive] succeed)\n (['oil] succeed)))\n;=> (extra virgin olive oil)\n\n;; Wild Cards and destructuring: https://github.com/frenchy64/Logic-Starter/wiki#matche-sugar-combining-wildcards-and-destructuring\n(run* [q]\n (fresh [a o]\n (== a [1 2 3 4 5])\n (matche [a]\n ([ [1 . _] ]\n (== q \"first\"))\n ([ [_ . o] ]\n (== q [\"second\" o])))))\n;=> (\"first\" \n; [\"second\" (2 3 4 5)])\n\n;; Implicit Variables: https://github.com/frenchy64/Logic-Starter/wiki#matche-sugar-implicit-variables\n(run* [q]\n (fresh [a o]\n (== a [1 2 3 4 5])\n (matche [a]\n ([ [1 . o] ]\n (== q [\"one\" o]))\n ([ [1 2 . ?o] ]\n (== q [\"two\" ?o]))\n ([ [o . ?o] ]\n (== q [\"third\" o ?o])))))\n;=> ([\"one\" (2 3 4 5)] \n; [\"two\" (3 4 5)] \n; [\"third\" 1 (2 3 4 5)] ", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3", :account-source "github", :login "freckletonj"}], :_id "570938c6e4b075f5b2c864db"}], :macro true, :notes nil, :arglists ["xs & cs"], :doc "Pattern matching macro. All patterns will be tried.\n See conde.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/matche"} {:ns "clojure.core.logic", :name "appendo", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1772, :examples [{:editors [{:login "lenw", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/339388?v=3"}], :body "(run* [q]\n (appendo [:a :b] [:c :d :e] q)) ;; ((:a :b :c :d :e))\n(run* [q]\n (appendo [:a :b] q [:a :b :c :d :e])) ;; ((:c :d :e))\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3", :account-source "github", :login "freckletonj"}, :created-at 1460064833781, :updated-at 1460410120788, :_id "5706d241e4b0fc95a97eab33"}], :notes nil, :arglists ["x y z"], :doc "A relation where x, y, and z are proper collections,\n such that z is x appended to y", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/appendo"} {:ns "clojure.core.logic", :name "nafc", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2725, :examples nil, :notes nil, :arglists ["c & args"], :doc "EXPERIMENTAL: negation as failure constraint. All arguments to the goal c\n must be ground. If some argument is not ground the execution of this constraint\n will be delayed.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/nafc"} {:ns "clojure.core.logic", :name "fnu", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1723, :examples nil, :macro true, :notes nil, :arglists ["& rest"], :doc "Define an anonymous committed choice goal. See condu.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/fnu"} {:ns "clojure.core.logic", :name "!=c", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2409, :examples nil, :notes nil, :arglists ["p"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/!=c"} {:ns "clojure.core.logic", :name "composeg*", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1060, :examples nil, :macro true, :notes nil, :arglists ["g0" "g0 & gs"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/composeg*"} {:ns "clojure.core.logic", :name "addcg", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2036, :examples nil, :notes nil, :arglists ["c"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/addcg"} {:ns "clojure.core.logic", :name "dissoc-meta", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 27, :examples nil, :notes nil, :arglists ["x k"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/dissoc-meta"} {:ns "clojure.core.logic", :name "rem-attr", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 440, :examples nil, :notes nil, :arglists ["s x attr"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/rem-attr"} {:ns "clojure.core.logic", :name "fk", :file "clojure/core/logic.clj", :type "var", :column 1, :see-alsos nil, :line 19, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/fk"} {:ns "clojure.core.logic", :name "-predc", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2659, :examples nil, :notes nil, :arglists ["x p" "x p pform"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/-predc"} {:ns "clojure.core.logic", :name "recover-vars-from-term", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2389, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/recover-vars-from-term"} {:ns "clojure.core.logic", :name "defna", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos [{:created-at 1460136622465, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defnc", :ns "clojure.core.logic"}, :_id "5707eaaee4b075f5b2c864d6"} {:created-at 1460136638290, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defne", :ns "clojure.core.logic"}, :_id "5707eabee4b0fc95a97eab3a"} {:created-at 1460136644492, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defnu", :ns "clojure.core.logic"}, :_id "5707eac4e4b0fc95a97eab3b"}], :line 1728, :examples nil, :macro true, :notes nil, :arglists ["& rest"], :doc "Define a soft cut goal. See conda.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/defna"} {:ns "clojure.core.logic", :name "recover-vars", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2398, :examples nil, :notes nil, :arglists ["p"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/recover-vars"} {:ns "clojure.core.logic", :name "defnu", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos [{:created-at 1460137178241, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defna", :ns "clojure.core.logic"}, :_id "5707ecdae4b075f5b2c864d8"} {:created-at 1460137189155, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defne", :ns "clojure.core.logic"}, :_id "5707ece5e4b0fc95a97eab3c"} {:created-at 1460137194453, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defnc", :ns "clojure.core.logic"}, :_id "5707eceae4b075f5b2c864da"} {:created-at 1490672152735, :author {:login "tkocmathla", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/183459?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "condu", :ns "clojure.core.logic"}, :_id "58d9da18e4b01f4add58fe7c"}], :line 1733, :examples nil, :macro true, :notes nil, :arglists ["& rest"], :doc "Define a committed choice goal. See condu.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/defnu"} {:ns "clojure.core.logic", :name "cgoal", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2187, :examples nil, :notes nil, :arglists ["c"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/cgoal"} {:ns "clojure.core.logic", :name "seqc", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2887, :examples nil, :notes nil, :arglists ["v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/seqc"} {:ns "clojure.core.logic", :name "log", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1288, :examples [{:updated-at 1668940522609, :created-at 1668940522609, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=4"}, :body "(run* [q]\n (log \"* running program\")\n (fresh [c d]\n (conde\n [(log \"** in first clause\")\n (== c 0)]\n [(log \"** in second clause\")\n (== c 10)]\n [(log \"** in third clause\")\n (== d 2)\n (is c d (fn [a] (* a 2)))])\n (log \"ok finishing. \")\n (== c q)))\n;; =>\n;; * running program\n;; ** in first clause\n;; ok finishing. \n;; ** in second clause\n;; ok finishing. \n;; ** in third clause\n;; ok finishing. \n", :_id "637a02eae4b0b1e3652d7689"}], :macro true, :notes nil, :arglists ["& s"], :doc "Goal for println", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/log"} {:ns "clojure.core.logic", :name "-reify*", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 259, :examples nil, :notes nil, :arglists ["s v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/-reify*"} {:ns "clojure.core.logic", :name "bind*", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1067, :examples nil, :macro true, :notes nil, :arglists ["a g" "a g & g-rest"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/bind*"} {:ns "clojure.core.logic", :name "reifyg", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2175, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/reifyg"} {:ns "clojure.core.logic", :name "distincto", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2472, :examples [{:updated-at 1581848182644, :created-at 1581848182644, :author {:login "mdzaebel", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/415392?v=4"}, :body "(run* [a b] (membero a [1 2]) (membero b [1 2]) (distincto [a b]))\n;;=> ([1 2] [2 1])\n\n;; Without 'distincto':\n\n(run* [a b] (membero a [1 2]) (membero b [1 2]))\n;;=>([1 1] [1 2] [2 1] [2 2])", :_id "5e491676e4b0ca44402ef83b"}], :notes nil, :arglists ["l"], :doc "A relation which guarantees no element of l will unify\n with another element of l.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/distincto"} {:ns "clojure.core.logic", :name "assoc-dom", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 30, :examples nil, :notes nil, :arglists ["x k v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/assoc-dom"} {:ns "clojure.core.logic", :name "get-dom", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 515, :examples nil, :notes nil, :arglists ["s x dom"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/get-dom"} {:ns "clojure.core.logic", :name "condu", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1425, :examples nil, :macro true, :notes nil, :arglists ["& clauses"], :doc "Committed choice. Once the head (first goal) of a clause\n has succeeded, remaining goals of the clause will only\n be run once. Non-relational.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/condu"} {:ns "clojure.core.logic", :name "constrain-tree", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2839, :examples nil, :notes nil, :arglists ["t fc"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/constrain-tree"} {:ns "clojure.core.logic", :name "run-nc*", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1263, :examples nil, :macro true, :notes nil, :arglists ["& goals"], :doc "Executes goals until results are exhausted. Does not occurs-check.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/run-nc*"} {:ns "clojure.core.logic", :name "empty-s", :file "clojure/core/logic.clj", :type "var", :column 1, :see-alsos nil, :line 537, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/empty-s"} {:ns "clojure.core.logic", :name "var-rands", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 91, :examples nil, :notes nil, :arglists ["a c"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/var-rands"} {:ns "clojure.core.logic", :name "merge-with-root", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 579, :examples nil, :notes nil, :arglists ["s x root"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/merge-with-root"} {:ns "clojure.core.logic", :name "waiting-stream-check", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1863, :examples nil, :notes nil, :arglists ["w success-cont failure-cont"], :doc "Take a waiting stream, a success continuation, and a failure continuation.\n If we don't find any ready suspended streams, invoke the failure continuation.\n If we find a ready suspended stream calculate the remainder of the waiting\n stream. If we've reached the fixpoint just call the thunk of the suspended\n stream, otherwise call mplus on the result of the thunk and the remainder\n of the waiting stream. Pass this result to the success contination.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/waiting-stream-check"} {:ns "clojure.core.logic", :name "tabled-s", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 529, :examples nil, :notes nil, :arglists ["" "oc" "oc meta"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/tabled-s"} {:ns "clojure.core.logic", :name "fresh", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1207, :examples [{:updated-at 1651390083912, :created-at 1651390083912, :author {:login "shenlebantongying", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20123683?v=4"}, :body "(run* [q]\n (fresh [a]\n (membero a [2 3])\n (== a q)))\n; => (2 3)\n\n;; a is a member of [2 3]\n;; a and q are unified.\n;; Note that only q will occur in the result.", :_id "626e3683e4b0b1e3652d75dc"}], :macro true, :notes nil, :arglists ["[& lvars] & goals"], :doc "Creates fresh variables. Goals occuring within form a logical\n conjunction.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/fresh"} {:ns "clojure.core.logic", :name "treec", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2876, :examples nil, :notes nil, :arglists ["x fc reifier"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/treec"} {:ns "clojure.core.logic", :name "partial-map", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos [{:created-at 1450638666311, :author {:login "qneo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5214601?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "featurec", :ns "clojure.core.logic"}, :_id "5676fd4ae4b08a391679537f"}], :line 2536, :examples nil, :notes nil, :arglists ["m"], :doc "Given map m, returns partial map that unifies with maps even if it\n doesn't share all of the keys of that map.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/partial-map"} {:ns "clojure.core.logic", :name "*logic-dbs*", :file "clojure/core/logic.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 1235, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/*logic-dbs*"} {:ns "clojure.core.logic", :name "and*", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1273, :examples nil, :notes nil, :arglists ["goals"], :doc "A function version of all, which takes a list of goals and succeeds only fi they all succeed.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/and*"} {:ns "clojure.core.logic", :name "unify-with-map*", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 911, :examples nil, :notes nil, :arglists ["u v s"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/unify-with-map*"} {:ns "clojure.core.logic", :name "runcg", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2053, :examples nil, :notes nil, :arglists ["c"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/runcg"} {:ns "clojure.core.logic", :name "matcha", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1738, :examples nil, :macro true, :notes nil, :arglists ["xs & cs"], :doc "Define a soft cut pattern match. See conda.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/matcha"} {:ns "clojure.core.logic", :name "ientailed?", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2061, :examples nil, :notes nil, :arglists ["c"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/ientailed_q"} {:ns "clojure.core.logic", :name "lcons?", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 875, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/lcons_q"} {:ns "clojure.core.logic", :name "ext-run-csg", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1152, :examples nil, :notes nil, :arglists ["u v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/ext-run-csg"} {:ns "clojure.core.logic", :name "emptyo", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1654, :examples nil, :notes nil, :arglists ["a"], :doc "A relation where a is the empty list", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/emptyo"} {:ns "clojure.core.logic", :name "unbound-rands", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 97, :examples nil, :notes nil, :arglists ["a c"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/unbound-rands"} {:ns "clojure.core.logic", :name "updatecg", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2045, :examples nil, :notes nil, :arglists ["c"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/updatecg"} {:ns "clojure.core.logic", :name "reify-lvar-name", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 253, :examples nil, :notes nil, :arglists ["s"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/reify-lvar-name"} {:ns "clojure.core.logic", :name "reify-constraints", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2164, :examples nil, :notes nil, :arglists ["v r a"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/reify-constraints"} {:ns "clojure.core.logic", :name "lvar", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 706, :examples [{:updated-at 1480022982266, :created-at 1480022982266, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :body "(let [x (lvar 'x)]\n (run 10 [q]\n (membero x [1 2 3])\n (== q x)))", :_id "58375bc6e4b0782b632278cb"}], :notes nil, :arglists ["" "name" "name unique"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/lvar"} {:ns "clojure.core.logic", :name "unify", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 236, :examples nil, :notes nil, :arglists ["s u v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/unify"} {:ns "clojure.core.logic", :name "to-stream", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1794, :examples nil, :notes nil, :arglists ["aseq"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/to-stream"} {:ns "clojure.core.logic", :name "s#", :file "clojure/core/logic.clj", :type "var", :column 1, :see-alsos nil, :line 1148, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/s#"} {:ns "clojure.core.logic", :name "trace-s", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos [{:created-at 1668965882210, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "log", :ns "clojure.core.logic"}, :_id "637a65fae4b0b1e3652d768b"}], :line 1295, :examples [{:updated-at 1668965824190, :created-at 1668965824190, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=4"}, :body "\n(run* [q u v]\n (log \"no bindings:\")\n (trace-s)\n (== u 1)\n (log \"one binding:\")\n (trace-s)\n (== q 2)\n (== v 3)\n (log \"three bindings:\")\n (trace-s))\n\n;; => ([2 1 3])\n\n;; this is what gets printed from the run:\n\nno bindings:\n{ \n [ \n \n ]}\n\none binding:\n{ \n [ \n \n ], \n 1}\n\nthree bindings:\n{ \n [\n \n ],\n 1, \n 2, \n 3}", :_id "637a65c0e4b0b1e3652d768a"}], :macro true, :notes nil, :arglists [""], :doc "Goal that prints the current substitution", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/trace-s"} {:ns "clojure.core.logic", :name "->Substitutions", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 287, :examples nil, :notes nil, :arglists ["s vs ts cs cq cqs oc _meta"], :doc "Positional factory function for class clojure.core.logic.Substitutions.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/->Substitutions"} {:ns "clojure.core.logic", :name "enforce-constraints", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2156, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/enforce-constraints"} {:ns "clojure.core.logic", :name "rembero", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2483, :examples [{:editors [{:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}], :body ";;https://github.com/clojure/core.logic/blob/master/src/main/clojure/clojure/core/logic.clj#L2483\n;; (rembero x l o)\n;; my simple reminder is: x+o=l (L, not 1)\n\n(run* [q]\n (fresh [a b x y]\n (== q [a b])\n (rembero a [:apple :banana :carrot] x)\n (rembero b x y)))\n;; ([:apple :banana] [:apple :carrot] [:banana :apple] [:banana :carrot] [:carrot :apple] [:carrot :banana])", :author {:avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3", :account-source "github", :login "freckletonj"}, :created-at 1460390058189, :updated-at 1460390756178, :_id "570bc8aae4b075f5b2c864e4"}], :notes nil, :arglists ["x l o"], :doc "A relation between l and o where x is removed from\n l exactly one time.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/rembero"} {:ns "clojure.core.logic", :name "permuteo", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1781, :examples [{:editors [{:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}], :body "(run* [q]\n (permuteo [:c q :a] [:b :a :c])) ;; :b", :author {:avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3", :account-source "github", :login "freckletonj"}, :created-at 1460065748768, :updated-at 1460065872775, :_id "5706d5d4e4b075f5b2c864d0"}], :notes nil, :arglists ["xl yl"], :doc "A relation that will permute xl into the yl. May not\n terminate if xl is not ground.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/permuteo"} {:ns "clojure.core.logic", :name "llist", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos [{:created-at 1460389651286, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "lcons", :ns "clojure.core.logic"}, :_id "570bc713e4b0fc95a97eab43"}], :line 878, :examples [{:editors [{:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}], :body "(run* [q]\n (fresh [a d]\n (== [1 2 3 4] (llist a d))\n (== q d))) ;; ((2 3 4))\n\n(run* [q]\n (fresh [a d r]\n (== [1 2 3 4] (llist a d r))\n (== q r))) ;; a=1, d=2, r=(3 4)", :author {:avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3", :account-source "github", :login "freckletonj"}, :created-at 1460389406664, :updated-at 1460389513893, :_id "570bc61ee4b075f5b2c864e0"}], :macro true, :notes nil, :arglists ["f s" "f s & rest"], :doc "Constructs a sequence from 2 or more arguments, with the last argument as the\n tail. The tail is improper if the last argument is a logic variable.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/llist"} {:ns "clojure.core.logic", :name "ext", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 220, :examples nil, :notes nil, :arglists ["s u v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/ext"} {:ns "clojure.core.logic", :name "onceo", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1434, :examples nil, :notes nil, :arglists ["g"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/onceo"} {:ns "clojure.core.logic", :name "run", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1237, :examples [{:updated-at 1593353821796, :created-at 1593353821796, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/8271291?v=4"}, :body ";; Solves 3X + 2Y + Z = 3 equation\n(let [symbols '[X Y Z]\n vars (repeatedly (count symbols) lvar)\n [x y z] vars\n sum 3]\n (run 1 [q]\n (everyg #(fd/in % (fd/interval 0 sum)) vars)\n (fresh [pro-x pro-y pro-z sum-x-y]\n (fd/* 3 x pro-x)\n (fd/* 2 y pro-y)\n (fd/* 1 z pro-z)\n (fd/+ pro-x pro-y sum-x-y)\n (fd/+ sum-x-y pro-z sum))\n (== q (zipmap symbols vars))))\n\n;;=> ({X 0, Y 0, Z 3})\n;; since we limit number of results with 1, only one solution is returned\n;; if we replace (run 1 ...) with (run* ...) then we get 3 (all) results\n", :_id "5ef8a65de4b0b1e3652d7317"}], :macro true, :notes nil, :arglists ["n bindings & goals"], :doc "Executes goals until a maximum of n results are found.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/run"} {:ns "clojure.core.logic", :name "unify-with-pmap*", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2497, :examples nil, :notes nil, :arglists ["u v s"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/unify-with-pmap*"} {:ns "clojure.core.logic", :name "defnc", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos [{:created-at 1460136453300, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defnu", :ns "clojure.core.logic"}, :_id "5707ea05e4b0fc95a97eab38"} {:created-at 1460136464708, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defna", :ns "clojure.core.logic"}, :_id "5707ea10e4b075f5b2c864d4"} {:created-at 1460136479959, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defne", :ns "clojure.core.logic"}, :_id "5707ea1fe4b0fc95a97eab39"} {:created-at 1571647061473, :author {:login "svdo", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/4028554?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "fnc", :ns "clojure.core.logic"}, :_id "5dad6e55e4b0ca44402ef7d0"}], :line 2653, :examples [{:updated-at 1460067011666, :created-at 1460067011666, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :body ";; I'm not exactly sure what `defnc` is, but I know a little how to use it\n;; The following gets all multiples of 3 in the `(range 50)`\n\n(defnc dev3c [x]\n (zero? (mod x 3)))\n\n(run* [x]\n (membero x (range 50))\n (dev3c x))", :_id "5706dac3e4b075f5b2c864d1"}], :macro true, :notes nil, :arglists ["name args & body"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/defnc"} {:ns "clojure.core.logic", :name "tramp", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2695, :examples nil, :notes nil, :arglists ["f"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/tramp"} {:ns "clojure.core.logic", :name "->Pair", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 43, :examples nil, :notes nil, :arglists ["lhs rhs"], :doc "Positional factory function for class clojure.core.logic.Pair.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/->Pair"} {:ns "clojure.core.logic", :name "mplus*", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1072, :examples nil, :macro true, :notes nil, :arglists ["e" "e & e-rest"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/mplus*"} {:ns "clojure.core.logic", :name "fnc", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 2611, :examples nil, :macro true, :notes nil, :arglists ["args & body"], :doc "Define an anonymous constraint that can be used with the unifier:\n\n (let [oddc (fnc [x] (odd? x))]\n\n (unifier {:a '?a} {:a 1} :when {'?a oddc})\n ;;=> {:a 1}\n\n (unifier {:a '?a} {:a 2} :when {'?a oddc})\n ;;=> nil\n )\n\n Note, the constraint will not run until all arguments are fully ground.\n\n Use defnc to define a constraint and assign a toplevel var.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/fnc"} {:ns "clojure.core.logic", :name "run-nc", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1257, :examples nil, :macro true, :notes nil, :arglists ["n bindings & goals"], :doc "Executes goals until a maximum of n results are found. Does not\n occurs-check.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/run-nc"} {:ns "clojure.core.logic", :name "lcons", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos [{:created-at 1460389630764, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "llist", :ns "clojure.core.logic"}, :_id "570bc6fee4b075f5b2c864e3"}], :line 868, :examples [{:updated-at 1460389621203, :created-at 1460389621203, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :body "(run* [q]\n (fresh [a d]\n (== [1 2 3 4] (lcons a d))\n (== q d))) ;; ((2 3 4))", :_id "570bc6f5e4b075f5b2c864e2"} {:updated-at 1581848387951, :created-at 1581286402438, :author {:login "mdzaebel", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/415392?v=4"}, :body "(run* [t] (== [1 2 3] (lcons 1 t)))\n;;=> ((2 3))", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/415392?v=4", :account-source "github", :login "mdzaebel"}], :_id "5e408402e4b0ca44402ef82e"}], :notes nil, :arglists ["a d"], :doc "Constructs a sequence a with an improper tail d if d is a logic variable.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/lcons"} {:ns "clojure.core.logic", :name "solutions", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1279, :examples nil, :notes nil, :arglists ["s g" "s q g"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/solutions"} {:ns "clojure.core.logic", :name "stopcg", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2057, :examples nil, :notes nil, :arglists ["c"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/stopcg"} {:ns "clojure.core.logic", :name "copy-term", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1439, :examples nil, :notes nil, :arglists ["u v"], :doc "Copies a term u into v. Non-relational.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/copy-term"} {:ns "clojure.core.logic", :name "disunify", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2290, :examples nil, :notes nil, :arglists ["s u v" "s u v cs"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/disunify"} {:ns "clojure.core.logic", :name "sort-by-strategy", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2223, :examples nil, :notes nil, :arglists ["v x a"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/sort-by-strategy"} {:ns "clojure.core.logic", :name "add-dom", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 467, :examples nil, :notes nil, :arglists ["s x dom domv" "s x dom domv seenset"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/add-dom"} {:ns "clojure.core.logic", :name "fnm", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1632, :examples nil, :macro true, :notes nil, :arglists ["t as tabled? & cs"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/fnm"} {:ns "clojure.core.logic", :name "pred", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1336, :examples [{:updated-at 1450639518107, :created-at 1450639518107, :author {:login "qneo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5214601?v=3"}, :body "user> (run* [q] (pred q symbol?))\n()\nuser> (run* [q] (== q 'x) (pred q symbol?))\n(x)\nuser> (run* [q] (== q 1) (pred q symbol?))\n()\nuser> (run* [q] (== q 1) (pred q number?))\n(1)", :_id "5677009ee4b08a3916795380"} {:updated-at 1640474969522, :created-at 1640474969522, :author {:login "hank-lenzi", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/48740267?v=4"}, :body "Example From PC3\n\nuser> (defn indexed [coll] (map-indexed vector coll))\n#'user/indexed\n\nuser> (indexed \"abcde\")\n([0 \\a] [1 \\b] [2 \\c] [3 \\d] [4 \\e])\n\n(defn index-filter [pred coll]\n (when pred\n (for [[idx elt] (indexed coll) :when (pred elt)] idx)))\n\n(index-filter #{\\a \\b} \"abcdbbb\")\n-> (0 1 4 5 6)\n\n;;; NOTES\n;; 'for' used destructuring above. 'for' is not a loop - \n;; it's 'list comprehension'.\n;; 'pred' is a predicate and a lisp form (i.e., 'keyword') in core.logic\n;; - https://clojuredocs.org/clojure.core.logic/pred\n;; It's from https://clojuredocs.org/clojure.core.logic\n;; and NOT included in core\n;; https://github.com/clojure/core.logic\n;; for forms accept bindings (':let') , filters (with ':when')\n;; and restraints (':when') .\n", :_id "61c7a959e4b0b1e3652d758d"} {:editors [{:login "wactbprot", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/113518?v=4"}], :body "user> (use '[clojure.core.logic :only [run* membero pred]])\n\n;; The position of the pred expression matters:\n\nuser> (run* [q]\n (pred q keyword?)\n (membero q [1 :a :b])\n (membero q [1 :a :c]))\n;; => ()\n\nuser> (run* [q]\n (membero q [1 :a :b])\n (membero q [1 :a :c])\n (pred q keyword?))\n;; => (:a)\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/113518?v=4", :account-source "github", :login "wactbprot"}, :created-at 1640857443937, :updated-at 1640858964293, :_id "61cd7f63e4b0b1e3652d7590"}], :macro true, :notes nil, :arglists ["v f"], :doc "Check a predicate against the value logic var. Non-relational.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/pred"} {:ns "clojure.core.logic", :name "sync-eset", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 455, :examples nil, :notes nil, :arglists ["s v seenset f"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/sync-eset"} {:ns "clojure.core.logic", :name "is", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1344, :examples [{:updated-at 1668939955671, :created-at 1668939955671, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=4"}, :body ";; assign v == 3, q == v * 10 (and, really, use clojure.core.logic.fd for this particular operation)\n\n(run* [q v]\n (== v 3)\n (is q v (fn [a] (* a 10))))", :_id "637a00b3e4b0b1e3652d7688"}], :macro true, :notes nil, :arglists ["u v op"], :doc "Set the value of a var to value of another var with the operation\n applied. Non-relational.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/is"} {:ns "clojure.core.logic", :name "->LCons", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 755, :examples nil, :notes nil, :arglists ["a d cache meta"], :doc "Positional factory function for class clojure.core.logic.LCons.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/->LCons"} {:ns "clojure.core.logic", :name "umi", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 741, :examples nil, :macro true, :notes nil, :arglists ["& args"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/umi"} {:ns "clojure.core.logic", :name "assoc-meta", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 24, :examples nil, :notes nil, :arglists ["x k v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/assoc-meta"} {:ns "clojure.core.logic", :name "conda", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos [{:created-at 1468922820940, :author {:login "freaxmind", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3929438?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "condu", :ns "clojure.core.logic"}, :_id "578dfbc4e4b0bafd3e2a04a9"} {:created-at 1468922827794, :author {:login "freaxmind", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3929438?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "conde", :ns "clojure.core.logic"}, :_id "578dfbcbe4b0bafd3e2a04aa"} {:created-at 1468922837244, :author {:login "freaxmind", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3929438?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defna", :ns "clojure.core.logic"}, :_id "578dfbd5e4b0bafd3e2a04ab"} {:created-at 1468922843584, :author {:login "freaxmind", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3929438?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "fna", :ns "clojure.core.logic"}, :_id "578dfbdbe4b0bafd3e2a04ac"}], :line 1417, :examples [{:updated-at 1468925514081, :created-at 1468925514081, :author {:login "freaxmind", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3929438?v=3"}, :body ";; Mind the order:\n\n(defn logic-test-1 []\n (run* [q r]\n (membero q [\"linux\" \"windows\" \"mac\" \"android\" \"\"])\n (conda\n [(membero q [\"linux\" \"windows\"]) (== r 1)]\n [(== q \"mac\") (== r 2)]\n [succeed (== q \"\") (== r 3)])))\n;; => ([\"linux\" 1] [\"windows\" 1] [\"mac\" 2] [\"\" 3])\n;; conda takes ground values and matches them one by one against its clauses. \n\n(defn logic-test-2 []\n (run* [q r]\n (conda\n [(membero q [\"linux\" \"windows\"]) (== r 1)]\n [(== q \"mac\") (== r 2)]\n [succeed (== q \"\") (== r 3)])\n (membero q [\"linux\" \"windows\" \"mac\" \"android\" \"\"])))\n;; ([\"linux\" 1] [\"windows\" 1])\n;; conda takes a fresh variable and associates it to the head of its first clause.\n;; only the rest of the first clause (== r 1) is considered", :_id "578e064ae4b0bafd3e2a04ad"} {:updated-at 1651392808446, :created-at 1651392808446, :author {:login "shenlebantongying", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20123683?v=4"}, :body ";; The order of \"cond\"s matters\n\n(run* [q]\n (conda\n [(membero 1 [q 2 3])]\n [(membero q [4 5 6])]))\n;; => (1)\n\n\n(run* [q]\n (conda\n [(membero q [4 5 6])]\n [(membero 1 [q 2 3])]))\n;; => (4 5 6)", :_id "626e4128e4b0b1e3652d75de"}], :macro true, :notes nil, :arglists ["& clauses"], :doc "Soft cut. Once the head of a clause has succeeded\n all other clauses will be ignored. Non-relational.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/conda"} {:ns "clojure.core.logic", :name "run-constraints*", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2115, :examples nil, :notes nil, :arglists ["xs cs ws"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/run-constraints*"} {:ns "clojure.core.logic", :name "let-dom", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 2211, :examples nil, :macro true, :notes nil, :arglists ["a vars & body"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/let-dom"} {:ns "clojure.core.logic", :name "-reify", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 263, :examples nil, :notes nil, :arglists ["s v" "s v r"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/-reify"} {:ns "clojure.core.logic", :name "run-constraint", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2070, :examples nil, :notes nil, :arglists ["c"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/run-constraint"} {:ns "clojure.core.logic", :name "->ConstraintStore", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 109, :examples nil, :notes nil, :arglists ["km cm cid running"], :doc "Positional factory function for class clojure.core.logic.ConstraintStore.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/->ConstraintStore"} {:ns "clojure.core.logic", :name "make-suspended-stream", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1854, :examples nil, :notes nil, :arglists ["cache ansv* f"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/make-suspended-stream"} {:ns "clojure.core.logic", :name "tree-term?", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 884, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/tree-term_q"} {:ns "clojure.core.logic", :name "fna", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1718, :examples nil, :macro true, :notes nil, :arglists ["& rest"], :doc "Define an anonymous soft cut goal. See conda.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/fna"} {:ns "clojure.core.logic", :name "*locals*", :file "clojure/core/logic.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 17, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/*locals*"} {:ns "clojure.core.logic", :name "unbound-names", :file "clojure/core/logic.clj", :type "var", :column 1, :see-alsos nil, :line 249, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/unbound-names"} {:ns "clojure.core.logic", :name "member1o", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1762, :examples nil, :notes nil, :arglists ["x l"], :doc "Like membero but uses to disequality further constraining\n the results. For example, if x and l are ground and x occurs\n multiple times in l, member1o will succeed only once.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/member1o"} {:ns "clojure.core.logic", :name "pair", :file "clojure/core/logic.clj", :type "var", :column 1, :see-alsos nil, :line 214, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/pair"} {:ns "clojure.core.logic", :name "walk-record-term", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 969, :examples nil, :notes nil, :arglists ["v f"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/walk-record-term"} {:ns "clojure.core.logic", :name "lvaro", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1448, :examples nil, :macro true, :notes nil, :arglists ["v"], :doc "A goal that succeeds if the argument is fresh. v must be a logic\n variable. Non-relational.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/lvaro"} {:ns "clojure.core.logic", :name "map->PMap", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2518, :examples nil, :notes nil, :arglists ["m__8876__auto__"], :doc "Factory function for class clojure.core.logic.PMap, taking a map of keywords to field values.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/map->PMap"} {:ns "clojure.core.logic", :name "annotate", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 547, :examples nil, :notes nil, :arglists ["k v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/annotate"} {:ns "clojure.core.logic", :name "empty-f", :file "clojure/core/logic.clj", :type "var", :column 1, :see-alsos nil, :line 538, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/empty-f"} {:ns "clojure.core.logic", :name "->LVar", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 621, :examples nil, :notes nil, :arglists ["id unique name oname hash meta"], :doc "Positional factory function for class clojure.core.logic.LVar.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/->LVar"} {:ns "clojure.core.logic", :name "update-pvars!", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1492, :examples nil, :notes nil, :arglists ["x vars"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/update-pvars!"} {:ns "clojure.core.logic", :name "tabled", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1997, :examples nil, :macro true, :notes nil, :arglists ["args & grest"], :doc "Macro for defining a tabled goal. Prefer ^:tabled with the\n defne/a/u forms over using this directly.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/tabled"} {:ns "clojure.core.logic", :name "resto", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos [{:created-at 1490671466023, :author {:login "tkocmathla", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/183459?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "firsto", :ns "clojure.core.logic"}, :_id "58d9d76ae4b01f4add58fe7a"}], :line 1671, :examples nil, :notes nil, :arglists ["l d"], :doc "A relation where l is a collection, such that d is the rest of l", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/resto"} {:ns "clojure.core.logic", :name "ifu*", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1369, :examples nil, :macro true, :notes nil, :arglists ["" "[e & gs] & grest"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/ifu*"} {:ns "clojure.core.logic", :name "unify-with-sequential*", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 893, :examples nil, :notes nil, :arglists ["u v s"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/unify-with-sequential*"} {:ns "clojure.core.logic", :name "add-attr", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 432, :examples nil, :notes nil, :arglists ["s x attr attrv"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/add-attr"} {:ns "clojure.core.logic", :name "walk*", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 227, :examples nil, :notes nil, :arglists ["s v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/walk*"} {:ns "clojure.core.logic", :name "->AnswerCache", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1818, :examples nil, :notes nil, :arglists ["ansl anss _meta"], :doc "Positional factory function for class clojure.core.logic.AnswerCache.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/->AnswerCache"} {:ns "clojure.core.logic", :name "enforceable-constrained", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2140, :examples nil, :notes nil, :arglists ["a"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/enforceable-constrained"} {:ns "clojure.core.logic", :name "bindable?", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 732, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/bindable_q"} {:ns "clojure.core.logic", :name "->Choice", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1084, :examples nil, :notes nil, :arglists ["a f"], :doc "Positional factory function for class clojure.core.logic.Choice.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/->Choice"} {:ns "clojure.core.logic", :name "defne", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos [{:created-at 1460136376057, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defna", :ns "clojure.core.logic"}, :_id "5707e9b8e4b0fc95a97eab36"} {:created-at 1460136395724, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defnu", :ns "clojure.core.logic"}, :_id "5707e9cbe4b075f5b2c864d3"} {:created-at 1460136407118, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defnc", :ns "clojure.core.logic"}, :_id "5707e9d7e4b0fc95a97eab37"} {:created-at 1460143705697, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "fne", :ns "clojure.core.logic"}, :_id "57080659e4b0fc95a97eab3f"} {:created-at 1490672610441, :author {:login "tkocmathla", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/183459?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "conde", :ns "clojure.core.logic"}, :_id "58d9dbe2e4b01f4add58fe7d"}], :line 1699, :examples [{:updated-at 1444345575973, :created-at 1444345575973, :author {:login "stewSquared", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4022813?v=3"}, :body "(defne match1 [x y]\n ([:foo :bar])\n ([:baz :qux]))\n\n(run* [x y] (match1 x y)) ;; => ([:foo :bar] [:baz :qux])\n\n(defne match2 [x y]\n ([[a b . tail] [b a . tail]]))\n\n(run* [r] (match2 '(a b c d) r)) ;; => ((b a c d))\n\n(defne match3 [x y]\n ([[a . _] [a . _]]))\n\n(run* [r] (match3 [3 2 1] [3 4 5])) ;; => (_0)", :_id "5616f6e7e4b084e61c76ecbe"} {:editors [{:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}], :body ";; adapted from:\n;; http://stackoverflow.com/questions/11964055/constraining-two-vectors-to-be-in-the-same-domain-but-not-be-members-of-each-ot\n\n(defne not-membero [x l]\n ([_ []])\n ([_ [?y . ?r]]\n (!= x ?y)\n (not-membero x ?r)))\n\n(run* [q]\n (not-membero q [:a :b :c])) ;; ((_0 :- (!= (_0 :a)) (!= (_0 :b)) (!= (_0 :c))) \n\n(run* [q]\n (membero q [1 2 3 4 5])\n (not-membero q [2 4])) ;; (1 3 5)", :author {:avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3", :account-source "github", :login "freckletonj"}, :created-at 1460087200380, :updated-at 1460143693913, :_id "570729a0e4b075f5b2c864d2"}], :macro true, :notes nil, :arglists ["& rest"], :doc "Define a goal fn. Supports pattern matching. All\n patterns will be tried. See conde.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/defne"} {:ns "clojure.core.logic", :name "featurec", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos [{:created-at 1450637745267, :author {:login "qneo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5214601?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "conjo", :ns "clojure.core.logic"}, :_id "5676f9b1e4b01f598e267e8e"}], :line 2579, :examples [{:updated-at 1450637709624, :created-at 1450637709624, :author {:login "qneo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5214601?v=3"}, :body "user> (run 1 [q] (featurec q {1 2}) (== q {2 4}))\n() ;; {2 4} does not cointain k-v 1 2\nuser> (run 1 [q] (featurec q {1 2}) (== q {1 2 2 4}))\n({1 2, 2 4}) ;; {1 2 2 4} does contain k-v 1 2", :_id "5676f98de4b01f598e267e8c"} {:updated-at 1460576267720, :created-at 1460576267720, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :body ";; http://michaelrbernste.in/2013/05/12/featurec-and-maps.html\n;; http://stackoverflow.com/questions/15821718/how-do-i-de-structure-a-map-in-core-logic\n\n(is (= (run* [q]\n (featurec q {:foo 1})\n (== q {:foo 1 :bar 2}))\n '({:foo 1 :bar 2})))", :_id "570ea00be4b0fc95a97eab4b"} {:updated-at 1596504989470, :created-at 1596503615103, :author {:login "owenRiddy", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/8080718?v=4"}, :body ";;\n;; Using featurec rather than == can trigger bugs.\n;; \n\n(run* [p]\n (featurec p {:a 1})\n (fresh [m]\n (== p {:a m})))\n;; => Error printing return value (IllegalArgumentException) at \n;; => clojure.lang.RT/seqFrom (RT.java:557).\n;; => Don't know how to create ISeq from: java.lang.Long\n\n(run* [p]\n (== p {:a 1})\n (featurec p {:a 1})\n (fresh [m]\n (== p {:a m})))\n;; => ({:a 1})", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/8080718?v=4", :account-source "github", :login "owenRiddy"}], :_id "5f28b63fe4b0b1e3652d7341"}], :notes nil, :arglists ["x fs"], :doc "Ensure that a map contains at least the key-value pairs\n in the map fs. fs must be partially instantiated - that is,\n it may contain values which are logic variables to support\n feature extraction.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/featurec"} {:ns "clojure.core.logic", :name "force-ans", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2273, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/force-ans"} {:ns "clojure.core.logic", :name "normalize-store", :file "clojure/core/logic.clj", :type "var", :column 1, :see-alsos nil, :line 2407, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/normalize-store"} {:ns "clojure.core.logic", :name "update-dom", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 480, :examples nil, :notes nil, :arglists ["s x dom f" "s x dom f seenset"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/update-dom"} {:ns "clojure.core.logic", :name "membero", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1755, :examples [{:editors [{:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}], :body ";; Usage: (membero x l)\n\n(run* [q]\n (membero :a [q :b :c])) ;; :a\n(run* [q]\n (membero q [:a :b :c])) ;; [:a :b :c]\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3", :account-source "github", :login "freckletonj"}, :created-at 1460065964061, :updated-at 1460139875793, :_id "5706d6ace4b0fc95a97eab35"} {:updated-at 1654526190348, :created-at 1654526190348, :author {:login "zackteo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7510179?v=4"}, :body " (run* [q]\n (membero q [1 2 3])\n (membero q [2 3 4])) ;;=> (2 3)", :_id "629e10eee4b0b1e3652d75f9"}], :notes nil, :arglists ["x l"], :doc "A relation where l is a collection, such that l contains x.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/membero"} {:ns "clojure.core.logic", :name "merge-doms", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 558, :examples nil, :notes nil, :arglists ["s x doms"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/merge-doms"} {:ns "clojure.core.logic", :name "matchu", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1744, :examples nil, :macro true, :notes nil, :arglists ["xs & cs"], :doc "Define a committed choice goal. See condu.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/matchu"} {:ns "clojure.core.logic", :name "fixc", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2871, :examples nil, :notes nil, :arglists ["x f reifier" "x f runnable reifier"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/fixc"} {:ns "clojure.core.logic", :name "lvar?", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 726, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/lvar_q"} {:ns "clojure.core.logic", :name "answer-cache", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1844, :examples nil, :notes nil, :arglists [""], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/answer-cache"} {:ns "clojure.core.logic", :name "run-constraints", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2105, :examples nil, :notes nil, :arglists ["xcs"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/run-constraints"} {:ns "clojure.core.logic", :name "all", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos [{:created-at 1571658725931, :author {:login "svdo", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/4028554?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "fresh", :ns "clojure.core.logic"}, :_id "5dad9be5e4b0ca44402ef7d1"} {:created-at 1680599621892, :author {:login "port19x", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/82055622?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "every?", :ns "clojure.core"}, :_id "642bea45e4b08cf8563f4b8c"}], :line 1268, :examples nil, :macro true, :notes nil, :arglists ["" "& goals"], :doc "Like fresh but does does not create logic variables.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/all"} {:ns "clojure.core.logic", :name "or*", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1185, :examples nil, :notes nil, :arglists ["goals"], :doc "A function version of conde, which takes a list of goals and tries them as if via conde.\n Note that or* only does disjunction, ie (or* [a b c]) is the same as (conde [a] [b] [c]).\n If you need something like (conde [a b] [c]), you can use and*, or all:\n (or* [(and* a b) c]).", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/or*"} {:ns "clojure.core.logic", :name "->PMap", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2518, :examples nil, :notes nil, :arglists [""], :doc "Positional factory function for class clojure.core.logic.PMap.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/->PMap"} {:ns "clojure.core.logic", :name "u#", :file "clojure/core/logic.clj", :type "var", :column 1, :see-alsos nil, :line 1150, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/u#"} {:ns "clojure.core.logic", :name "trace-lvar", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1302, :examples nil, :notes nil, :arglists ["a lvar"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/trace-lvar"} {:ns "clojure.core.logic", :name "add-var", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 178, :examples nil, :notes nil, :arglists ["cs x c"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/add-var"} {:ns "clojure.core.logic", :name "to-s", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 543, :examples nil, :notes nil, :arglists ["v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/to-s"} {:ns "clojure.core.logic", :name "waiting-stream?", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1860, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/waiting-stream_q"} {:ns "clojure.core.logic", :name "-fnm", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1628, :examples nil, :macro true, :notes nil, :arglists ["fn-gen t as & cs"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/-fnm"} {:ns "clojure.core.logic", :name "distribute", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2283, :examples nil, :notes nil, :arglists ["v* strategy"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/distribute"} {:ns "clojure.core.logic", :name "occurs-check", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 216, :examples nil, :notes nil, :arglists ["s u v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/occurs-check"} {:ns "clojure.core.logic", :name "predc", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2687, :examples nil, :notes nil, :arglists ["x p" "x p pform"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/predc"} {:ns "clojure.core.logic", :name "entailed?", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2064, :examples nil, :notes nil, :arglists ["c c' a"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/entailed_q"} {:ns "clojure.core.logic", :name "->SubstValue", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 197, :examples nil, :notes nil, :arglists ["v doms eset"], :doc "Positional factory function for class clojure.core.logic.SubstValue.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/->SubstValue"} {:ns "clojure.core.logic", :name "-featurec", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2549, :examples nil, :notes nil, :arglists ["x fs"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/-featurec"} {:ns "clojure.core.logic", :name "rem-dom", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 494, :examples nil, :notes nil, :arglists ["s x dom" "s x dom seenset"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/rem-dom"} {:ns "clojure.core.logic", :name "update-eset", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 572, :examples nil, :notes nil, :arglists ["s doms eset"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/update-eset"} {:ns "clojure.core.logic", :name "conso", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos [{:created-at 1562862235221, :author {:login "kannangce", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/8754040?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "cons", :ns "clojure.core"}, :_id "5d27629be4b0ca44402ef780"}], :line 1659, :examples [{:updated-at 1562862221958, :created-at 1562862221958, :author {:login "kannangce", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/8754040?v=4"}, :body ";; conso for 1 lvar\n\n(run* [x] (conso 1 x [1 2 3 4]))\n\n;; ((2 3 4))\n\n\n;; conso for 2 lvar\n\n(run* [x y] (conso x y [1 2 3 4]))\n\n;; ([1 (2 3 4)])", :_id "5d27628de4b0ca44402ef77f"}], :notes nil, :arglists ["a d l"], :doc "A relation where l is a collection, such that a is the first of l\n and d is the rest of l. If ground d must be bound to a proper tail.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/conso"} {:ns "clojure.core.logic", :name "nilo", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1649, :examples nil, :notes nil, :arglists ["a"], :doc "A relation where a is nil", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/nilo"} {:ns "clojure.core.logic", :name "nonlvaro", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1456, :examples nil, :macro true, :notes nil, :arglists ["v"], :doc "A goal that succeeds if the argument is not fresh. v must be a\n logic variable. Non-relational.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/nonlvaro"} {:ns "clojure.core.logic", :name "uai", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 747, :examples nil, :macro true, :notes nil, :arglists ["& args"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/uai"} {:ns "clojure.core.logic", :name "fail", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1144, :examples nil, :notes nil, :arglists ["a"], :doc "A goal that always fails.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/fail"} {:ns "clojure.core.logic", :name "get-attr", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 450, :examples nil, :notes nil, :arglists ["s x attr"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/get-attr"} {:ns "clojure.core.logic", :name "-fixc", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2843, :examples nil, :notes nil, :arglists ["x f reifier" "x f runnable reifier"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/-fixc"} {:ns "clojure.core.logic", :name "build", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 271, :examples nil, :notes nil, :arglists ["s u"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/build"} {:ns "clojure.core.logic", :name "everyg", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1677, :examples [{:editors [{:login "zackteo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7510179?v=4"}], :body "\n;; everyg takes a goal and a seq of lvars and \n;; applies the goal for each of the lvars.\n\n;; For ex,\n\n(run* [x y]\n (fd/in x (fd/domain 1 2))\n (fd/in y (fd/domain 1 2)))\n\n;; can be rewritten as \n\n(run* [x y]\n (everyg #(fd/in % (fd/domain 1 2)) [x y]))\n\n;; For O/P\n;; ([1 1] [2 1] [1 2] [2 2])", :author {:avatar-url "https://avatars0.githubusercontent.com/u/8754040?v=4", :account-source "github", :login "kannangce"}, :created-at 1563388435865, :updated-at 1655422626875, :_id "5d2f6a13e4b0ca44402ef786"}], :notes nil, :arglists ["g coll"], :doc "A pseudo-relation that takes a coll and ensures that the goal g\n succeeds on every element of the collection.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/everyg"} {:ns "clojure.core.logic", :name "project", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1327, :examples [{:editors [{:login "originalhat", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/579630?v=4"}], :body ";; convert lvars into values\nuser=> (cl/project [a b] (cl/== % (str a \" proposed to \" b)))\n\"Jack proposed to Mira\"", :author {:avatar-url "https://avatars1.githubusercontent.com/u/579630?v=4", :account-source "github", :login "originalhat"}, :created-at 1605047817834, :updated-at 1605047863927, :_id "5fab1609e4b0b1e3652d7402"}], :macro true, :notes nil, :arglists ["[& vars] & goals"], :doc "Extract the values bound to the specified logic vars. Non-relational.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/project"} {:ns "clojure.core.logic", :name "-run", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1218, :examples nil, :macro true, :notes nil, :arglists ["opts [x :as bindings] & goals"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/-run"} {:ns "clojure.core.logic", :name "get-dom-fd", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2205, :examples nil, :notes nil, :arglists ["a x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/get-dom-fd"} {:ns "clojure.core.logic", :name "-nafc", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2701, :examples nil, :notes nil, :arglists ["c args"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/-nafc"} {:ns "clojure.core.logic", :name "ifa*", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1361, :examples nil, :macro true, :notes nil, :arglists ["" "[e & gs] & grest"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/ifa*"} {:ns "clojure.core.logic", :name "trace-lvars", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1305, :examples [{:editors [{:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=4"}], :body "(run* [q]\n (fresh [v]\n (conde\n [(trace-lvars \"1:A clause\" q v)\n (== q 1)\n (== v 23)\n (trace-lvars \"1:B clause\" q v)]\n [(== q 2)\n (trace-lvars \"2:A clause\" q v)\n (== q v)\n (trace-lvars \"2:B clause\" q v)])))\n\n\n;; => (1 _0)\n\n1:A clause\n q = _0\n v = _0\n1:B clause\n q = 1\n v = 23\n2:A clause\n q = 2\n v = _0\n2:B clause\n q = 2\n v = 2", :author {:avatar-url "https://avatars.githubusercontent.com/u/353113?v=4", :account-source "github", :login "claj"}, :created-at 1669159763379, :updated-at 1669757615161, :_id "637d5b53e4b0b1e3652d7690"}], :macro true, :notes nil, :arglists ["title & lvars"], :doc "Goal for tracing the values of logic variables.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/trace-lvars"} {:ns "clojure.core.logic", :name "make-cs", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 188, :examples nil, :notes nil, :arglists [""], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/make-cs"} {:ns "clojure.core.logic", :name "-inc", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1077, :examples nil, :macro true, :notes nil, :arglists ["& rest"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/-inc"} {:ns "clojure.core.logic", :name "fne", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1693, :examples [{:editors [{:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}], :body "(run 10 [q]\n ((fne [x y]\n ([[h . t] t]))\n [1 2 3] q)) ; => ((2 3))\n\n(run 10 [q]\n ((fne [x y]\n ([[o? 2 _ 4 5]] (== y o?))\n ([[1 2 _ . o?]] (== y o?)))\n [1 2 3 4 5] q))", :author {:avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3", :account-source "github", :login "freckletonj"}, :created-at 1480021319437, :updated-at 1480023049650, :_id "58375547e4b0782b632278ca"}], :macro true, :notes nil, :arglists ["& rest"], :doc "Define an anonymous goal fn. Supports pattern matching. All\n patterns will be tried. See conde.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/fne"} {:ns "clojure.core.logic", :name "lvars", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 729, :examples nil, :notes nil, :arglists ["n"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/lvars"} {:ns "clojure.core.logic", :name "subst?", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 540, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/subst_q"} {:ns "clojure.core.logic", :name "!=", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos [{:created-at 1577762515984, :author {:login "yuhan0", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/22216124?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "==", :ns "clojure.core.logic"}, :_id "5e0abed3e4b0ca44402ef802"}], :line 2458, :examples [{:editors [{:login "yuhan0", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/22216124?v=4"}], :body ";; Do not confuse with not= from clojure.core!\n\n(run* [a b]\n (membero a [1 2 3])\n (membero b [1 2 3])\n (!= a b))\n;; => ([1 2] [2 1] [1 3] [3 1] [2 3] [3 2])\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/7733800?v=3", :account-source "github", :login "clojurehunter"}, :created-at 1437906067367, :updated-at 1576168878662, :_id "55b4b493e4b0080a1b79cdad"}], :notes nil, :arglists ["u v"], :doc "Disequality constraint. Ensures that u and v will never\n unify. u and v can be complex terms.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/!="} {:ns "clojure.core.logic", :name "==", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1156, :examples [{:updated-at 1648391340255, :created-at 1648391340255, :author {:login "vimfun", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/851484?v=4"}, :body "(require '[clojure.core.logic :as logic :refer [run* ==])\n\n(run* [q]\n (== q 1))\n;; (1)\n\n(run* [q]\n (== q [1 2 3]))\n;; ([1 2 3])\n\n(run* [q]\n (== [1 q 3] [1 2 3]))\n;; (2)", :_id "624074ace4b0b1e3652d75c1"}], :notes [{:author {:login "zackteo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7510179?v=4"}, :updated-at 1654864972133, :created-at 1654864972133, :body "==, or unify", :_id "62a33c4ce4b0b1e3652d75fb"}], :arglists ["u v"], :doc "A goal that attempts to unify terms u and v.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/=="} {:ns "clojure.core.logic", :name "env-locals", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1625, :examples nil, :notes nil, :arglists ["& syms"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/env-locals"} {:ns "clojure.core.logic", :name "conjo", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2802, :examples [{:body "(use 'clojure.core.logic)\n\n;; Like conj, but result is the last argument\n\n(run* [q] (conjo [1 2 3] 4 q))\n;;=> ([1 2 3 4])\n(run* [q] (conjo [1 2 3] 4 5 6 q))\n;;=> ([1 2 3 4 5 6])\n(run* [q] (conjo {:a 0} {:a 123 :b 345} q))\n;;=> ({:a 123, :b 345})\n\n;; Partially relational:\n(run* [q] (conjo [1 2] q [1 2 3]))\n;;=> (3)\n\n;; but the same doesn't work for maps\n(run* [q] (conjo {} q {:a 1}))\n;; java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.core.logic.LVar\n\n;; This case works:\n(run* [q] (conjo {} {:a q} {:a 12345}))\n;;=> (12345)", :author {:login "kolen", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/24191?v=2"}, :created-at 1414160050597, :updated-at 1414160050597, :_id "544a5eb2e4b0dc573b892fa8"}], :notes nil, :arglists ["coll & args"], :doc "A constraint version of conj", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/conjo"} {:ns "clojure.core.logic", :name "remcg", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2049, :examples nil, :notes nil, :arglists ["c"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/remcg"} {:ns "clojure.core.logic", :name "dissoc-dom", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 33, :examples nil, :notes nil, :arglists ["x k"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/dissoc-dom"} {:ns "clojure.core.logic", :name "suspended-stream?", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1857, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/suspended-stream_q"} {:ns "clojure.core.logic", :name "firsto", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos [{:created-at 1490671476774, :author {:login "tkocmathla", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/183459?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "resto", :ns "clojure.core.logic"}, :_id "58d9d774e4b01f4add58fe7b"}], :line 1665, :examples nil, :notes nil, :arglists ["l a"], :doc "A relation where l is a collection, such that a is the first of l", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/firsto"} {:ns "clojure.core.logic", :name "map->SuspendedStream", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1849, :examples nil, :notes nil, :arglists ["m__8876__auto__"], :doc "Factory function for class clojure.core.logic.SuspendedStream, taking a map of keywords to field values.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/map->SuspendedStream"} {:ns "clojure.core.logic", :name "entangle", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 609, :examples nil, :notes nil, :arglists ["s x y"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/entangle"} {:ns "clojure.core.logic", :name "run*", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1242, :examples [{:updated-at 1593353431525, :created-at 1593353431525, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/8271291?v=4"}, :body ";; Solves 3X + 2Y + Z = 3 equation\n(let [symbols '[X Y Z]\n vars (repeatedly (count symbols) lvar)\n [x y z] vars\n sum 3]\n (run* [q]\n (everyg #(fd/in % (fd/interval 0 sum)) vars)\n (fresh [pro-x pro-y pro-z sum-x-y]\n (fd/* 3 x pro-x)\n (fd/* 2 y pro-y)\n (fd/* 1 z pro-z)\n (fd/+ pro-x pro-y sum-x-y)\n (fd/+ sum-x-y pro-z sum))\n (== q (zipmap symbols vars))))\n\n;;=> ({X 0, Y 0, Z 3} \n;; {X 1, Y 0, Z 0} \n;; {X 0, Y 1, Z 1})", :_id "5ef8a4d7e4b0b1e3652d7314"}], :macro true, :notes nil, :arglists ["bindings & goals"], :doc "Executes goals until results are exhausted.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/run*"} {:ns "clojure.core.logic", :name "->SuspendedStream", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1849, :examples nil, :notes nil, :arglists ["cache ansv* f"], :doc "Positional factory function for class clojure.core.logic.SuspendedStream.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/->SuspendedStream"} {:ns "clojure.core.logic", :name "run-db", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1247, :examples nil, :macro true, :notes nil, :arglists ["n db bindings & goals"], :doc "Executes goals until a maximum of n results are found. Uses a specified logic database.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/run-db"} {:ns "clojure.core.logic", :name "ground-term?", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2590, :examples nil, :notes nil, :arglists ["x s"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/ground-term_q"} {:ns "clojure.core.logic", :name "verify-all-bound", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2129, :examples nil, :notes nil, :arglists ["a constrained"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/verify-all-bound"} {:ns "clojure.core.logic", :name "defnm", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1639, :examples nil, :macro true, :notes nil, :arglists ["t n & rest"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/defnm"} {:ns "clojure.core.logic", :name "fix-constraints", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2088, :examples nil, :notes nil, :arglists ["a"], :doc "A goal to run the constraints in cq until it is empty. Of\n course running a constraint may grow cq so this function\n finds the fixpoint.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/fix-constraints"} {:ns "clojure.core.logic", :name "subst-val?", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 202, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/subst-val_q"} {:ns "clojure.core.logic", :name "map->SubstValue", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 197, :examples nil, :notes nil, :arglists ["m__8876__auto__"], :doc "Factory function for class clojure.core.logic.SubstValue, taking a map of keywords to field values.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/map->SubstValue"} {:ns "clojure.core.logic", :name "partial-map?", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2542, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/partial-map_q"} {:ns "clojure.core.logic", :name "succeed", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1140, :examples nil, :notes nil, :arglists ["a"], :doc "A goal that always succeeds.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/succeed"} {:ns "clojure.core.logic", :name "subst-val", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 205, :examples nil, :notes nil, :arglists ["x" "x doms" "x doms _meta" "x doms eset _meta"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/subst-val"} {:ns "clojure.core.logic", :name "composeg", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1053, :examples nil, :notes nil, :arglists ["" "g0 g1"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/composeg"} {:ns "clojure.core.logic.fd", :name "interval", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 357, :examples [{:updated-at 1632545550940, :created-at 1632545550940, :author {:login "jngbng", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/552977?v=4"}, :body "(cl/run* [x]\n (fd/in x (fd/interval 1 3)))\n;; => (1 2 3)", :_id "614eab0ee4b0b1e3652d7545"}], :notes nil, :arglists ["ub" "lb ub"], :doc "Construct an interval for an assignment to a var. intervals may\n be more efficient that the domain type when the range of possiblities\n is large.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/interval"} {:ns "clojure.core.logic.fd", :name "domain", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 155, :examples [{:updated-at 1596510435368, :created-at 1596510395370, :author {:login "owenRiddy", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/8080718?v=4"}, :body ";; The docs are truthful but highly misleading. \n;; Although integers can be passed as arguments\n;; a domain can only be constructed over the\n;; Natural numbers.\n\n\ndirect> (fd/domain 1 2 3)\n;; => \ndirect> (fd/domain -1 -2 -3)\n;; => nil\ndirect> (fd/domain -3 -2 -1 0 1 2 3)\n;; => ", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/8080718?v=4", :account-source "github", :login "owenRiddy"}], :_id "5f28d0bbe4b0b1e3652d7346"}], :notes nil, :arglists ["& args"], :doc "Construct a domain for assignment to a var. Arguments should \n be integers given in sorted order. domains may be more efficient \n than intervals when only a few values are possible.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/domain"} {:ns "clojure.core.logic.fd", :name "interval?", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 351, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/interval_q"} {:ns "clojure.core.logic.fd", :name "->FiniteDomain", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 64, :examples nil, :notes nil, :arglists ["s min max"], :doc "Positional factory function for class clojure.core.logic.fd.FiniteDomain.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/->FiniteDomain"} {:ns "clojure.core.logic.fd", :name "!=c", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 755, :examples nil, :notes nil, :arglists ["u v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/!=c"} {:ns "clojure.core.logic.fd", :name "domc", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 718, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/domc"} {:ns "clojure.core.logic.fd", :name "-member?", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["this n"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/-member_q"} {:ns "clojure.core.logic.fd", :name "->MultiIntervalFD", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 477, :examples nil, :notes nil, :arglists ["min max is"], :doc "Positional factory function for class clojure.core.logic.fd.MultiIntervalFD.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/->MultiIntervalFD"} {:ns "clojure.core.logic.fd", :name "<", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 825, :examples nil, :notes nil, :arglists ["u v"], :doc "A finite domain constraint. u must be less than v. u and v\n must eventually be given domains if vars.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/<"} {:ns "clojure.core.logic.fd", :name "get-dom", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 591, :examples nil, :notes nil, :arglists ["a x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/get-dom"} {:ns "clojure.core.logic.fd", :name "expand", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 1113, :examples nil, :notes nil, :arglists ["form"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/expand"} {:ns "clojure.core.logic.fd", :name "dom", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 631, :examples nil, :notes nil, :arglists ["x dom"], :doc "Assign a var x a domain.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/dom"} {:ns "clojure.core.logic.fd", :name "->IntervalFD", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 231, :examples nil, :notes nil, :arglists ["lb ub"], :doc "Positional factory function for class clojure.core.logic.fd.IntervalFD.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/->IntervalFD"} {:ns "clojure.core.logic.fd", :name "resolve-storable-dom", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 607, :examples nil, :notes nil, :arglists ["a x dom domp"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/resolve-storable-dom"} {:ns "clojure.core.logic.fd", :name "difference*", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 408, :examples nil, :notes nil, :arglists ["is js"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/difference*"} {:ns "clojure.core.logic.fd", :name "bounded-listo", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 1085, :examples nil, :notes nil, :arglists ["l n"], :doc "Ensure that the list l never grows beyond bound n.\n n must have been assigned a domain.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/bounded-listo"} {:ns "clojure.core.logic.fd", :name "map-sum", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 658, :examples nil, :notes nil, :arglists ["f"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/map-sum"} {:ns "clojure.core.logic.fd", :name "ext-dom-fd", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 597, :examples nil, :notes nil, :arglists ["a x dom domp"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/ext-dom-fd"} {:ns "clojure.core.logic.fd", :name "in", :file "clojure/core/logic/fd.clj", :type "macro", :column 1, :see-alsos [{:created-at 1655305783395, :author {:login "zackteo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7510179?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "domain", :ns "clojure.core.logic.fd"}, :_id "62a9f637e4b0b1e3652d7602"} {:created-at 1655305802408, :author {:login "zackteo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7510179?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "interval", :ns "clojure.core.logic.fd"}, :_id "62a9f64ae4b0b1e3652d7603"} {:created-at 1679493250018, :author {:login "port19x", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/82055622?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "contains?", :ns "clojure.core"}, :_id "641b0882e4b08cf8563f4b82"}], :line 646, :examples [{:editors [{:login "zackteo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7510179?v=4"}], :body "(logic/run* [x y]\n (fd/in x y (fd/interval 0 5))\n (fd/+ x y 5))\n;; => ([0 5] [1 4] [2 3] [3 2] [4 1] [5 0])", :author {:avatar-url "https://avatars.githubusercontent.com/u/552977?v=4", :account-source "github", :login "jngbng"}, :created-at 1632547487519, :updated-at 1655305031162, :_id "614eb29fe4b0b1e3652d7546"} {:updated-at 1655305396793, :created-at 1655305396793, :author {:login "zackteo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7510179?v=4"}, :body ";; Modelling the possible combination of values of 2 coin tosses\n;; heads - 1, tails - 0; or vice-versa\n(logic/run* [coin-1 coin-2]\n (let [coin (fd/domain 0 1)]\n (fd/in coin-1 coin-2 coin)))\n;; => ([0 0] [1 0] [0 1] [1 1])", :_id "62a9f4b4e4b0b1e3652d7600"}], :macro true, :notes [{:author {:login "port19x", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/82055622?v=4"}, :updated-at 1679493347028, :created-at 1679493347028, :body "If you're looking to do simple membership tests, such a function isn't builtin\n\n`(defn in? [xs el] (some #(= % el) xs))`", :_id "641b08e3e4b08cf8563f4b83"}], :arglists ["& xs-and-dom"], :doc "Assign vars to domain. The domain must come last.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/in"} {:ns "clojure.core.logic.fd", :name "distinctc", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 1042, :examples nil, :notes nil, :arglists ["v*"], :doc "The real distinct constraint. v* can be seq of logic vars and\n values or it can be a logic var itself. This constraint does not \n run until v* has become ground. When it has become ground we group\n v* into a set of logic vars and a sorted set of known singleton \n values. We then construct the individual constraint for each var.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/distinctc"} {:ns "clojure.core.logic.fd", :name "multi-interval", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 573, :examples nil, :notes nil, :arglists ["" "i0" "i0 i1" "i0 i1 & ir"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/multi-interval"} {:ns "clojure.core.logic.fd", :name "-intervals", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["this"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/-intervals"} {:ns "clojure.core.logic.fd", :name "-intersection", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["this that"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/-intersection"} {:ns "clojure.core.logic.fd", :name "<=", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 819, :examples nil, :notes nil, :arglists ["u v"], :doc "A finite domain constraint. u must be less than or equal to v.\n u and v must eventually be given domains if vars.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/<="} {:ns "clojure.core.logic.fd", :name "normalize-intervals", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 561, :examples nil, :notes nil, :arglists ["is"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/normalize-intervals"} {:ns "clojure.core.logic.fd", :name "intersection*", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 369, :examples nil, :notes nil, :arglists ["is js"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/intersection*"} {:ns "clojure.core.logic.fd", :name "*", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos [{:created-at 1591806367061, :author {:login "jogo3000", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/7455939?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "eq", :ns "clojure.core.logic.fd"}, :_id "5ee1099fe4b0b1e3652d7301"}], :line 976, :examples [{:editors [{:login "jogo3000", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/7455939?v=4"}], :body ";; Solve q in 2 * q = 10\n(use 'clojure.core.logic)\n(require '[clojure.core.logic.fd :as fd])\n\n(run* [q] (fd/* 2 q 10)) ; => (5)\n\n;; Gotcha: it can only really find integer solutions\n(run* [q] (fd/* 2 q 5)) ; => ()", :author {:avatar-url "https://avatars1.githubusercontent.com/u/7455939?v=4", :account-source "github", :login "jogo3000"}, :created-at 1591806163866, :updated-at 1591806328350, :_id "5ee108d3e4b0b1e3652d72ff"}], :notes nil, :arglists ["x y product"], :doc "A finite domain constraint for multiplication and\n thus division. x, y & product must be eventually be given \n domains if vars.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/*"} {:ns "clojure.core.logic.fd", :name "-drop-one", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["this"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/-drop-one"} {:ns "clojure.core.logic.fd", :name "interval-<", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 42, :examples nil, :notes nil, :arglists ["i j"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/interval-<"} {:ns "clojure.core.logic.fd", :name "-distinct", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 1028, :examples nil, :notes nil, :arglists ["x y* n*"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/-distinct"} {:ns "clojure.core.logic.fd", :name "singleton-dom?", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 604, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/singleton-dom_q"} {:ns "clojure.core.logic.fd", :name "<=c", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 792, :examples nil, :notes nil, :arglists ["u v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/<=c"} {:ns "clojure.core.logic.fd", :name "quot", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 983, :examples nil, :notes nil, :arglists ["u v w"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/quot"} {:ns "clojure.core.logic.fd", :name "binops->fd", :file "clojure/core/logic/fd.clj", :type "var", :column 1, :see-alsos nil, :line 1099, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/binops->fd"} {:ns "clojure.core.logic.fd", :name "eq", :file "clojure/core/logic/fd.clj", :type "macro", :column 1, :see-alsos nil, :line 1156, :examples [{:editors [{:login "jngbng", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/552977?v=4"}], :body ";; from https://github.com/clojure/core.logic/wiki/Features#clpfd\n\n;; fd/eq is a macro that allows you to write arithmetic expressions \n;; in normal Lisp syntax which will be expanded into the appropriate\n;; series of CLP(FD) operators. It will create the transient intermediate\n;; vars for you and domain inference will be applied.\n\n(logic/run* [q]\n (logic/fresh [x y]\n (fd/in x y (fd/interval 0 9))\n (fd/eq\n (= (+ x y) 9)\n (= (+ (* x 2) (* y 4)) 24))\n (== q [x y]))) ; => ([6 3])", :author {:avatar-url "https://avatars.githubusercontent.com/u/552977?v=4", :account-source "github", :login "jngbng"}, :created-at 1632547827870, :updated-at 1632553103427, :_id "614eb3f3e4b0b1e3652d7548"}], :macro true, :notes nil, :arglists ["& forms"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/eq"} {:ns "clojure.core.logic.fd", :name "eq-form", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 1151, :examples nil, :notes nil, :arglists ["form"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/eq-form"} {:ns "clojure.core.logic.fd", :name ">", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 833, :examples nil, :notes nil, :arglists ["u v"], :doc "A finite domain constraint. u must be greater than v. u and v\n must eventually be given domains if vars.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/>"} {:ns "clojure.core.logic.fd", :name "IInterval", :file "clojure/core/logic/fd.clj", :type "var", :column 1, :see-alsos nil, :line 16, :examples nil, :notes nil, :arglists [], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/IInterval"} {:ns "clojure.core.logic.fd", :name "eq*", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 1122, :examples nil, :notes nil, :arglists ["form vars" "form vars out"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/eq*"} {:ns "clojure.core.logic.fd", :name "-drop-before", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["this n"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/-drop-before"} {:ns "clojure.core.logic.fd", :name "process-dom", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 616, :examples nil, :notes nil, :arglists ["x dom domp"], :doc "If x is a var we update its domain. If it's an integer\n we check that it's a member of the given domain. dom is\n then new domain, it should have already been calculated from\n domp which was the previous domain.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/process-dom"} {:ns "clojure.core.logic.fd", :name "ISet", :file "clojure/core/logic/fd.clj", :type "var", :column 1, :see-alsos nil, :line 28, :examples nil, :notes nil, :arglists [], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/ISet"} {:ns "clojure.core.logic.fd", :name "-", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 906, :examples nil, :notes nil, :arglists ["u v w"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/-"} {:ns "clojure.core.logic.fd", :name "sorted-set->domain", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 148, :examples nil, :notes nil, :arglists ["s"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/sorted-set->domain"} {:ns "clojure.core.logic.fd", :name "interval-<=", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 45, :examples nil, :notes nil, :arglists ["i j"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/interval-<="} {:ns "clojure.core.logic.fd", :name "-domc", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 692, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/-domc"} {:ns "clojure.core.logic.fd", :name "list-sorted?", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 1031, :examples nil, :notes nil, :arglists ["pred ls"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/list-sorted_q"} {:ns "clojure.core.logic.fd", :name "-lb", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["this"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/-lb"} {:ns "clojure.core.logic.fd", :name "==c", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 721, :examples nil, :notes nil, :arglists ["u v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/==c"} {:ns "clojure.core.logic.fd", :name "extend-to-fd", :file "clojure/core/logic/fd.clj", :type "macro", :column 1, :see-alsos nil, :line 169, :examples nil, :macro true, :notes nil, :arglists ["t"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/extend-to-fd"} {:ns "clojure.core.logic.fd", :name "-disjoint?", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["this that"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/-disjoint_q"} {:ns "clojure.core.logic.fd", :name "disjoint?*", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 449, :examples nil, :notes nil, :arglists ["is js"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/disjoint_q*"} {:ns "clojure.core.logic.fd", :name ">=", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 839, :examples nil, :notes nil, :arglists ["u v"], :doc "A finite domain constraint. u must be greater than or equal to v.\n u and v must eventually be given domains if vars.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/>="} {:ns "clojure.core.logic.fd", :name "distinct", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 1077, :examples [{:editors [{:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/8271291?v=4"}], :body "(run* [q]\n (fresh [x y]\n (fd/in x y (fd/interval 1 10))\n (fd/+ x y 10)\n (fd/distinct [x y])\n (== q [x y])))\n\n;;=> ([1 9] [2 8] [3 7] [4 6] [6 4] [7 3] [8 2] [9 1])\n;; because of fd/distinct there is no [5 5] in result list.", :author {:avatar-url "https://avatars1.githubusercontent.com/u/8271291?v=4", :account-source "github", :login "ertugrulcetin"}, :created-at 1593353632149, :updated-at 1593353660081, :_id "5ef8a5a0e4b0b1e3652d7315"}], :notes nil, :arglists ["v*"], :doc "A finite domain constraint that will guarantee that \n all vars that occur in v* will be unified with unique \n values. v* need not be ground. Any vars in v* should\n eventually be given a domain.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/distinct"} {:ns "clojure.core.logic.fd", :name "-distinctc", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 986, :examples nil, :notes nil, :arglists ["x y* n*"], :doc "The real *individual* distinct constraint. x is a var that now is bound to\n a single value. y* were the non-singleton bound vars that existed at the\n construction of the constraint. n* is the set of singleton domain values \n that existed at the construction of the constraint. We use categorize to \n determine the current non-singleton bound vars and singleton vlaues. if x\n is in n* or the new singletons we have failed. If not we simply remove \n the value of x from the remaining non-singleton domains bound to vars.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/-distinctc"} {:ns "clojure.core.logic.fd", :name "bounds", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 39, :examples nil, :notes nil, :arglists ["i"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/bounds"} {:ns "clojure.core.logic.fd", :name "interval->=", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 51, :examples nil, :notes nil, :arglists ["i j"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/interval->="} {:ns "clojure.core.logic.fd", :name "to-vals", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 668, :examples nil, :notes nil, :arglists ["dom"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/to-vals"} {:ns "clojure.core.logic.fd", :name "-difference", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["this that"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/-difference"} {:ns "clojure.core.logic.fd", :name "->fd", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 1147, :examples nil, :notes nil, :arglists ["vars exprs"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/->fd"} {:ns "clojure.core.logic.fd", :name "interval->", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 48, :examples nil, :notes nil, :arglists ["i j"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/interval->"} {:ns "clojure.core.logic.fd", :name "+", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 900, :examples [{:updated-at 1582534477216, :created-at 1582534477216, :author {:login "mdzaebel", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/415392?v=4"}, :body "(run* [sum] (fd/+ 1 2 sum))\n;;=> (3)", :_id "5e538f4de4b087629b5a18a0"}], :notes nil, :arglists ["x y sum"], :doc "A finite domain constraint for addition and subtraction.\n x, y & sum must eventually be given domains if vars.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/+"} {:ns "clojure.core.logic.fd", :name "-ub", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["this"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/-ub"} {:ns "clojure.core.logic.fd", :name "binops", :file "clojure/core/logic/fd.clj", :type "var", :column 1, :see-alsos nil, :line 1111, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/binops"} {:ns "clojure.core.logic.fd", :name "unify-with-domain*", :file "clojure/core/logic/fd.clj", :type "var", :column 1, :see-alsos nil, :line 34, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/unify-with-domain*"} {:ns "clojure.core.logic.fd", :name "finite-domain?", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 145, :examples [{:updated-at 1655306137177, :created-at 1655306137177, :author {:login "zackteo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7510179?v=4"}, :body "(fd/finite-domain? (fd/domain 0 1));; => true\n(fd/finite-domain? (fd/interval 0 1));; => false", :_id "62a9f799e4b0b1e3652d7604"}], :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/finite-domain_q"} {:ns "clojure.core.logic.fd", :name "!=", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 786, :examples nil, :notes nil, :arglists ["u v"], :doc "A finite domain constraint. u and v must not be equal. u and v\n must eventually be given domains if vars.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/!="} {:ns "clojure.core.logic.fd", :name "==", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 749, :examples nil, :notes nil, :arglists ["u v"], :doc "A finite domain constraint. u and v must be equal. u and v must\n eventually be given domains if vars.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/=="} {:ns "clojure.core.logic.fd", :name "*c", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 913, :examples nil, :notes nil, :arglists ["u v w"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/*c"} {:ns "clojure.core.logic.fd", :name "ISortedDomain", :file "clojure/core/logic/fd.clj", :type "var", :column 1, :see-alsos nil, :line 23, :examples nil, :notes nil, :arglists [], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/ISortedDomain"} {:ns "clojure.core.logic.fd", :name "-keep-before", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["this n"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/-keep-before"} {:ns "clojure.core.logic.fd", :name "IIntervals", :file "clojure/core/logic/fd.clj", :type "var", :column 1, :see-alsos nil, :line 20, :examples nil, :notes nil, :arglists [], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/IIntervals"} {:ns "clojure.core.logic.fd", :name "+c", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 849, :examples nil, :notes nil, :arglists ["u v w"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/+c"} {:ns "clojure.core.logic.pldb", :name "with-dbs", :file "clojure/core/logic/pldb.clj", :type "macro", :column 1, :see-alsos nil, :line 8, :examples nil, :macro true, :notes nil, :arglists ["dbs & body"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/with-dbs"} {:ns "clojure.core.logic.pldb", :name "db", :file "clojure/core/logic/pldb.clj", :type "function", :column 1, :see-alsos nil, :line 125, :examples nil, :notes nil, :arglists ["& facts"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/db"} {:ns "clojure.core.logic.pldb", :name "index-for-query", :file "clojure/core/logic/pldb.clj", :type "function", :column 1, :see-alsos nil, :line 41, :examples nil, :notes nil, :arglists ["s q indexes"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/index-for-query"} {:ns "clojure.core.logic.pldb", :name "indexed?", :file "clojure/core/logic/pldb.clj", :type "function", :column 1, :see-alsos nil, :line 31, :examples nil, :notes nil, :arglists ["v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/indexed_q"} {:ns "clojure.core.logic.pldb", :name "db-facts", :file "clojure/core/logic/pldb.clj", :type "function", :column 1, :see-alsos nil, :line 122, :examples nil, :notes nil, :arglists ["base-db & facts"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/db-facts"} {:ns "clojure.core.logic.pldb", :name "facts-for", :file "clojure/core/logic/pldb.clj", :type "function", :column 1, :see-alsos nil, :line 16, :examples nil, :notes nil, :arglists ["dbs kname"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/facts-for"} {:ns "clojure.core.logic.pldb", :name "contains-lvar?", :file "clojure/core/logic/pldb.clj", :type "function", :column 1, :see-alsos nil, :line 35, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/contains-lvar_q"} {:ns "clojure.core.logic.pldb", :name "empty-db", :file "clojure/core/logic/pldb.clj", :type "var", :column 1, :see-alsos nil, :line 6, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/empty-db"} {:ns "clojure.core.logic.pldb", :name "ground?", :file "clojure/core/logic/pldb.clj", :type "function", :column 1, :see-alsos nil, :line 38, :examples nil, :notes nil, :arglists ["s term"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/ground_q"} {:ns "clojure.core.logic.pldb", :name "rel-key", :file "clojure/core/logic/pldb.clj", :type "function", :column 1, :see-alsos nil, :line 23, :examples nil, :notes nil, :arglists ["rel"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/rel-key"} {:ns "clojure.core.logic.pldb", :name "db-rel", :file "clojure/core/logic/pldb.clj", :type "macro", :column 1, :see-alsos nil, :line 48, :examples [{:updated-at 1616351269886, :created-at 1616351269886, :author {:login "brown131", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2651342?v=4"}, :body ";; To defined an indexed argument for a relation.\n\n(db-rel direction ^:index d p)\n", :_id "60579025e4b0b1e3652d74a7"}], :macro true, :notes nil, :arglists ["name & args"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/db-rel"} {:ns "clojure.core.logic.pldb", :name "rel-indexes", :file "clojure/core/logic/pldb.clj", :type "function", :column 1, :see-alsos nil, :line 28, :examples nil, :notes nil, :arglists ["rel"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/rel-indexes"} {:ns "clojure.core.logic.pldb", :name "facts-using-index", :file "clojure/core/logic/pldb.clj", :type "function", :column 1, :see-alsos nil, :line 19, :examples nil, :notes nil, :arglists ["dbs kname index val"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/facts-using-index"} {:ns "clojure.core.logic.pldb", :name "db-retractions", :file "clojure/core/logic/pldb.clj", :type "function", :column 1, :see-alsos nil, :line 128, :examples nil, :notes nil, :arglists ["base-db & retractions"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/db-retractions"} {:ns "clojure.core.logic.pldb", :name "db-fact", :file "clojure/core/logic/pldb.clj", :type "function", :column 1, :see-alsos nil, :line 79, :examples nil, :notes nil, :arglists ["db rel & args"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/db-fact"} {:ns "clojure.core.logic.pldb", :name "with-db", :file "clojure/core/logic/pldb.clj", :type "macro", :column 1, :see-alsos nil, :line 12, :examples nil, :macro true, :notes nil, :arglists ["db & body"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/with-db"} {:ns "clojure.core.logic.pldb", :name "db-retraction", :file "clojure/core/logic/pldb.clj", :type "function", :column 1, :see-alsos [{:created-at 1515676308690, :author {:login "fhur", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/6452323?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "db-fact", :ns "clojure.core.logic.pldb"}, :_id "5a576294e4b0a08026c48cef"}], :line 100, :examples [{:updated-at 1515676270032, :created-at 1515676270032, :author {:login "fhur", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/6452323?v=4"}, :body "; db-retraction is the reverse operation to db-fact. \n; You can think of db-rel as learning a fact and db-retraction as unlearning it.\n\n; Step 1: define a relation\n(db-rel user x)\n\n; Step 2: create a simple DB\n(def my-db (-> empty-db\n (db-fact user \"me\")\n (db-fact user \"you\")))\n;; => {\"user/user_1\" {:clojure.core.logic.pldb/unindexed #{(\"you\") (\"me\")}}}\n\n;; Step 3: retract from \"me\" being a user.\n(db-retraction my-db user \"me\")\n;; => {\"user/user_1\" {:clojure.core.logic.pldb/unindexed #{(\"you\")}}}", :_id "5a57626ee4b0a08026c48cee"}], :notes nil, :arglists ["db rel & args"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/db-retraction"} {:ns "clojure.core.protocols", :name "IKVReduce", :file "clojure/core/protocols.clj", :type "var", :column 1, :see-alsos nil, :line 175, :examples nil, :notes nil, :arglists [], :doc "Protocol for concrete associative types that can reduce themselves\n via a function of key and val faster than first/next recursion over map\n entries. Called by clojure.core/reduce-kv, and has same\n semantics (just different arg order).", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.protocols/IKVReduce"} {:ns "clojure.core.protocols", :name "Navigable", :file "clojure/core/protocols.clj", :type "var", :column 1, :see-alsos nil, :line 194, :examples nil, :notes nil, :arglists [], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.protocols/Navigable"} {:ns "clojure.core.protocols", :name "nav", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["coll k v"], :doc "return (possibly transformed) v in the context of coll and k (a key/index or nil),\ndefaults to returning v.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.protocols/nav"} {:ns "clojure.core.protocols", :name "Datafiable", :file "clojure/core/protocols.clj", :type "var", :column 1, :see-alsos nil, :line 182, :examples nil, :notes nil, :arglists [], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.protocols/Datafiable"} {:ns "clojure.core.protocols", :name "CollReduce", :file "clojure/core/protocols.clj", :type "var", :column 1, :see-alsos nil, :line 13, :examples nil, :notes nil, :arglists [], :doc "Protocol for collection types that can implement reduce faster than\n first/next recursion. Called by clojure.core/reduce. Baseline\n implementation defined in terms of Iterable.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.protocols/CollReduce"} {:ns "clojure.core.protocols", :name "datafy", :type "function", :see-alsos nil, :examples nil, :notes [{:body "Sean Corfiled gives an overview of the usage of `datafy` and `nav` in the blog post [Clojure 1.10's datafy and nav](https://corfield.org/blog/2018/12/03/datafy-nav/) (3 december 2018).", :created-at 1641131137516, :updated-at 1641131295668, :author {:avatar-url "https://avatars.githubusercontent.com/u/353113?v=4", :account-source "github", :login "claj"}, :_id "61d1ac81e4b0b1e3652d7594"} {:author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=4"}, :updated-at 1641131282256, :created-at 1641131282256, :body "Stuart Halloway gives an example of `datafy` usage in the [Cognitect REBL](https://docs.datomic.com/cloud/other-tools/REBL.html).", :_id "61d1ad12e4b0b1e3652d7595"} {:author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=4"}, :updated-at 1641132127831, :created-at 1641132127831, :body "A full example of a datafy application is [jedi-time](https://github.com/jimpil/jedi-time), which adds datafy- and navigation on the `java.time` objects.", :_id "61d1b05fe4b0b1e3652d7596"}], :arglists ["o"], :doc "return a representation of o as data (default identity)", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.protocols/datafy"} {:ns "clojure.core.protocols", :name "coll-reduce", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["coll f" "coll f val"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.protocols/coll-reduce"} {:ns "clojure.core.protocols", :name "internal-reduce", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["seq f start"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.protocols/internal-reduce"} {:ns "clojure.core.protocols", :name "InternalReduce", :file "clojure/core/protocols.clj", :type "var", :column 1, :see-alsos nil, :line 19, :examples nil, :notes [{:updated-at 1386465477000, :body "http://muhammadkhojaye.blogspot.com", :created-at 1386465477000, :author {:login "peternortan", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c7d95a3a7a7090ffdc29428a2c424b17?r=PG&default=identicon"}, :_id "542692edf6e94c6970522014"}], :arglists [], :doc "Protocol for concrete seq types that can reduce themselves\n faster than first/next recursion. Called by clojure.core/reduce.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.protocols/InternalReduce"} {:ns "clojure.core.protocols", :name "kv-reduce", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["amap f init"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.protocols/kv-reduce"} {:ns "clojure.core.reducers", :name "reduce", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos nil, :line 38, :examples nil, :notes nil, :arglists ["f coll" "f init coll"], :doc "Like core/reduce except:\n When init is not provided, (f) is used.\n Maps are reduced with reduce-kv", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/reduce"} {:added "1.5", :ns "clojure.core.reducers", :name "take", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos nil, :line 201, :examples nil, :notes nil, :arglists ["n" "n coll"], :doc "Ends the reduction of coll after consuming n values.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/take"} {:added "1.5", :ns "clojure.core.reducers", :name "map", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos [{:created-at 1493965139204, :author {:login "chbrown", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/360279?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "mapcat", :ns "clojure.core.reducers"}, :_id "590c1953e4b01f4add58feae"}], :line 128, :examples nil, :notes nil, :arglists ["f" "f coll"], :doc "Applies f to every value in the reduction of coll. Foldable.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/map"} {:added "1.5", :ns "clojure.core.reducers", :name "foldcat", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos [{:created-at 1493963884640, :author {:login "chbrown", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/360279?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "fold", :ns "clojure.core.reducers"}, :_id "590c146ce4b01f4add58feac"}], :line 281, :examples [{:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; Worth remembering that parallel fold in Clojure is enabled for: \n;; vectors, maps and clojure.core.reducers.Cat objects.\n;; r/foldcat returns a \"Cat\", so it can be parallel folded again:\n\n(r/fold + \n (r/foldcat \n (r/filter even? \n (r/foldcat \n (r/map inc (into [] (range 100000)))))))\n;; 2500050000", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1510328583520, :updated-at 1510328990875, :_id "5a05c907e4b0a08026c48cac"} {:updated-at 1522594338253, :created-at 1522594338253, :author {:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}, :body ";; One non-obvious thing about clojure.core.reducers/foldcat is its return type,\n;; which is either clojure.core.reducers.Cat or java.util.ArrayList (!)\n;; depending on the size of the source collection.\n\n(require '[clojure.core.reducers :as r])\n\n(def small-vector (vec (range 10)))\n(def big-vector (vec (range 100000)))\n\n(type (r/foldcat (r/filter odd? small-vector))) ;;=> java.util.ArrayList\n(type (r/foldcat (r/filter odd? big-vector))) ;;=> clojure.core.reducers.Cat\n\n;; Both return types are suited for further reduce-like processing, but they are\n;; not general-purpose data types like proper Clojure collections.\n", :_id "5ac0f222e4b045c27b7fac2d"}], :notes nil, :arglists ["coll"], :doc "Equivalent to (fold cat append! coll)", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/foldcat"} {:added "1.5", :ns "clojure.core.reducers", :name "reducer", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos nil, :line 67, :examples nil, :notes [{:body ";;Beware of this bug\n\n;;These two suppose to be the same:\n\n(transduce (comp (take 10) (partition-all 3)) conj (range))\n;; => [[0 1 2] [3 4 5] [6 7 8] [9]]\n\n\n(reduce conj (r/reducer (range) (comp (take 10) (partition-all 3))))\n;; => [[0 1 2] [3 4 5] [6 7 8]]\n\n;;See https://dev.clojure.org/jira/browse/CLJ-2338\n", :created-at 1521749493579, :updated-at 1522047651605, :author {:avatar-url "https://avatars0.githubusercontent.com/u/132936?v=4", :account-source "github", :login "gzmask"}, :_id "5ab40df5e4b045c27b7fac1e"} {:author {:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}, :updated-at 1522096119969, :created-at 1522096119969, :body "As far as I can see, `clojure.core.reducers/reducer` (since 1.5) is made obsolete by `eduction` (since 1.7), which can do the same and more.", :_id "5ab957f7e4b045c27b7fac26"}], :arglists ["coll xf"], :doc "Given a reducible collection, and a transformation function xf,\n returns a reducible collection, where any supplied reducing\n fn will be transformed by xf. xf is a function of reducing fn to\n reducing fn.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/reducer"} {:added "1.5", :ns "clojure.core.reducers", :name "mapcat", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos [{:created-at 1493965130702, :author {:login "chbrown", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/360279?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "map", :ns "clojure.core.reducers"}, :_id "590c194ae4b01f4add58fead"}], :line 138, :examples nil, :notes nil, :arglists ["f" "f coll"], :doc "Applies f to every value in the reduction of coll, concatenating the result\n colls of (f val). Foldable.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/mapcat"} {:added "1.5", :ns "clojure.core.reducers", :name "cat", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos [{:created-at 1462880260219, :author {:login "achesnais", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6626105?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "cat", :ns "clojure.core"}, :_id "5731c804e4b0b27c121b2154"} {:created-at 1510328149020, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "foldcat", :ns "clojure.core.reducers"}, :_id "5a05c755e4b0a08026c48cab"} {:created-at 1685378209827, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "concat", :ns "clojure.core"}, :_id "6474d4a1e4b08cf8563f4bc2"}], :line 255, :examples [{:updated-at 1510257522103, :created-at 1510096162999, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; The example showcase use of r/cat to build HashSets (instead \n;; of the default ArrayList) of distinct words in parallel \n;; and then merge all together walking the binary tree produced by r/fold.\n(require '[clojure.core.reducers :as r])\n(require '[clojure.string :refer [lower-case blank? split split-lines]])\n(import 'java.util.HashSet)\n\n(def book\n (-> \"http://www.gutenberg.org/files/2600/2600-0.txt\"\n slurp\n split-lines))\n\n(def r-word (comp\n (r/map lower-case)\n (r/remove blank?)\n (r/map #(re-find #\"\\w+\" %))\n (r/mapcat #(split % #\"\\s+\"))))\n\n(def btree\n (r/fold\n (r/cat #(HashSet.))\n r/append!\n (r-word book)))\n\n(defn merge-tree [root res]\n (cond\n (instance? clojure.core.reducers.Cat root)\n (do (merge-tree (.left root) res) (merge-tree (.right root) res))\n (instance? HashSet root)\n (doto res (.addAll root))\n :else res))\n\n(def distinct-words (merge-tree btree (HashSet.)))\n(count distinct-words)\n;; 17200", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5a023d22e4b0a08026c48c99"}], :notes nil, :arglists ["" "ctor" "left right"], :doc "A high-performance combining fn that yields the catenation of the\n reduced values. The result is reducible, foldable, seqable and\n counted, providing the identity collections are reducible, seqable\n and counted. The single argument version will build a combining fn\n with the supplied identity constructor. Tests for identity\n with (zero? (count x)). See also foldcat.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/cat"} {:added "1.5", :ns "clojure.core.reducers", :name "take-while", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos nil, :line 189, :examples nil, :notes nil, :arglists ["pred" "pred coll"], :doc "Ends the reduction of coll when (pred val) returns logical false.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/take-while"} {:added "1.5", :ns "clojure.core.reducers", :name "remove", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos nil, :line 167, :examples nil, :notes nil, :arglists ["pred" "pred coll"], :doc "Removes values in the reduction of coll for which (pred val)\n returns logical true. Foldable.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/remove"} {:ns "clojure.core.reducers", :name "pool", :file "clojure/core/reducers.clj", :type "var", :column 1, :see-alsos nil, :line 22, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/pool"} {:ns "clojure.core.reducers", :name "CollFold", :file "clojure/core/reducers.clj", :type "var", :column 1, :see-alsos nil, :line 48, :examples nil, :notes nil, :arglists [], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/CollFold"} {:added "1.5", :ns "clojure.core.reducers", :name "folder", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos nil, :line 81, :examples [{:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body "(require '[clojure.core.reducers :as r])\n(r/fold\n (r/monoid merge (constantly {}))\n (fn [m k v] (assoc m k (+ 3 v)))\n (r/folder\n (zipmap (range 100) (range 100))\n (fn [rf] (fn [m k v] (if (zero? (mod k 10)) (rf m k v) m)))))\n;; {0 3, 70 73, 20 23, 60 63, 50 53, 40 43, 90 93, 30 33, 10 13, 80 83}", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1505064428954, :updated-at 1505064553043, :_id "59b575ece4b09f63b945ac6e"}], :notes nil, :arglists ["coll xf"], :doc "Given a foldable collection, and a transformation function xf,\n returns a foldable collection, where any supplied reducing\n fn will be transformed by xf. xf is a function of reducing fn to\n reducing fn.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/folder"} {:added "1.5", :ns "clojure.core.reducers", :name "append!", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos nil, :line 275, :examples nil, :notes nil, :arglists ["acc x"], :doc ".adds x to acc and returns acc", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/append!"} {:ns "clojure.core.reducers", :name "->Cat", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos nil, :line 230, :examples nil, :notes nil, :arglists ["cnt left right"], :doc "Positional factory function for class clojure.core.reducers.Cat.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/->Cat"} {:added "1.5", :ns "clojure.core.reducers", :name "drop", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos nil, :line 215, :examples [{:updated-at 1621653290675, :created-at 1621653290675, :author {:login "andreasguther", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/9425214?v=4"}, :body "Clojure 1.10.3\nuser=> (def coll (range 10))\n#'user/coll\nuser=> coll\n(0 1 2 3 4 5 6 7 8 9)\nuser=> (drop 4 coll)\n(4 5 6 7 8 9)", :_id "60a8772ae4b0b1e3652d7503"}], :notes nil, :arglists ["n" "n coll"], :doc "Elides the first n values from the reduction of coll.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/drop"} {:added "1.5", :ns "clojure.core.reducers", :name "fold", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos [{:created-at 1505066414445, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pmap", :ns "clojure.core"}, :_id "59b57daee4b09f63b945ac70"} {:created-at 1514410031569, :author {:login "jcburley", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/430319?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reduce", :ns "clojure.core"}, :_id "5a44102fe4b0a08026c48ce0"}], :line 51, :examples [{:editors [{:login "xfcjscn", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/4743082?v=4"}], :body "(require '[clojure.core.reducers :as reducers])\n(defn diddly ([xs x] (conj xs x)) ([] []))\n(reducers/fold diddly '(1 2 3 4 5 6)) \n;; [1 2 3 4 5 6] \n\n\n;; CAUTION! This example is buggy, as diddly can NOT be used as combinef\n;; Correct combinef can be `into` as combinef is operating on 2 vectors", :author {:avatar-url "https://avatars.githubusercontent.com/u/5030667?v=3", :account-source "github", :login "davidsiefert"}, :created-at 1463744297516, :updated-at 1524749191933, :_id "573ef729e4b00a9b70be566a"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; word-frequencies on large text\n(require '[clojure.core.reducers :as r] '[clojure.string :as s])\n\n(defn count-occurrences [words]\n (r/fold\n (r/monoid #(merge-with + %1 %2) (constantly {}))\n (fn [m [k cnt]] (assoc m k (+ cnt (get m k 0))))\n (r/map #(vector % 1) words)))\n\n(defn word-count [s]\n (count-occurrences (s/split s #\"\\s+\")))\n\n(def war-and-peace \"http://www.gutenberg.org/files/2600/2600-0.txt\")\n(def book (slurp war-and-peace))\n\n(def freqs (word-count book))\n(freqs \"Andrew\")\n;; 700", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1518468936868, :updated-at 1518469083350, :_id "5a81ff48e4b0316c0f44f8b9"} {:updated-at 1522439008885, :created-at 1522439008885, :author {:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}, :body ";; One pitfall of clojure.core.reducers/fold is that the reducing function must\n;; take either three or two arguments according to whether the foldable\n;; collection is a map or not!\n\n(require '[clojure.core.reducers :as r])\n\n(def my-vector (vec (range 10000)))\n(def my-map (into {} (map (juxt (comp keyword str) identity)) my-vector))\n\n;; Identity folds for vector and map. Notice the differing arities of reducef.\n\n(->> my-vector\n (r/fold (r/monoid into vector)\n (fn [ret v] (conj ret v))) ; <- arity 2\n (= my-vector))\n\n(->> my-map\n (r/fold (r/monoid merge hash-map)\n (fn [ret k v] (assoc ret k v))) ; <- arity 3\n (= my-map))\n\n;; Caution: this behaviour is not documented. It breaks down as soon as you wrap\n;; the map in a reducer/folder.\n", :_id "5abe9360e4b045c27b7fac2b"} {:editors [{:login "enforser", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/5402402?v=4"}], :body ";; This example demonstrates how the partition size used to parallelize\n;; fold can be modified. \n(require '[clojure.core.reducers :as r])\n\n(defn simple-fold \n [partition-size]\n (r/fold partition-size\n + ;; function that returns the init value. (x) => 0\n +\n (r/filter odd?\n (r/map inc\n (r/filter number?\n (range 10000))))))\n\n;; Default partition size.\n(simple-fold 512) \n;;=> 25000000\n\n;; Raises the number of elements from coll that will be processed in each partition.\n(simple-fold 1000) \n;; => 25000000\n\n;; Partition each element to be processed separately.\n(simple-fold 1) \n;; =>> 25000000\n\n;; All of the above return the same result, but they utilize different\n;; sized partitions to achieve parallelization.", :author {:avatar-url "https://avatars1.githubusercontent.com/u/5402402?v=4", :account-source "github", :login "enforser"}, :created-at 1537920358727, :updated-at 1537920400365, :_id "5baacd66e4b00ac801ed9ea8"}], :notes nil, :arglists ["reducef coll" "combinef reducef coll" "n combinef reducef coll"], :doc "Reduces a collection using a (potentially parallel) reduce-combine\n strategy. The collection is partitioned into groups of approximately\n n (default 512), each of which is reduced with reducef (with a seed\n value obtained by calling (combinef) with no arguments). The results\n of these reductions are then reduced with combinef (default\n reducef). combinef must be associative, and, when called with no\n arguments, (combinef) must produce its identity element. These\n operations may be performed in parallel, but the results will\n preserve order.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/fold"} {:added "1.5", :ns "clojure.core.reducers", :name "flatten", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos nil, :line 174, :examples [{:updated-at 1477678517441, :created-at 1477678517441, :author {:login "lifehug", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/689626?v=3"}, :body "user=> (require '[clojure.core.reducers :as r])\n\nuser=> (into [] (r/flatten [1 [2 3 4 5 6 7] 8]))\n[1 2 3 4 5 6 7 8]\n\nuser=> (into [] (r/flatten [0 2 [[2 3] 8 [[100]] nil [[nil]]] -2]))\n[0 2 2 3 8 100 nil nil -2]\n\nuser=> (into [] (r/flatten nil))\n[]\n", :_id "581395b5e4b024b73ca35a1f"}], :notes nil, :arglists ["" "coll"], :doc "Takes any nested combination of sequential things (lists, vectors,\n etc.) and returns their contents as a single, flat foldable\n collection.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/flatten"} {:added "1.5", :ns "clojure.core.reducers", :name "filter", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos nil, :line 154, :examples [{:updated-at 1667792431871, :created-at 1667792431871, :author {:login "iatenine", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4423088?v=4"}, :body ";; lambda provided as predicate: (fn [n] (< n 4))\n;; collection to filter: [1, 2, 3, 4, 5]\n\n(filter (fn [n] (< n 4)) [1, 2, 3, 4, 5]) ;; => (1 2 3)", :_id "63687e2fe4b0b1e3652d7681"}], :notes nil, :arglists ["pred" "pred coll"], :doc "Retains values in the reduction of coll for which (pred val)\n returns logical true. Foldable.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/filter"} {:ns "clojure.core.reducers", :name "fjtask", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos nil, :line 24, :examples nil, :notes nil, :arglists ["f"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/fjtask"} {:added "1.5", :ns "clojure.core.reducers", :name "monoid", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos nil, :line 287, :examples [{:editors [{:login "danielcompton", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/811954?v=3"}], :body "(require '[clojure.core.reducers :as reducers])\n\n(reducers/fold\n (reducers/monoid + (constantly 0))\n (range 10000))\n;; => 49995000\n\n(reducers/fold\n (reducers/monoid max (constantly Long/MIN_VALUE))\n [1 2 7 10 3 -5])\n;; => 10", :author {:avatar-url "https://avatars1.githubusercontent.com/u/811954?v=3", :account-source "github", :login "danielcompton"}, :created-at 1496113685577, :updated-at 1496113867385, :_id "592ce215e4b0bebe93300ecb"}], :notes nil, :arglists ["op ctor"], :doc "Builds a combining fn out of the supplied operator and identity\n constructor. op must be associative and ctor called with no args\n must return an identity value for it.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/monoid"} {:ns "clojure.core.reducers", :name "coll-fold", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["coll n combinef reducef"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/coll-fold"} {:ns "clojure.core.server", :name "stop-server", :file "clojure/core/server.clj", :type "function", :column 1, :see-alsos nil, :line 125, :examples nil, :notes nil, :arglists ["" "name"], :doc "Stop server with name or use the server-name from *session* if none supplied.\n Returns true if server stopped successfully, nil if not found, or throws if\n there is an error closing the socket.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.server/stop-server"} {:ns "clojure.core.server", :name "repl-init", :file "clojure/core/server.clj", :type "function", :column 1, :see-alsos nil, :line 163, :examples nil, :notes nil, :arglists [""], :doc "Initialize repl in user namespace and make standard repl requires.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.server/repl-init"} {:ns "clojure.core.server", :name "start-server", :file "clojure/core/server.clj", :type "function", :column 1, :see-alsos nil, :line 84, :examples nil, :notes nil, :arglists ["opts"], :doc "Start a socket server given the specified opts:\n :address Host or address, string, defaults to loopback address\n :port Port, integer, required\n :name Name, required\n :accept Namespaced symbol of the accept function to invoke, required\n :args Vector of args to pass to accept function\n :bind-err Bind *err* to socket out stream?, defaults to true\n :server-daemon Is server thread a daemon?, defaults to true\n :client-daemon Are client threads daemons?, defaults to true\n Returns server socket.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.server/start-server"} {:ns "clojure.core.server", :name "start-servers", :file "clojure/core/server.clj", :type "function", :column 1, :see-alsos nil, :line 157, :examples nil, :notes nil, :arglists ["system-props"], :doc "Start all servers specified in the system properties.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.server/start-servers"} {:ns "clojure.core.server", :name "stop-servers", :file "clojure/core/server.clj", :type "function", :column 1, :see-alsos nil, :line 139, :examples nil, :notes nil, :arglists [""], :doc "Stop all servers ignores all errors, and returns nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.server/stop-servers"} {:ns "clojure.core.server", :name "repl-read", :file "clojure/core/server.clj", :type "function", :column 1, :see-alsos nil, :line 169, :examples nil, :notes nil, :arglists ["request-prompt request-exit"], :doc "Enhanced :read hook for repl supporting :repl/quit.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.server/repl-read"} {:ns "clojure.core.server", :name "*session*", :file "clojure/core/server.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 23, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.server/*session*"} {:added "1.10", :ns "clojure.core.server", :name "io-prepl", :file "clojure/core/server.clj", :type "function", :column 1, :see-alsos nil, :line 272, :examples nil, :notes nil, :arglists ["& {:keys [valf], :or {valf pr-str}}"], :doc "prepl bound to *in* and *out*, suitable for use with e.g. server/repl (socket-repl).\n :ret and :tap vals will be processed by valf, a fn of one argument\n or a symbol naming same (default pr-str)\n\n Alpha, subject to change.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.server/io-prepl"} {:added "1.10", :ns "clojure.core.server", :name "prepl", :file "clojure/core/server.clj", :type "function", :column 1, :see-alsos nil, :line 191, :examples nil, :notes nil, :arglists ["in-reader out-fn & {:keys [stdin]}"], :doc "a REPL with structured output (for programs)\n reads forms to eval from in-reader (a LineNumberingPushbackReader)\n Closing the input or passing the form :repl/quit will cause it to return\n\n Calls out-fn with data, one of:\n {:tag :ret\n :val val ;;eval result\n :ns ns-name-string\n :ms long ;;eval time in milliseconds\n :form string ;;iff successfully read\n :clojure.error/phase (:execution et al per clojure.main/ex-triage) ;;iff error occurred\n }\n {:tag :out\n :val string} ;chars from during-eval *out*\n {:tag :err\n :val string} ;chars from during-eval *err*\n {:tag :tap\n :val val} ;values from tap>\n\n You might get more than one :out or :err per eval, but exactly one :ret\n tap output can happen at any time (i.e. between evals)\n If during eval an attempt is made to read *in* it will read from in-reader unless :stdin is supplied\n\n Alpha, subject to change.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.server/prepl"} {:ns "clojure.core.server", :name "repl", :file "clojure/core/server.clj", :type "function", :column 1, :see-alsos nil, :line 180, :examples nil, :notes nil, :arglists [""], :doc "REPL with predefined hooks for attachable socket server.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.server/repl"} {:added "1.10", :ns "clojure.core.server", :name "remote-prepl", :file "clojure/core/server.clj", :type "function", :column 1, :see-alsos nil, :line 295, :examples nil, :notes nil, :arglists ["host port in-reader out-fn & {:keys [valf readf], :or {valf read-string, readf (fn* [p1__8961# p2__8962#] (read p1__8961# false p2__8962#))}}"], :doc "Implements a prepl on in-reader and out-fn by forwarding to a\n remote [io-]prepl over a socket. Messages will be read by readf, a\n fn of a LineNumberingPushbackReader and EOF value or a symbol naming\n same (default #(read %1 false %2)),\n :ret and :tap vals will be processed by valf, a fn of one argument\n or a symbol naming same (default read-string). If that function\n throws, :val will be unprocessed.\n\n Alpha, subject to change.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.server/remote-prepl"} {:added "1.3", :ns "clojure.data", :name "diff", :file "clojure/data.clj", :type "function", :column 1, :see-alsos nil, :line 120, :examples [{:author {:login "joshrotenberg", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/aa968cafce96d1810cb1014c7545d4a5?r=PG&default=identicon"}, :editors [], :body "(use 'clojure.data)\n(def uno {:same \"same\", :different \"one\"})\n(def dos {:same \"same\", :different \"two\", :onlyhere \"whatever\"})\n(diff uno dos)\n=> ({:different \"one\"} {:onlyhere \"whatever\", :different \"two\"} {:same \"same\"})\n;; {different in uno} { different or unique in dos } {same in both}\n(diff {:a 1} {:a 1 :b 2})\n=> (nil {:b 2} {:a 1})\n;; the first contains nothing unique, but only the second contains :b\n;; and both contain :a", :created-at 1321070124000, :updated-at 1321070124000, :_id "542692d6c026201cdc3270d7"} {:body "(diff [1 2 3] [5 9 3 2 3 7]) ;;=> [[1 2] [5 9 nil 2 3 7] [nil nil 3]]\n(diff (set [1 2 3]) (set [5 9 3 2 3 7])) ;;=> [#{1} #{7 9 5} #{3 2}]", :author {:login "vede1", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8151095?v=2"}, :created-at 1414076160639, :updated-at 1414076160639, :_id "54491700e4b03d20a1024276"} {:updated-at 1455883330938, :created-at 1455883167587, :author {:login "zootalures", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4050521?v=3"}, :body ";; To invert a diff you can re-apply diff to its output and then merge this back with the prior state \n;; This works in almost all cases (with the exception of preserving empty maps) \n\n(defn- seqzip\n \"returns a sequence of [[ value-left] [value-right]....] padding with nulls for shorter sequences \"\n [left right]\n (loop [list [] a left b right]\n (if (or (seq a) (seq b))\n (recur (conj list [(first a) (first b)] ) (rest a) (rest b))\n list)))\n\n(defn- recursive-diff-merge\n \" Merge two structures recusively , taking non-nil values from sequences and maps and merging sets\" \n [part-state original-state]\n (cond\n (sequential? part-state) (map (fn [[l r]] (recursive-diff-merge l r)) (seqzip part-state original-state))\n (map? part-state) (merge-with recursive-diff-merge part-state original-state)\n (set? part-state) (set/union part-state original-state)\n (nil? part-state ) original-state\n :default part-state))\n\n(defn undiff\n \"returns the state of x after reversing the changes described by a diff against\n an earlier state (where before and after are the first two elements of the diff)\"\n [x before after]\n (let [[a _ _] (clojure.data/diff x after)]\n (recursive-diff-merge a before)))\n\n;; examples: \n\n;; Simple data types\n(clojure.data/diff :before :after )\n=> [:before :after nil]\n\n(undiff :after :before :after)\n=> :before\n\n;; Lists \n(clojure.data/diff [1 2 3 4] [1 2 3 5] )\n=> [[nil nil nil 4] [nil nil nil 5] [1 2 3]]\n(undiff [1 2 3 5] [nil nil nil 4] [nil nil nil 5] )\n=> (1 2 3 4)\n\n;; Nested complex data structures; \n(clojure.data/diff {:a 1 :b [1 2 3] :c {:d 4}}\n {:a 2 :b [1 2 3 4] :c {:d 3 :e 10}})\n=> ({:c {:d 4}, :a 1} {:c {:d 3, :e 10}, :b [nil nil nil 4], :a 2} {:b [1 2 3]})\n\n(undiff {:a 2 :b [1 2 3 4] :c {:d 3 :e 10}} ; State after diff \n {:c {:d 4}, :a 1} ; first element of diff against previous state\n {:c {:d 3, :e 10}, :b [nil nil nil 4], :a 2}) ; second element of diff \n ; against previous state \n=> {:b [1 2 3], :c {:d 4}, :a 1}\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/4050521?v=3", :account-source "github", :login "zootalures"}], :_id "56c7039fe4b0b41f39d96cce"} {:updated-at 1589309791553, :created-at 1589309791553, :author {:login "Biserkov", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/49756?v=4"}, :body ";; Beware that empty maps get turned into nil\n(clojure.data/diff {:a {:b 1} :c 2} {:a {} :c 2})\n=> ({:a {:b 1}} {:a nil} {:c 2})", :_id "5ebaf15fe4b087629b5a190b"} {:editors [{:login "marcoslimagon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8239564?v=4"}], :body ";; The diff also applies for nested structures\n\n;; Example creating a function that evaluates if a given value is subset of a map\n(defn map-subset? [map subset]\n (let [[_ subset_diff _] (clojure.data/diff map subset)]\n (nil? subset_diff)))\n\n(def a {\"KEY\" {\n :kv1 {:nested \"X\"}\n :kv2 \"Y\"\n }} )\n(def b {\"KEY\" {\n :kv1 {:nested \"X\"}\n }})\n(map-subset? a b)\n\n=> true", :author {:avatar-url "https://avatars.githubusercontent.com/u/8239564?v=4", :account-source "github", :login "marcoslimagon"}, :created-at 1674505567719, :updated-at 1674505657687, :_id "63ceed5fe4b08cf8563f4b6a"}], :notes [{:author {:login "Bost", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1174677?v=4"}, :updated-at 1585396974568, :created-at 1585396974568, :body "See also https://github.com/lambdaisland/deep-diff2 \"Deep diff Clojure data structures and pretty print the result\"", :_id "5e7f3ceee4b087629b5a18c7"} {:author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :updated-at 1594482387999, :created-at 1594482387999, :body "See https://github.com/juji-io/editscript \"Editscript is a library designed to extract the differences between two Clojure/Clojurescript data structures as an 'editscript', which represents the minimal modification necessary to transform one to another\"", :_id "5f09ded3e4b0b1e3652d731e"}], :arglists ["a b"], :doc "Recursively compares a and b, returning a tuple of\n [things-only-in-a things-only-in-b things-in-both].\n Comparison rules:\n\n * For equal a and b, return [nil nil a].\n * Maps are subdiffed where keys match and values differ.\n * Sets are never subdiffed.\n * All sequential things are treated as associative collections\n by their indexes, with results returned as vectors.\n * Everything else (including strings!) is treated as\n an atom and compared for equality.", :library-url "https://github.com/clojure/clojure", :href "/clojure.data/diff"} {:added "1.3", :ns "clojure.data", :name "equality-partition", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["x"], :doc "Implementation detail. Subject to change.", :library-url "https://github.com/clojure/clojure", :href "/clojure.data/equality-partition"} {:added "1.3", :ns "clojure.data", :name "EqualityPartition", :file "clojure/data.clj", :type "var", :column 1, :see-alsos nil, :line 67, :examples nil, :notes nil, :arglists [], :doc "Implementation detail. Subject to change.", :library-url "https://github.com/clojure/clojure", :href "/clojure.data/EqualityPartition"} {:added "1.3", :ns "clojure.data", :name "diff-similar", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["a b"], :doc "Implementation detail. Subject to change.", :library-url "https://github.com/clojure/clojure", :href "/clojure.data/diff-similar"} {:added "1.3", :ns "clojure.data", :name "Diff", :file "clojure/data.clj", :type "var", :column 1, :see-alsos nil, :line 71, :examples nil, :notes nil, :arglists [], :doc "Implementation detail. Subject to change.", :library-url "https://github.com/clojure/clojure", :href "/clojure.data/Diff"} {:ns "clojure.datafy", :name "nav", :file "clojure/datafy.clj", :type "function", :column 1, :see-alsos nil, :line 30, :examples nil, :notes nil, :arglists ["coll k v"], :doc "Returns (possibly transformed) v in the context of coll and k (a\n key/index or nil). Callers should attempt to provide the key/index\n context k for Indexed/Associative/ILookup colls if possible, but not\n to fabricate one e.g. for sequences (pass nil). nav returns the\n value of clojure.core.protocols/nav.", :library-url "https://github.com/clojure/clojure", :href "/clojure.datafy/nav"} {:ns "clojure.datafy", :name "datafy", :file "clojure/datafy.clj", :type "function", :column 1, :see-alsos nil, :line 15, :examples [{:updated-at 1641146617559, :created-at 1641146617559, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=4"}, :body ";; default impl is the identity\n(datafy {:message \"Hello\"})\n=>\n{:message \"Hello\"}\n\n;; exceptions default datafy impl is `Throwable->map`\n(datafy (ex-info \"An Exception\" {:msg \"something went wrong\"}))\n{:cause \"An Exception\",\n :data {:msg \"something went wrong\"}\n :via\n [{:type clojure.lang.ExceptionInfo,\n :message \"An Exception\",\n :data {:msg \"something went wrong\"},\n :at [user$eval16337 invokeStatic \"form-init3462716552974711523.clj\" 120]}],\n :trace\n [[user$eval16337 invokeStatic \"form-init3462716552974711523.clj\" 120]\n [user$eval16337 invoke \"form-init3462716552974711523.clj\" 120]\n [clojure.lang.Compiler eval \"Compiler.java\" 7181]\n ,,,\n [clojure.lang.AFn run \"AFn.java\" 22]\n [java.lang.Thread run \"Thread.java\" 833]]}", :_id "61d1e8f9e4b0b1e3652d7597"} {:editors [{:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=4"}], :body ";; add a (bogus) Datafy implementation for java.util.Date\n\n(require '[clojure.core.protocols :as p])\n(require '[clojure.datafy :as d])\n\n(extend-protocol p/Datafiable\n java.util.Date\n (datafy [d]\n {:type 'Date\n :timestamp (.getTime d)}))\n\n(d/datafy (java.util.Date.))\n;;=> {:type Date, :timestamp 1641145865991}\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/353113?v=4", :account-source "github", :login "claj"}, :created-at 1641147412716, :updated-at 1641219235911, :_id "61d1ec14e4b0b1e3652d7598"} {:updated-at 1671991609458, :created-at 1641147941988, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=4"}, :body ";; adding a data representation to a java.io.File\n\n(require '[clojure.core.protocols :as p])\n(require '[clojure.datafy :as d])\n\n(extend-protocol p/Datafiable\n java.io.File\n (datafy [f]\n ;; keep the file-object as the metadata\n\n ;; This actually doesn't work\n ;; with-meta throws following exception\n ;; class java.io.File cannot be cast to class clojure.lang.IPersistentMap\n ;; see with-meta docs -> https://clojuredocs.org/clojure.datafy/datafy\n (with-meta \n {:exists (.exists f)\n :length (.length f)\n :last-modified (.lastModified f)\n :path (.toString f)}\n f)))\n\n(d/datafy (java.io.File. \"/home/alfred/todo.txt\"))\n;;=> {:exists true,\n;; :length 28850,\n;; :last-modified 1641082627553,\n;; :path \"/home/alfred/todo.txt\"}", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/353113?v=4", :account-source "github", :login "claj"} {:login "siddharthjain-in", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6537820?v=4"} {:avatar-url "https://avatars.githubusercontent.com/u/1427311?v=4", :account-source "github", :login "SergeyKozachenko"} {:login "rgkirch", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6143833?v=4"}], :_id "61d1ee25e4b0b1e3652d7599"}], :notes nil, :arglists ["x"], :doc "Attempts to return x as data.\n datafy will return the value of clojure.core.protocols/datafy. If\n the value has been transformed and the result supports\n metadata, :clojure.datafy/obj will be set on the metadata to the\n original value of x, and :clojure.datafy/class to the name of the\n class of x, as a symbol.", :library-url "https://github.com/clojure/clojure", :href "/clojure.datafy/datafy"} {:added "1.5", :ns "clojure.edn", :name "read", :file "clojure/edn.clj", :type "function", :column 1, :see-alsos [{:created-at 1582146666132, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "read-string", :ns "clojure.edn"}, :_id "5e4da46ae4b0ca44402ef83f"}], :line 14, :examples [{:editors [{:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}], :body ";; See one of the examples for clojure.core/pr for some uncommon Clojure values\n;; that cannot be printed then read back to get the original values (or in\n;; some cases, cannot be read back at all).\n\n;; If you wish to transmit data that may contain such values, one suggestion\n;; is to use the transit library: https://github.com/cognitect/transit-format", :author {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}, :created-at 1470508582724, :updated-at 1470754331719, :_id "57a62e26e4b0bafd3e2a04cb"} {:editors [{:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}], :body ";; Note that it is not possible to pass the result of (clojure.java.io/reader) \n;; directly to (clojure.edn/read):\n(require '[clojure.java.io :as io] '[clojure.edn :as edn])\n=> nil\n(edn/read (io/reader (.getBytes \":edn\")))\nClassCastException java.io.BufferedReader cannot be cast to java.io.PushbackReader\n\n;; Instead, you need to construct a java.io.PushbackReader instance\n;; and pass that to (edn/read):\n(edn/read (java.io.PushbackReader. (io/reader (.getBytes \":edn\"))))\n=> :edn\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/94482?v=3", :account-source "github", :login "timgilbert"}, :created-at 1470759663495, :updated-at 1470842100437, :_id "57aa02efe4b0bafd3e2a04d1"} {:editors [{:login "elias94", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8095533?v=4"}], :body ";; If you need to distinguish between I/O errors (permission denied, etc)\n;; and syntax errors in the EDN itself (eg, unbalanced parentheses), you'll\n;; want to catch different exceptions from (edn/read):\n\n(defn load-edn\n \"Load edn from an io/reader source (filename or io/resource).\"\n [source]\n (try\n (with-open [r (io/reader source)]\n (edn/read (java.io.PushbackReader. r)))\n\n (catch java.io.IOException e\n (printf \"Couldn't open '%s': %s\\n\" source (.getMessage e)))\n (catch RuntimeException e\n (printf \"Error parsing edn file '%s': %s\\n\" source (.getMessage e)))))", :author {:avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4", :account-source "github", :login "timgilbert"}, :created-at 1516827524686, :updated-at 1629516163850, :_id "5a68f384e4b09621d9f53a79"} {:updated-at 1619537620688, :created-at 1619111247295, :author {:login "seltzer1717", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1911117?v=4"}, :body ";; At some point you'll want to serialize and deserialize java.time.LocalDate.\n;; Here's how:\n\n(defn localdate-rdr\n \"Takes serialized Java object, tests for LocalDate, and returns LocalDate object.\"\n [[clazz _ object-string :as input]] ;; [java.time.LocalDate 861096493 \"2021-04-22\"]\n (if (= 'java.time.LocalDate clazz)\n ;; LocalDate string will be of form yyyy-mm-dd\n ;; which also matches the parse function.\n (java.time.LocalDate/parse object-string)\n ;; just returns input if serialized object is not LocalDate\n input))\n\n(defn test-localdate-rdr\n []\n (let [today (java.time.LocalDate/now)\n ;; seralized -> \"#object[java.time.LocalDate 0x4479783b \\\"2021-04-22\\\"]\"\n serialized (pr-str today)\n deserialized (clojure.edn/read {:readers {'object localdate-rdr}}\n (java.io.PushbackReader.\n (java.io.StringReader. serialized)))]\n (.toString (.plusDays deserialized 1))))\n\nuser=> (test-localdate-rdr) \n\"2021-04-23\" ;; Today was 2021-04-22\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/1911117?v=4", :account-source "github", :login "seltzer1717"}], :_id "6081ad4fe4b0b1e3652d74cf"}], :notes [{:author {:login "rmoehn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/311879?v=3"}, :updated-at 1436251602311, :created-at 1436251602311, :body "For everyone struggling to provide custom reader functions to\n`clojure.edn/read`: _you cannot do that through `data_readers.clj`_.\n`data_readers.clj` can be used to provide custom reader functions for\n`clojure.core/read` and `clojure.core/read-string`, but not `clojure.edn/read`\nand `clojure.edn/read-string`.\n\nYou look carefully and you'll find that the official documentation does say so:\nif you don't supply a map of `:readers`, ‘only the `default-data-readers` will\nbe used’. But the information from `data_readers.clj` ends up in\n`*data-readers*` not `default-data-readers`. However, you'd have to look\n_very_ carefully to find this out.\n\n(If you're not interested in silly stories, you can skip the following two\nparagraphs and continue with the last.)\n\nNow you might think: ‘then I'll just say `(edn/read-string {:readers\n*data-readers*} )`’. On the first try this will probably fail, because\nyou forgot to `require` the namespaces where the reader functions live. Okay,\nyou've fixed that………\n\nBrowsing from your smartphone now? I know, your home directory just got wiped.\nAnd the external drive with the backups that's always plugged in to your machine\nas well. Why's that? Well, the procedures from `clojure.edn` are supposed to be\nsafe, to not execute any code, so that you can use them with data from untrusted\nsources. If you do want to have code executed (only from trusted sources, of\ncourse), you use the corresponding procedures from `clojure.core`. Now, there\nare people who know about `data_readers.clj` only being used by\n`clojure.core/read` and `clojure.core/read-string`, which aren't safe. So they\ndon't make their reader functions safe either. `guten-tag.core/read-tagged-val`\nis such an example. It calls `eval` on the data it is passed. That means, if you\nuse it with `clojure.edn/read` or `clojure.edn/read-string`, those will become\nas unsafe as their `clojure.core` counterparts.\n\nSorry for the long story. The moral is: have a very careful look at the reader\nfunctions you provide to the procedures from `clojure.edn`. If they execute code\nthat's passed to them, all safety is lost.\n", :_id "559b75d2e4b020189d740549"}], :arglists ["" "stream" "opts stream"], :doc "Reads the next object from stream, which must be an instance of\n java.io.PushbackReader or some derivee. stream defaults to the\n current value of *in*.\n\n Reads data in the edn format (subset of Clojure data):\n http://edn-format.org\n\n opts is a map that can include the following keys:\n :eof - value to return on end-of-file. When not supplied, eof throws an exception.\n :readers - a map of tag symbols to data-reader functions to be considered before default-data-readers.\n When not supplied, only the default-data-readers will be used.\n :default - A function of two args, that will, if present and no reader is found for a tag,\n be called with the tag and the value.", :library-url "https://github.com/clojure/clojure", :href "/clojure.edn/read"} {:added "1.5", :ns "clojure.edn", :name "read-string", :file "clojure/edn.clj", :type "function", :column 1, :see-alsos [{:created-at 1412284709546, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.edn", :name "read", :library-url "https://github.com/clojure/clojure"}, :_id "542dc125e4b05f4d257a2994"} {:created-at 1412284813516, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "prn-str", :library-url "https://github.com/clojure/clojure"}, :_id "542dc18de4b05f4d257a2998"} {:created-at 1422653108103, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=2"}, :to-var {:ns "clojure.core", :name "read-string", :library-url "https://github.com/clojure/clojure"}, :_id "54cbf6b4e4b0e2ac61831cf1"} {:created-at 1422653117945, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=2"}, :to-var {:ns "clojure.main", :name "load-script", :library-url "https://github.com/clojure/clojure"}, :_id "54cbf6bde4b081e022073c3d"} {:created-at 1661550967348, :author {:login "djblue", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1986211?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "tagged-literal", :ns "clojure.core"}, :_id "63094177e4b0b1e3652d7657"}], :line 37, :examples [{:body ";; The following code is a subset of that found at\n;; http://www.compoundtheory.com/clojure-edn-walkthrough\n;; It illustrates the fact that the readers \n;; 'read' and 'read-string' have symmetric writers\n;; 'prn' and 'prn-str'.\n\n(ns edn-example.core\n (require [clojure.edn :as edn]))\n \n(def sample-map {:foo \"bar\" :bar \"foo\"})\n \n;; Here you can see that the 'prn-str' is the writer...\n(defn convert-sample-map-to-edn\n \"Converting a Map to EDN\"\n []\n ;; yep, converting a map to EDN is that simple\"\n (prn-str sample-map))\n \n(println \"Let's convert a map to EDN: \" (convert-sample-map-to-edn))\n;=> Let's convert a map to EDN: {:foo \"bar\", :bar \"foo\"}\n \n;; ...and the reader is 'read-string'\n(println \"Now let's covert the map back: \" (edn/read-string (convert-sample-map-to-edn)))\n;=> Now let's covert the map back: {:foo bar, :bar foo}", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1412284690591, :updated-at 1412285328892, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :_id "542dc112e4b05f4d257a2993"} {:updated-at 1504691868756, :created-at 1504691868756, :author {:login "humorless", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/3061798?v=4"}, :body ";; The following demonstrates the use case of edn built-in tagged elements\nuser=> (class (clojure.edn/read-string \"#inst \\\"1985-04-12T23:20:50.52Z\\\"\"))\njava.util.Date\n\n", :_id "59afc69ce4b09f63b945ac60"} {:updated-at 1604505958870, :created-at 1510500744747, :author {:login "Atsman", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/3405704?v=4"}, :body ";; if you want to specify custom processing of some field add tag and function which process it\n;; let's assume we have edn with some relative paths and want to make them absolute\n\n(def config \"{:k8s-path #path \\\"./infra/k8s\\\"}\")\n\n(defn absolute [path] \"/users/some_user/project/k8s-path\")\n\n(edn/read-string {:readers {'path absolute}} config)\n\n{:k8s-path \"/users/some_user/project/k8s-path\"}", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/3405704?v=4", :account-source "github", :login "Atsman"} {:login "dosbol", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/6149147?v=4"}], :_id "5a086988e4b0a08026c48cb4"} {:editors [{:login "manojarya", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/2968153?v=4"}], :body ";; following example adds a custom data-reader which dynamically resolves value\n;; of a property from a lookup map. Falls back on default value if specified.\n\n(defn lookup-reader [lookup-map]\n (fn [v]\n (let [[k default-value] (if (sequential? v)\n v\n [v nil])]\n (get lookup-map k default-value))))\n\n;; returns readers map of tag symbols and handler functions\n(defn readers [lookup-map]\n {:readers {'prop (lookup-reader lookup-map)}})\n\n;; DB_HOST value is resolved while DB_PORT will be default\n(edn/read-string (readers {\"DB_HOST\" \"db-server1\"}) \"{:host #prop [\\\"DB_HOST\\\" \\\"localhost\\\"] :port #prop [\\\"DB_PORT\\\" 42]}\")\n;; {:host \"db-server1\", :port 42}", :author {:avatar-url "https://avatars0.githubusercontent.com/u/2968153?v=4", :account-source "github", :login "manojarya"}, :created-at 1569410505522, :updated-at 1569568738213, :_id "5d8b4dc9e4b0ca44402ef7c0"}], :notes nil, :arglists ["s" "opts s"], :doc "Reads one object from the string s. Returns nil when s is nil or empty.\n\n Reads data in the edn format (subset of Clojure data):\n http://edn-format.org\n\n opts is a map as per clojure.edn/read", :library-url "https://github.com/clojure/clojure", :href "/clojure.edn/read-string"} {:added "1.0", :ns "clojure.inspector", :name "inspect-table", :file "clojure/inspector.clj", :type "function", :column 1, :see-alsos [{:created-at 1331449134000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.pprint", :name "print-table", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aff"} {:created-at 1331449142000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.inspector", :name "inspect-tree", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b00"}], :line 100, :examples [{:updated-at 1438202947024, :created-at 1438202947024, :author {:login "lildata", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7280019?v=3"}, :body "(use 'clojure.inspector)\n(inspect-table [{:a 1 :b 2 :c 3}{:a 4 :b 5 :c 6}])", :_id "55b93c43e4b03580923b00d8"} {:updated-at 1545395763248, :created-at 1545395763248, :author {:login "sanel", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/213914?v=4"}, :body ";; display every element type alongside value in table\nuser=> (inspect-table\n (map #(vector (type %) %)\n [1 \"something\" \\c (java.io.File. \"/tmp/x\") 0.12 1234]))", :_id "5c1cde33e4b0ca44402ef5f3"}], :notes nil, :arglists ["data"], :doc "creates a graphical (Swing) inspector on the supplied regular\n data, which must be a sequential data structure of data structures\n of equal length", :library-url "https://github.com/clojure/clojure", :href "/clojure.inspector/inspect-table"} {:ns "clojure.inspector", :name "atom?", :file "clojure/inspector.clj", :type "function", :column 1, :see-alsos [{:created-at 1341044327000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "isa?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d24"}], :line 19, :examples [{:author {:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"}, :editors [], :body ";; atom? returns true if the form passed does not \n;; implement IPersistentCollection. The atom referred \n;; here is not the atom used in managing mutable state \n\nuser=> (use `[clojure.inspector :include (atom?)])\n\nuser=> (atom? 1)\ntrue\n\nuser=> (atom? \\a)\ntrue\n\nuser=> (atom? \"hello world\")\ntrue\n\nuser=> (atom? :keyword)\ntrue\n\nuser=> (atom? nil)\ntrue\n\nuser=> (atom? '())\nfalse\n\nuser=> (atom? [1, 3, 5])\nfalse\n\nuser=> (atom? #{\\a \\e \\i \\o \\u})\nfalse\n\nuser=> (atom? {:x 16 :y 25})\nfalse", :created-at 1313787533000, :updated-at 1313787533000, :_id "542692d0c026201cdc326eb1"}], :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.inspector/atom_q"} {:ns "clojure.inspector", :name "list-provider", :file "clojure/inspector.clj", :type "var", :column 1, :see-alsos nil, :line 112, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.inspector/list-provider"} {:ns "clojure.inspector", :name "is-leaf", :file "clojure/inspector.clj", :type "var", :column 1, :see-alsos nil, :line 31, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.inspector/is-leaf"} {:ns "clojure.inspector", :name "old-table-model", :file "clojure/inspector.clj", :type "function", :column 1, :see-alsos nil, :line 72, :examples nil, :notes nil, :arglists ["data"], :library-url "https://github.com/clojure/clojure", :href "/clojure.inspector/old-table-model"} {:ns "clojure.inspector", :name "tree-model", :file "clojure/inspector.clj", :type "function", :column 1, :see-alsos nil, :line 56, :examples nil, :notes nil, :arglists ["data"], :library-url "https://github.com/clojure/clojure", :href "/clojure.inspector/tree-model"} {:added "1.0", :ns "clojure.inspector", :name "inspect", :file "clojure/inspector.clj", :type "function", :column 1, :see-alsos nil, :line 154, :examples [{:updated-at 1545395525526, :created-at 1545395525526, :author {:login "sanel", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/213914?v=4"}, :body ";; display Swing table with value and value type\nuser=> (inspect \"something\")\n\n;; display every element (with index) in separate Swing table row\nuser=> (inspect [1 2 3])", :_id "5c1cdd45e4b0ca44402ef5f2"} {:updated-at 1586829405546, :created-at 1586829405546, :author {:login "staypufd", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/10730?v=4"}, :body ";; display all the attributes of the complex Java object (Swing JFrame in \n;; the example).\nuser=> \n(clojure.inspector/inspect \n (bean \n (javax.swing.JFrame. \"hello\")))\n\n", :_id "5e95185de4b087629b5a18d3"}], :notes nil, :arglists ["x"], :doc "creates a graphical (Swing) inspector on the supplied object", :library-url "https://github.com/clojure/clojure", :href "/clojure.inspector/inspect"} {:ns "clojure.inspector", :name "collection-tag", :file "clojure/inspector.clj", :type "function", :column 1, :see-alsos nil, :line 22, :examples [{:updated-at 1477012162986, :created-at 1477012162986, :author {:login "dalzony", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/562341?v=3"}, :body "user=> (clojure.inspector/collection-tag (first {:a 1 :b 2}))\n;;=> :entry\nuser=> (clojure.inspector/collection-tag {:a 1})\n;;=> :seqable\nuser=> (clojure.inspector/collection-tag #{:a 1})\n;;=> :seqable\nuser=> (clojure.inspector/collection-tag [1 2])\n;;=> :seq\nuser=> (clojure.inspector/collection-tag :a)\n;;=> :atom\n", :_id "58096ac2e4b001179b66bdd8"}], :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.inspector/collection-tag"} {:ns "clojure.inspector", :name "get-child-count", :file "clojure/inspector.clj", :type "var", :column 1, :see-alsos nil, :line 33, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.inspector/get-child-count"} {:added "1.0", :ns "clojure.inspector", :name "inspect-tree", :file "clojure/inspector.clj", :type "function", :column 1, :see-alsos [{:created-at 1331449151000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.inspector", :name "inspect-table", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f47"}], :line 91, :examples [{:updated-at 1545395305082, :created-at 1545395305082, :author {:login "sanel", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/213914?v=4"}, :body ";; opens Swing window with interactive tree component\nuser=> (inspect-tree '(a (1 2) b (3 4) c (5 6)))\n\n;; you can also visualize complex nested maps\nuser=> (inspect-tree {:a {:aa [1 2 3]\n :ab 3}\n :b 1\n :c {:ca {:caa [{:foo 1}\n {:foo 2}]}}})\n", :_id "5c1cdc69e4b0ca44402ef5f1"}], :notes nil, :arglists ["data"], :doc "creates a graphical (Swing) inspector on the supplied hierarchical data", :library-url "https://github.com/clojure/clojure", :href "/clojure.inspector/inspect-tree"} {:ns "clojure.inspector", :name "get-child", :file "clojure/inspector.clj", :type "var", :column 1, :see-alsos nil, :line 32, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.inspector/get-child"} {:ns "clojure.inspector", :name "list-model", :file "clojure/inspector.clj", :type "function", :column 1, :see-alsos nil, :line 129, :examples nil, :notes nil, :arglists ["provider"], :library-url "https://github.com/clojure/clojure", :href "/clojure.inspector/list-model"} {:ns "clojure.inspector", :name "table-model", :file "clojure/inspector.clj", :type "var", :column 1, :see-alsos nil, :line 139, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.inspector/table-model"} {:ns "clojure.instant", :name "validated", :file "clojure/instant.clj", :type "function", :column 1, :see-alsos nil, :line 139, :examples nil, :notes nil, :arglists ["new-instance"], :doc "Return a function which constructs an instant by calling constructor\nafter first validating that those arguments are in range and otherwise\nplausible. The resulting function will throw an exception if called\nwith invalid arguments.", :library-url "https://github.com/clojure/clojure", :href "/clojure.instant/validated"} {:ns "clojure.instant", :name "read-instant-timestamp", :file "clojure/instant.clj", :type "function", :column 1, :see-alsos [{:created-at 1617958817276, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "read-instant-date", :ns "clojure.instant"}, :_id "607017a1e4b0b1e3652d74bd"}], :line 288, :examples [{:updated-at 1583436804622, :created-at 1583436804622, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body "(clojure.instant/read-instant-date \"2020-03-23T01:17Z\")\n;=> #inst \"2020-03-23T01:17:00.000-00:00\"", :_id "5e615404e4b087629b5a18ba"}], :notes nil, :arglists ["cs"], :doc "To read an instant as a java.sql.Timestamp, bind *data-readers* to a\nmap with this var as the value for the 'inst key. Timestamp preserves\nfractional seconds with nanosecond precision. The timezone offset will\nbe used to convert into UTC.", :library-url "https://github.com/clojure/clojure", :href "/clojure.instant/read-instant-timestamp"} {:ns "clojure.instant", :name "read-instant-calendar", :file "clojure/instant.clj", :type "function", :column 1, :see-alsos nil, :line 281, :examples nil, :notes nil, :arglists ["cs"], :doc "To read an instant as a java.util.Calendar, bind *data-readers* to a map with\nthis var as the value for the 'inst key. Calendar preserves the timezone\noffset.", :library-url "https://github.com/clojure/clojure", :href "/clojure.instant/read-instant-calendar"} {:ns "clojure.instant", :name "read-instant-date", :file "clojure/instant.clj", :type "function", :column 1, :see-alsos [{:created-at 1587829080311, :author {:login "kyptin", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/254619?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "parse-timestamp", :ns "clojure.instant"}, :_id "5ea45958e4b087629b5a18e8"} {:created-at 1617958825769, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "read-instant-timestamp", :ns "clojure.instant"}, :_id "607017a9e4b0b1e3652d74be"}], :line 274, :examples [{:editors [{:login "cassc", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1858231?v=4"}], :body ";; Parse a string with RFC3339-like timestamp to get a java.util.Date object\n\n(use 'clojure.instant)\n(read-instant-date \"2017-08-23T10:22:22\")\n;; #inst \"2017-08-23T10:22:22.000-00:00\"\n\n;; If no timezone info is included in the input string, GMT is assumed.\n;; See clojure.instant/parse-timestamp for the timestamp pattern supported.", :author {:avatar-url "https://avatars2.githubusercontent.com/u/1858231?v=4", :account-source "github", :login "cassc"}, :created-at 1504252223491, :updated-at 1504252436727, :_id "59a9113fe4b09f63b945ac5c"}], :notes nil, :arglists ["cs"], :doc "To read an instant as a java.util.Date, bind *data-readers* to a map with\nthis var as the value for the 'inst key. The timezone offset will be used\nto convert into UTC.", :library-url "https://github.com/clojure/clojure", :href "/clojure.instant/read-instant-date"} {:ns "clojure.instant", :name "parse-timestamp", :file "clojure/instant.clj", :type "function", :column 1, :see-alsos [{:created-at 1583436680072, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "read-instant-timestamp", :ns "clojure.instant"}, :_id "5e615388e4b087629b5a18b8"} {:created-at 1583436695565, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "read-instant-date", :ns "clojure.instant"}, :_id "5e615397e4b087629b5a18b9"}], :line 53, :examples [{:editors [{:login "kyptin", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/254619?v=4"}], :body "(require '[clojure.instant :as instant])\n(instant/parse-timestamp vector \"2020-04-25T15:09:16.437Z\")\n;; => [2020 4 25 15 9 16 437000000 0 0 0]\n\n;; But the other functions in this namespace might be more convenient, e.g.:\n(instant/read-instant-date \"2020-04-25T15:09:16.437Z\")\n;; => #inst \"2020-04-25T15:09:16.437-00:00\"", :author {:avatar-url "https://avatars1.githubusercontent.com/u/254619?v=4", :account-source "github", :login "kyptin"}, :created-at 1587829024785, :updated-at 1587956901157, :_id "5ea45920e4b087629b5a18e7"}], :notes nil, :arglists ["new-instant cs"], :doc "Parse a string containing an RFC3339-like like timestamp.\n\nThe function new-instant is called with the following arguments.\n\n min max default\n --- ------------ -------\n years 0 9999 N/A (s must provide years)\n months 1 12 1\n days 1 31 1 (actual max days depends\n hours 0 23 0 on month and year)\n minutes 0 59 0\n seconds 0 60 0 (though 60 is only valid\n nanoseconds 0 999999999 0 when minutes is 59)\n offset-sign -1 1 0\n offset-hours 0 23 0\n offset-minutes 0 59 0\n\nThese are all integers and will be non-nil. (The listed defaults\nwill be passed if the corresponding field is not present in s.)\n\nGrammar (of s):\n\n date-fullyear = 4DIGIT\n date-month = 2DIGIT ; 01-12\n date-mday = 2DIGIT ; 01-28, 01-29, 01-30, 01-31 based on\n ; month/year\n time-hour = 2DIGIT ; 00-23\n time-minute = 2DIGIT ; 00-59\n time-second = 2DIGIT ; 00-58, 00-59, 00-60 based on leap second\n ; rules\n time-secfrac = '.' 1*DIGIT\n time-numoffset = ('+' / '-') time-hour ':' time-minute\n time-offset = 'Z' / time-numoffset\n\n time-part = time-hour [ ':' time-minute [ ':' time-second\n [time-secfrac] [time-offset] ] ]\n\n timestamp = date-year [ '-' date-month [ '-' date-mday\n [ 'T' time-part ] ] ]\n\nUnlike RFC3339:\n\n - we only parse the timestamp format\n - timestamp can elide trailing components\n - time-offset is optional (defaults to +00:00)\n\nThough time-offset is syntactically optional, a missing time-offset\nwill be treated as if the time-offset zero (+00:00) had been\nspecified.\n", :library-url "https://github.com/clojure/clojure", :href "/clojure.instant/parse-timestamp"} {:added "1.2", :ns "clojure.java.browse", :name "browse-url", :file "clojure/java/browse.clj", :type "function", :column 1, :see-alsos [{:created-at 1420901028632, :author {:login "AeroNotix", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/975962?v=3"}, :to-var {:ns "clojure.java.browse", :name "*open-url-script*", :library-url "https://github.com/clojure/clojure"}, :_id "54b13aa4e4b081e022073bfe"}], :line 66, :examples [{:author {:login "abhin4v", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4d29918c109bc75d2a1fd8420660d72b?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (use 'clojure.java.browse)\n\nuser=> (browse-url \"http://clojuredocs.org\")\n", :created-at 1283270758000, :updated-at 1285494149000, :_id "542692d0c026201cdc326eb2"} {:body ";;It's funny.... Open bash\n\n(browse-url \"/bin/bash\")", :author {:login "LMSlay", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8565224?v=3"}, :created-at 1427832992939, :updated-at 1427832992939, :_id "551b00a0e4b056ca16cfecfd"}], :notes nil, :arglists ["url"], :doc "Open url in a browser", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.browse/browse-url"} {:ns "clojure.java.browse", :name "*open-url-script*", :file "clojure/java/browse.clj", :type "var", :column 1, :see-alsos [{:created-at 1420901010720, :author {:login "AeroNotix", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/975962?v=3"}, :to-var {:ns "clojure.java.browse", :name "browse-url", :library-url "https://github.com/clojure/clojure"}, :_id "54b13a92e4b081e022073bfd"}], :dynamic true, :line 40, :examples [{:body ";; Sets the script used when calling browse-url\n;;\n;; It needs to be an atom because internally the browse-url function\n;; dereferences *open-url-script*\n(binding [clojure.java.browse/*open-url-script* (atom \"/usr/bin/ls\")]\n (clojure.java.browse/browse-url \"http://google.com\"))", :author {:login "AeroNotix", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/975962?v=3"}, :created-at 1420900983542, :updated-at 1420900983542, :_id "54b13a77e4b0e2ac61831ca4"}], :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.java.browse/*open-url-script*"} {:ns "clojure.java.io", :name "default-streams-impl", :file "clojure/java/io.clj", :type "var", :column 1, :see-alsos nil, :line 164, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/default-streams-impl"} {:added "1.2", :ns "clojure.java.io", :name "make-output-stream", :type "function", :see-alsos [{:created-at 1435101653324, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:ns "clojure.java.io", :name "writer", :library-url "https://github.com/clojure/clojure"}, :_id "5589e9d5e4b0fad27b85f921"}], :examples nil, :notes nil, :arglists ["x opts"], :doc "Creates a BufferedOutputStream. See also IOFactory docs.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/make-output-stream"} {:added "1.2", :ns "clojure.java.io", :name "make-parents", :file "clojure/java/io.clj", :type "function", :column 1, :see-alsos [{:created-at 1507587681180, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "file", :ns "clojure.java.io"}, :_id "59dbf661e4b03026fe14ea59"}], :line 438, :examples [{:body "(let [file-name \"path/to/whatever.txt\"]\n (make-parents file-name)\n (spit file-name \"whatever\"))", :author {:login "mattvvhat", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/367789?v=3"}, :created-at 1434030825430, :updated-at 1434030825430, :_id "557992e9e4b01ad59b65f4f0"}], :notes nil, :arglists ["f & more"], :doc "Given the same arg(s) as for file, creates all parent directories of\n the file they represent.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/make-parents"} {:added "1.2", :ns "clojure.java.io", :name "delete-file", :file "clojure/java/io.clj", :type "function", :column 1, :see-alsos [{:created-at 1329988386000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "file", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cb9"} {:created-at 1329988390000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "copy", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cba"}], :line 430, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; create a file using spit, then show its contents using slurp\n;; delete it and verify that it has been deleted by trying to print its\n;; contents again\n\nuser=> (require '[clojure.java.io :as io])\nnil\nuser=> (spit \"stuff.txt\" \"blurp\")\nnil\nuser=> (println (slurp \"stuff.txt\"))\nblurp\nnil\nuser=> (io/delete-file \"stuff.txt\")\ntrue\nuser=> (println (slurp \"stuff.txt\"))\njava.io.FileNotFoundException: stuff.txt (The system cannot find the file specif\nied) (NO_SOURCE_FILE:0)\nuser=>", :created-at 1313906436000, :updated-at 1313906436000, :_id "542692d0c026201cdc326eb9"} {:editors [{:login "zjliu1984", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1556007?v=3"}], :body "(require '[clojure.java.io :as io])\n\nuser> (io/delete-file \"d:/code/python/file-which-does-not-exist.py\")\nIOException Couldn't delete d:/code/python/exist.py \nclojure.java.io/delete-file (io.clj:426)\n\nuser> (io/delete-file \"d:/code/python/file-which-does-not-exist.py\" true)\ntrue", :author {:avatar-url "https://avatars.githubusercontent.com/u/1556007?v=3", :account-source "github", :login "zjliu1984"}, :created-at 1482289924813, :updated-at 1482289948834, :_id "5859f304e4b004d3a355e2d2"}], :notes nil, :arglists ["f & [silently]"], :doc "Delete file f. If silently is nil or false, raise an exception on failure, else return the value of silently.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/delete-file"} {:added "1.2", :ns "clojure.java.io", :name "input-stream", :file "clojure/java/io.clj", :type "function", :column 1, :see-alsos [{:created-at 1329988244000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "reader", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a9b"} {:created-at 1329988273000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "output-stream", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a9c"} {:created-at 1329988761000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "IOFactory", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a9d"} {:created-at 1331903198000, :author {:login "Pierre", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/dc0590890ca22fee047f8e2598c2568d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-open", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a9e"} {:created-at 1331903424000, :author {:login "Pierre", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/dc0590890ca22fee047f8e2598c2568d?r=PG&default=identicon"}, :to-var {:ns "clojure.java.io", :name "make-input-stream", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a9f"}], :line 121, :examples [{:editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :updated-at 1507926708504, :created-at 1430431281427, :author {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}, :body "(require '(clojure.java [io :as io]))\n\n;; A common task it to load a file into a byte array.\n(defn file->bytes [file]\n (with-open [xin (io/input-stream file)\n xout (java.io.ByteArrayOutputStream.)]\n (io/copy xin xout)\n (.toByteArray xout)))\n;=> #'boot.user/file->bytes\n\n(file->bytes (io/file \"/foo-pc\" \"junk.txt\"))\n;=> #object[\"[B\" 0x7813db81 \"[B@7813db81\"]\n\n\n", :_id "5542a631e4b01bb732af0a8f"} {:updated-at 1458914936478, :created-at 1458914936478, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :body "(require '[clojure.java.io :as io])\n\n;; these return a java.io.BufferedInputStream for a local file:\n(io/input-stream \"file.txt\")\n(io/input-stream \"/home/user/file.txt\")\n(io/input-stream \"file:///home/user/file.txt\")\n(io/input-stream (java.io.File. \"/home/user/file.txt\"))\n(io/input-stream (java.io.FileInputStream. \"file.txt\"))\n(io/input-stream (java.net.URL. \"file:///home/user/file.txt\"))\n(io/input-stream (java.net.URI. \"file:///home/user/file.txt\"))\n\n;; these return a java.io.BufferedInputStream for a remote resource:\n(io/input-stream \"http://clojuredocs.org/\")\n(io/input-stream (java.net.URL. \"http://clojuredocs.org\"))\n(io/input-stream (java.net.URI. \"http://clojuredocs.org\"))\n(let [socket (java.net.Socket. \"clojuredocs.org\" 80)\n out (java.io.PrintStream. (.getOutputStream socket))]\n (.println out \"GET /index.html HTTP/1.0\")\n (.println out \"Host: clojuredocs.org\\n\\n\")\n (io/input-stream socket))\n\n;; these return a java.io.BufferedInputStream from an in-memory source:\n(io/input-stream (.getBytes \"text\"))\n(io/input-stream (java.io.ByteArrayInputStream. (.getBytes \"text\")))\n(io/input-stream (byte-array [116 101 120 116]))\n", :_id "56f54678e4b09295d75dbf3f"}], :notes nil, :tag "java.io.InputStream", :arglists ["x & opts"], :doc "Attempts to coerce its argument into an open java.io.InputStream.\n Default implementations always return a java.io.BufferedInputStream.\n\n Default implementations are defined for InputStream, File, URI, URL,\n Socket, byte array, and String arguments.\n\n If the argument is a String, it tries to resolve it first as a URI, then\n as a local file name. URIs with a 'file' protocol are converted to\n local file names.\n\n Should be used inside with-open to ensure the InputStream is properly\n closed.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/input-stream"} {:added "1.2", :ns "clojure.java.io", :name "make-writer", :type "function", :see-alsos [{:created-at 1435099993554, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:ns "clojure.java.io", :name "writer", :library-url "https://github.com/clojure/clojure"}, :_id "5589e359e4b05f167dcf2342"}], :examples nil, :notes nil, :arglists ["x opts"], :doc "Creates a BufferedWriter. See also IOFactory docs.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/make-writer"} {:added "1.2", :ns "clojure.java.io", :name "as-relative-path", :file "clojure/java/io.clj", :type "function", :column 1, :see-alsos nil, :line 408, :examples [{:editors [{:login "zjliu1984", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1556007?v=3"}], :body "(require '[clojure.java.io :as io])\n\n; on windows\nuser> (io/as-relative-path \"this/is\")\n\"this\\\\is\n\nuser> (io/as-relative-path \"c:/code\")\nIllegalArgumentException c:\\code is not a relative path clojure.java.io/as-relative-path (io.clj:405)", :author {:avatar-url "https://avatars.githubusercontent.com/u/1556007?v=3", :account-source "github", :login "zjliu1984"}, :created-at 1482288709426, :updated-at 1482288737304, :_id "5859ee45e4b004d3a355e2d0"}], :notes nil, :tag "java.lang.String", :arglists ["x"], :doc "Take an as-file-able thing and return a string if it is\n a relative path, else IllegalArgumentException.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/as-relative-path"} {:added "1.2", :ns "clojure.java.io", :name "copy", :file "clojure/java/io.clj", :type "function", :column 1, :see-alsos [{:created-at 1329988342000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "file", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ccd"}], :line 391, :examples [{:updated-at 1561584738124, :created-at 1306503567000, :body "(ns your-project\n (:require [clojure.java.io :as io]))\n\n(defn copy-file [source-path dest-path]\n (io/copy (io/file source-path) (io/file dest-path)))\n\n(copy-file \"/home/username/squirrel.txt\" \"/home/username/burt-reynolds.txt\")\n\n;; Or, after extending the related multimethod:\n\n(defmethod @#'io/do-copy [String String] [in out opts]\n (apply io/copy (io/file in) (io/file out) opts))\n\n(io/copy \"/home/username/squirrel.txt\" \"/home/username/burt-reynolds.txt\")", :editors [{:avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon", :account-source "clojuredocs", :login "boxie"} {:avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon", :account-source "clojuredocs", :login "boxie"} {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692d0c026201cdc326eb4"} {:updated-at 1577094940425, :created-at 1577094940425, :author {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}, :body ";; Can be used to save a URL to disk. See: https://stackoverflow.com/a/19297746/1019491\n\n(defn copy-uri-to-file [uri file]\n (with-open [in (clojure.java.io/input-stream uri)\n out (clojure.java.io/output-stream file)]\n (clojure.java.io/copy in out)))", :_id "5e008f1ce4b0ca44402ef7fe"} {:updated-at 1676155296789, :created-at 1676155296789, :author {:login "wedesoft", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/28663?v=4"}, :body ";; Concatenate two files.\n\n(with-open [out (clojure.java.io/output-stream \"output.txt\")]\n (clojure.java.io/copy (clojure.java.io/file \"input1.txt\") out)\n (clojure.java.io/copy (clojure.java.io/file \"input2.txt\") out))", :_id "63e819a0e4b08cf8563f4b6d"}], :notes nil, :arglists ["input output & opts"], :doc "Copies input to output. Returns nil or throws IOException.\n Input may be an InputStream, Reader, File, byte[], char[], or String.\n Output may be an OutputStream, Writer, or File.\n\n Options are key/value pairs and may be one of\n\n :buffer-size buffer size to use, default is 1024.\n :encoding encoding to use if converting between\n byte and char streams. \n\n Does not close any streams except those it opens itself \n (on a File).", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/copy"} {:added "1.2", :ns "clojure.java.io", :name "as-file", :type "function", :see-alsos [{:created-at 1332830735000, :author {:login "eric", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2b0c9ae6f1da9716451e7c86bc87230b?r=PG&default=identicon"}, :to-var {:ns "clojure.java.io", :name "file", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eb4"}], :examples [{:updated-at 1482262177780, :created-at 1285050867000, :body "; It returns a java.io.File object\n> (require '[clojure.java.io :as io] )\n> (class (io/as-file \".\"))\njava.io.File\n\n; You can call java methods such as File/exists\n> (.exists (io/as-file \"dummy.txt\"))\nfalse\n> (.exists (io/as-file \"project.clj\"))\ntrue\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon", :account-source "clojuredocs", :login "gstamp"}, :_id "542692d0c026201cdc326eba"}], :notes [{:author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :updated-at 1516410057934, :created-at 1516410057934, :body "This is a low-level function for getting a file object from a single string.\nIn contrast, `(clojure.java.io/file)` is a higher-level API that will let you do \nthings like construct paths to files using strings and other file objects, \nas in `(io/file root-dir \"subdir\" \"filename.ext\")`.", :_id "5a6294c9e4b0a08026c48d08"}], :tag "java.io.File", :arglists ["x"], :doc "Coerce argument to a file.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/as-file"} {:added "1.2", :ns "clojure.java.io", :name "output-stream", :file "clojure/java/io.clj", :type "function", :column 1, :see-alsos [{:created-at 1329988282000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "writer", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b21"} {:created-at 1329988289000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "input-stream", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b22"} {:created-at 1329988768000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "IOFactory", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b23"} {:created-at 1418120263796, :author {:login "alilee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/16739?v=3"}, :to-var {:ns "clojure.java.io", :name "make-output-stream", :library-url "https://github.com/clojure/clojure"}, :_id "5486cc47e4b09260f767ca74"}], :line 138, :examples [{:updated-at 1619977096473, :created-at 1338273014000, :body "(:use [clojure.java.io :as io])\n\n(defn use-output-stream []\n (with-open [o (io/output-stream \"test.txt\")]\n (.write o 65))) ; Writes 'A'", :editors [{:avatar-url "https://www.gravatar.com/avatar/dae0f434afde5246ccb030cdec81fb71?r=PG&default=identicon", :account-source "clojuredocs", :login "Omer"} {:login "drewverlee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1130688?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/dae0f434afde5246ccb030cdec81fb71?r=PG&default=identicon", :account-source "clojuredocs", :login "Omer"}, :_id "542692d6c026201cdc3270d9"}], :notes nil, :tag "java.io.OutputStream", :arglists ["x & opts"], :doc "Attempts to coerce its argument into an open java.io.OutputStream.\n Default implementations always return a java.io.BufferedOutputStream.\n\n Default implementations are defined for OutputStream, File, URI, URL,\n Socket, and String arguments.\n\n If the argument is a String, it tries to resolve it first as a URI, then\n as a local file name. URIs with a 'file' protocol are converted to\n local file names.\n\n Should be used inside with-open to ensure the OutputStream is\n properly closed.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/output-stream"} {:added "1.2", :ns "clojure.java.io", :name "make-reader", :type "function", :see-alsos nil, :examples nil, :notes [{:updated-at 1393559963000, :body "Don't use this. You probably want [reader](reader) instead.", :created-at 1393559963000, :author {:login "TheAlchemist", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/43b98f8119f22e58791a57950145b051?r=PG&default=identicon"}, :_id "542692edf6e94c697052201e"}], :arglists ["x opts"], :doc "Creates a BufferedReader. See also IOFactory docs.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/make-reader"} {:added "1.2", :ns "clojure.java.io", :name "Coercions", :file "clojure/java/io.clj", :type "var", :column 1, :see-alsos nil, :line 35, :examples nil, :notes nil, :arglists [], :doc "Coerce between various 'resource-namish' things.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/Coercions"} {:added "1.2", :ns "clojure.java.io", :name "file", :file "clojure/java/io.clj", :type "function", :column 1, :see-alsos [{:created-at 1329988433000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "file-seq", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dfc"} {:created-at 1329988641000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "reader", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dfd"} {:created-at 1329988645000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "writer", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dfe"} {:created-at 1330337356000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "delete-file", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dff"} {:created-at 1507587660510, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "make-parents", :ns "clojure.java.io"}, :_id "59dbf64ce4b03026fe14ea58"} {:created-at 1550262589878, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "as-file", :ns "clojure.java.io"}, :_id "5c67213de4b0ca44402ef686"} {:created-at 1550262611875, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "load-file", :ns "clojure.core"}, :_id "5c672153e4b0ca44402ef687"}], :line 418, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [], :body "user> (clojure.java.io/file \"/tmp/foo\")\n#\n\nuser> (clojure.java.io/file \"http://asdf.com\")\n#\n\nuser> (clojure.java.io/file \"/tmp/foo\" \"bar\")\n#", :created-at 1293673542000, :updated-at 1293673542000, :_id "542692d0c026201cdc326eb7"} {:updated-at 1462995759891, :created-at 1399010194000, :body "; Use clojure.java.io to read in resources from the classpath\n\n(ns rescue.core\n (:require [clojure.java.io :as io] ))\n\n; Populate the file on the command line: \n; echo \"Hello Resources!\" > resources/hello.txt\n(def data-file (io/resource \n \"hello.txt\" ))\n(defn -main []\n (println (slurp data-file)) )\n; When do \"lein run\"\n; => Hello Resources!", :editors [{:login "slipset", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5894926?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon", :account-source "clojuredocs", :login "cloojure"}, :_id "542692d6c026201cdc3270d8"} {:body "; slurp can be used directly on value of io/resource\n\n(ns rescue.core\n (require [clojure.java.io :as io]))\n\n; echo \"hello world\" > resources/hello.txt\n(def data (io/resource \"hello.txt\"))\n\n(defn -main []\n (println (slurp data-file))\n; when do \"lein run\"\n; => hello world", :author {:login "m00nlight", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5475472?v=3"}, :created-at 1422524528923, :updated-at 1422524528923, :_id "54ca0070e4b0e2ac61831ce8"}], :notes nil, :tag "java.io.File", :arglists ["arg" "parent child" "parent child & more"], :doc "Returns a java.io.File, passing each arg to as-file. Multiple-arg\n versions treat the first argument as parent and subsequent args as\n children relative to the parent.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/file"} {:added "1.2", :ns "clojure.java.io", :name "make-input-stream", :type "function", :see-alsos [{:created-at 1331903445000, :author {:login "Pierre", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/dc0590890ca22fee047f8e2598c2568d?r=PG&default=identicon"}, :to-var {:ns "clojure.java.io", :name "IOFactory", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d61"}], :examples nil, :notes nil, :arglists ["x opts"], :doc "Creates a BufferedInputStream. See also IOFactory docs.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/make-input-stream"} {:added "1.2", :ns "clojure.java.io", :name "IOFactory", :file "clojure/java/io.clj", :type "var", :column 1, :see-alsos [{:created-at 1329988722000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "reader", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bdc"} {:created-at 1329988725000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "writer", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bdd"} {:created-at 1329988729000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "input-stream", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bde"} {:created-at 1329988733000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "output-stream", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bdf"}], :line 69, :examples nil, :notes nil, :arglists [], :doc "Factory functions that create ready-to-use, buffered versions of\n the various Java I/O stream types, on top of anything that can\n be unequivocally converted to the requested kind of stream.\n\n Common options include\n \n :append true to open stream in append mode\n :encoding string name of encoding to use, e.g. \"UTF-8\".\n\n Callers should generally prefer the higher level API provided by\n reader, writer, input-stream, and output-stream.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/IOFactory"} {:added "1.2", :ns "clojure.java.io", :name "resource", :file "clojure/java/io.clj", :type "function", :column 1, :see-alsos [{:created-at 1529009753028, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "slurp", :ns "clojure.core"}, :_id "5b22d659e4b00ac801ed9e15"} {:created-at 1529010567539, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reader", :ns "clojure.java.io"}, :_id "5b22d987e4b00ac801ed9e17"} {:created-at 1529010728887, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "line-seq", :ns "clojure.core"}, :_id "5b22da28e4b00ac801ed9e18"}], :line 446, :examples [{:author {:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"}, :editors [{:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"} {:avatar-url "https://avatars.githubusercontent.com/u/11081351?v=3", :account-source "github", :login "rauhs"} {:login "flyboarder", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/147004?v=3"}], :body "; Use clojure.java.io/resource to read resources from the classpath:\n\n(ns rescue.core\n (:require [clojure.java.io :as io] ))\n\n; Populate the file on the command line: \n; echo \"Hello Resources!\" > resources/hello.txt\n(def data-file (io/resource \n \"hello.txt\" ))\n(defn -main []\n (println (slurp data-file)) )\n; When do \"lein run\"\n; => Hello Resources!", :created-at 1399010149000, :updated-at 1494456807781, :_id "542692d6c026201cdc3270dc"} {:body "(require '(clojure.java.io :as io))\n\n;; If the resource does not exist on the classpath a nil is returned.\n(io/resource \"I_do_not_exist.txt\")\n;;=> nil", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1435094542239, :updated-at 1435094573241, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :_id "5589ce0ee4b0fad27b85f91e"}], :notes [{:body "If you need to `slurp` a file from a JAR file, don't call `io/file` on the result of calling `io/resource`, or you will get an exception that says the resource is \"not a file\". Instead, call `slurp` directly on the result of `io/resource`.", :created-at 1435260445537, :updated-at 1435260445537, :author {:login "kyptin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/254619?v=3"}, :_id "558c561de4b0fad27b85f927"} {:author {:login "benwhorwood", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/17282487?v=3"}, :updated-at 1469616475473, :created-at 1469616313988, :body "If you need to copy a **binary** file from a running JAR (or WAR), don't call `slurp` as it will try and decode the file. Instead, extract similarily to:\n\n
    \n(with-open [in (io/input-stream (io/resource \"file.dat\"))] ;; resources/file.dat\n    (io/copy in (io/file \"/path/to/extract/file.dat\"))))\n
    ", :_id "579890b9e4b0bafd3e2a04be"}], :tag "java.net.URL", :arglists ["n" "n loader"], :doc "Returns the URL for a named resource. Use the context class loader\n if no loader is specified.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/resource"} {:added "1.2", :ns "clojure.java.io", :name "writer", :file "clojure/java/io.clj", :type "function", :column 1, :see-alsos [{:created-at 1324516890000, :author {:login "cgray", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7fe6255dbe4806a588cc06a5ba4a5d82?r=PG&default=identicon"}, :to-var {:ns "clojure.java.io", :name "reader", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e40"} {:created-at 1329988746000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "IOFactory", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e41"} {:created-at 1330170599000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "output-stream", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e42"} {:created-at 1334795963000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "spit", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e43"}], :line 104, :examples [{:author {:login "weiyongqing123", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8341059515e9e257bbb8da3c9fc158c2?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; This example shows the use of the ':append' option\n(defn write-file []\n (with-open [w (clojure.java.io/writer \"f:/w.txt\" :append true)]\n (.write w (str \"hello\" \"world\"))))", :created-at 1329302480000, :updated-at 1434481428515, :_id "542692d6c026201cdc3270de"} {:body ";; This example shows the use of the ':encoding' option.\n(require '(clojure.data.xml :as xml))\n\n(let [tags (xml/element :foo {:foo-attr \"foo value\"}\n (xml/element :bar {:bar-attr \"bar value\"}\n (xml/element :baz {} \"The baz value\")))]\n (with-open [out-file (clojure.java.io/writer \"/temp/bar.xml\" :encoding \"UTF-8\")]\n (xml/emit tags out-file))\n (with-open [input (clojure.java.io/reader \"/temp/bar.xml\")]\n (xml/parse input)))\n;;=> #clojure.data.xml.Element{:tag :foo, :attrs {:foo-attr \"foo value\"}, \n;; :content \n;; (#clojure.data.xml.Element{:tag :bar, :attrs {:bar-attr \"bar value\"},\n;; :content \n;; (#clojure.data.xml.Element{:tag :baz, :attrs {}, :content (\"The baz value\")})})}", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1434481387584, :updated-at 1434481476334, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :_id "558072ebe4b01ad59b65f4fa"} {:updated-at 1495636148152, :created-at 1495636148152, :author {:login "jasonmm", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/2171623?v=3"}, :body ";; When a Writer is created from a Socket using `with-open`, the \n;; underlying Socket is closed along with the Writer.\n\n;; Create the Socket.\n(require '[clojure.java.io :as io])\n(def socket (java.net.Socket.))\n(.connect socket (java.net.InetSocketAddress. \"www.google.com\" 80))\n(.isClosed socket)\n;;=> false\n\n;; Write to the Socket.\n(with-open [w (io/writer socket)]\n (.write w \"GET / HTTP/1.0\\n\\n\")\n (.flush w))\n(.isClosed socket)\n;;=> true\n\n;; Attempt to read from the Socket.\n(with-open [r (io/reader socket)\n s (java.io.StringWriter.)]\n (io/copy r s))\n;;=> java.net.SocketException: Socket is closed\n", :_id "592598b4e4b093ada4d4d722"}], :notes nil, :tag "java.io.Writer", :arglists ["x & opts"], :doc "Attempts to coerce its argument into an open java.io.Writer.\n Default implementations always return a java.io.BufferedWriter.\n\n Default implementations are provided for Writer, BufferedWriter,\n OutputStream, File, URI, URL, Socket, and String.\n\n If the argument is a String, it tries to resolve it first as a URI, then\n as a local file name. URIs with a 'file' protocol are converted to\n local file names.\n\n Should be used inside with-open to ensure the Writer is properly\n closed.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/writer"} {:added "1.2", :ns "clojure.java.io", :name "as-url", :type "function", :see-alsos [{:created-at 1561545843452, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "file", :ns "clojure.java.io"}, :_id "5d134c73e4b0ca44402ef76b"}], :examples [{:updated-at 1561545860751, :created-at 1306270061000, :body "(use '[clojure.java.io :only (as-url)])\n(import 'java.io.File)\n\nuser=> (as-url nil)\nnil\n\nuser=> (as-url (File. \"/tmp\"))\n#\n\nuser=> (as-url \"http://clojuredocs.org\")\n#\n\nuser=> (as-url \"http://clojuredocs.org:8080\")\n#\n\nuser=> (as-url \"clojuredocs.org\")\n#", :editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/567898c496278341be69087507d5ed24?r=PG&default=identicon", :account-source "clojuredocs", :login "Jeff Rose"}, :_id "542692d0c026201cdc326ebc"} {:updated-at 1561545787852, :created-at 1561545787852, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; How to extend \"io/as-url\" or \"io/file\" to handle additional types,\n;; for example \"java.nio.file.Path\":\n\n(require '[clojure.java.io :as io])\n(import '[java.nio.file Path FileSystems])\n\n(extend-protocol io/Coercions\n Path\n (as-file [path] (io/file (.toUri path)))\n (as-url [path] (io/as-url (.toUri path))))\n\n(def path\n (.. FileSystems\n getDefault\n (getPath \"/usr\" \n (into-array String [\"share\" \"dict\" \"words\"]))))\n\n(io/as-url path)\n;; #object[java.net.URL 0x1255fa42 \"file:\"/usr/share/dict/words\"]\n\n(io/file path)\n;; #object[java.io.File 0x1c80a235 \"/usr/share/dict/words\"]", :_id "5d134c3be4b0ca44402ef76a"}], :notes nil, :tag "java.net.URL", :arglists ["x"], :doc "Coerce argument to a URL.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/as-url"} {:added "1.2", :ns "clojure.java.io", :name "reader", :file "clojure/java/io.clj", :type "function", :column 1, :see-alsos [{:created-at 1324516916000, :author {:login "cgray", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7fe6255dbe4806a588cc06a5ba4a5d82?r=PG&default=identicon"}, :to-var {:ns "clojure.java.io", :name "writer", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cce"} {:created-at 1329988254000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "input-stream", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ccf"} {:created-at 1329988703000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "IOFactory", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cd0"} {:created-at 1334796117000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "slurp", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cd1"}], :line 86, :examples [{:author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :editors [], :body "(with-open [rdr (clojure.java.io/reader \"/tmp/foo.txt\")]\n (reduce conj [] (line-seq rdr)))", :created-at 1290297729000, :updated-at 1290297729000, :_id "542692d0c026201cdc326eb8"} {:updated-at 1507915508004, :created-at 1324315042000, :body "(with-open [rdr (clojure.java.io/reader \"http://www.google.com\")]\n (printf \"%s\\n\" (clojure.string/join \"\\n\" (line-seq rdr))))\n;; nil", :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}, :_id "542692d6c026201cdc3270db"} {:updated-at 1561057591570, :created-at 1561057591570, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Sometimes it's useful to create a reader from a string, but strings\n;; are locations for \"reader\", so we turn them into char-arrays first:\n\n(require '[clojure.java.io :as io])\n\n(with-open [r (io/reader (char-array \"hello\"))] (slurp r))\n;; \"hello\"", :_id "5d0bd937e4b0ca44402ef75a"}], :notes [{:updated-at 1387185171000, :body "Java documentation links for the listed argument types that have “default implementationsâ€�:\r\n\r\n* [`Reader`](http://docs.oracle.com/javase/7/docs/api/java/io/Reader.html)\r\n* [`BufferedReader`](http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html)\r\n* [`InputStream`](http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html)\r\n* [`File`](http://docs.oracle.com/javase/7/docs/api/java/io/File.html)\r\n* [`URI`](http://docs.oracle.com/javase/7/docs/api/java/net/URI.html)\r\n* [`URL`](http://docs.oracle.com/javase/7/docs/api/java/net/URL.html)\r\n* [`Socket`](http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html)\r\n* byte arrays (`byte[]`)\r\n* character arrays (`char[]`)\r\n* [`String`](http://docs.oracle.com/javase/7/docs/api/java/lang/String.html) (resolved as a URI or a local file name)", :created-at 1387185171000, :author {:login "roryokane", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5b2b185c814bb25f2f95a1152e58f033?r=PG&default=identicon"}, :_id "542692edf6e94c6970522016"} {:author {:login "jakubholynet", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/624958?v=3"}, :updated-at 1436102372053, :created-at 1436102372053, :body "`opts` depend on the type of the reader but [common ones include](https://github.com/clojure/clojure/blob/cc69d19bd471c48d441071fff43e768ffa7eb8e5/src/clj/clojure/java/io.clj) `:encoding` and, where applicable, `:buffer-size`.", :_id "55992ee4e4b020189d740547"}], :tag "java.io.Reader", :arglists ["x & opts"], :doc "Attempts to coerce its argument into an open java.io.Reader.\n Default implementations always return a java.io.BufferedReader.\n\n Default implementations are provided for Reader, BufferedReader,\n InputStream, File, URI, URL, Socket, byte arrays, character arrays,\n and String.\n\n If argument is a String, it tries to resolve it first as a URI, then\n as a local file name. URIs with a 'file' protocol are converted to\n local file names.\n\n Should be used inside with-open to ensure the Reader is properly\n closed.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/reader"} {:added "1.2", :ns "clojure.java.javadoc", :name "javadoc", :file "clojure/java/javadoc.clj", :type "function", :column 1, :see-alsos [{:created-at 1332796364000, :author {:login "Olivenmann", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d5b1703fb08dd81e4cb2f653a3aaf10b?r=PG&default=identicon"}, :to-var {:ns "clojure.repl", :name "doc", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cb0"} {:created-at 1619379527003, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "*local-javadocs*", :ns "clojure.java.javadoc"}, :_id "6085c547e4b0b1e3652d74e8"} {:created-at 1619379537456, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "*remote-javadocs*", :ns "clojure.java.javadoc"}, :_id "6085c551e4b0b1e3652d74e9"}], :line 77, :examples [{:author {:login "abhin4v", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4d29918c109bc75d2a1fd8420660d72b?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (use 'clojure.java.javadoc)\nnil\n\nuser=> (javadoc String)\n\"http://java.sun.com/javase/6/docs/api/java/lang/String.html\"\n\nuser=> (javadoc (java.util.Date.))\n\"http://java.sun.com/javase/6/docs/api/java/util/Date.html\"\n", :created-at 1283270938000, :updated-at 1285492232000, :_id "542692d0c026201cdc326ebd"} {:author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :editors [], :body "user> (javadoc 1)\n\"http://java.sun.com/javase/7/docs/api/java/lang/Long.html\"\n\n(javadoc \"abc\")\n\"http://java.sun.com/javase/7/docs/api/java/lang/String.html\"", :created-at 1397981916000, :updated-at 1397981916000, :_id "542692d6c026201cdc3270e0"} {:author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :editors [], :body "user> (javadoc org.joda.time.DateTime)\n\"http://www.google.com/search?btnI=I%27m%20Feeling%20Lucky&q=allinurl:org/joda/time/DateTime.html\"", :created-at 1397981945000, :updated-at 1397981945000, :_id "542692d6c026201cdc3270e1"}], :notes nil, :arglists ["class-or-object"], :doc "Opens a browser window displaying the javadoc for the argument.\n Tries *local-javadocs* first, then *remote-javadocs*.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.javadoc/javadoc"} {:added "1.2", :ns "clojure.java.javadoc", :name "add-local-javadoc", :file "clojure/java/javadoc.clj", :type "function", :column 1, :see-alsos [{:created-at 1619379450941, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "javadoc", :ns "clojure.java.javadoc"}, :_id "6085c4fae4b0b1e3652d74e6"} {:created-at 1619379489484, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "*local-javadocs*", :ns "clojure.java.javadoc"}, :_id "6085c521e4b0b1e3652d74e7"}], :line 43, :examples [{:updated-at 1619379433450, :created-at 1619379433450, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :body "(require '[clojure.java.javadoc :as javadoc])\n\n;; After extracting JDK 11 Javadocs into ~/javadocs/jdk11\n(javadoc/add-local-javadoc \n (str (System/getProperty \"user.home\")\n \"/javadocs/jdk11/api/java.base\"))\n\n;; Open default browser showing java.io.PrintStream\n(javadoc/javadoc System/out)\n", :_id "6085c4e9e4b0b1e3652d74e5"}], :notes nil, :arglists ["path"], :doc "Adds to the list of local Javadoc paths.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.javadoc/add-local-javadoc"} {:ns "clojure.java.javadoc", :name "*core-java-api*", :file "clojure/java/javadoc.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 21, :examples nil, :notes [{:author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :updated-at 1619367585052, :created-at 1619367585052, :body "Effectively read-only. `*core-java.api*` returns the JDK 7 version of Javadoc by default (unless you run Clojure with the JDK 6). This is the version of the documentation that the rest of `clojure.java.javadoc` uses for the Java core API.", :_id "608596a1e4b0b1e3652d74e4"}], :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.java.javadoc/*core-java-api*"} {:ns "clojure.java.javadoc", :name "*feeling-lucky-url*", :file "clojure/java/javadoc.clj", :type "var", :column 1, :see-alsos [{:created-at 1534516213976, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "*feeling-lucky*", :ns "clojure.java.javadoc"}, :_id "5b76dbf5e4b00ac801ed9e67"}], :dynamic true, :line 16, :examples [{:updated-at 1534515944915, :created-at 1534515944915, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :body ";; If `clojure.java.javadoc/*feeling-lucky*` is true,\n;; clojure.java.javadoc/javadoc opens a browser with this URL if it can’t\n;; find the proper documentation URL (e.g. if it’s a custom class).\n\n;; Default value\n*feeling-lucky-url*\n; => \"http://www.google.com/search?btnI=I%27m%20Feeling%20Lucky&q=allinurl:\"\n\n;; Use DuckDuckGo instead of Google\n(binding [clojure.java.javadoc/*feeling-lucky-url* \"https://duckduckgo.com/?q=\\\\\"]\n (clojure.java.javadoc/javadoc your-class))", :_id "5b76dae8e4b00ac801ed9e65"}], :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.java.javadoc/*feeling-lucky-url*"} {:ns "clojure.java.javadoc", :name "*local-javadocs*", :file "clojure/java/javadoc.clj", :type "var", :column 1, :see-alsos [{:created-at 1619365716926, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "add-local-javadoc", :ns "clojure.java.javadoc"}, :_id "60858f54e4b0b1e3652d74e0"}], :dynamic true, :line 19, :examples [{:updated-at 1619365889369, :created-at 1619365824236, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :body "(require '[clojure.java.javadoc :as javadoc])\n\n;; Assuming \"~/javadocs/jdk11/api/java.base\" exists:\n\n(def jdk11-javadoc\n (str (System/getProperty \"user.home\")\n \"/javadocs/jdk11/api/java.base\"))\n\n;; Alter the local Javadoc folders for the current thread.\n;; Use javadoc/add-local-javadoc to alter permanently.\n;; Opens java.lang.Object.html for Java 11 instead of 7 (default).\n\n(binding [javadoc/*local-javadocs* (ref [jdk11-javadoc])]\n (javadoc/javadoc (Object.)))\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "60858fc0e4b0b1e3652d74e1"}], :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.java.javadoc/*local-javadocs*"} {:added "1.2", :ns "clojure.java.javadoc", :name "add-remote-javadoc", :file "clojure/java/javadoc.clj", :type "function", :column 1, :see-alsos [{:created-at 1561982333040, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "add-local-javadoc", :ns "clojure.java.javadoc"}, :_id "5d19f57de4b0ca44402ef77d"}], :line 49, :examples [{:author {:login "linxiangyu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2c7492645426ece4ae86fde83d61bd03?r=PG&default=identicon"}, :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}], :body "user=> (use 'clojure.java.javadoc)\nnil\n\nuser=> (add-remote-javadoc \"org.apache.commons.csv.\"\n \"http://commons.apache.org/proper/commons-csv/apidocs/index.html\")\n{\"java.\" \"http://java.sun.com/javase/6/docs/api/\",\n \"javax.\" \"http://java.sun.com/javase/6/docs/api/\",\n \"org.apache.commons.codec.\" \"http://commons.apache.org/codec/api-release/\",\n \"org.apache.commons.csv.\" \"http://commons.apache.org/proper/commons-csv/apidocs/index.html\",\n \"org.apache.commons.io.\" \"http://commons.apache.org/io/api-release/\",\n \"org.apache.commons.lang.\" \"http://commons.apache.org/lang/api-release/\",\n \"org.ietf.jgss.\" \"http://java.sun.com/javase/6/docs/api/\",\n \"org.omg.\" \"http://java.sun.com/javase/6/docs/api/\",\n \"org.w3c.dom.\" \"http://java.sun.com/javase/6/docs/api/\",\n \"org.xml.sax.\" \"http://java.sun.com/javase/6/docs/api/\"}", :created-at 1369812981000, :updated-at 1497949372886, :_id "542692d6c026201cdc3270df"} {:updated-at 1561982312102, :created-at 1561982312102, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Replace the JavaDoc URLs for the current JDK version.\n\n(require '[clojure.java.javadoc :as browse])\n\n(def java-version\n (let [jsv (System/getProperty \"java.specification.version\")]\n (if-let [single-digit (last (re-find #\"^\\d\\.(\\d+).*\" jsv))]\n single-digit jsv)))\n\n(def jdocs-template\n (format \"https://docs.oracle.com/javase/%s/docs/api/\" java-version))\n\n(def known-prefix\n [\"java.\" \"javax.\" \"org.ietf.jgss.\" \"org.omg.\"\n \"org.w3c.dom.\" \"org.xml.sax.\"])\n\n(doseq [prefix known-prefix]\n (browse/add-remote-javadoc prefix jdocs-template))", :_id "5d19f568e4b0ca44402ef77c"}], :notes nil, :arglists ["package-prefix url"], :doc "Adds to the list of remote Javadoc URLs. package-prefix is the\n beginning of the package name that has docs at this URL.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.javadoc/add-remote-javadoc"} {:ns "clojure.java.javadoc", :name "*remote-javadocs*", :file "clojure/java/javadoc.clj", :type "var", :column 1, :see-alsos [{:created-at 1619365573969, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "add-remote-javadoc", :ns "clojure.java.javadoc"}, :_id "60858ec5e4b0b1e3652d74de"}], :dynamic true, :line 29, :examples [{:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}], :body "(require '[clojure.java.javadoc :as javadoc])\n\n(def clojure-javadoc\n \"https://javadoc.io/doc/org.clojure/clojure/latest/\")\n\n;; Altering the Javadoc remote locations for the current thread.\n;; Use javadoc/add-remote-javadoc to alter permanently.\n\n(binding [javadoc/*remote-javadocs*\n (ref {\"clojure.\" clojure-javadoc})]\n (javadoc/javadoc []))", :author {:avatar-url "https://avatars.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1619365561620, :updated-at 1619365626070, :_id "60858eb9e4b0b1e3652d74dd"}], :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.java.javadoc/*remote-javadocs*"} {:ns "clojure.java.javadoc", :name "*feeling-lucky*", :file "clojure/java/javadoc.clj", :type "var", :column 1, :see-alsos [{:created-at 1534516222829, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "*feeling-lucky-url*", :ns "clojure.java.javadoc"}, :_id "5b76dbfee4b00ac801ed9e68"}], :dynamic true, :line 17, :examples [{:updated-at 1534516142907, :created-at 1534516142907, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :body ";; If true, clojure.java.javadoc/javadoc opens a browser using\n;; *feeling-lucky-url* when it can’t find the proper documentation URL\n;; for a class.\n\n;; opens a browser with *feeling-lucky-url*\n(clojure.java.javadoc/javadoc inc)\n\n;; prints \"Could not find Javadoc for clojure.core$inc\"\n(binding [clojure.java.javadoc/*feeling-lucky* false] \n (clojure.java.javadoc/javadoc inc))", :_id "5b76dbaee4b00ac801ed9e66"}], :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.java.javadoc/*feeling-lucky*"} {:added "1.2", :ns "clojure.java.shell", :name "sh", :file "clojure/java/shell.clj", :type "function", :column 1, :see-alsos [{:created-at 1332915179000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.shell", :name "with-sh-dir", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e1b"} {:created-at 1332915183000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.shell", :name "with-sh-env", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e1c"} {:created-at 1336536810000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "future", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e1d"} {:created-at 1661552183304, :author {:login "djblue", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1986211?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "shutdown-agents", :ns "clojure.core"}, :_id "63094637e4b0b1e3652d765c"}], :line 79, :examples [{:author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :editors [{:login "juergenhoetzel", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2736dfffc803c704dcf25b45ff63cede?r=PG&default=identicon"} {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (use '[clojure.java.shell :only [sh]])\n\n;; Note: The actual output you see from a command like this will look messier.\n;; The output below has had all newline characters replaced with line\n;; breaks. You would see a big long string with \\n characters in the middle.\nuser=> (sh \"ls\" \"-aul\")\n\n{:exit 0, \n :out \"total 64\ndrwxr-xr-x 11 zkim staff 374 Jul 5 13:21 .\ndrwxr-xr-x 25 zkim staff 850 Jul 5 13:02 ..\ndrwxr-xr-x 12 zkim staff 408 Jul 5 13:02 .git\n-rw-r--r-- 1 zkim staff 13 Jul 5 13:02 .gitignore\n-rw-r--r-- 1 zkim staff 12638 Jul 5 13:02 LICENSE.html\n-rw-r--r-- 1 zkim staff 4092 Jul 5 13:02 README.md\ndrwxr-xr-x 2 zkim staff 68 Jul 5 13:15 classes\ndrwxr-xr-x 5 zkim staff 170 Jul 5 13:15 lib\n-rw-r--r--@ 1 zkim staff 3396 Jul 5 13:03 pom.xml\n-rw-r--r--@ 1 zkim staff 367 Jul 5 13:15 project.clj\ndrwxr-xr-x 4 zkim staff 136 Jul 5 13:15 src\n\", :err \"\"}", :created-at 1278383022000, :updated-at 1332916119000, :_id "542692d0c026201cdc326ebf"} {:author {:login "secondplanet", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/6c3417477c007600db59c4a94718ee43?r=PG&default=identicon"}, :editors [], :body "user=> (use '[clojure.java.shell :only [sh]])\n\nuser=> (println (:out (sh \"cowsay\" \"Printing a command-line output\")))\n\n _________________________________ \n< Printing a command-line output. >\n --------------------------------- \n \\ ^__^\n \\ (oo)\\_______\n (__)\\ )\\/\\\n ||----w |\n || ||\n\nnil", :created-at 1313622736000, :updated-at 1313622736000, :_id "542692d0c026201cdc326ec4"} {:author {:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"}, :editors [{:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"} {:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"} {:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"} {:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"}], :body "user=> (use '[clojure.java.shell :only [sh]])\nnil\n\n;; note that the options, like :in, have to go at the end of arglist\n;; advantage of piping-in thru stdin is less need for quoting/escaping\nuser=> (println (:out (sh \"cat\" \"-\" :in \"Printing input from stdin with funny chars like ' \\\" $@ & \")))\nPrinting input from stdin with funny chars like ' \" $@ & \nnil", :created-at 1331269027000, :updated-at 1331270505000, :_id "542692d6c026201cdc3270e2"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; sh is implemented using Clojure futures. See examples for 'future'\n;; for discussion of an undesirable 1-minute wait that can occur before\n;; your standalone Clojure program exits if you do not use shutdown-agents.", :created-at 1336536805000, :updated-at 1336536828000, :_id "542692d6c026201cdc3270e7"} {:author {:login "octopusgrabbus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon"}, :editors [], :body "(sh \"pwd\" :dir \"/home/ics/icsdev\")\n{:exit 0, :out \"/home/ics/icsdev\\n\", :err \"\"}", :created-at 1398214606000, :updated-at 1398214606000, :_id "542692d6c026201cdc3270e9"} {:author {:login "octopusgrabbus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon"}, :editors [], :body "(require '[clojure.java.shell :as shell])\n(shell/sh \"sh\" \"-c\" \"cd /etc; pwd\")\n{:exit 0, :out \"/etc\\n\", :err \"\"}", :created-at 1398221530000, :updated-at 1398221530000, :_id "542692d6c026201cdc3270ea"} {:updated-at 1510403291191, :created-at 1510403291191, :author {:login "Atsman", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/3405704?v=4"}, :body ";; note that you have to split you script by whitespace \n;; that was confusing for me \n;; for example script: \n;; \"terraform plan -var param1=value1 -var param2=value2 -var-file=/etc/var.tfvars\"\n\n(shell/sh \"terraform\" \"plan\" \"-var\" \"param=value\" \"-var\" \"param2=value2\" \"-var-file=/etc/var.tfvars\")", :_id "5a06ecdbe4b0a08026c48cae"} {:updated-at 1539183276794, :created-at 1539183276794, :author {:login "claj", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/353113?v=4"}, :body ";; feed the sh with environment variables\n;; (note that $HELLO in our command line wouldn't work since we act as the shell here)\n\n(require '[clojure.java.shell :as shell])\n(shell/sh \"printenv\" \"HELLO\" :env {\"HELLO\" \"Hello, World!\"})\n{:exit 0, :out \"Hello, World!\\n\", :err \"\"}\n\n", :_id "5bbe12ace4b00ac801ed9ece"} {:updated-at 1539186762145, :created-at 1539186710931, :author {:login "claj", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/353113?v=4"}, :body ";; override environment variables\n;; BAD EXAMPLE since i guess lein uses a lot of env vars for coordination\n;; but anyway\n\n(require '[clojure.java.shell :as shell])\n\n(sh/sh \"lein\" \"compile\")\n{:exit 0,\n :out\n \"WARNING: You have $CLASSPATH set, probably by accident.\n It is strongly recommended to unset this before proceeding.\",\n :err \"\"}\n\n;; note that\n(sh/sh \"lein\" \"compile\" :env {})\n;; will make lein quite confused.\n\n;; we better modify the current env:\n\n(let [current-env (into {} (System/getenv))]\n (sh/sh \"lein\" \"compile\" :env (dissoc current-env \"CLASSPATH\"))\n{:exit 0, :out \"\", :err \"\"}\n\n\n;; (into {} ...) is needed because System/getenv returns a map of type\n;; java.util.Collections$UnmodifiableMap", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/353113?v=4", :account-source "github", :login "claj"}], :_id "5bbe2016e4b00ac801ed9ecf"} {:updated-at 1618300543742, :created-at 1618300543742, :author {:login "Saikyun", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2477927?v=4"}, :body ";; on windows, the above examples won't work. try with an exe instead :)\n(require '[clojure.java.shell :as shell])\n(shell/sh \"notepad.exe\")\n;; now notepad should be open!", :_id "60754e7fe4b0b1e3652d74c5"} {:editors [{:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}], :body ";; On Windows, the Java shell needs to execute a program \n;; that executes the command: usually PowerShell, Bash, or cmd. \n\n;; So your `sh` function should invoke \"powershell\" OR \"bash\" and -c\" \n;; OR \"cmd and \"/c\" before your command. \n\n;; Instead of \n(clojure.java.shell/sh \"ls\")\n\n;; you would do this\n\n(clojure.java.shell/sh \"powershell\" \"ls\")\n\n;; or this\n\n(clojure.java.shell/sh \"bash\" \"-c\" \"ls\")\n\n;; or this\n\n(clojure.java.shell/sh \"cmd\" \"/c\" \"dir\") ;; No `ls` or `pwd` in cmd. \n\n;; (I first learned about the need for command flags like \"/c\" here: \n;; https://stackoverflow.com/a/4031412/2596132\n\n;; These Microsoft docs explain the \"/c\" flag: \n;; https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd\n\n;; I learned of bash's \"-c\" flag after finding `exec` in `bash -c help` as suggested\n;; from `bash --help. I didn't know that `-c` was the command flag at the time.)", :author {:avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4", :account-source "github", :login "Crowbrammer"}, :created-at 1673135391810, :updated-at 1673136173848, :_id "63ba051fe4b08cf8563f4b5e"}], :notes [{:author {:login "ejschoen", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/10605666?v=3"}, :updated-at 1493923269271, :created-at 1493923269271, :body "It's worth noting that sh begins interpreting arguments starting with the first non-string (not just keywords!) as key-value pairs, as in the example above with pwd. This means that even if an argument's type has a trivial conversion to a string, such as an integer or boolean, it must be stringified. If not, it'll be passed as an argument to hash-map, and you might see an IllegalArgumentException if there are an odd number of arguments beginning with the first non-string.", :_id "590b75c5e4b01f4add58feab"} {:author {:login "geokon-gh", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/21017379?v=4"}, :updated-at 1550146015552, :created-at 1550146015552, :body "As noted in the [4th example](http://clojuredocs.org/clojure.java.shell/sh#example-542692d6c026201cdc3270e7), `sh` uses futures. This means that if your program uses `sh` and then finishes its execution it will unexpectedly hang and not terminate/exit. The `sh` future will still be alive in the background and will be holding up the program. \n\nThis is a bit confusing when you first try to use Clojure for scripting as it looks like your script doesn't exit naturally. Furthermore, when you run `sh` in the REPL the background futures aren't apparent to the user and everything works as-expected\n\nTo fix the situation you can either run `(System/exit 0)` to terminate your program explicitly. Or you can run `(shutdown-agents)` to kill the background future and then the program will exit naturally\n\nFor a discussion of this strange behavior see: https://clojureverse.org/t/why-doesnt-my-program-exit/3754/2", :_id "5c6559dfe4b0ca44402ef684"}], :arglists ["& args"], :doc "Passes the given strings to Runtime.exec() to launch a sub-process.\n\n Options are\n\n :in may be given followed by any legal input source for\n clojure.java.io/copy, e.g. InputStream, Reader, File, byte[],\n or String, to be fed to the sub-process's stdin.\n :in-enc option may be given followed by a String, used as a character\n encoding name (for example \"UTF-8\" or \"ISO-8859-1\") to\n convert the input string specified by the :in option to the\n sub-process's stdin. Defaults to UTF-8.\n If the :in option provides a byte array, then the bytes are passed\n unencoded, and this option is ignored.\n :out-enc option may be given followed by :bytes or a String. If a\n String is given, it will be used as a character encoding\n name (for example \"UTF-8\" or \"ISO-8859-1\") to convert\n the sub-process's stdout to a String which is returned.\n If :bytes is given, the sub-process's stdout will be stored\n in a byte array and returned. Defaults to UTF-8.\n :env override the process env with a map (or the underlying Java\n String[] if you are a masochist).\n :dir override the process dir with a String or java.io.File.\n\n You can bind :env or :dir for multiple operations using with-sh-env\n and with-sh-dir.\n\n sh returns a map of\n :exit => sub-process's exit code\n :out => sub-process's stdout (as byte[] or String)\n :err => sub-process's stderr (String via platform default encoding)", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.shell/sh"} {:ns "clojure.java.shell", :name "*sh-dir*", :file "clojure/java/shell.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 18, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.java.shell/*sh-dir*"} {:added "1.2", :ns "clojure.java.shell", :name "with-sh-dir", :file "clojure/java/shell.clj", :type "macro", :column 1, :see-alsos [{:created-at 1332915149000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.shell", :name "sh", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f48"}], :line 21, :examples [{:updated-at 1560006443938, :created-at 1560006443938, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body "(require '[clojure.java.shell :as shell :refer [sh]])\n\n(shell/with-sh-dir \"/usr/share\"\n (sh \"pwd\"))\n\n;; {:exit 0, :out \"/usr/share\\n\", :err \"\"}\n", :_id "5cfbcf2be4b0ca44402ef751"}], :macro true, :notes nil, :arglists ["dir & forms"], :doc "Sets the directory for use with sh, see sh for details.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.shell/with-sh-dir"} {:ns "clojure.java.shell", :name "*sh-env*", :file "clojure/java/shell.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 19, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.java.shell/*sh-env*"} {:added "1.2", :ns "clojure.java.shell", :name "with-sh-env", :file "clojure/java/shell.clj", :type "macro", :column 1, :see-alsos [{:created-at 1332915161000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.shell", :name "sh", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f58"}], :line 28, :examples [{:updated-at 1560006506866, :created-at 1560006506866, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body "(require '[clojure.java.shell :as shell :refer [sh]])\n\n(shell/with-sh-env {:debug \"true\"}\n (sh \"env\"))\n\n;; {:exit 0, :out \"debug=true\\n\", :err \"\"}\n", :_id "5cfbcf6ae4b0ca44402ef752"}], :macro true, :notes nil, :arglists ["env & forms"], :doc "Sets the environment for use with sh, see sh for details.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.shell/with-sh-env"} {:ns "clojure.main", :name "main", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 616, :examples [{:body "java -cp clojure-1.6.0.jar clojure.main hey.clj", :author {:login "ganeshskm", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2527539?v=3"}, :created-at 1418110038171, :updated-at 1418110038171, :_id "5486a456e4b04e93c519ff9f"}], :notes nil, :arglists ["& args"], :doc "Usage: java -cp clojure.jar clojure.main [init-opt*] [main-opt] [arg*]\n\n With no options or args, runs an interactive Read-Eval-Print Loop\n\n init options:\n -i, --init path Load a file or resource\n -e, --eval string Evaluate expressions in string; print non-nil values\n --report target Report uncaught exception to \"file\" (default), \"stderr\",\n or \"none\", overrides System property clojure.main.report\n\n main options:\n -m, --main ns-name Call the -main function from a namespace with args\n -r, --repl Run a repl\n path Run a script from a file or resource\n - Run a script from standard input\n -h, -?, --help Print this help message and exit\n\n operation:\n\n - Establishes thread-local bindings for commonly set!-able vars\n - Enters the user namespace\n - Binds *command-line-args* to a seq of strings containing command line\n args that appear after any main option\n - Runs all init options in order\n - Calls a -main function or runs a repl or script if requested\n\n The init options may be repeated and mixed freely, but must appear before\n any main option. The appearance of any eval option before running a repl\n suppresses the usual repl greeting message: \"Clojure ~(clojure-version)\".\n\n Paths may be absolute or relative in the filesystem or relative to\n classpath. Classpath-relative paths have prefix of @ or @/", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/main"} {:ns "clojure.main", :name "with-bindings", :file "clojure/main.clj", :type "macro", :column 1, :see-alsos [{:created-at 1374149313000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "binding", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a83"} {:created-at 1374149334000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-local-vars", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a84"} {:created-at 1374149343000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-redefs-fn", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a85"}], :line 77, :examples nil, :macro true, :notes nil, :arglists ["& body"], :doc "Executes body in the context of thread-local bindings for several vars\n that often need to be set!: *ns* *warn-on-reflection* *math-context*\n *print-meta* *print-length* *print-level* *compile-path*\n *command-line-args* *1 *2 *3 *e", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/with-bindings"} {:added "1.3", :ns "clojure.main", :name "stack-element-str", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 62, :examples nil, :notes nil, :arglists ["el"], :doc "Returns a (possibly unmunged) string representation of a StackTraceElement", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/stack-element-str"} {:ns "clojure.main", :name "repl-caught", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 348, :examples nil, :notes nil, :arglists ["e"], :doc "Default :caught hook for repl", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/repl-caught"} {:ns "clojure.main", :name "repl-exception", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 172, :examples nil, :notes nil, :arglists ["throwable"], :doc "Returns the root cause of throwables", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/repl-exception"} {:ns "clojure.main", :name "err->msg", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 343, :examples nil, :notes nil, :arglists ["e"], :doc "Helper to return an error message string from an exception.", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/err->msg"} {:ns "clojure.main", :name "repl-read", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 154, :examples nil, :notes nil, :arglists ["request-prompt request-exit"], :doc "Default :read hook for repl. Reads from *in* which must either be an\n instance of LineNumberingPushbackReader or duplicate its behavior of both\n supporting .unread and collapsing all of CR, LF, and CRLF into a single\n \\newline. repl-read:\n - skips whitespace, then\n - returns request-prompt on start of line, or\n - returns request-exit on end of stream, or\n - reads an object from the input stream, then\n - skips the next input character if it's end of line, then\n - returns the object.", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/repl-read"} {:ns "clojure.main", :name "load-script", :file "clojure/main.clj", :type "function", :column 1, :see-alsos [{:created-at 1422652999747, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=2"}, :to-var {:ns "clojure.core", :name "read-string", :library-url "https://github.com/clojure/clojure"}, :_id "54cbf647e4b0e2ac61831cee"} {:created-at 1422653011235, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=2"}, :to-var {:ns "clojure.edn", :name "read-string", :library-url "https://github.com/clojure/clojure"}, :_id "54cbf653e4b081e022073c3c"}], :line 468, :examples [{:body ";; In file /some/path/to-script.clj\n;; (ns test)\n;; \n;; (defn greet [name]\n;; (str \"Hello \" name))\n\n;; from repl\nuser=> (clojure.main/load-script \"/some/path/to-script.clj\")\n#'test/greet\nuser=> (greet \"Peter\")\n\"Hello Peter\"\n\n;; to load hello.clj from current directory\nuser=> (clojure.main/load-script \"hello.clj\")\n\n;; to load some-code.clj from class path\nuser=> (clojure.main/load-script \"@some-code.clj\")\n", :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=2"}, :created-at 1422652901571, :updated-at 1422652901571, :_id "54cbf5e5e4b0e2ac61831ced"}], :notes nil, :arglists ["path"], :doc "Loads Clojure source from a file or resource given its path. Paths\n beginning with @ or @/ are considered relative to classpath.", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/load-script"} {:ns "clojure.main", :name "skip-if-eol", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 108, :examples nil, :notes nil, :arglists ["s"], :doc "If the next character on stream s is a newline, skips it, otherwise\n leaves the stream untouched. Returns :line-start, :stream-end, or :body\n to indicate the relative location of the next character on s. The stream\n must either be an instance of LineNumberingPushbackReader or duplicate\n its behavior of both supporting .unread and collapsing all of CR, LF, and\n CRLF to a single \\newline.", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/skip-if-eol"} {:ns "clojure.main", :name "skip-whitespace", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 122, :examples [{:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; Use while reading characters from a LineNumberingPushbackReader\n;; to jump to the next available \":body\", skipping whites spaces \n;; line starts, comment lines, until \":stream-end\".\n\n(require '[clojure.main :as main])\n\n(defn string-reader [s] \n (-> (java.io.StringReader. s)\n (clojure.lang.LineNumberingPushbackReader.)))\n\n(def r \n (string-reader \n \" A\\n B\\n; comment\\n C\"))\n\n(char (.read r)) ;; \\space\n(main/skip-whitespace r) ;; :body\n(char (.read r)) ;; \\A\n(main/skip-whitespace r) ;; :line-start\n(main/skip-whitespace r) ;; :body\n(char (.read r)) ;; \\B\n(main/skip-whitespace r) ;; :line-start\n(main/skip-whitespace r) ;; :line-start\n(main/skip-whitespace r) ;; :body\n(char (.read r)) ;; \\C\n(main/skip-whitespace r) ;; :stream-end", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1559643650513, :updated-at 1559647605018, :_id "5cf64602e4b0ca44402ef749"}], :notes nil, :arglists ["s"], :doc "Skips whitespace characters on stream s. Returns :line-start, :stream-end,\n or :body to indicate the relative location of the next character on s.\n Interprets comma as whitespace and semicolon as comment to end of line.\n Does not interpret #! as comment to end of line because only one\n character of lookahead is available. The stream must either be an\n instance of LineNumberingPushbackReader or duplicate its behavior of both\n supporting .unread and collapsing all of CR, LF, and CRLF to a single\n \\newline.", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/skip-whitespace"} {:ns "clojure.main", :name "report-error", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 584, :examples nil, :notes nil, :arglists ["t & {:keys [target], :or {target \"file\"}, :as opts}"], :doc "Create and output an exception report for a Throwable to target.\n\n Options:\n :target - \"file\" (default), \"stderr\", \"none\"\n\n If file is specified but cannot be written, falls back to stderr.", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/report-error"} {:added "1.3", :ns "clojure.main", :name "root-cause", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 35, :examples nil, :notes nil, :arglists ["t"], :doc "Returns the initial cause of an exception or error by peeling off all of\n its wrappers", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/root-cause"} {:ns "clojure.main", :name "repl-requires", :file "clojure/main.clj", :type "var", :column 1, :see-alsos nil, :line 355, :examples nil, :notes nil, :arglists [], :doc "A sequence of lib specs that are applied to `require`\nby default when a new command-line REPL is started.", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/repl-requires"} {:added "1.3", :ns "clojure.main", :name "demunge", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 28, :examples [{:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [], :body "(use 'clojure.main)\n\n(demunge \"clojure.core$println\")\n=>\"clojure.core/println\"", :created-at 1325041264000, :updated-at 1325041264000, :_id "542692d6c026201cdc3270eb"}], :notes nil, :arglists ["fn-name"], :doc "Given a string representation of a fn class,\n as in a stack trace element, returns a readable version.", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/demunge"} {:ns "clojure.main", :name "with-read-known", :file "clojure/main.clj", :type "macro", :column 1, :see-alsos nil, :line 361, :examples nil, :macro true, :notes nil, :arglists ["& body"], :doc "Evaluates body with *read-eval* set to a \"known\" value,\n i.e. substituting true for :unknown if necessary.", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/with-read-known"} {:added "1.10", :ns "clojure.main", :name "ex-str", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 269, :examples nil, :notes nil, :arglists ["{:clojure.error/keys [phase source path line column symbol class cause spec], :as triage-data}"], :doc "Returns a string from exception data, as produced by ex-triage.\n The first line summarizes the exception phase and location.\n The subsequent lines describe the cause.", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/ex-str"} {:added "1.10", :ns "clojure.main", :name "renumbering-read", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 140, :examples nil, :notes nil, :arglists ["opts reader line-number"], :doc "Reads from reader, which must be a LineNumberingPushbackReader, while capturing\n the read string. If the read is successful, reset the line number and re-read.\n The line number on re-read is the passed line-number unless :line or\n :clojure.core/eval-file meta are explicitly set on the read value.", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/renumbering-read"} {:ns "clojure.main", :name "repl", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 368, :examples [{:updated-at 1559663740765, :created-at 1559663133898, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Create a REPL for a small toy language. A simple calculator \n;; evaluates the 4 arithmetic operators with infix notation.\n\n(require '[clojure.main :as main])\n\n(def repl-options\n [:prompt #(printf \"enter expression :> \")\n :read (fn [request-prompt request-exit]\n (or ({:line-start request-prompt :stream-end request-exit}\n (main/skip-whitespace *in*))\n (re-find #\"^(\\d+)([\\+\\-\\*\\/])(\\d+)$\" (read-line))))\n :eval (fn [[_ x op y]]\n (({\"+\" + \"-\" - \"*\" * \"/\" /} op)\n (Integer. x)\n (Integer. y)))])\n\n;; This enters a new REPL loop that shows a new prompt.\n;; Type ctrl+d to exit the nested REPL and go back to normal.\n(apply main/repl repl-options)\n\n;; An example interaction:\n;; enter expression :> 2*3\n;; 6\n\n\n", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5cf6921de4b0ca44402ef74d"}], :notes nil, :arglists ["& options"], :doc "Generic, reusable, read-eval-print loop. By default, reads from *in*,\n writes to *out*, and prints exception summaries to *err*. If you use the\n default :read hook, *in* must either be an instance of\n LineNumberingPushbackReader or duplicate its behavior of both supporting\n .unread and collapsing CR, LF, and CRLF into a single \\newline. Options\n are sequential keyword-value pairs. Available options and their defaults:\n\n - :init, function of no arguments, initialization hook called with\n bindings for set!-able vars in place.\n default: #()\n\n - :need-prompt, function of no arguments, called before each\n read-eval-print except the first, the user will be prompted if it\n returns true.\n default: (if (instance? LineNumberingPushbackReader *in*)\n #(.atLineStart *in*)\n #(identity true))\n\n - :prompt, function of no arguments, prompts for more input.\n default: repl-prompt\n\n - :flush, function of no arguments, flushes output\n default: flush\n\n - :read, function of two arguments, reads from *in*:\n - returns its first argument to request a fresh prompt\n - depending on need-prompt, this may cause the repl to prompt\n before reading again\n - returns its second argument to request an exit from the repl\n - else returns the next object read from the input stream\n default: repl-read\n\n - :eval, function of one argument, returns the evaluation of its\n argument\n default: eval\n\n - :print, function of one argument, prints its argument to the output\n default: prn\n\n - :caught, function of one argument, a throwable, called when\n read, eval, or print throws an exception or error\n default: repl-caught", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/repl"} {:ns "clojure.main", :name "repl-prompt", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 103, :examples nil, :notes nil, :arglists [""], :doc "Default :prompt hook for repl", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/repl-prompt"} {:added "1.10", :ns "clojure.main", :name "ex-triage", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 208, :examples nil, :notes nil, :arglists ["datafied-throwable"], :doc "Returns an analysis of the phase, error, cause, and location of an error that occurred\n based on Throwable data, as returned by Throwable->map. All attributes other than phase\n are optional:\n :clojure.error/phase - keyword phase indicator, one of:\n :read-source :compile-syntax-check :compilation :macro-syntax-check :macroexpansion\n :execution :read-eval-result :print-eval-result\n :clojure.error/source - file name (no path)\n :clojure.error/path - source path\n :clojure.error/line - integer line number\n :clojure.error/column - integer column number\n :clojure.error/symbol - symbol being expanded/compiled/invoked\n :clojure.error/class - cause exception class symbol\n :clojure.error/cause - cause exception message\n :clojure.error/spec - explain-data for spec error", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/ex-triage"} {:added "1.2", :ns "clojure.pprint", :name "pprint", :file "clojure/pprint/pprint_base.clj", :type "function", :column 1, :see-alsos [{:created-at 1329988989000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.pprint", :name "pp", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e21"} {:created-at 1331448999000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.pprint", :name "print-table", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e22"} {:created-at 1486959495016, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "prn", :ns "clojure.core"}, :_id "58a13387e4b01f4add58fe4e"} {:created-at 1486959503388, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "prn-str", :ns "clojure.core"}, :_id "58a1338fe4b01f4add58fe4f"} {:created-at 1486959509922, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pr", :ns "clojure.core"}, :_id "58a13395e4b01f4add58fe50"} {:created-at 1486959527438, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pr-str", :ns "clojure.core"}, :_id "58a133a7e4b01f4add58fe51"} {:created-at 1518042875271, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pprint-tab", :ns "clojure.pprint"}, :_id "5a7b7efbe4b0316c0f44f8ae"}], :line 241, :examples [{:author {:login "nipra", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/142529?v=3"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "geofffilippi", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/caad97b26450a04c6925249cda76fd74?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body "(def big-map (zipmap \n [:a :b :c :d :e] \n (repeat \n (zipmap [:a :b :c :d :e] \n (take 5 (range))))))\n;;=> #'user/big-map\n\nbig-map\n;;=> {:a {:a 0, :b 1, :c 2, :d 3, :e 4}, :b {:a 0, :b 1, :c 2, :d 3, :e 4}, :c {:a 0, :b 1, :c 2, :d 3, :e 4}, :d {:a 0, :b 1, :c 2, :d 3, :e 4}, :e {:a 0, :b 1, :c 2, :d 3, :e 4}}\n\n(clojure.pprint/pprint big-map)\n;; {:e {:e 4, :d 3, :c 2, :b 1, :a 0},\n;; :d {:e 4, :d 3, :c 2, :b 1, :a 0},\n;; :c {:e 4, :d 3, :c 2, :b 1, :a 0},\n;; :b {:e 4, :d 3, :c 2, :b 1, :a 0},\n;; :a {:e 4, :d 3, :c 2, :b 1, :a 0}}\n;; nil", :created-at 1279160964000, :updated-at 1536169383689, :_id "542692d0c026201cdc326ec5"} {:body ";; suppose you want to pretty print to a file.\n(clojure.pprint/pprint *map* (clojure.java.io/writer \"foo.txt\"))\n;; writes the contents of *map* to a file named 'foo.txt'", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1435609992368, :updated-at 1435609992368, :_id "5591ab88e4b05f167dcf2345"} {:updated-at 1449436011404, :created-at 1449436011404, :author {:login "mrzor", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/54230?v=3"}, :body ";; pprint into a string using with-out-str\n(with-out-str (clojure.pprint/pprint {:x 1 :y -1}))\n;; => \"{:x 1, :y -1}\\n\"\n\n;; pprint into a string using StringWriter\n(let [out (java.io.StringWriter.)]\n (clojure.pprint/pprint {:a 1 :b 2} out)\n (clojure.pprint/pprint {:c 3 :d 4} out)\n (.toString out))\n;; => \"{:a 1, :b 2}\\n{:c 3, :d 4}\\n\"\n", :_id "5664a36be4b09a2675a0ba71"} {:updated-at 1510915362495, :created-at 1510915362495, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;how to use it with :require and :use\n\n;; :require \n(ns example.pprinter\n (:require [clojure.pprint :as pp]))\n\n(def myname \"John Smith\")\n(pp/pprint myname)\n\n--------------\n\n;;:use\n(ns example.pprinter\n (:use clojure.pprint))\n\n(def myname \"John Smith\")\n(pprint myname)", :_id "5a0ebd22e4b0a08026c48cbb"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; get Clojure snippets to print nicely\n(require '[clojure.pprint :as p])\n\n(def lost-formatting \n \"(defn op [sel] (condp = sel :plus + :minus - :mult * \n :div / :rem rem :quot quot :mod mod))\")\n\n(p/with-pprint-dispatch\n p/code-dispatch\n (p/pprint \n (clojure.edn/read-string lost-formatting)))\n\n;; (defn op [sel]\n;; (condp = sel\n;; :plus +\n;; :minus -\n;; :mult *\n;; :div /\n;; :rem rem\n;; :quot quot\n;; :mod mod))", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1536495212985, :updated-at 1536495430265, :_id "5b950e6ce4b00ac801ed9e8a"} {:updated-at 1662581080334, :created-at 1662581080334, :author {:login "djblue", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1986211?v=4"}, :body ";; pprint with metadata, requires Clojure >= 1.10.2\n(require '[clojure.pprint :as p])\n(binding [*print-meta* true]\n (p/pprint ^{:hello :world} {}))", :_id "6318f958e4b0b1e3652d765f"}], :notes [{:body "When using Clojure from the REPL, you don't need to specify `clojure.pprint` to use `pprint` or `pp`. At the REPL `(clojure.pprint x)` is equivalent to `(pprint x)`.", :created-at 1536169564110, :updated-at 1536494583495, :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :_id "5b90165ce4b00ac801ed9e88"}], :arglists ["object" "object writer"], :doc "Pretty print object to the optional output writer. If the writer is not provided, \nprint the object to the currently bound value of *out*.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/pprint"} {:added "1.2", :ns "clojure.pprint", :name "simple-dispatch", :file "clojure/pprint/dispatch.clj", :type "function", :column 1, :see-alsos [{:created-at 1683111333271, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "set-pprint-dispatch", :ns "clojure.pprint"}, :_id "64523da5e4b08cf8563f4bb1"} {:created-at 1683111339705, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "with-pprint-dispatch", :ns "clojure.pprint"}, :_id "64523dabe4b08cf8563f4bb2"}], :line 151, :examples nil, :notes nil, :arglists ["object"], :doc "The pretty print dispatch function for simple data structure format.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/simple-dispatch"} {:added "1.2", :ns "clojure.pprint", :name "get-pretty-writer", :file "clojure/pprint/cl_format.clj", :type "function", :column 1, :see-alsos nil, :line 1203, :examples nil, :notes nil, :arglists ["writer"], :doc "Returns the java.io.Writer passed in wrapped in a pretty writer proxy, unless it's \nalready a pretty writer. Generally, it is unnecessary to call this function, since pprint,\nwrite, and cl-format all call it if they need to. However if you want the state to be \npreserved across calls, you will want to wrap them with this. \n\nFor example, when you want to generate column-aware output with multiple calls to cl-format, \ndo it like in this example:\n\n (defn print-table [aseq column-width]\n (binding [*out* (get-pretty-writer *out*)]\n (doseq [row aseq]\n (doseq [col row]\n (cl-format true \"~4D~7,vT\" col column-width))\n (prn))))\n\nNow when you run:\n\n user> (print-table (map #(vector % (* % %) (* % % %)) (range 1 11)) 8)\n\nIt prints a table of squares and cubes for the numbers from 1 to 10:\n\n 1 1 1 \n 2 4 8 \n 3 9 27 \n 4 16 64 \n 5 25 125 \n 6 36 216 \n 7 49 343 \n 8 64 512 \n 9 81 729 \n 10 100 1000", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/get-pretty-writer"} {:added "1.2", :ns "clojure.pprint", :name "*print-suppress-namespaces*", :file "clojure/pprint/pprint_base.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 72, :examples [{:author {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}, :editors [{:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}], :body "(require '[clojure.pprint :as pp])\n\n(defmacro plus [n1 n2]\n `(+ ~n1 ~n2))\n\n(macroexpand-1 '(plus 3 4))\n;=> (clojure.core/+ 3 4)\n\n\n(alter-var-root #'pp/*print-suppress-namespaces* (constantly true))\n\n(macroexpand-1 '(plus 3 4))\n;=> (clojure.core/+ 3 4)\n\n;; comes into effect only in pprint.\n(pp/pprint (macroexpand-1 '(plus 3 4)))\n;=> (+ 3 4)\n", :created-at 1397944252000, :updated-at 1397944707000, :_id "542692d6c026201cdc3270ec"}], :notes nil, :arglists [], :doc "Don't print namespaces with symbols. This is particularly useful when \npretty printing the results of macro expansions", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/*print-suppress-namespaces*"} {:added "1.2", :ns "clojure.pprint", :name "*print-pretty*", :file "clojure/pprint/pprint_base.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 30, :examples [{:updated-at 1533810134347, :created-at 1533810134347, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :body "(binding [clojure.pprint/*print-right-margin* 5]\n\n ;; Compare the two outputs below:\n\n (binding [clojure.pprint/*print-pretty* true]\n (clojure.pprint/write (range 3)))\n ; Prints:\n ; (0\n ; 1\n ; 2)\n\n (binding [clojure.pprint/*print-pretty* false]\n (clojure.pprint/write (range 3)))\n ; Prints:\n ; (0 1 2)\n)", :_id "5b6c15d6e4b00ac801ed9e48"}], :notes [{:author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :updated-at 1533810194451, :created-at 1533810194451, :body "`clojure.pprint/pprint` always sets `*print-pretty*` to `true` internally, so changing it has no effect if you only use `pprint` and not `write`.", :_id "5b6c1612e4b00ac801ed9e49"}], :arglists [], :doc "Bind to true if you want write to use pretty printing", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/*print-pretty*"} {:added "1.2", :ns "clojure.pprint", :name "*print-pprint-dispatch*", :file "clojure/pprint/pprint_base.clj", :type "var", :column 1, :see-alsos [{:created-at 1619968276432, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "with-pprint-dispatch", :ns "clojure.pprint"}, :_id "608ec114e4b0b1e3652d74ee"}], :dynamic true, :line 34, :examples [{:updated-at 1619968239057, :created-at 1619968239057, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :body "(require '[clojure.pprint :as pprint])\n\n(def condp-statement\n '(condp = x\n 1 \"one\" 2 \"two\" 3 \"three\"\n 4 \"four\" 5 \"five\" 6 \"six\" :else :none))\n\n(binding [pprint/*print-pprint-dispatch* pprint/code-dispatch]\n (pprint/pprint condp-statement))\n;; (condp = x\n;; 1 \"one\"\n;; 2 \"two\"\n;; 3 \"three\"\n;; 4 \"four\"\n;; 5 \"five\"\n;; 6 \"six\"\n;; :else :none)\n", :_id "608ec0efe4b0b1e3652d74ed"}], :notes nil, :arglists [], :doc "The pretty print dispatch function. Use with-pprint-dispatch or set-pprint-dispatch\nto modify.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/*print-pprint-dispatch*"} {:added "1.2", :ns "clojure.pprint", :name "pprint-newline", :file "clojure/pprint/pprint_base.clj", :type "function", :column 1, :see-alsos nil, :line 329, :examples nil, :notes nil, :arglists ["kind"], :doc "Print a conditional newline to a pretty printing stream. kind specifies if the \nnewline is :linear, :miser, :fill, or :mandatory. \n\nThis function is intended for use when writing custom dispatch functions.\n\nOutput is sent to *out* which must be a pretty printing writer.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/pprint-newline"} {:added "1.2", :ns "clojure.pprint", :name "code-dispatch", :file "clojure/pprint/dispatch.clj", :type "function", :column 1, :see-alsos [{:created-at 1683111298261, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "set-pprint-dispatch", :ns "clojure.pprint"}, :_id "64523d82e4b08cf8563f4baf"} {:created-at 1683111307405, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "with-pprint-dispatch", :ns "clojure.pprint"}, :_id "64523d8be4b08cf8563f4bb0"}], :line 453, :examples nil, :notes nil, :arglists ["object"], :doc "The pretty print dispatch function for pretty printing Clojure code.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/code-dispatch"} {:added "1.3", :ns "clojure.pprint", :name "print-length-loop", :file "clojure/pprint/pprint_base.clj", :type "macro", :column 1, :see-alsos nil, :line 391, :examples [{:updated-at 1682635931128, :created-at 1682635931128, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body "(set! *print-length* 5)\n\n(print-length-loop [a 0]\n (pprint a)\n (recur (inc a)))\n;; 0\n;; 1\n;; 2\n;; 3\n;; 4\n;; ...\n;; => nil", :_id "644afc9be4b08cf8563f4ba2"}], :macro true, :notes nil, :arglists ["bindings & body"], :doc "A version of loop that iterates at most *print-length* times. This is designed \nfor use in pretty-printer dispatch functions.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/print-length-loop"} {:added "1.2", :ns "clojure.pprint", :name "pprint-tab", :file "clojure/pprint/pprint_base.clj", :type "function", :column 1, :see-alsos nil, :line 356, :examples nil, :notes nil, :arglists ["kind colnum colinc"], :doc "Tab at this point in the pretty printing stream. kind specifies whether the tab\nis :line, :section, :line-relative, or :section-relative. \n\nColnum and colinc specify the target column and the increment to move the target\nforward if the output is already past the original target.\n\nThis function is intended for use when writing custom dispatch functions.\n\nOutput is sent to *out* which must be a pretty printing writer.\n\nTHIS FUNCTION IS NOT YET IMPLEMENTED.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/pprint-tab"} {:added "1.2", :ns "clojure.pprint", :name "pprint-logical-block", :file "clojure/pprint/pprint_base.clj", :type "macro", :column 1, :see-alsos nil, :line 302, :examples nil, :macro true, :notes nil, :arglists ["options* body"], :doc "Execute the body as a pretty printing logical block with output to *out* which \nmust be a pretty printing writer. When used from pprint or cl-format, this can be \nassumed. \n\nThis function is intended for use when writing custom dispatch functions.\n\nBefore the body, the caller can optionally specify options: :prefix, :per-line-prefix, \nand :suffix.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/pprint-logical-block"} {:added "1.3", :ns "clojure.pprint", :name "print-table", :file "clojure/pprint/print_table.clj", :type "function", :column 1, :see-alsos [{:created-at 1331448986000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.pprint", :name "pprint", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e86"} {:created-at 1331449122000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.inspector", :name "inspect-table", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e87"}], :line 11, :examples [{:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"} {:login "bkovitz", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/4142015?v=4"}], :body "(use 'clojure.pprint)\n;=> nil\n\n;; By default, columns are in the order returned by (keys (first rows))\n(print-table [{:a 1 :b 2 :c 3} {:b 5 :a 7 :c \"dog\"}])\n;; =============\n;; :a | :c | :b\n;; =============\n;; 1 | 3 | 2 \n;; 7 | dog | 5 \n;; =============\n;=> nil\n\n;; If there are keys not in the first row, and/or you want to specify only\n;; some, or in a particular order, give the desired keys as the first arg.\n(print-table [:b :a] [{:a 1 :b 2 :c 3} {:b 5 :a 7 :c \"dog\"}])\n;; =======\n;; :b | :a\n;; =======\n;; 2 | 1 \n;; 5 | 7 \n;; =======\n;=> nil\n", :created-at 1329889278000, :updated-at 1516548290588, :_id "542692d6c026201cdc3270f1"} {:updated-at 1507762324788, :created-at 1329889427000, :body "(use 'clojure.pprint 'clojure.reflect)\n;=> nil\n(def x (:members (reflect clojure.lang.BigInt)))\n;=> #'user/x\n(print-table [:name :type :flags] (sort-by :name x))\n;; ======================================================================\n;; :name | :type | :flags \n;; ======================================================================\n;; ONE | clojure.lang.BigInt | #{:static :public :final}\n;; ZERO | clojure.lang.BigInt | #{:static :public :final}\n;; add | | #{:public} \n;; bipart | java.math.BigInteger | #{:public :final} \n;; bitLength | | #{:public} \n;; byteValue | | #{:public} \n;; clojure.lang.BigInt | | #{:private} \n;; doubleValue | | #{:public} \n;; equals | | #{:public} \n;; floatValue | | #{:public} \n;; fromBigInteger | | #{:static :public} \n;; fromLong | | #{:static :public} \n;; hashCode | | #{:public} \n;; intValue | | #{:public} \n;; longValue | | #{:public} \n;; lpart | long | #{:public :final} \n;; lt | | #{:public} \n;; multiply | | #{:public} \n;; quotient | | #{:public} \n;; remainder | | #{:public} \n;; shortValue | | #{:public} \n;; toBigInteger | | #{:public} \n;; toString | | #{:public} \n;; valueOf | | #{:static :public} \n;; ======================================================================\n;=> nil\n", :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}, :_id "542692d6c026201cdc3270f3"} {:updated-at 1573569597228, :created-at 1573569597228, :author {:login "l3nz", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1101849?v=4"}, :body "; Redirect print-table to a string.\n\n(binding [*out* (java.io.StringWriter.)]\n (clojure.pprint/print-table [{:a 1 :b 2}])\n (.toString *out*))\n\n\n=> \"\\n| :a | :b |\\n|----+----|\\n| 1 | 2 |\\n\"\n\n", :_id "5dcac43de4b0ca44402ef7db"} {:updated-at 1579276290470, :created-at 1579276290470, :author {:login "malesch", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/114063?v=4"}, :body "; Another way to redirect print-table to a string\n\n(with-out-str (clojure.pprint/print-table [{:a 1 :b 2}]))\n\n=> \"\\n| :a | :b |\\n|----+----|\\n| 1 | 2 |\\n\"", :_id "5e21d802e4b0ca44402ef819"}], :notes nil, :arglists ["ks rows" "rows"], :doc "Prints a collection of maps in a textual table. Prints table headings\n ks, and then a line of output for each row, corresponding to the keys\n in ks. If ks are not specified, use the keys of the first item in rows.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/print-table"} {:added "1.2", :ns "clojure.pprint", :name "pp", :file "clojure/pprint/pprint_base.clj", :type "macro", :column 1, :see-alsos [{:created-at 1518042853743, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pprint", :ns "clojure.pprint"}, :_id "5a7b7ee5e4b0316c0f44f8ad"}], :line 254, :examples [{:updated-at 1285501102000, :created-at 1279160860000, :body "user=> (zipmap \n [:a :b :c :d :e] \n (repeat \n (zipmap \n [:a :b :c :d :e] \n (take 5 (range)))))\n{:e {:e 4, :d 3, :c 2, :b 1, :a 0}, :d {:e 4, :d 3, :c 2, :b 1, :a 0}, :c {:e 4, :d 3, :c 2, :b 1, :a 0}, :b {:e 4, :d 3, :c 2, :b 1, :a 0}, :a {:e 4, :d 3, :c 2, :b 1, :a 0}}\n\nuser=> (clojure.pprint/pp)\n{:e {:e 4, :d 3, :c 2, :b 1, :a 0},\n :d {:e 4, :d 3, :c 2, :b 1, :a 0},\n :c {:e 4, :d 3, :c 2, :b 1, :a 0},\n :b {:e 4, :d 3, :c 2, :b 1, :a 0},\n :a {:e 4, :d 3, :c 2, :b 1, :a 0}}\nnil\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692d0c026201cdc326ec8"}], :macro true, :notes [{:author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :updated-at 1536169628718, :created-at 1536169628718, :body "When using Clojure from the REPL, you don't need to specify `clojure.pprint` to use `pp` or `pprint`. So at the REPL `(clojure.pp)` is equivalent to `(pp)`.", :_id "5b90169ce4b00ac801ed9e89"}], :arglists [""], :doc "A convenience macro that pretty prints the last thing output. This is\nexactly equivalent to (pprint *1).", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/pp"} {:added "1.2", :ns "clojure.pprint", :name "set-pprint-dispatch", :file "clojure/pprint/pprint_base.clj", :type "function", :column 1, :see-alsos [{:created-at 1683111037007, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "*print-pprint-dispatch*", :ns "clojure.pprint"}, :_id "64523c7de4b08cf8563f4bad"}], :line 260, :examples [{:updated-at 1683111221732, :created-at 1683111221732, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body "(require '[clojure.pprint :as pprint])\n\n(def condp-statement\n '(condp = x\n 1 \"one\" 2 \"two\" 3 \"three\"\n 4 \"four\" 5 \"five\" 6 \"six\" :else :none))\n\n(pprint/pprint condp-statement)\n;; (condp\n;; =\n;; x\n;; 1\n;; \"one\"\n;; 2\n;; \"two\"\n;; 3\n;; \"three\"\n;; 4\n;; \"four\"\n;; 5\n;; \"five\"\n;; 6\n;; \"six\"\n;; :else\n;; :none)\n\n(pprint/set-pprint-dispatch pprint/code-dispatch)\n\n(pprint/pprint condp-statement)\n;; (condp = x\n;; 1 \"one\"\n;; 2 \"two\"\n;; 3 \"three\"\n;; 4 \"four\"\n;; 5 \"five\"\n;; 6 \"six\"\n;; :else :none)", :_id "64523d35e4b08cf8563f4bae"}], :notes nil, :arglists ["function"], :doc "Set the pretty print dispatch function to a function matching (fn [obj] ...)\nwhere obj is the object to pretty print. That function will be called with *out* set\nto a pretty printing writer to which it should do its printing.\n\nFor example functions, see simple-dispatch and code-dispatch in \nclojure.pprint.dispatch.clj.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/set-pprint-dispatch"} {:added "1.2", :ns "clojure.pprint", :name "fresh-line", :file "clojure/pprint/cl_format.clj", :type "function", :column 1, :see-alsos nil, :line 1245, :examples nil, :notes nil, :arglists [""], :doc "Make a newline if *out* is not already at the beginning of the line. If *out* is\nnot a pretty writer (which keeps track of columns), this function always outputs a newline.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/fresh-line"} {:added "1.2", :ns "clojure.pprint", :name "formatter-out", :file "clojure/pprint/cl_format.clj", :type "macro", :column 1, :see-alsos [{:created-at 1683117747988, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "formatter", :ns "clojure.pprint"}, :_id "645256b3e4b08cf8563f4bb6"}], :line 1936, :examples [{:updated-at 1683117741775, :created-at 1683117741775, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body "(def my-formatter (pprint/formatter-out \"~:d\"))\n\n(my-formatter 123456)\n;; 123,456\n;; => nil", :_id "645256ade4b08cf8563f4bb5"}], :macro true, :notes nil, :arglists ["format-in"], :doc "Makes a function which can directly run format-in. The function is\nfn [& args] ... and returns nil. This version of the formatter macro is\ndesigned to be used with *out* set to an appropriate Writer. In particular,\nthis is meant to be used as part of a pretty printer dispatch method.\n\nformat-in can be either a control string or a previously compiled format.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/formatter-out"} {:added "1.2", :ns "clojure.pprint", :name "formatter", :file "clojure/pprint/cl_format.clj", :type "macro", :column 1, :see-alsos [{:created-at 1683117686117, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "formatter-out", :ns "clojure.pprint"}, :_id "64525676e4b08cf8563f4bb4"} {:created-at 1683389093912, :author {:login "josuesantos1", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/43919440?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pprint", :ns "clojure.pprint"}, :_id "64567aa5e4b08cf8563f4bba"}], :line 1916, :examples [{:updated-at 1683117677315, :created-at 1683117677315, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body "(def my-formatter (pprint/formatter \"~:d\"))\n\n(with-open [stream (java.io.StringWriter.)]\n (my-formatter stream 123456)\n (str stream))\n;; => \"123,456\"", :_id "6452566de4b08cf8563f4bb3"} {:updated-at 1683490074327, :created-at 1683128227191, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; Compiling the control string can have significant performance benefits…\n\n(time\n (with-open [stream (java.io.StringWriter.)]\n (doseq [x (range 1e5)]\n (pprint/cl-format stream \"Number is ~:d \" x))))\n;; Elapsed time: 5100.348801 msecs\n\n(def my-formatter (pprint/formatter \"Number is ~:d \"))\n\n(time\n (with-open [stream (java.io.StringWriter.)]\n (doseq [x (range 1e5)]\n (my-formatter stream x))))\n;; Elapsed time: 3620.067511 msecs\n\n;; But still not a patch on `format` for this example…\n\n(time\n (with-open [stream (java.io.StringWriter.)]\n (doseq [x (range 1e5)]\n (.write stream (format \"Number is %,d \" x)))))\n;; \"Elapsed time: 444.501672 msecs\"", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4", :account-source "github", :login "tomdl89"}], :_id "64527fa3e4b08cf8563f4bb8"}], :macro true, :notes nil, :arglists ["format-in"], :doc "Makes a function which can directly run format-in. The function is\nfn [stream & args] ... and returns nil unless the stream is nil (meaning \noutput to a string) in which case it returns the resulting string.\n\nformat-in can be either a control string or a previously compiled format.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/formatter"} {:added "1.2", :ns "clojure.pprint", :name "pprint-indent", :file "clojure/pprint/pprint_base.clj", :type "function", :column 1, :see-alsos nil, :line 341, :examples nil, :notes nil, :arglists ["relative-to n"], :doc "Create an indent at this point in the pretty printing stream. This defines how \nfollowing lines are indented. relative-to can be either :block or :current depending \nwhether the indent should be computed relative to the start of the logical block or\nthe current column position. n is an offset. \n\nThis function is intended for use when writing custom dispatch functions.\n\nOutput is sent to *out* which must be a pretty printing writer.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/pprint-indent"} {:added "1.2", :ns "clojure.pprint", :name "*print-radix*", :file "clojure/pprint/pprint_base.clj", :type "var", :column 1, :see-alsos [{:created-at 1664286342316, :author {:login "sreekanthb", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1254569?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "*print-base*", :ns "clojure.pprint"}, :_id "6332fe86e4b0b1e3652d7668"}], :dynamic true, :line 80, :examples [{:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}], :body "(require '[clojure.pprint :as pprint])\n\n(binding [pprint/*print-base* 16\n pprint/*print-radix* true]\n (pprint/pprint 3405691582))\n;; #xcafebabe\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1620057785572, :updated-at 1620333810711, :_id "60901eb9e4b0b1e3652d74f3"}], :notes nil, :arglists [], :doc "Print a radix specifier in front of integers and rationals. If *print-base* is 2, 8, \nor 16, then the radix specifier used is #b, #o, or #x, respectively. Otherwise the \nradix specifier is in the form #XXr where XX is the decimal value of *print-base* ", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/*print-radix*"} {:added "1.2", :ns "clojure.pprint", :name "cl-format", :file "clojure/pprint/cl_format.clj", :type "function", :column 1, :see-alsos [{:created-at 1330170813000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "printf", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f44"} {:created-at 1330170818000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "format", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f45"}], :line 27, :examples [{:updated-at 1627687397697, :created-at 1332481954000, :body ";; Formatting integers, with options, in one of many bases.\n\n;; Basic Example\nuser=> (cl-format nil \"~:d\" 1234567)\n\"1,234,567\"\n\n;; First arg true sends formatted output to *out*\nuser=> (cl-format true \"~5d\\n\" 3)\n 3\nnil\n\n;; First arg nil or false causes formatted output to be returned as string\nuser=> (cl-format nil \"~5d\" 3)\n\" 3\"\n\nuser=> (cl-format nil \"Pad with leading zeros ~5,'0d\" 3)\n\"Pad with leading zeros 00003\"\n\nuser=> (cl-format nil \"Pad with leading asterisks ~5,'*d\" 3)\n\"Pad with leading asterisks ****3\"\n\n;; If there is a way to specify left-justifying a number in a single\n;; format string, please add it here. It can be done by using one\n;; cl-format invocation to get a formatted number as a string, and\n;; then use the ~a specifier on the result.\nuser=> (cl-format nil \"~15a\" (cl-format nil \"~:d\" 1234567))\n\"1,234,567 \"\n\n;; To specify left-justifying a number in a single format string, you can use:\nuser=> (cl-format nil \"~15@<~:d~>\" 1234567)\n\"1,234,567 \"\n\nuser=> (cl-format nil \"Always print the sign ~5@d\" 3)\n\"Always print the sign +3\"\n\nuser=> (cl-format nil \"Use comma group-separator every 3 digits ~12:d\" 1234567)\n\"Use comma group-separator every 3 digits 1,234,567\"\n\nuser=> (cl-format nil \"decimal ~d binary ~b octal ~o hex ~x\" 63 63 63 63)\n\"decimal 63 binary 111111 octal 77 hex 3f\"\n\nuser=> (cl-format nil \"base 7 ~7r with width and zero pad ~7,15,'0r\" 63 63)\n\"base 7 120 with width and zero pad 000000000000120\"\n\n;; No need for you to do any conversions to use cl-format with BigInt,\n;; BigInteger, or BigDecimal.\nuser=> (cl-format nil \"cl-format handles BigInts ~15d\" 12345678901234567890)\n\"cl-format handles BigInts 12345678901234567890\"\n\nuser=> (cl-format nil \"Be aware of auto-conversion ~8,'0d ~8,'0d\" 2.4 -5/4)\n\"Be aware of auto-conversion 000002.4 0000-5/4\"\n\n;; This might look like a bug, but it is actually behavior specified by the\n;; Common Lisp HyperSpec mentioned in the docs above. If you don't want that\n;; behavior (format \"%08d\" -2) might suit your purposes better.\nuser=> (cl-format nil \"~8,'0d\" -2)\n\"000000-2\"", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "coldnew", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/39703?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/16775439?v=4", :account-source "github", :login "Okwori"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}, :_id "542692d6c026201cdc3270ee"} {:body "(let [examples [[]\n [\"Alice\"]\n [\"Alice\" \"Bob\"]\n [\"Alice\" \"Bob\" \"Charlie\"]]]\n (doseq [users examples]\n (cljs.pprint/cl-format true \"~1{~#[none~;~a~;~a and ~a~:;~@{~#[~;and ~]~a~^, ~}~]~:} ~:*~1{~#[are~;is~:;are~]~:} online\" users)))\n\n;; Prints the following:\n\nnone are online\nAlice is online\nAlice and Bob are online\nAlice, Bob, and Charlie are online\n\n;; The following guide for Common Lisp format is available here. The examples applies to Clojure as well:\n;; http://www.gigamonkeys.com/book/a-few-format-recipes.html", :author {:login "lokedhs", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1028755?v=3"}, :created-at 1432169914857, :updated-at 1432169914857, :_id "555d2dbae4b01ad59b65f4d7"} {:editors [{:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}], :body ";; cl-format knows what nil should look like:\nuser=> (cl-format nil \"~s\" nil)\n\"nil\"\n;; format doesn't:\nuser=> (format \"%s\" nil)\n\"null\"\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3", :account-source "github", :login "mars0i"}, :created-at 1437886988750, :updated-at 1437887125187, :_id "55b46a0ce4b0080a1b79cdac"} {:updated-at 1535748237199, :created-at 1535748237199, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body "(def word-wrap\n [\"This\" \"sentence\" \"is\" \"too\" \"long\" \"for\" \"a\" \"small\" \"screen\"\n \"and\" \"should\" \"appear\" \"in\" \"multiple\" \"lines\" \"no\" \"longer\"\n \"than\" \"20\" \"characters\" \"each\" \".\"])\n\n(println (cl-format nil \"~{~<~%~1,20:;~A~> ~}\" word-wrap))\n;; This sentence is too\n;; long for a small\n;; screen and should\n;; appear in multiple\n;; lines no longer than\n;; 20 characters each.", :_id "5b89a88de4b00ac801ed9e7b"} {:updated-at 1586704521298, :created-at 1586704521298, :author {:login "jimka2001", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/6414129?v=4"}, :body "user=> (cl-format true \"~R~%\" 63)\nsixty-three\nnil\nuser=> (cl-format false \"~R\" 635464)\n\"six hundred thirty-five thousand, four hundred sixty-four\"", :_id "5e933089e4b087629b5a18d2"} {:editors [{:login "jimka2001", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6414129?v=4"}], :body ";; ~ followed by newline and white space, ignores the newline and the white space\n;; it is used simply to align code.\n;; ~@ followed by newline and white space outputs the newline \n;; but ignores the white space\n;; ~& outputs a newline unless already at beginning of line\n\n;; The following (using clojure.test) formats 5 lines of output\n;; each starting at the left margin. \n;; The initial ~&~ starts a newline if necessary and outputs \"expected\"\n;; at the left margin (without the quotes of course)\n;; The first argument, false, of cl-format, simply indicates to print\n;; to a string and return the string.\n(deftest t-type-subtypep-randomized-2\n (testing \"type subtype of union\"\n (doseq [depth (range 5)\n reps (range 200)\n :let [t1 (gns/gen-type depth)\n t2 (gns/gen-type depth)]]\n (is (= true (bdd/type-subtype? t1 (gns/create-or [t1 t2])))\n (cl-format false\n \"~&~\n expecting t1 <: (or t1 t2)~@\n t1=~A~@\n t2=~A~@\n depth=~A~@\n reps=~A\"\n t1 t2\n depth reps)))))", :author {:avatar-url "https://avatars.githubusercontent.com/u/6414129?v=4", :account-source "github", :login "jimka2001"}, :created-at 1626965634556, :updated-at 1628090795457, :_id "60f98682e4b0b1e3652d751b"} {:editors [{:login "jimka2001", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6414129?v=4"}], :body ";; cl-format can be used to force lazy sequences to be unwound.\n\n;; returns a string such as \"hello clojure.lang.LazySeq@3874d01 world\\n\"\n(format \"hello %s world\\n\" (map list '(1 2 3 4 5)))\n\n;; returns the string \"hello ((1) (2) (3) (4) (5)) world\\n\"\n(cl-format false \"hello ~A world~%\" (map list '(1 2 3 4 5)))\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/6414129?v=4", :account-source "github", :login "jimka2001"}, :created-at 1627544071732, :updated-at 1627544168523, :_id "61025a07e4b0b1e3652d7521"}], :notes nil, :arglists ["writer format-in & args"], :doc "An implementation of a Common Lisp compatible format function. cl-format formats its\narguments to an output stream or string based on the format control string given. It \nsupports sophisticated formatting of structured data.\n\nWriter is an instance of java.io.Writer, true to output to *out* or nil to output \nto a string, format-in is the format control string and the remaining arguments \nare the data to be formatted.\n\nThe format control string is a string to be output with embedded 'format directives' \ndescribing how to format the various arguments passed in.\n\nIf writer is nil, cl-format returns the formatted result string. Otherwise, cl-format \nreturns nil.\n\nFor example:\n (let [results [46 38 22]]\n (cl-format true \"There ~[are~;is~:;are~]~:* ~d result~:p: ~{~d~^, ~}~%\" \n (count results) results))\n\nPrints to *out*:\n There are 3 results: 46, 38, 22\n\nDetailed documentation on format control strings is available in the \"Common Lisp the \nLanguage, 2nd edition\", Chapter 22 (available online at:\nhttp://www.cs.cmu.edu/afs/cs.cmu.edu/project/ai-repository/ai/html/cltl/clm/node200.html#SECTION002633000000000000000) \nand in the Common Lisp HyperSpec at \nhttp://www.lispworks.com/documentation/HyperSpec/Body/22_c.htm\n", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/cl-format"} {:added "1.2", :ns "clojure.pprint", :name "*print-miser-width*", :file "clojure/pprint/pprint_base.clj", :type "var", :column 1, :see-alsos [{:created-at 1620036444882, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "write", :ns "clojure.pprint"}, :_id "608fcb5ce4b0b1e3652d74f2"}], :dynamic true, :line 47, :examples [{:updated-at 1620036422897, :created-at 1620036422897, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :body "(require '[clojure.pprint :as pprint])\n\n;; Simple example to keep it readable, but this could\n;; be much more nested code coming from some large Clojure file\n(def nested-statement\n '(condp = x\n 1 \"one\" 2 \"two\" 3 \"three\"\n 4 \"four\" 5 \"five\" 6 \"six\"\n :else (condp = x\n 1 \"one\" 2 \"two\" 3 \"three\"\n 4 \"four\" 5 \"five\" 6 \"six\"\n :else :none)))\n\n;; Forcing a narrow right margin at 30 to illustrate the point.\n;; In reality the nesting would accumulate close to a larger margin\n;; with similar effects, leaving a lot of white space on the left.\n(binding [pprint/*print-pprint-dispatch* pprint/code-dispatch\n pprint/*print-right-margin* 30]\n (pprint/pprint nested-statement))\n\n;; (condp\n;; =\n;; x\n;; 1 \"one\"\n;; 2 \"two\"\n;; 3 \"three\"\n;; 4 \"four\"\n;; 5 \"five\"\n;; 6 \"six\"\n;; :else\n;; (condp\n;; =\n;; x\n;; 1 \"one\"\n;; 2 \"two\"\n;; 3 \"three\"\n;; 4 \"four\"\n;; 5 \"five\"\n;; 6 \"six\"\n;; :else :none))\n\n;; changing the miser width relax the pretty printer allowing to \n;; use the space better.\n(binding [pprint/*print-pprint-dispatch* pprint/code-dispatch\n pprint/*print-right-margin* 30\n pprint/*print-miser-width* 20]\n (pprint/pprint nested-statement))\n\n;; (condp = x\n;; 1 \"one\"\n;; 2 \"two\"\n;; 3 \"three\"\n;; 4 \"four\"\n;; 5 \"five\"\n;; 6 \"six\"\n;; :else (condp = x\n;; 1 \"one\"\n;; 2 \"two\"\n;; 3 \"three\"\n;; 4 \"four\"\n;; 5 \"five\"\n;; 6 \"six\"\n;; :else :none))", :_id "608fcb46e4b0b1e3652d74f1"}], :notes nil, :arglists [], :doc "The column at which to enter miser style. Depending on the dispatch table, \nmiser style add newlines in more places to try to keep lines short allowing for further \nlevels of nesting.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/*print-miser-width*"} {:added "1.2", :ns "clojure.pprint", :name "write", :file "clojure/pprint/pprint_base.clj", :type "function", :column 1, :see-alsos [{:created-at 1536497648303, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pprint", :ns "clojure.pprint"}, :_id "5b9517f0e4b00ac801ed9e8f"}], :line 197, :examples [{:updated-at 1536497633749, :created-at 1536497633749, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Same as pprint but taking configuration directives.\n(require '[clojure.pprint :as p])\n\n;; Prints the number in binary with indication of the base as \"#b\".\n(p/write 20/3 :base 2 :radix true) \n;; #b10100/11\n\n;; Pretty looking truncation of lists longer than 3.\n(p/write (range 100) :length 3) \n;; (0 1 2 ...)\n\n;; Removes namespaces from symbols when printing.\n(p/write 'clojure.core/+ :suppress-namespaces true) \n;; +\n\n;; Avoids anything beyond 10 right margin.\n(p/write [:a :b :c :d] :right-margin 10)\n;; [:a\n;; :b\n;; :c\n;; :d]\n", :_id "5b9517e1e4b00ac801ed9e8e"}], :notes nil, :arglists ["object & kw-args"], :doc "Write an object subject to the current bindings of the printer control variables.\nUse the kw-args argument to override individual variables for this call (and any \nrecursive calls). Returns the string result if :stream is nil or nil otherwise.\n\nThe following keyword arguments can be passed with values:\n Keyword Meaning Default value\n :stream Writer for output or nil true (indicates *out*)\n :base Base to use for writing rationals Current value of *print-base*\n :circle* If true, mark circular structures Current value of *print-circle*\n :length Maximum elements to show in sublists Current value of *print-length*\n :level Maximum depth Current value of *print-level*\n :lines* Maximum lines of output Current value of *print-lines*\n :miser-width Width to enter miser mode Current value of *print-miser-width*\n :dispatch The pretty print dispatch function Current value of *print-pprint-dispatch*\n :pretty If true, do pretty printing Current value of *print-pretty*\n :radix If true, prepend a radix specifier Current value of *print-radix*\n :readably* If true, print readably Current value of *print-readably*\n :right-margin The column for the right margin Current value of *print-right-margin*\n :suppress-namespaces If true, no namespaces in symbols Current value of *print-suppress-namespaces*\n\n * = not yet supported\n", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/write"} {:added "1.2", :ns "clojure.pprint", :name "*print-right-margin*", :file "clojure/pprint/pprint_base.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 40, :examples [{:updated-at 1533810720443, :created-at 1533810720443, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :body ";; Compare the two outputs below. Note how pprint puts the map on two lines\n;; in the second snippet to avoid having a line longer than 5 characters.\n\n(binding [clojure.pprint/*print-right-margin* 15]\n (clojure.pprint/pprint {:foo \"bar\"}))\n; Prints:\n; {:foo \"bar\"}\n\n(binding [clojure.pprint/*print-right-margin* 5]\n (clojure.pprint/pprint {:foo \"bar\"}))\n; Prints:\n; {:foo\n; \"bar\"}", :_id "5b6c1820e4b00ac801ed9e4a"}], :notes nil, :arglists [], :doc "Pretty printing will try to avoid anything going beyond this column.\nSet it to nil to have pprint let the line be arbitrarily long. This will ignore all \nnon-mandatory newlines.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/*print-right-margin*"} {:added "1.2", :ns "clojure.pprint", :name "write-out", :file "clojure/pprint/pprint_base.clj", :type "function", :column 1, :see-alsos nil, :line 171, :examples nil, :notes nil, :arglists ["object"], :doc "Write an object to *out* subject to the current bindings of the printer control \nvariables. Use the kw-args argument to override individual variables for this call (and \nany recursive calls).\n\n*out* must be a PrettyWriter if pretty printing is enabled. This is the responsibility\nof the caller.\n\nThis method is primarily intended for use by pretty print dispatch functions that \nalready know that the pretty printer will have set up their environment appropriately.\nNormal library clients should use the standard \"write\" interface. ", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/write-out"} {:added "1.2", :ns "clojure.pprint", :name "with-pprint-dispatch", :file "clojure/pprint/pprint_base.clj", :type "macro", :column 1, :see-alsos [{:created-at 1683110543113, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "*print-pprint-dispatch*", :ns "clojure.pprint"}, :_id "64523a8fe4b08cf8563f4bac"}], :line 274, :examples [{:updated-at 1619968380698, :created-at 1619968380698, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :body "(require '[clojure.pprint :as pprint])\n\n(def condp-statement\n '(condp = x\n 1 \"one\" 2 \"two\" 3 \"three\"\n 4 \"four\" 5 \"five\" 6 \"six\" :else :none))\n\n(pprint/with-pprint-dispatch \n pprint/code-dispatch\n (pprint/pprint condp-statement))\n;; (condp = x\n;; 1 \"one\"\n;; 2 \"two\"\n;; 3 \"three\"\n;; 4 \"four\"\n;; 5 \"five\"\n;; 6 \"six\"\n;; :else :none)", :_id "608ec17ce4b0b1e3652d74ef"}], :macro true, :notes nil, :arglists ["function & body"], :doc "Execute body with the pretty print dispatch function bound to function.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/with-pprint-dispatch"} {:added "1.2", :ns "clojure.pprint", :name "*print-base*", :file "clojure/pprint/pprint_base.clj", :type "var", :column 1, :see-alsos [{:created-at 1664286279673, :author {:login "sreekanthb", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1254569?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "*print-radix*", :ns "clojure.pprint"}, :_id "6332fe47e4b0b1e3652d7667"}], :dynamic true, :line 87, :examples [{:updated-at 1533810848478, :created-at 1533810848478, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :body "(binding [clojure.pprint/*print-base* 10]\n (clojure.pprint/pprint 42))\n; Prints:\n; 42\n\n(binding [clojure.pprint/*print-base* 2]\n (clojure.pprint/pprint 42))\n; Prints:\n; 101010", :_id "5b6c18a0e4b00ac801ed9e4b"} {:updated-at 1664799578948, :created-at 1664286031216, :author {:login "sreekanthb", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1254569?v=4"}, :body ";; Prints list of hexadecimals with radix specifier: #x\nuser> (with-bindings {#'clojure.pprint/*print-base* 16\n #'clojure.pprint/*print-radix* true}\n (clojure.pprint/pprint (range 16)))\n;;=> (#x0 #x1 #x2 #x3 #x4 #x5 #x6 #x7 #x8 #x9 #xa #xb #xc #xd #xe #xf)\n\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/1254569?v=4", :account-source "github", :login "sreekanthb"}], :_id "6332fd4fe4b0b1e3652d7666"}], :notes nil, :arglists [], :doc "The base to use for printing integers and rationals.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/*print-base*"} {:ns "clojure.reflect", :name "->Field", :file "clojure/reflect/java.clj", :type "function", :column 1, :see-alsos nil, :line 154, :examples nil, :notes nil, :arglists ["name type declaring-class flags"], :doc "Positional factory function for class clojure.reflect.Field.", :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/->Field"} {:ns "clojure.reflect", :name "->Method", :file "clojure/reflect/java.clj", :type "function", :column 1, :see-alsos nil, :line 134, :examples nil, :notes nil, :arglists ["name return-type declaring-class parameter-types exception-types flags"], :doc "Positional factory function for class clojure.reflect.Method.", :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/->Method"} {:ns "clojure.reflect", :name "TypeReference", :file "clojure/reflect.clj", :type "var", :column 1, :see-alsos nil, :line 48, :examples nil, :notes nil, :arglists [], :doc "A TypeReference can be unambiguously converted to a type name on\n the host platform.\n\n All typerefs are normalized into symbols. If you need to\n normalize a typeref yourself, call typesym.", :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/TypeReference"} {:added "1.3", :ns "clojure.reflect", :name "reflect", :file "clojure/reflect.clj", :type "function", :column 1, :see-alsos [{:created-at 1332916378000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.pprint", :name "print-table", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e88"} {:created-at 1465943137399, :author {:login "bkovitz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "type-reflect", :ns "clojure.reflect"}, :_id "57608461e4b0bafd3e2a0487"}], :line 115, :examples [{:updated-at 1507758581210, :created-at 1329989405000, :body "(use 'clojure.reflect 'clojure.pprint)\n;;=> nil\n(def r (reflect *in*))\n;;=> #'user/r\n(count (:members r))\n;;=> 9\n(pprint (map class (:members r)))\n;; (clojure.reflect.Constructor\n;; clojure.reflect.Method\n;; clojure.reflect.Field\n;; clojure.reflect.Field\n;; clojure.reflect.Method\n;; clojure.reflect.Method\n;; clojure.reflect.Method\n;; clojure.reflect.Method\n;; clojure.reflect.Field)\n;;=> nil\n(pprint r)\n;; {:bases #{java.io.PushbackReader},\n;; :flags #{:public},\n;; :members\n;; #{{:name clojure.lang.LineNumberingPushbackReader,\n;; :declaring-class clojure.lang.LineNumberingPushbackReader,\n;; :parameter-types [java.io.Reader],\n;; :exception-types [],\n;; :flags #{:public}}\n;; {:name read,\n;; :return-type int,\n;; :declaring-class clojure.lang.LineNumberingPushbackReader,\n;; :parameter-types [],\n;; :exception-types [java.io.IOException],\n;; :flags #{:public}}\n;; {:name _atLineStart,\n;; :type boolean,\n;; :declaring-class clojure.lang.LineNumberingPushbackReader,\n;; :flags #{:private}}\n;; {:name newline,\n;; :type int,\n;; :declaring-class clojure.lang.LineNumberingPushbackReader,\n;; :flags #{:private :static :final}}\n;; {:name unread,\n;; :return-type void,\n;; :declaring-class clojure.lang.LineNumberingPushbackReader,\n;; :parameter-types [int],\n;; :exception-types [java.io.IOException],\n;; :flags #{:public}}\n;; {:name readLine,\n;; :return-type java.lang.String,\n;; :declaring-class clojure.lang.LineNumberingPushbackReader,\n;; :parameter-types [],\n;; :exception-types [java.io.IOException],\n;; :flags #{:public}}\n;; {:name atLineStart,\n;; :return-type boolean,\n;; :declaring-class clojure.lang.LineNumberingPushbackReader,\n;; :parameter-types [],\n;; :exception-types [],\n;; :flags #{:public}}\n;; {:name getLineNumber,\n;; :return-type int,\n;; :declaring-class clojure.lang.LineNumberingPushbackReader,\n;; :parameter-types [],\n;; :exception-types [],\n;; :flags #{:public}}\n;; {:name _prev,\n;; :type boolean,\n;; :declaring-class clojure.lang.LineNumberingPushbackReader,\n;; :flags #{:private}}}}\n;;=> nil\n", :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}, :_id "542692d6c026201cdc3270f4"} {:body "(require '[clojure.reflect :as cr])\n(require '[clojure.pprint :as pp])\n\n;; Here we have a simple function that prints the\n;; important bits of the class definition in a table.\n(->> String \n cr/reflect \n :members \n pp/print-table))\n;;=> [produces a large table the next example filters it down.\n\n;; In order to reduce the rows to just :public methods a filter can be used.\n(->> String \n cr/reflect \n :members \n (filter #(contains? (:flags %) :public)) \n pp/print-table)\n;;=> | :name | :return-type | :declaring-class | \n;; |------------------------+------------------+------------------+------->\n;; | replaceAll | java.lang.String | java.lang.String | \n;; | CASE_INSENSITIVE_ORDER | | java.lang.String | \n;; | codePointCount | int | java.lang.String |\n;; | getChars | void | java.lang.String | \n;; etc.\n\n;; Print methods that contain \"to\", as a way of code completion.\n;; Combine with above example ``#(contains? (:flags %) :public)`` to get \n;; matching callable methods (public & with \"to\")\n(->> String \n cr/reflect \n :members \n (filter #(.contains (str (:name %)) \"to\"))\n pp/print-table)\n\n;; => | :name | :return-type | :declaring-class | \n;; |-------------+------------------+------------------+---\n;; | toString | java.lang.String | java.lang.String | \n;; | toLowerCase | java.lang.String | java.lang.String | \n;; | toUpperCase | java.lang.String | java.lang.String | \n;; | toUpperCase | java.lang.String | java.lang.String | \n;; | toCharArray | char<> | java.lang.String | \n;; | toLowerCase | java.lang.String | java.lang.String | ", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1424120412909, :updated-at 1507759169913, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/4199136?v=3", :account-source "github", :login "alvarogarcia7"}], :_id "54e25a5ce4b0b716de7a6528"} {:editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :body "(require '[clojure.reflect :as cr])\n(import '(clojure.reflect.JavaReflector))\n\n;; Let us see what is available in the JavaReflector\n(->> clojure.reflect.JavaReflector \n cr/reflect\n :members\n (sort-by :name)\n (pp/print-table [:name :flags :parameter-types])\n;; | :name | :flags | :parameter-types |\n;; |-------------------------------+---------------------------+--------------------|\n;; | __cached_class__0 | #{:private :static} | |\n;; | classloader | #{:public :final} | |\n;; | clojure.reflect.JavaReflector | #{:public} | [java.lang.Object] |\n;; | const__0 | #{:public :static :final} | |\n;; | const__1 | #{:public :static :final} | |\n;; | const__10 | #{:public :static :final} | |\n;; | const__5 | #{:public :static :final} | |\n;; | const__7 | #{:public :static :final} | |\n;; | const__9 | #{:public :static :final} | |\n;; | do_reflect | #{:public} | [java.lang.Object] |\n;; | getBasis | #{:public :static} | [] |\n;;=> nil", :author {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}, :created-at 1507760580365, :updated-at 1507761553527, :_id "59de99c4e4b03026fe14ea68"}], :notes nil, :arglists ["obj & options"], :doc "Alpha - subject to change.\n Reflect on the type of obj (or obj itself if obj is a class).\n Return value and options are the same as for type-reflect. ", :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/reflect"} {:ns "clojure.reflect", :name "map->Field", :file "clojure/reflect/java.clj", :type "function", :column 1, :see-alsos [{:created-at 1507762821609, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "map->Constructor", :ns "clojure.reflect"}, :_id "59dea285e4b03026fe14ea6e"} {:created-at 1507762840684, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "map->Method", :ns "clojure.reflect"}, :_id "59dea298e4b03026fe14ea6f"}], :line 154, :examples [{:updated-at 1507762803236, :created-at 1507762803236, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body "(require '[clojure.reflect :as cr])\n\n;; I have no idea what this is for but here is what it does.\n(cr/map->Field {}) \n;=> #clojure.reflect.Field{:name nil, :type nil, :declaring-class nil, :flags nil}", :_id "59dea273e4b03026fe14ea6d"}], :notes nil, :arglists ["m__7888__auto__"], :doc "Factory function for class clojure.reflect.Field, taking a map of keywords to field values.", :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/map->Field"} {:ns "clojure.reflect", :name "map->Method", :file "clojure/reflect/java.clj", :type "function", :column 1, :see-alsos [{:created-at 1507762922151, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "map->Constructor", :ns "clojure.reflect"}, :_id "59dea2eae4b03026fe14ea71"} {:created-at 1507762942594, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "map->Field", :ns "clojure.reflect"}, :_id "59dea2fee4b03026fe14ea72"}], :line 134, :examples [{:updated-at 1507762895850, :created-at 1507762895850, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body "(require '[clojure.reflect :as cr])\n\n;; I have no idea what this is for but here is what it does.\n(cr/map->Method {}) \n;=> #clojure.reflect.Method{:name nil, :return-type nil, \n;; :declaring-class nil, :parameter-types nil,\n;; :exception-types nil, :flags nil}", :_id "59dea2cfe4b03026fe14ea70"}], :notes nil, :arglists ["m__7888__auto__"], :doc "Factory function for class clojure.reflect.Method, taking a map of keywords to field values.", :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/map->Method"} {:ns "clojure.reflect", :name "typename", :type "function", :see-alsos [{:created-at 1507759637967, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reflect", :ns "clojure.reflect"}, :_id "59de9615e4b03026fe14ea65"} {:created-at 1507759650019, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "do-reflect", :ns "clojure.reflect"}, :_id "59de9622e4b03026fe14ea66"} {:created-at 1507759666391, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "type-reflect", :ns "clojure.reflect"}, :_id "59de9632e4b03026fe14ea67"}], :examples [{:updated-at 1507759616018, :created-at 1507759616018, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body "(require '[clojure.reflect :as cr])\n\n;; It returns the class name as a string. \n(->> java.lang.Integer \n cr/typename)\n;;=> \"java.lang.Integer\"", :_id "59de9600e4b03026fe14ea64"}], :notes nil, :arglists ["o"], :doc "Returns Java name as returned by ASM getClassName, e.g. byte[], java.lang.String[]", :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/typename"} {:ns "clojure.reflect", :name "->JavaReflector", :file "clojure/reflect/java.clj", :type "function", :column 1, :see-alsos nil, :line 178, :examples [{:editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :body "(require '[clojure.reflect :as cr])\n(import '(clojure.reflect.JavaReflector))\n\n;; Let us see what is available in the JavaReflector\n(->> clojure.reflect.JavaReflector \n cr/reflect\n :members\n (sort-by :name)\n (pp/print-table [:name :flags :parameter-types]))\n; | :name | :flags | :parameter-types |\n; |-------------------------------+---------------------------+--------------------|\n; | __cached_class__0 | #{:private :static} | |\n; | classloader | #{:public :final} | |\n; | clojure.reflect.JavaReflector | #{:public} | [java.lang.Object] |\n; | const__0 | #{:public :static :final} | |\n; | const__1 | #{:public :static :final} | |\n; | const__10 | #{:public :static :final} | |\n; | const__5 | #{:public :static :final} | |\n; | const__7 | #{:public :static :final} | |\n; | const__9 | #{:public :static :final} | |\n; | do_reflect | #{:public} | [java.lang.Object] |\n; | getBasis | #{:public :static} | [] |\n;;=> nil\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}, :created-at 1507763250502, :updated-at 1507763276867, :_id "59dea432e4b03026fe14ea73"}], :notes nil, :arglists ["classloader"], :doc "Positional factory function for class clojure.reflect.JavaReflector.", :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/->JavaReflector"} {:ns "clojure.reflect", :name "->AsmReflector", :file "clojure/reflect/java.clj", :type "function", :column 1, :see-alsos nil, :line 208, :examples [{:updated-at 1507763433355, :created-at 1507763433355, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body "(require '[clojure.reflect :as cr])\n(import '(clojure.reflect.AsmReflector))\n\n;; Let us see what is available in the AsmReflector\n(->> clojure.reflect.AsmReflector \n cr/reflect\n :members\n (sort-by :name)\n (pp/print-table [:name :flags :parameter-types]))\n\n; | :name | :flags | :parameter-types |\n; |------------------------------+---------------------------+--------------------|\n; | __cached_class__0 | #{:private :static} | |\n; | class_resolver | #{:public :final} | |\n; | clojure.reflect.AsmReflector | #{:public} | [java.lang.Object] |\n; | const__0 | #{:public :static :final} | |\n; | const__3 | #{:public :static :final} | |\n; | const__4 | #{:public :static :final} | |\n; | const__5 | #{:public :static :final} | |\n; | do_reflect | #{:public} | [java.lang.Object] |\n; | getBasis | #{:public :static} | [] |\n;;=> nil\n", :_id "59dea4e9e4b03026fe14ea75"}], :notes nil, :arglists ["class-resolver"], :doc "Positional factory function for class clojure.reflect.AsmReflector.", :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/->AsmReflector"} {:ns "clojure.reflect", :name "resolve-class", :type "function", :see-alsos nil, :examples [{:author {:login "weakreference", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/86146f8bd5207b97701c0f16f0017334?r=PG&default=identicon"}, :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}], :body ";;Check if class c exists on the classpath\n(require '[clojure.reflect :refer [resolve-class]])\n\n(defn class-exists? [c] \n (resolve-class (.getContextClassLoader (Thread/currentThread)) c))\n\n(class-exists? 'org.joda.time.DateTime) \n;;=> nil", :created-at 1351132479000, :updated-at 1508166357885, :_id "542692d6c026201cdc3270f5"} {:editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :body ";; Obtaining a suitable class loader is an important consideration.\n;; to a large degree the class loader used by default is the\n;; context class loader which is controlled by \n*use-context-classloader*\n;=> true\n\n;; the following helper function shows the \n(require '[clojure.java.classpath :as cp])\n;=> nil\n\n;; the context class loader\n(def ccl (.getContextClassLoader (Thread/currentThread)))\n;=> #'boot.user/ccl\n(cp/classpath ccl)\n;=> (#object[java.io.File 0x709e8101 ...\n\n;; the system class loader\n(def scl (java.lang.ClassLoader/getSystemClassLoader)) \n;=> #'boot.user/scl\n(cp/classpath scl)\n;=> (#object[java.io.File 0x709e8101 ...\n\n;; the class loader used to load a particular class instance.\n(deftype Foo [bar])\n;=> boot.user.Foo\n(def icl (.getClassLoader (class (Foo. 4))))\n;=> #'boot.user/icl\n(cp/classpath icl)\n;=> (#object[java.io.File 0x709e8101 ...\n\n;; I recommend you use the DynamicClassLoader \n;; for cases when 'import' does not do it.\n;; https://github.com/clojure/clojure\n(def dcl (clojure.lang.DynamicClassLoader.))\n;=> #'boot.user/dcl\n(cp/classpath dcl)\n;=> (#object[java.io.File 0x709e8101 ...\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}, :created-at 1507306884656, :updated-at 1508168226939, :_id "59d7ad84e4b03026fe14ea54"}], :notes nil, :tag "InputStream", :arglists ["this name"], :doc "Given a class name, return that typeref's class bytes as an InputStream.", :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/resolve-class"} {:ns "clojure.reflect", :name "flag-descriptors", :file "clojure/reflect/java.clj", :type "var", :column 1, :see-alsos nil, :line 77, :examples [{:updated-at 1495736937803, :created-at 1495736937803, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body "(use 'clojure.reflect)\n\n(pprint clojure.reflect/flag-descriptors)\n;;=> [{:name :public, :flag 1, :contexts #{:method :field :class}}\n;; {:name :private, :flag 2, :contexts #{:method :field :class}}\n;; {:name :protected, :flag 4, :contexts #{:method :field :class}}\n;; {:name :static, :flag 8, :contexts #{:method :field}}\n;; {:name :final, :flag 16, :contexts #{:method :field :class}}\n;; {:name :synchronized, :flag 32, :contexts #{:method}}\n;; {:name :volatile, :flag 64, :contexts #{:field}}\n;; {:name :bridge, :flag 64, :contexts #{:method}}\n;; {:name :varargs, :flag 128, :contexts #{:method}}\n;; {:name :transient, :flag 128, :contexts #{:field}}\n;; {:name :native, :flag 256, :contexts #{:method}}\n;; {:name :interface, :flag 512, :contexts #{:class}}\n;; {:name :abstract, :flag 1024, :contexts #{:method :class}}\n;; {:name :strict, :flag 2048, :contexts #{:method}}\n;; {:name :synthetic, :flag 4096, :contexts #{:method :field :class}}\n;; {:name :annotation, :flag 8192, :contexts #{:class}}\n;; {:name :enum, :flag 16384, :contexts #{:field :inner :class}}]", :_id "59272269e4b093ada4d4d770"}], :notes [{:author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :updated-at 1495736792080, :created-at 1495736792080, :body "The value of the `:flag` field for each modifier is identical to the value of the constant representing the modifier in [`java.lang.reflect.Modifier`](https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Modifier.html#field.summary), which in turn is taken from [Table 4.1-A](https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.1-200-E.1), [Table 4.5-A](https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.5-200-A.1), [Table 4.6-A](https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.6-200-A.1) and [Table 4.7.6-A](https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7.6-300-D.1-D.1) of *The Java™ Virtual Machine Specification.*\n", :_id "592721d8e4b093ada4d4d76f"}], :arglists [], :doc "The Java access bitflags, along with their friendly names and\nthe kinds of objects to which they can apply.", :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/flag-descriptors"} {:ns "clojure.reflect", :name "do-reflect", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["reflector typeref"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/do-reflect"} {:ns "clojure.reflect", :name "ClassResolver", :file "clojure/reflect/java.clj", :type "var", :column 1, :see-alsos [{:created-at 1507763760914, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "resolve-class", :ns "clojure.reflect"}, :_id "59dea630e4b03026fe14ea77"}], :line 196, :examples [{:editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :body "(require '[clojure.reflect :as cr]) \n\n;; Let us see what is available in the JavaReflector\n(->> clojure.reflect.ClassResolver \n cr/reflect\n :members\n (sort-by :name)\n (pp/print-table [:name :flags :parameter-types])\n; | :name | :flags | :parameter-types |\n; |---------------+----------------------+--------------------|\n; | resolve_class | #{:public :abstract} | [java.lang.Object] |\n;;=> nil\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}, :created-at 1507763657006, :updated-at 1507763804408, :_id "59dea5c9e4b03026fe14ea76"}], :notes nil, :arglists [], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/ClassResolver"} {:ns "clojure.reflect", :name "Reflector", :file "clojure/reflect.clj", :type "var", :column 1, :see-alsos nil, :line 44, :examples nil, :notes [{:body ";; not to be confused with the Reflector class\n```\n (import '(clojure.lang DynamicClassLoader Reflector))\n``` \n;;=> clojure.lang.Reflector\n```\n(let [class-loader (DynamicClassLoader.) \n a-class (.loadClass class-loader \"java.lang.Long\")] \n (Reflector/invokeConstructor a-class (into-array String [\"2\"])))\n```\n;;=> 2", :created-at 1507758825536, :updated-at 1507758968544, :author {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}, :_id "59de92e9e4b03026fe14ea62"}], :arglists [], :doc "Protocol for reflection implementers.", :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/Reflector"} {:ns "clojure.reflect", :name "->Constructor", :file "clojure/reflect/java.clj", :type "function", :column 1, :see-alsos nil, :line 115, :examples nil, :notes nil, :arglists ["name declaring-class parameter-types exception-types flags"], :doc "Positional factory function for class clojure.reflect.Constructor.", :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/->Constructor"} {:ns "clojure.reflect", :name "map->Constructor", :file "clojure/reflect/java.clj", :type "function", :column 1, :see-alsos nil, :line 115, :examples [{:updated-at 1507762666011, :created-at 1507762666011, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body "(require '[clojure.reflect :as cr])\n\n;; I have no idea what this is for but here is what it does.\n(cr/map->Constructor {:name \"do_reflect\" \n :declaring-class \"clojure.reflect.JavaReflector\"\n :parameter-types [\"java.lang.Object\"]\n :exception-types []\n :flags #{:public}}) \n;=> #clojure.reflect.Constructor{:name \"do_reflect\", \n;; :declaring-class \"clojure.reflect.JavaReflector\",\n;; :parameter-types [\"java.lang.Object\"],\n;; :exception-types [],\n;; :flags #{:public}}", :_id "59dea1eae4b03026fe14ea6c"}], :notes nil, :arglists ["m__7888__auto__"], :doc "Factory function for class clojure.reflect.Constructor, taking a map of keywords to field values.", :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/map->Constructor"} {:added "1.3", :ns "clojure.reflect", :name "type-reflect", :file "clojure/reflect.clj", :type "function", :column 1, :see-alsos [{:created-at 1495744758522, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reflect", :ns "clojure.reflect"}, :_id "592740f6e4b093ada4d4d773"}], :line 58, :examples [{:updated-at 1495738204071, :created-at 1495738204071, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body ";;;; Alphabetically list all public static fields in java.lang.Integer\n\n(use 'clojure.reflect)\n\n(->> java.lang.Integer \n clojure.reflect/type-reflect\n :members \n (filter #(instance? clojure.reflect.Field %)) \n (filter #(:public (:flags %)))\n (filter #(:static (:flags %)))\n (map #(vector (:name %) (:type %)))\n (sort)\n (pprint))\n\n;;=> ([BYTES int]\n;; [MAX_VALUE int]\n;; [MIN_VALUE int]\n;; [SIZE int]\n;; [TYPE java.lang.Class])", :_id "5927275ce4b093ada4d4d771"} {:updated-at 1495743210185, :created-at 1495743210185, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body ";;;; List class hierarchy for a particular class \n\n(defn class-hierarchy [clazz]\n (let [refl (fn [c] (assoc (clojure.reflect/type-reflect c) :name c))]\n (loop [type (refl clazz) hierarchy '()]\n (let [parent (->> type\n :bases\n (map refl)\n (remove #(:interface (:flags %)))\n first)]\n (if parent\n (recur parent (conj hierarchy (:name type)))\n (conj hierarchy java.lang.Object))))))\n\n(pprint (class-hierarchy javax.security.auth.login.CredentialNotFoundException))\n;;=> (java.lang.Object\n;; java.lang.Throwable\n;; java.lang.Exception\n;; java.security.GeneralSecurityException\n;; javax.security.auth.login.LoginException\n;; javax.security.auth.login.CredentialException\n;; javax.security.auth.login.CredentialNotFoundException)\n\n(pprint (class-hierarchy javax.swing.JPasswordField$AccessibleJPasswordField))\n;;=> (java.lang.Object\n;; javax.accessibility.AccessibleContext\n;; java.awt.Component$AccessibleAWTComponent\n;; java.awt.Container$AccessibleAWTContainer\n;; javax.swing.JComponent$AccessibleJComponent\n;; javax.swing.text.JTextComponent$AccessibleJTextComponent\n;; javax.swing.JTextField$AccessibleJTextField\n;; javax.swing.JPasswordField$AccessibleJPasswordField)\n", :_id "59273aeae4b093ada4d4d772"} {:updated-at 1508197724829, :created-at 1508197724829, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body "(require '(clojure [reflect :as cr] [pprint :as pp]))\n\n;; Let us see what is available in the DynamicClassLoader\n(->> clojure.lang.DynamicClassLoader \n cr/type-reflect\n :members\n (sort-by :name)\n (pp/print-table [:name :flags :parameter-types]))\n;| :name | :flags | :parameter-types |\n;|---------------------------------+-----------------------------+--------------------------------------------|\n;| EMPTY_URLS | #{:static :final} | |\n;| addURL | #{:public} | [java.net.URL] |\n;| classCache | #{:static} | |\n;| clojure.lang.DynamicClassLoader | #{:public} | [java.lang.ClassLoader] |\n;| clojure.lang.DynamicClassLoader | #{:public} | [] |\n;| constantVals | #{} | |\n;| defineClass | #{:public} | [java.lang.String byte<> java.lang.Object] |\n;| findClass | #{:protected} | [java.lang.String] |\n;| findInMemoryClass | #{:static} | [java.lang.String] |\n;| getConstants | #{:public} | [int] |\n;| loadClass | #{:synchronized :protected} | [java.lang.String boolean] |\n;| registerConstants | #{:public} | [int java.lang.Object<>] |\n;| rq | #{:static :final} | |", :_id "59e5455ce4b03026fe14ea91"}], :notes nil, :arglists ["typeref & options"], :doc "Alpha - subject to change.\n Reflect on a typeref, returning a map with :bases, :flags, and\n :members. In the discussion below, names are always Clojure symbols.\n\n :bases a set of names of the type's bases\n :flags a set of keywords naming the boolean attributes\n of the type.\n :members a set of the type's members. Each member is a map\n and can be a constructor, method, or field.\n\n Keys common to all members:\n :name name of the type \n :declaring-class name of the declarer\n :flags keyword naming boolean attributes of the member\n\n Keys specific to constructors:\n :parameter-types vector of parameter type names\n :exception-types vector of exception type names\n\n Key specific to methods:\n :parameter-types vector of parameter type names\n :exception-types vector of exception type names\n :return-type return type name\n\n Keys specific to fields:\n :type type name\n\n Options:\n\n :ancestors in addition to the keys described above, also\n include an :ancestors key with the entire set of\n ancestors, and add all ancestor members to\n :members.\n :reflector implementation to use. Defaults to JavaReflector,\n AsmReflector is also an option.", :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/type-reflect"} {:ns "clojure.repl", :name "source-fn", :file "clojure/repl.clj", :type "function", :column 1, :see-alsos [{:created-at 1353815572000, :author {:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"}, :to-var {:ns "clojure.repl", :name "source", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e83"}], :line 148, :examples [{:updated-at 1481465114444, :created-at 1481465114444, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body "(source-fn 'max)\n\n;;=> \"(defn max\n \\\"Returns the greatest of the nums.\\\"\n {:added \\\"1.0\\\"\n :inline-arities >1?\n :inline (nary-inline 'max)}\n ([x] x)\n ([x y] (. clojure.lang.Numbers (max x y)))\n ([x y & more]\n (reduce1 max (max x y) more)))\"\n", :_id "584d5d1ae4b0782b632278dc"}], :notes nil, :arglists ["x"], :doc "Returns a string of the source code for the given symbol, if it can\n find it. This requires that the symbol resolve to a Var defined in\n a namespace for which the .clj is in the classpath. Returns nil if\n it can't find the source. For most REPL usage, 'source' is more\n convenient.\n\n Example: (source-fn 'filter)", :library-url "https://github.com/clojure/clojure", :href "/clojure.repl/source-fn"} {:added "1.0", :ns "clojure.repl", :name "doc", :file "clojure/repl.clj", :type "macro", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "source", :ns "clojure.repl"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342639092000, :_id "542692eaf6e94c6970521af5"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "dir", :ns "clojure.repl"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342639183000, :_id "542692eaf6e94c6970521af6"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "apropos", :ns "clojure.repl"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342639337000, :_id "542692eaf6e94c6970521af7"}], :line 132, :examples [{:updated-at 1342639164000, :created-at 1342639164000, :body "=> (doc map)\n;; prints in console:\n-------------------------\nclojure.core/map\n([f coll] [f c1 c2] [f c1 c2 c3] [f c1 c2 c3 & colls])\n Returns a lazy sequence consisting of the result of applying f to the\n set of first items of each coll, followed by applying f to the set\n of second items in each coll, until any one of the colls is\n exhausted. Any remaining items in other colls are ignored. Function\n f should accept number-of-colls arguments.", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :_id "542692d6c026201cdc3270f7"} {:author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :editors [], :body "user> (doc clojure.core)\n-------------------------\nclojure.core\n Fundamental library of the Clojure language\n", :created-at 1398682749000, :updated-at 1398682749000, :_id "542692d6c026201cdc3270f8"}], :macro true, :notes [{:updated-at 1350125867000, :body "Note that the clojure.repl namespace which contains doc is not loaded by default in Emacs' SLIME mode, because SLIME provides its own doc function via C-c C-d d.", :created-at 1350125867000, :author {:login "pjlegato", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4ce55cfd8b3ae2f63f5ecbc8fc1c05d4?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fed"}], :arglists ["name"], :doc "Prints documentation for a var or special form given its name,\n or for a spec if given a keyword", :library-url "https://github.com/clojure/clojure", :href "/clojure.repl/doc"} {:added "1.3", :ns "clojure.repl", :name "stack-element-str", :file "clojure/repl.clj", :type "function", :column 1, :see-alsos [{:created-at 1559582539068, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "demunge", :ns "clojure.repl"}, :_id "5cf5574be4b0ca44402ef746"}], :line 228, :examples [{:updated-at 1559582523950, :created-at 1559582310173, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body "(ns my-namespace)\n\n(require '[clojure.repl :refer [stack-element-str]])\n\n(defn my-funct! [] (throw (ex-info \"error\" {})))\n\n(def stack-trace \n (try (my-funct!) (catch Exception e (.getStackTrace e))))\n\n;; This stack trace element shows a Java compatible class name,\n;; but is not very readable.\n(str (nth stack-trace 2))\n;; \"my_namespace$my_funct_BANG_.invokeStatic(form-init417155.clj:1)\"\n\n;; Use stack-element-str to transform it back into idiomatic Clojure\n(stack-element-str (nth stack-trace 2))\n;; \"my-namespace/my-funct! (form-init417155.clj:1)\"\n", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5cf55666e4b0ca44402ef743"}], :notes nil, :arglists ["el"], :doc "Returns a (possibly unmunged) string representation of a StackTraceElement", :library-url "https://github.com/clojure/clojure", :href "/clojure.repl/stack-element-str"} {:added "1.0", :ns "clojure.repl", :name "find-doc", :file "clojure/repl.clj", :type "function", :column 1, :see-alsos nil, :line 116, :examples [{:author {:login "pimgeek", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fa1bf77254fb5c14b4fd5afd1c11fe53?r=PG&default=identicon"}, :editors [{:login "pimgeek", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fa1bf77254fb5c14b4fd5afd1c11fe53?r=PG&default=identicon"}], :body "user=> (find-doc \"data structure\")\n\n-------------------------\nclojure.core/eval\n([form])\n Evaluates the form data structure (not text!) and returns the result.\n-------------------------\nclojure.core/ifn?\n([x])\n Returns true if x implements IFn. Note that many data structures\n (e.g. sets and maps) implement IFn\n", :created-at 1365967175000, :updated-at 1365967933000, :_id "542692d6c026201cdc3270f9"}], :notes nil, :arglists ["re-string-or-pattern"], :doc "Prints documentation for any var whose documentation or name\n contains a match for re-string-or-pattern", :library-url "https://github.com/clojure/clojure", :href "/clojure.repl/find-doc"} {:ns "clojure.repl", :name "dir", :file "clojure/repl.clj", :type "macro", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "doc", :ns "clojure.repl"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342639192000, :_id "542692eaf6e94c6970521b24"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "source", :ns "clojure.repl"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342639197000, :_id "542692eaf6e94c6970521b25"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "apropos", :ns "clojure.repl"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342639317000, :_id "542692eaf6e94c6970521b26"}], :line 202, :examples [{:author {:login "teyc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd6e62afb4881ab0f617611b8b65d003?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (require 'clojure.string 'clojure.repl)\n\nuser=> (clojure.repl/dir clojure.string)\nblank?\ncapitalize\nescape\njoin\nlower-case\nreplace\nreplace-first\nreverse\nsplit\nsplit-lines\ntrim\ntrim-newline\ntriml\ntrimr\nupper-case", :created-at 1283977504000, :updated-at 1332953035000, :_id "542692d0c026201cdc326ecf"}], :macro true, :notes nil, :arglists ["nsname"], :doc "Prints a sorted directory of public vars in a namespace", :library-url "https://github.com/clojure/clojure", :href "/clojure.repl/dir"} {:added "1.3", :ns "clojure.repl", :name "pst", :file "clojure/repl.clj", :type "function", :column 1, :see-alsos [{:created-at 1334156025000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "*e", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f5f"}], :line 241, :examples [{:author {:login "pimgeek", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fa1bf77254fb5c14b4fd5afd1c11fe53?r=PG&default=identicon"}, :editors [], :body "user=> (pst)\nnil\n\nuser=> (/ 1 0)\nArithmeticException Divide by zero clojure.lang.Numbers.divide (Numbers.java:156)\n\nuser=> (pst)\nArithmeticException Divide by zero\n\tclojure.lang.Numbers.divide (Numbers.java:156)\n\tclojure.lang.Numbers.divide (Numbers.java:3691)\n\tuser/eval13 (NO_SOURCE_FILE:7)\n\tclojure.lang.Compiler.eval (Compiler.java:6619)\n\tclojure.lang.Compiler.eval (Compiler.java:6582)\n\tclojure.core/eval (core.clj:2852)\n\tclojure.main/repl/read-eval-print--6588/fn--6591 (main.clj:259)\n\tclojure.main/repl/read-eval-print--6588 (main.clj:259)\n\tclojure.main/repl/fn--6597 (main.clj:277)\n\tclojure.main/repl (main.clj:277)\n\tclojure.main/repl-opt (main.clj:343)\n\tclojure.main/main (main.clj:441)\nnil\n", :created-at 1365968672000, :updated-at 1365968672000, :_id "542692d6c026201cdc3270fb"}], :notes nil, :arglists ["" "e-or-depth" "e depth"], :doc "Prints a stack trace of the exception, to the depth requested. If none supplied, uses the root cause of the\n most recent repl exception (*e), and a depth of 12.", :library-url "https://github.com/clojure/clojure", :href "/clojure.repl/pst"} {:ns "clojure.repl", :name "dir-fn", :file "clojure/repl.clj", :type "function", :column 1, :see-alsos [{:created-at 1545998336322, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "dir", :ns "clojure.repl"}, :_id "5c261000e4b0ca44402ef600"}], :line 196, :examples [{:updated-at 1559571596051, :created-at 1283977379000, :body "(require 'clojure.repl 'clojure.string)\n\nuser=> (pprint (clojure.repl/dir-fn 'clojure.string))\n(blank?\n capitalize\n escape\n join\n lower-case\n replace\n replace-first\n reverse\n split\n split-lines\n trim\n trim-newline\n triml\n trimr\n upper-case)\nnil\n\n;; Or the same with \"dir\" at the REPL:\n\nuser=> (dir clojure.string)\n(blank?\n capitalize\n escape\n join\n lower-case\n[...]", :editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/bd6e62afb4881ab0f617611b8b65d003?r=PG&default=identicon", :account-source "clojuredocs", :login "teyc"}, :_id "542692d0c026201cdc326ed1"}], :notes nil, :arglists ["ns"], :doc "Returns a sorted seq of symbols naming public vars in\n a namespace or namespace alias. Looks for aliases in *ns*", :library-url "https://github.com/clojure/clojure", :href "/clojure.repl/dir-fn"} {:ns "clojure.repl", :name "source", :file "clojure/repl.clj", :type "macro", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "doc", :ns "clojure.repl"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342639074000, :_id "542692ebf6e94c6970521db6"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "dir", :ns "clojure.repl"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342639176000, :_id "542692ebf6e94c6970521db7"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "apropos", :ns "clojure.repl"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342639308000, :_id "542692ebf6e94c6970521db8"} {:created-at 1502136782003, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/8271291?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "source-fn", :ns "clojure.repl"}, :_id "5988c9cee4b0d19c2ce9d710"}], :line 173, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (source max)\n;; prints in console:\n(defn max\n \"Returns the greatest of the nums.\"\n {:added \"1.0\"}\n ([x] x)\n ([x y] (if (> x y) x y))\n ([x y & more]\n (reduce max (max x y) more)))\n", :created-at 1279775890000, :updated-at 1285497544000, :_id "542692d0c026201cdc326ecb"}], :macro true, :notes nil, :arglists ["n"], :doc "Prints the source code for the given symbol, if it can find it.\n This requires that the symbol resolve to a Var defined in a\n namespace for which the .clj is in the classpath.\n\n Example: (source filter)", :library-url "https://github.com/clojure/clojure", :href "/clojure.repl/source"} {:ns "clojure.repl", :name "set-break-handler!", :file "clojure/repl.clj", :type "function", :column 1, :see-alsos nil, :line 280, :examples nil, :notes nil, :arglists ["" "f"], :doc "Register INT signal handler. After calling this, Ctrl-C will cause\n the given function f to be called with a single argument, the signal.\n Uses thread-stopper if no function given.", :library-url "https://github.com/clojure/clojure", :href "/clojure.repl/set-break-handler!"} {:added "1.3", :ns "clojure.repl", :name "root-cause", :file "clojure/repl.clj", :type "function", :column 1, :see-alsos nil, :line 215, :examples [{:updated-at 1559582779428, :created-at 1559576151369, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body "(require '[clojure.repl :refer [root-cause]])\n\n(def chained-exceptions \n (ex-info \"Problem.\" {:status :surprise} \n (try (/ 1 0) \n (catch Exception e \n (ex-info \"What happened?\" {:status :unknown} e)))))\n\n;; Only shows the first 3 items from the stack trace \n;; of the root-cause exception in chained-exceptions.\n\n(pst (root-cause chained-exceptions) 3)\n\n;; ArithmeticException Divide by zero\n;; clojure.lang.Numbers.divide (Numbers.java:158)\n;; clojure.lang.Numbers.divide (Numbers.java:3808)\n;; user/fn--2169 (form-init4179141376169992155.clj:3)\n\n", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5cf53e57e4b0ca44402ef741"}], :notes nil, :arglists ["t"], :doc "Returns the initial cause of an exception or error by peeling off all of\n its wrappers", :library-url "https://github.com/clojure/clojure", :href "/clojure.repl/root-cause"} {:added "1.3", :ns "clojure.repl", :name "demunge", :file "clojure/repl.clj", :type "function", :column 1, :see-alsos [{:created-at 1559571453087, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "munge", :ns "clojure.core"}, :_id "5cf52bfde4b0ca44402ef73d"}], :line 208, :examples [{:author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :editors [{:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=4"}], :body "user=> (require '[clojure.repl :as repl])\nnil\n\nuser=> (-> + class str)\n\"class clojure.core$_PLUS_\"\n\nuser=> (-> + class str repl/demunge)\n\"class clojure.core/+\"", :created-at 1335431555000, :updated-at 1647645337838, :_id "542692d6c026201cdc3270f6"}], :notes nil, :arglists ["fn-name"], :doc "Given a string representation of a fn class,\n as in a stack trace element, returns a readable version.", :library-url "https://github.com/clojure/clojure", :href "/clojure.repl/demunge"} {:ns "clojure.repl", :name "thread-stopper", :file "clojure/repl.clj", :type "function", :column 1, :see-alsos nil, :line 274, :examples nil, :notes nil, :arglists ["" "thread"], :doc "Returns a function that takes one arg and uses that as an exception message\n to stop the given thread. Defaults to the current thread", :library-url "https://github.com/clojure/clojure", :href "/clojure.repl/thread-stopper"} {:ns "clojure.repl", :name "apropos", :file "clojure/repl.clj", :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "source", :ns "clojure.repl"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342639345000, :_id "542692ebf6e94c6970521e1e"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "doc", :ns "clojure.repl"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342639350000, :_id "542692ebf6e94c6970521e1f"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "dir", :ns "clojure.repl"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342639354000, :_id "542692ebf6e94c6970521e20"}], :line 182, :examples [{:author {:login "teyc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd6e62afb4881ab0f617611b8b65d003?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (apropos \"temp\")\n()\n\nuser=> (require 'clojure.template)\nnil\n\nuser=> (apropos \"temp\")\n(apply-template do-template)\n", :created-at 1283977701000, :updated-at 1285487332000, :_id "542692d0c026201cdc326ecd"} {:updated-at 1611953795226, :created-at 1611953795226, :author {:login "sanel", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/213914?v=4"}, :body ";; apropos can accept regex patterns. E.g. find only definitions\n;; ending with \"reduce\"\nuser=> (apropos #\".+?reduce\")\n(clojure.core/areduce clojure.core/ensure-reduced clojure.core/unreduced ...)\n\n;; get all public definitions from all currently-loaded namespaces\nuser=> (apropos #\"^+?\")\n(clojure.core/* clojure.core/*' clojure.core/*1 ...)", :_id "60147683e4b0b1e3652d7445"}], :notes nil, :arglists ["str-or-pattern"], :doc "Given a regular expression or stringable thing, return a seq of all\npublic definitions in all currently-loaded namespaces that match the\nstr-or-pattern.", :library-url "https://github.com/clojure/clojure", :href "/clojure.repl/apropos"} {:added "1.0", :ns "clojure.set", :name "union", :file "clojure/set.clj", :type "function", :column 1, :see-alsos [{:created-at 1318523783000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "intersection", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b57"} {:created-at 1318525824000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "difference", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b58"} {:created-at 1318525832000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "superset?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b59"}], :line 20, :examples [{:author {:login "Brian Marick", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (union)\n#{}\n\nuser=> (union #{1 2})\n#{1 2}\n\nuser=> (union #{1 2} #{2 3})\n#{1 2 3}\n\nuser=> (union #{1 2} #{2 3} #{3 4})\n#{1 2 3 4}\n", :created-at 1278994901000, :updated-at 1412048733230, :_id "542692d0c026201cdc326ed9"} {:editors [{:login "sleyzerzon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/528932?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/200617?v=3", :account-source "github", :login "bsima"}], :body "(reduce (fn [flattened [key val]]\n (conj flattened val))\n #{}\n {:e #{:m :f}, :c #{:f}, :b #{:c :f}, :d #{:m :f}, :a #{:c :f}})\n\n;;=> #{#{:m :f} #{:c :f} #{:f}}\n\n\n(reduce (fn [flattened [key val]]\n (clojure.set/union flattened val))\n #{}\n {:e #{:m :f}, :c #{:f}, :b #{:c :f}, :d #{:m :f}, :a #{:c :f}})\n\n;;=> #{:m :c :f}", :author {:avatar-url "https://avatars.githubusercontent.com/u/528932?v=3", :account-source "github", :login "sleyzerzon"}, :created-at 1471130818331, :updated-at 1485272654530, :_id "57afacc2e4b02d8da95c26f8"} {:updated-at 1471131322046, :created-at 1471131322046, :author {:login "sleyzerzon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/528932?v=3"}, :body "(defn flatten-dpdnts [dpdnts-map]\n (apply set/union (vals dpdnts-map)))\n\n(flatten-dpdnts {:e #{:m :f}, :c #{:f}, :b #{:c :f}, :d #{:m :f}, :a #{:c :f}})\n;;=> #{:m :c :f}", :_id "57afaebae4b02d8da95c26fb"} {:updated-at 1532995894885, :created-at 1532655671091, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :body ";; Advice: Do not call union with non-set arguments. If you are\n;; concerned that you may be unintentionally doing so, and want an\n;; exception to be thrown if you do, consider using the library\n;; funjible (https://github.com/jafingerhut/funjible) which provides\n;; its own definition of union that is identical to Clojure's, except\n;; it checks the types of its arguments.\n\n;; union might or might not return what you expect if you give it\n;; values that are not sets. The implementation of union _does not\n;; check_ whether you are actually giving it values that are sets. It\n;; _assumes_ so.\n\n;; This looks like what someone might expect. It _happens_ to give\n;; back the same answer as if you coerced the second argument to a\n;; set.\nuser=> (union #{1 2 3} [4 5])\n#{1 4 3 2 5}\n\n;; Wait, this returned a vector, not a set!\nuser=> (union #{1 2} [3 4 5])\n[3 4 5 1 2]\n\n;; This also returned a vector, and some elements are duplicates of\n;; each other!\nuser=> (union #{1 2} [3 4 5] #{4 5})\n[3 4 5 1 2 4 5]\n\n;; Why not change the definition of union so it throws an exception if\n;; you give it a non-set argument? I would guess that the primary\n;; reason is that the extra run-time type checks would slow union down\n;; by an amount that the Clojure core team does not want everyone to\n;; have to pay on every such call.\n\n;; Related Clojure tickets: \n;; https://dev.clojure.org/jira/browse/CLJ-1953\n;; https://dev.clojure.org/jira/browse/CLJ-2287\n", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4", :account-source "github", :login "jafingerhut"}], :_id "5b5a7837e4b00ac801ed9e2e"} {:updated-at 1545071198416, :created-at 1545071198416, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :body ";; (set/union) treats nil as the empty set, as you'd probably expect.\n(clojure.set/union nil #{1 2} nil)\n;;=> #{1 2}\n\n;; This makes it handy to use as an accumulator in combination with (update-in):\n(update-in {} [:a :b :c] clojure.set/union #{333})\n;;=> {:a {:b {:c #{333}}}}\n", :_id "5c17ea5ee4b0ca44402ef5eb"} {:updated-at 1583387308326, :created-at 1583387308326, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; The \"powerset\" is the set of all the combinations of \"items\"\n(require '[clojure.set :refer [union]])\n\n(defn powerset [items]\n (reduce\n (fn [s x]\n (union s (map #(conj % x) s)))\n (hash-set #{})\n items))\n\n(powerset #{1 2 3})\n;; #{#{} #{3} #{2} #{1} #{1 3 2} #{1 3} #{1 2} #{3 2}}", :_id "5e6092ace4b087629b5a18b6"}], :notes nil, :arglists ["" "s1" "s1 s2" "s1 s2 & sets"], :doc "Return a set that is the union of the input sets", :library-url "https://github.com/clojure/clojure", :href "/clojure.set/union"} {:added "1.0", :ns "clojure.set", :name "map-invert", :file "clojure/set.clj", :type "function", :column 1, :see-alsos nil, :line 106, :examples [{:author {:login "Brian Marick", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Despite being in clojure.set, this has nothing to do with sets. \n\nuser=> (map-invert {:a 1, :b 2})\n{2 :b, 1 :a}\n\n;; If there are duplicate keys, one is chosen:\n\nuser=> (map-invert {:a 1, :b 1})\n{1 :b}\n\n;; I suspect it'd be unwise to depend on which key survives the clash.", :created-at 1278995220000, :updated-at 1285502749000, :_id "542692d0c026201cdc326ee9"} {:updated-at 1483716604767, :created-at 1483716604767, :author {:login "bruno-oliveira", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4722412?v=3"}, :body ";; The inverted map of an empty map is also an empty map.\nuser=> (map-invert {})\n{}\n\n;; Using complex values (which serve as keys in the inverted map) is possible.\nuser=> ((map-invert {:a {:c 5}}) {:c 5})\n:a", :_id "586fb7fce4b09108c8545a49"} {:updated-at 1532105186014, :created-at 1532105186014, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; simple text obfuscation and back, with map-invert\n\n(def scramble-key\n {\\a \\t \\b \\m \\c \\o \\d \\l\n \\e \\z \\f \\i \\g \\b \\h \\u\n \\i \\h \\j \\n \\k \\s \\l \\r\n \\m \\a \\n \\q \\o \\d \\p \\e\n \\q \\k \\r \\y \\s \\f \\t \\c\n \\u \\p \\v \\w \\w \\x \\x \\j\n \\y \\g \\z \\v \\space \\space})\n\n(defn scramble [text scramble-key]\n (apply str (map scramble-key text)))\n\n(defn unscramble [text scramble-key]\n (apply str (map (map-invert scramble-key) text)))\n\n(scramble \"try to read this if you can\" scramble-key)\n;; \"cyg cd yztl cuhf hi gdp otq\"\n\n(unscramble \"cyg cd yztl cuhf hi gdp otq\" scramble-key)\n;; \"try to read this if you can\"", :_id "5b5211e2e4b00ac801ed9e29"}], :notes [{:author {:login "optevo", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1281179?v=4"}, :updated-at 1573544646653, :created-at 1573544406399, :body "If you have the possibility of duplicate values, in your map, the invert-map function will only preserve one of them. An alternative which doesn't eliminate values is to ensure all values are sets then use the following function:\n
    (defn invert-map-of-sets [m]\n   (reduce (fn [a [k v]] (assoc a k (conj (get a k #{}) v))) {} (for [[k s] m v s] [v k]))))
    \nThis will work as follows:\n
    ;; From\n{1 #{:a :b :c} 2 #{:b :c :d}}
    \n\n
    ;; To\n{:c #{1 2}, :b #{1 2}, :a #{1}, :d #{2}}
    \n\n\n\n\n", :_id "5dca61d6e4b0ca44402ef7da"}], :arglists ["m"], :doc "Returns the map with the vals mapped to the keys.", :library-url "https://github.com/clojure/clojure", :href "/clojure.set/map-invert"} {:added "1.0", :ns "clojure.set", :name "join", :file "clojure/set.clj", :type "function", :column 1, :see-alsos [{:created-at 1533910568303, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "rename", :ns "clojure.set"}, :_id "5b6d9e28e4b00ac801ed9e50"}], :line 111, :examples [{:updated-at 1493911041846, :created-at 1278825825000, :body ";; This simple example shows each element of the first relation joined\n;; with each element of the second (because they have no columns in common):\n\nuser=> (def first-relation #{ {:a 1} {:a 2} })\nuser=> (def second-relation #{ {:b 1} {:b 2} })\nuser=> (join first-relation second-relation)\n#{{:b 1, :a 1} \n {:b 2, :a 1} \n {:b 1, :a 2} \n {:b 2, :a 2}}\n\n\n;; Here's a larger example, in which a relation mainly about animal ownership\n;; is joined with a relation about animal personality. The join is used to \n;; produce a relation joining information about an animal's personality to \n;; that animal.\n\nuser=> (def animals #{{:name \"betsy\" :owner \"brian\" :kind \"cow\"}\n {:name \"jake\" :owner \"brian\" :kind \"horse\"}\n {:name \"josie\" :owner \"dawn\" :kind \"cow\"}})\n\nuser=> (def personalities #{{:kind \"cow\" :personality \"stoic\"}\n {:kind \"horse\" :personality \"skittish\"}})\n#'user/personalities\nuser=> (join animals personalities)\n\n#{{:owner \"dawn\", :name \"josie\", :kind \"cow\", :personality \"stoic\"}\n {:owner \"brian\", :name \"betsy\", :kind \"cow\", :personality \"stoic\"}\n {:owner \"brian\", :name \"jake\", :kind \"horse\", :personality \"skittish\"}}\n\n\n;; (If cows had two personalities, instead of one, each cow would have \n;; two rows in the output.)\n\n;; Suppose `personalities` used `:species` instead of `:kind`:\n\nuser=> (def personalities #{{:species \"cow\" :personality \"stoic\"}\n {:species \"horse\" :personality \"skittish\"}})\n\n\n;; A simple join would produce results like this:\n\nuser=> (join animals personalities)\n#{{:kind \"horse\", :owner \"brian\", :name \"jake\", :species \"cow\", :personality \"stoic\"}\n {:kind \"cow\", :owner \"dawn\", :name \"josie\", :species \"cow\", :personality \"stoic\"}\n {:kind \"horse\", :owner \"brian\", :name \"jake\", :species \"horse\", :personality \"skittish\"}\n {:kind \"cow\", :owner \"brian\", :name \"betsy\", :species \"cow\", :personality \"stoic\"}\n {:kind \"cow\", :owner \"dawn\", :name \"josie\", :species \"horse\", :personality \"skittish\"}\n {:kind \"cow\", :owner \"brian\", :name \"betsy\", :species \"horse\", :personality \"skittish\"}}\n\n\n;; Notice that \"Jake\" is both a horse and a cow in the first line. That's \n;; likely not what you want. You can tell `join` to only produce output \n;; where the `:kind` value is the same as the `:species` value like this:\n\nuser=> (join animals personalities {:kind :species})\n#{{:kind \"cow\", :owner \"dawn\", :name \"josie\", :species \"cow\", :personality \"stoic\"}\n {:kind \"horse\", :owner \"brian\", :name \"jake\", :species \"horse\", :personality \"skittish\"}\n {:kind \"cow\", :owner \"brian\", :name \"betsy\", :species \"cow\", :personality \"stoic\"}}\n\n\n;; Notice that the `:kind` and `:species` keys both appear in each output map.\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon", :account-source "clojuredocs", :login "Brian Marick"} {:avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon", :account-source "clojuredocs", :login "Brian Marick"} {:avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon", :account-source "clojuredocs", :login "Brian Marick"} {:avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon", :account-source "clojuredocs", :login "Brian Marick"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/90ffa70a579c3e0c398b7523ecdc6a87?r=PG&default=identicon", :account-source "clojuredocs", :login "morphling"} {:login "tomaskulich", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4833191?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon", :account-source "clojuredocs", :login "Brian Marick"}, :_id "542692d0c026201cdc326edf"} {:updated-at 1493911081751, :created-at 1493911081751, :author {:login "tomaskulich", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4833191?v=3"}, :body "\n;; If you don't specify `km`, `join` has to 'guess' on which attributes to join.\n;; Sometimes, result may surprise you:\n\nuser=> (join [{:a 1 :b 2}] [{:c 3 :d 4} {:a 5 :b 6}]) \n;#{{:a 5, :b 6} {:a 1, :b 2, :c 3, :d 4}}", :_id "590b4629e4b01f4add58feaa"} {:updated-at 1631961178190, :created-at 1533911386656, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; join with rename of (otherwise clashing) keys. Note that in the following\n;; relations, we have \"user.type\" and \"account.type\"\n\n(def users\n #{{:user-id 1 :name \"john\" :age 22 :type \"personal\"}\n {:user-id 2 :name \"jake\" :age 28 :type \"company\"}\n {:user-id 3 :name \"amanda\" :age 63 :type \"personal\"}})\n\n(def accounts\n #{{:acc-id 1 :user-id 1 :amount 300.45 :type \"saving\"}\n {:acc-id 2 :user-id 2 :amount 1200.0 :type \"saving\"}\n {:acc-id 3 :user-id 1 :amount 850.1 :type \"debit\"}})\n\n(require '[clojure.set :as s])\n\n;; Clojure equivalent of the SQL:\n;; SELECT users.user-id, accounts.acc-id, \n;; users.type as type, accounts.type as atype\n;; FROM users\n;; INNER JOIN accounts ON users.user-id = accounts.user-id;\n\n(s/project\n (s/join users (s/rename accounts {:type :atype}))\n [:user-id :acc-id :type :atype])\n\n;; #{{:user-id 1, :acc-id 1, :type \"personal\", :atype \"saving\"}\n;; {:user-id 2, :acc-id 2, :type \"company\", :atype \"saving\"}\n;; {:user-id 1, :acc-id 3, :type \"personal\", :atype \"debit\"}}\n\n", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"} {:login "marckoch", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20969375?v=4"}], :_id "5b6da15ae4b00ac801ed9e51"}], :notes nil, :arglists ["xrel yrel" "xrel yrel km"], :doc "When passed 2 rels, returns the rel corresponding to the natural\n join. When passed an additional keymap, joins on the corresponding\n keys.", :library-url "https://github.com/clojure/clojure", :href "/clojure.set/join"} {:added "1.0", :ns "clojure.set", :name "select", :file "clojure/set.clj", :type "function", :column 1, :see-alsos [{:created-at 1321756919000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "filter", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d82"} {:created-at 1687507624559, :author {:login "daveliepmann", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/974443?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "project", :ns "clojure.set"}, :_id "649552a8e4b08cf8563f4bca"} {:created-at 1687507661784, :author {:login "daveliepmann", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/974443?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "join", :ns "clojure.set"}, :_id "649552cde4b08cf8563f4bcb"}], :line 65, :examples [{:author {:login "Brian Marick", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "kimh", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/924390?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/8908139?v=3", :account-source "github", :login "bsifou"}], :body "(clojure.set/select odd? #{1 2 3})\n;;=> #{1 3}\n", :created-at 1278822406000, :updated-at 1486787976866, :_id "542692d0c026201cdc326edb"}], :notes nil, :arglists ["pred xset"], :doc "Returns a set of the elements for which pred is true", :library-url "https://github.com/clojure/clojure", :href "/clojure.set/select"} {:added "1.0", :ns "clojure.set", :name "intersection", :file "clojure/set.clj", :type "function", :column 1, :see-alsos [{:created-at 1318523876000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "union", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aab"} {:created-at 1318525852000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "difference", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aac"} {:created-at 1318525861000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "superset?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aad"} {:created-at 1366429268000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "project", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aae"}], :line 33, :examples [{:updated-at 1447239876245, :created-at 1278994500000, :body "user=> (clojure.set/intersection #{1})\n#{1}\nuser=> (clojure.set/intersection #{1 2} #{2 3})\n#{2}\nuser=> (clojure.set/intersection #{1 2} #{2 3} #{3 4})\n#{}\nuser=> (clojure.set/intersection #{1 :a} #{:a 3} #{:a})\n#{:a}\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:login "edipofederle", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/50778?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon", :account-source "clojuredocs", :login "Brian Marick"}, :_id "542692d0c026201cdc326ee7"} {:updated-at 1474102028022, :created-at 1474101854124, :author {:login "mhmdsalem1993", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10787314?v=3"}, :body "; gcd => Greatest common divisor\n(defn find-divisors [x]\n (let [divisors (atom [x])]\n (doseq [_x (range 1 x)] (if (== 0 (mod x _x))\n (swap! divisors conj _x)\n ))\n @divisors\n )\n )\n(defn gcd [x y] (let\n [x-div (set (find-divisors x))\n y-div (set (find-divisors y))]\n (last (into [] (clojure.set/intersection y-div x-div)))\n ))\n;; lcm least common multiply\n(defn lcm [x y] (/ (Math/abs (* x y)) (gcd x y)))\n\n\n=> #'user/find-divisors\n=> #'user/gcd\n=> #'user/lcm\n(lcm 4 6)\n=> 12", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/10787314?v=3", :account-source "github", :login "mhmdsalem1993"}], :_id "57dd025ee4b0709b524f04fc"} {:updated-at 1494919958612, :created-at 1494919958612, :author {:login "abhilater", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1904958?v=3"}, :body "(clojure.set/intersection #{:a :b :c} #{:d :c :b})\n;=> #{:b :c}\n\n(clojure.set/intersection #{:a :e :i :o :u}\n\t\t\t #{:a :u :r}\n\t\t\t #{:r :u :s})\n;=> #{:u}", :_id "591aab16e4b01920063ee05e"} {:updated-at 1532996003370, :created-at 1532676926792, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :body ";; Advice: Do not call intersection with non-set arguments. If you\n;; are concerned that you may be unintentionally doing so, and want an\n;; exception to be thrown if you do, consider using the library\n;; funjible (https://github.com/jafingerhut/funjible) which provides\n;; its own definition of intersection that is identical to Clojure's,\n;; except it checks the types of its arguments.\n\n;; intersection might or might not return what you expect if you give it\n;; values that are not sets. The implementation of intersection _does not\n;; check_ whether you are actually giving it values that are sets. It\n;; _assumes_ so.\n\n;; It is possible that intersection _might_ throw an exception if you\n;; give it a non-set as an argument:\nuser=> (intersection #{1 3 5} [2 4])\nClassCastException clojure.lang.PersistentVector cannot be cast to clojure.lang.IPersistentSet clojure.core/disj (core.clj:1517)\n\n;; But it can also simply return an answer that is not the\n;; intersection of the two collections:\nuser=> (intersection #{1 3 5} [2 4 6 8])\n#{1 3}\n\n;; In the previous case, it includes elements in the returned set that\n;; you would not expect. It can also leave out elements in the\n;; returned set that you would expect to find there.\nuser=> (intersection #{\"1\" \"3\" \"5\"} [\"1\" \"3\" \"5\" \"7\"])\n#{}\n\n;; Why not change the definition of intersection so it always throws\n;; an exception if you give it a non-set argument? I would guess that\n;; the primary reason is that the extra run-time type checks would\n;; slow intersection down by an amount that the Clojure core team does\n;; not want everyone to have to pay on every such call.\n\n;; Related Clojure tickets: \n;; https://dev.clojure.org/jira/browse/CLJ-1953\n;; https://dev.clojure.org/jira/browse/CLJ-2287\n", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4", :account-source "github", :login "jafingerhut"}], :_id "5b5acb3ee4b00ac801ed9e35"}], :notes nil, :arglists ["s1" "s1 s2" "s1 s2 & sets"], :doc "Return a set that is the intersection of the input sets", :library-url "https://github.com/clojure/clojure", :href "/clojure.set/intersection"} {:added "1.2", :ns "clojure.set", :name "superset?", :file "clojure/set.clj", :type "function", :column 1, :see-alsos [{:created-at 1338064940000, :author {:login "jasonrudolph.com", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c4e34ac0818591402a41b2e9cfb4747b?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "subset?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d31"} {:created-at 1338064955000, :author {:login "jasonrudolph.com", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c4e34ac0818591402a41b2e9cfb4747b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "set", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d32"}], :line 150, :examples [{:author {:login "jasonrudolph.com", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c4e34ac0818591402a41b2e9cfb4747b?r=PG&default=identicon"}, :editors [], :body "(use '[clojure.set :only [superset?]])\n\nuser=> (superset? #{0} #{0})\ntrue\n\nuser=> (superset? #{0 1} #{0})\ntrue\n\nuser=> (superset? #{0} #{0 1}) \nfalse\n", :created-at 1338064647000, :updated-at 1338064647000, :_id "542692d6c026201cdc3270fc"} {:updated-at 1543865081521, :created-at 1532677432379, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :body ";; Advice: Do not call superset? with non-set arguments. If you are\n;; concerned that you may be unintentionally doing so, and want an\n;; exception to be thrown if you do, consider using the library\n;; funjible (https://github.com/jafingerhut/funjible) which provides\n;; its own definition of superset? that is identical to Clojure's,\n;; except it checks the types of its arguments.\n\n;; superset? might or might not return what you expect if you give it\n;; values that are not sets. The implementation of superset? _does not\n;; check_ whether you are actually giving it values that are sets. It\n;; _assumes_ so.\n\n;; If the first argument were a set with the same elements, you would\n;; expect the return value false here.\nuser=> (superset? [2 4 6 8] #{1 3})\ntrue\n\n;; Here, if the first argument were a set with the same elements as\n;; the vector, you would expect the return value true.\nuser=> (superset? [1 3 5] #{1 3 5})\nfalse\n\n;; And similarly here:\nuser=> (superset? [\"1\" \"3\" \"5\"] #{\"1\" \"3\"})\nfalse\n\n;; Switching to considering cases where the second argument is not a set, this\n;; appears to do what one would hope:\nuser=> (superset? #{1 2 3 4 5} [1 2 3 4])\ntrue\n\n;; ... but this does not (at least up until Clojure 1.10 this behavior is\n;; because of how superset? is implemented, first comparing the count of the\n;; two collections to make it possible to quickly return false when the second\n;; collection is larger):\nuser=> (subset? #{1 2 3 4 5} [1 2 3 4 1 2 3 4])\nfalse\n\n;; Why not change the definition of superset? so it always throws\n;; an exception if you give it a non-set argument? I would guess that\n;; the primary reason is that the extra run-time type checks would\n;; slow superset? down by an amount that the Clojure core team does\n;; not want everyone to have to pay on every such call.\n\n;; Related Clojure tickets: \n;; https://dev.clojure.org/jira/browse/CLJ-1953\n;; https://dev.clojure.org/jira/browse/CLJ-2287\n", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4", :account-source "github", :login "jafingerhut"}], :_id "5b5acd38e4b00ac801ed9e39"}], :notes nil, :tag "java.lang.Boolean", :arglists ["set1 set2"], :doc "Is set1 a superset of set2?", :library-url "https://github.com/clojure/clojure", :href "/clojure.set/superset_q"} {:added "1.0", :ns "clojure.set", :name "index", :file "clojure/set.clj", :type "function", :column 1, :see-alsos [{:created-at 1290275867000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "hash-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b48"} {:created-at 1290275888000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "get", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b49"}], :line 95, :examples [{:author {:login "Brian Marick", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "taylor.sando", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c127297f5548f7275ded1428aa5518bb?r=PG&default=identicon"} {:login "taylor.sando", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c127297f5548f7275ded1428aa5518bb?r=PG&default=identicon"} {:login "taylor.sando", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c127297f5548f7275ded1428aa5518bb?r=PG&default=identicon"} {:avatar-url "https://avatars0.githubusercontent.com/u/7083783?v=4", :account-source "github", :login "cloojure"} {:login "conan", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3037019?v=4"}], :body "(use '[clojure.set :only (index)])\n\n;; Suppose you have a set of descriptions of the weights of animals:\n\nuser=> (def weights #{ {:name 'betsy :weight 1000}\n {:name 'jake :weight 756}\n {:name 'shyq :weight 1000} })\n\n\n; You want the names of all the animals that weigh 1000. One way to do \n; that uses `index`. First, you can group the set elements (the maps) so\n; that those with the same weights are in the same group.\nuser=> (def by-weight (index weights [:weight]))\n#'user/by-weight\n\n; index returns a map. The keys are maps themselves, where {:weight 756} \n; and {:weight 1000} are taken from the maps in the weights set. \n; The values in the map returned by index are sets that contain map \n; entries from the above weights set.\nuser=> by-weight\n{{:weight 756} #{{:name jake, :weight 756}}, \n {:weight 1000} #{{:name shyq, :weight 1000} \n {:name betsy, :weight 1000}}}\n\n; To better visualize the by-weight map that is returned by index, \n; you can query it using get, using {:weight 756} as the key. This \n; will return all the maps (animals) that contain a weight of 756. \n; In this case, there is only one result, which is a set containing \n; a single map. \nuser=> (get by-weight {:weight 756})\n#{{:name jake, :weight 756}}\n\n; To see that there are two animals with a weight of 1000, you can \n; query by-weight with the key {:weight 1000}. This returns a set \n; containing two maps.\nuser=> (get by-weight {:weight 1000})\n#{{:name shyq, :weight 1000} {:name betsy :weight 1000}}\n\n; You can verify by using count\nuser=> (count (get by-weight {:weight 1000}))\n2\n\n; To get the names of those two animals we can map a name-extracting function\n; over the set of two maps. Since a keyword in a map is also a function that\n; returns its corresponding value, we can just use `:name` as our function:\nuser=> (map :name (get by-weight {:weight 1000}))\n(shyq betsy)\n", :created-at 1278996864000, :updated-at 1612200146773, :_id "542692d0c026201cdc326ef1"} {:updated-at 1601047527682, :created-at 1523214100238, :author {:login "statcompute", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/4590938?v=4"}, :body ";; You can do a join using 'index'\n(require '[clojure.set :as s]\n '[clojure.core.reducers :as r])\n \n(def ds1 [{:id 1 :name \"name1\"}\n {:id 2 :name \"name2\"}\n {:id 3 :name \"name3\"}])\n \n(def ds2 [{:id 2 :address \"addr2\"}\n {:id 3 :address \"addr3\"}\n {:id 4 :address \"addr4\"}])\n\n(into () (r/map #(r/reduce merge %) (vals (s/index (s/union ds2 ds1) [:id]))))\n;; ({:id 1, :name \"name1\"}\n;; {:id 4, :address \"addr4\"}\n;; {:id 3, :name \"name3\", :address \"addr3\"}\n;; {:id 2, :address \"addr2\", :name \"name2\"})\n", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4", :account-source "github", :login "dijonkitchen"} {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}], :_id "5aca6714e4b045c27b7fac3a"}], :notes nil, :arglists ["xrel ks"], :doc "Returns a map of the distinct values of ks in the xrel mapped to a\n set of the maps in xrel with the corresponding values of ks.", :library-url "https://github.com/clojure/clojure", :href "/clojure.set/index"} {:added "1.2", :ns "clojure.set", :name "subset?", :file "clojure/set.clj", :type "function", :column 1, :see-alsos [{:created-at 1293674668000, :author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "set?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a98"} {:created-at 1293674671000, :author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "set", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a99"} {:created-at 1338064920000, :author {:login "jasonrudolph.com", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c4e34ac0818591402a41b2e9cfb4747b?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "superset?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a9a"} {:created-at 1512076531871, :author {:login "chbrown", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/360279?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "every?", :ns "clojure.core"}, :_id "5a2074f3e4b0a08026c48cc9"}], :line 142, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [], :body "user> (clojure.set/subset? #{2 3} #{1 2 3 4})\ntrue\n\nuser> (clojure.set/subset? #{2 4} #{1 2 3 4})\ntrue\n\nuser> (clojure.set/subset? #{2 5} #{1 2 3 4})\nfalse", :created-at 1293674661000, :updated-at 1293674661000, :_id "542692d0c026201cdc326ee6"} {:editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}], :body ";; Advice: Do not call subset? with non-set arguments. If you are\n;; concerned that you may be unintentionally doing so, and want an\n;; exception to be thrown if you do, consider using the library\n;; funjible (https://github.com/jafingerhut/funjible) which provides\n;; its own definition of subset? that is identical to Clojure's,\n;; except it checks the types of its arguments.\n\n;; subset? might or might not return what you expect if you give it\n;; values that are not sets. The implementation of subset? _does not\n;; check_ whether you are actually giving it values that are sets. It\n;; _assumes_ so.\n\n;; If the second argument were a set with the same elements, you would\n;; expect the return value false here.\nuser=> (subset? #{1 3} [2 4 6 8])\ntrue\n\n;; Here, if the second argument were a set with the same elements as\n;; the vector, you would expect the return value true.\nuser=> (subset? #{1 3 5} [1 3 5])\nfalse\n\n;; And similarly here:\nuser=> (subset? #{\"1\" \"3\"} [\"1\" \"3\" \"5\"])\nfalse\n\n;; Switching to considering cases where the first argument is not a set, this\n;; appears to do what one would hope:\nuser=> (subset? [1 2 3 4] #{1 2 3 4 5})\ntrue\n\n;; ... but this does not (at least up until Clojure 1.10 this behavior is\n;; because of how subset? is implemented, first comparing the count of the\n;; two collections to make it possible to quickly return false when the first\n;; collection is larger):\nuser=> (subset? [1 2 3 4 1 2 3 4] #{1 2 3 4 5})\nfalse\n\n;; Why not change the definition of subset? so it always throws\n;; an exception if you give it a non-set argument? I would guess that\n;; the primary reason is that the extra run-time type checks would\n;; slow subset? down by an amount that the Clojure core team does\n;; not want everyone to have to pay on every such call.\n\n;; Related Clojure tickets: \n;; https://dev.clojure.org/jira/browse/CLJ-1953\n;; https://dev.clojure.org/jira/browse/CLJ-2287\n", :author {:avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4", :account-source "github", :login "jafingerhut"}, :created-at 1532677195231, :updated-at 1543865004707, :_id "5b5acc4be4b00ac801ed9e37"}], :notes [{:body "Do note that this will only work as expected for sets. subset? uses contains? in it's implementation. The functionality in contains? for vectors can be slightly unintuitive at first, and causes functions like this to perform in completely unexpected ways when using vectors instead of sets. For example,\n\n```\nuser> (clojure.set/subset? [0 1] [2 3])\ntrue\nuser> (clojure.set/subset? [2 3] [2 3])\nfalse\n```\n\nIt is slightly more intuitive with maps, as it checks whether every item in the first collection is a key in the map passed in as the 2nd parameter, but still is probably a bit confusing to someone reading your code.\n\n```\nuser> (clojure.set/subset? '(7 8) {8 1 7 3})\ntrue\nuser> (clojure.set/subset? '(9 10) {8 1 7 3})\nfalse\n```\n\nLong story short, if you're using functions from the clojure.set namespace, make sure you're passing in sets. ", :created-at 1422419407728, :updated-at 1422422014024, :author {:login "arkdrag", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1578334?v=3"}, :_id "54c865cfe4b0e2ac61831ce5"}], :tag "java.lang.Boolean", :arglists ["set1 set2"], :doc "Is set1 a subset of set2?", :library-url "https://github.com/clojure/clojure", :href "/clojure.set/subset_q"} {:added "1.0", :ns "clojure.set", :name "rename", :file "clojure/set.clj", :type "function", :column 1, :see-alsos [{:created-at 1313707898000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "rename-keys", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e1a"}], :line 89, :examples [{:author {:login "Brian Marick", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Here's a relation with two keys (think \"column names\" in SQL), :a and :b\n\nuser=> (def relation #{ {:a 1, :b 1} {:a 2, :b 2} })\n\n\n;; I decide that :a is a stupid name and that :new-a would be better. \n;; Here's how I make a new relation with the renamed key:\n\nuser=> (rename relation {:a :new-a})\n#{{:new-a 1, :b 1} {:new-a 2, :b 2}}\n\n", :created-at 1278824834000, :updated-at 1285503801000, :_id "542692d0c026201cdc326eef"}], :notes nil, :arglists ["xrel kmap"], :doc "Returns a rel of the maps in xrel with the keys in kmap renamed to the vals in kmap", :library-url "https://github.com/clojure/clojure", :href "/clojure.set/rename"} {:added "1.0", :ns "clojure.set", :name "rename-keys", :file "clojure/set.clj", :type "function", :column 1, :see-alsos [{:created-at 1313707906000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "rename", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d90"}], :line 78, :examples [{:author {:login "Brian Marick", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Stathis Sideris", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/299a3fab7a1a2d6644455dedae9fce0a?r=PG&default=identicon"}], :body "user=> (rename-keys {:a 1, :b 2} {:a :new-a, :b :new-b})\n{:new-a 1, :new-b 2}\n\n\n;; The behavior when the second map contains a key not in the first is interesting.\n;; I suspect you shouldn't depend on it. (Clojure 1.1 - no longer happens in 1.2.1)\n\nuser=> (rename-keys {:a 1} {:b :new-b})\n{ :a 1, :new-b nil}\n", :created-at 1278824415000, :updated-at 1350332324000, :_id "542692d0c026201cdc326ed2"} {:author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :editors [{:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"} {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"} {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"} {:avatar-url "https://avatars1.githubusercontent.com/u/28267638?v=4", :account-source "github", :login "mrkam2"} {:login "dijonkitchen", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4"}], :body ";; You need to be careful about key collisions. You probably shouldn't \n;; depend on the exact behavior.\nuser=> (rename-keys {:a 1 :b 2} {:a :b})\n{:b 1}\n", :created-at 1305262334000, :updated-at 1576884199874, :_id "542692d0c026201cdc326ed5"} {:updated-at 1548872180983, :created-at 1548872180983, :author {:login "mrkam2", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/28267638?v=4"}, :body ";; Key collisions no longer reproducible in Clojure 1.10.0\nuser=> (rename-keys {:a 1 :b 2} {:a :b :b :a})\n{:b 1, :a 2}", :_id "5c51e9f4e4b0ca44402ef65d"} {:editors [{:login "Jeel-Shah", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/4922694?v=4"}], :body ";; Note that rename-keys in the clojure.set namespace. In order to use it, you\n;; must require the namespace\n\nuser=> (require '[clojure.set :as set])\nuser=> (set/rename-keys {:a 1 :b 2} {:a :new-a})\n=> {:new-a 1 :b 2}\n\n;; Alternatively, you can use rename-keys by simply doing clojure.set/rename-keys", :author {:avatar-url "https://avatars2.githubusercontent.com/u/4922694?v=4", :account-source "github", :login "Jeel-Shah"}, :created-at 1580344960284, :updated-at 1580589650671, :_id "5e322680e4b0ca44402ef828"} {:editors [{:login "shegeley", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8594472?v=4"}], :body "doesn't works on nested (as one might expect)\nuser=> \n(rename-keys\n {:user {:name \"john\"}}\n {:user {:name :nickname}}) => {{:name :nickname} {:name \"john\"}}", :author {:avatar-url "https://avatars.githubusercontent.com/u/8594472?v=4", :account-source "github", :login "shegeley"}, :created-at 1621365421644, :updated-at 1621365442781, :_id "60a412ade4b0b1e3652d7501"}], :notes nil, :arglists ["map kmap"], :doc "Returns the map with the keys in kmap renamed to the vals in kmap", :library-url "https://github.com/clojure/clojure", :href "/clojure.set/rename-keys"} {:added "1.0", :ns "clojure.set", :name "project", :file "clojure/set.clj", :type "function", :column 1, :see-alsos nil, :line 72, :examples [{:author {:login "Brian Marick", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; `project` strips out unwanted key/value pairs from a set of maps. \n;; Suppose you have these descriptions of cows:\n\nuser=> (def cows #{ {:name \"betsy\" :id 33} {:name \"panda\" :id 34} })\n#'user/cows\n\n;; You care only about the names. So you can get them like this:\n\nuser=> (project cows [:name])\n#{{:name \"panda\"} {:name \"betsy\"}}\n", :created-at 1278995532000, :updated-at 1285502725000, :_id "542692d0c026201cdc326edd"} {:updated-at 1476954849358, :created-at 1476954849358, :author {:login "dalzony", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/562341?v=3"}, :body ";; also worked from vector of maps.\n\nuser=> (def sample [{:name \"Minsun\" :device \"iphone6\"}\n {:name \"hogle\" :device \"iphone7 matte black\"}])\n;;=> #'user/sample\n\nuser=> (clojure.set/project sample [:name])\n;;=> #{{:name \"hogle\"} {:name \"Minsun\"}}\n", :_id "58088ae1e4b001179b66bdd5"}], :notes [{:updated-at 1320358713000, :body "is there a function that is like project, but returns a set of hash-maps with with all the keys but the ones project was given?", :created-at 1320358713000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fd1"} {:updated-at 1349530376000, :body "This doesn't exist in clojure.set, but I think it would be what you wanted.\r\n\r\n
    \r\n(defn project-not [xrel ks]\r\n  ;; convert the given key sequence into a hash-set\r\n  ;; This represents keys that you don't want included\r\n  (let [ks-set (into #{} ks)]\r\n    ;; Do a projection on the keys that are not in ks\r\n    (clojure.set/project xrel\r\n                         ;; Assumes xrel is a set of maps\r\n                         ;; Grab the first map and extract the keys\r\n                         ;; Then remove any keys that are in ks-set\r\n                         ;; This will leave the remaining keys for\r\n                         ;; projection\r\n                         (remove #(ks-set %) (keys (first xrel))))))\r\n\r\nuser> (project-not cows [:id])\r\n#{{:name \"panda\" {:name \"betsy\"}}\r\n
    ", :created-at 1349530376000, :author {:login "taylor.sando", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c127297f5548f7275ded1428aa5518bb?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fe9"} {:updated-at 1366672505000, :body "it strikes me as being very odd that the key set is a vector as opposed to vargs\r\n", :created-at 1366672505000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :_id "542692edf6e94c6970522001"} {:body "An alternate version of `project-not` that doesn't assume the first map in xrel has all the possible keys:\n\n
    \n(defn project-not\n  \"Returns a rel of the elements of xrel with keys in ks dissoced\"\n  [xrel ks]\n  (with-meta (set (map #(apply dissoc % ks) xrel)) (meta xrel)))\n
    ", :created-at 1444156923198, :updated-at 1444156940978, :author {:avatar-url "https://avatars.githubusercontent.com/u/938655?v=3", :account-source "github", :login "yanatan16"}, :_id "561415fbe4b084e61c76ecbc"}], :arglists ["xrel ks"], :doc "Returns a rel of the elements of xrel with only the keys in ks", :library-url "https://github.com/clojure/clojure", :href "/clojure.set/project"} {:added "1.0", :ns "clojure.set", :name "difference", :file "clojure/set.clj", :type "function", :column 1, :see-alsos [{:created-at 1318525779000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "union", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ce2"} {:created-at 1318525788000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "intersection", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ce3"} {:created-at 1318525910000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "superset?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ce4"} {:created-at 1366429247000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "project", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ce5"} {:created-at 1533849200342, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "disj", :ns "clojure.core"}, :_id "5b6cae70e4b00ac801ed9e4c"}], :line 49, :examples [{:author {:login "Brian Marick", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (difference #{1 2 3})\n#{1 2 3}\nuser=> (difference #{1 2} #{2 3})\n#{1}\nuser=> (difference #{1 2 3} #{1} #{1 4} #{3})\n#{2}", :created-at 1278822538000, :updated-at 1332952529000, :_id "542692d0c026201cdc326eeb"} {:author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (difference (set (keys {:1 1 :2 2 :3 3})) (set (keys {:1 1 :2 2})))\n#{:3}\nuser=> (difference (set (keys {:1 1 :2 2})) (set (keys {:1 1 :2 2 :3 3})))\n#{}", :created-at 1279384603000, :updated-at 1332952542000, :_id "542692d0c026201cdc326eed"} {:updated-at 1457518056250, :created-at 1457518056250, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body "user=> (difference #{:a :b :c :d} (difference #{:a :b :c :d} #{:c :e :a :f :d}))\n#{:a :c :d}", :_id "56dff5e8e4b0119038be0211"} {:editors [{:login "tdg5", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/2316989?v=4"} {:avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4", :account-source "github", :login "jafingerhut"}], :body ";; Advice: Do not call difference with non-set arguments. If you are\n;; concerned that you may be unintentionally doing so, and want an\n;; exception to be thrown if you do, consider using the library\n;; funjible (https://github.com/jafingerhut/funjible) which provides\n;; its own definition of difference that is identical to Clojure's,\n;; except it checks the types of its arguments.\n\n;; difference might or might not return what you expect if you give it\n;; values that are not sets. The implementation of difference _does not\n;; check_ whether you are actually giving it values that are sets. It\n;; _assumes_ so.\n\n;; This looks like what someone might expect. It _happens_ to give\n;; back the same answer as if you coerced the second argument to a\n;; set.\nuser=> (difference #{1 3 5} [1 2 3 4 5 6])\n#{}\n\n;; This is not the difference between the two collections (if they\n;; were both sets) at all!\nuser=> (difference #{1 3 5} [2 4 6 8 10 12])\n#{}\n\n;; Give it only sets, and it returns the correct answer.\nuser=> (set/difference #{1 3 5} #{2 4 6 8 10 12})\n#{1 3 5}\n\n;; Also not the correct set difference, because the second arg is a\n;; vector, not a set.\nuser=> (difference #{-1 10 20 30} [-1 10 20 30 40])\n#{20 -1 30 10}\n\n;; This is correct.\nuser=> (difference #{-1 10 20 30} #{-1 10 20 30 40})\n#{}\n\n;; Why not change the definition of difference so it throws an exception if\n;; you give it a non-set argument? I would guess that the primary\n;; reason is that the extra run-time type checks would slow difference down\n;; by an amount that the Clojure core team does not want everyone to\n;; have to pay on every such call.\n\n;; Related Clojure tickets: \n;; https://dev.clojure.org/jira/browse/CLJ-1953\n;; https://dev.clojure.org/jira/browse/CLJ-2287\n", :author {:avatar-url "https://avatars2.githubusercontent.com/u/2316989?v=4", :account-source "github", :login "tdg5"}, :created-at 1505239113099, :updated-at 1532995953611, :_id "59b82049e4b09f63b945ac71"} {:editors [{:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4"}], :body ";; difference subtracts the trailing sets\n(def s1 #{1 2})\n(def s2 #{2 3})\n(set/difference s1 s2)\n;;=> #{1}\n\n;; to get the exclusive union #{1 3} (or \"XOR\"):\n(set/difference\n (set/union s1 s2)\n (set/intersection s1 s2))\n;;=> #{1 3}\n\n;; You can extend this to maps:\n(defn- map-xor [m1 m2]\n (map (juxt (fn [[k1 _] _] k1)\n (fn [[_ v1] [_ v2]]\n (set/difference\n (set/union (set v1) (set v2))\n (set/intersection (set v1) (set v2)))))\n m1\n m2))\n(map-xor \n {:a [1 2] :b [2 3]}\n {:a [2 3] :b [3]})\n;;=> ([:a #{1 3}] \n [:b #{2}])", :author {:avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4", :account-source "github", :login "loeschzwerg"}, :created-at 1655477240416, :updated-at 1655477266625, :_id "62ac93f8e4b0b1e3652d7606"}], :notes nil, :arglists ["s1" "s1 s2" "s1 s2 & sets"], :doc "Return a set that is the first set without elements of the remaining sets", :library-url "https://github.com/clojure/clojure", :href "/clojure.set/difference"} {:ns "clojure.spec.alpha", :name "form", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 173, :examples nil, :notes nil, :arglists ["spec"], :doc "returns the spec as data", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/form"} {:ns "clojure.spec.alpha", :name "&", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos nil, :line 653, :examples [{:editors [{:login "holyjak", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/624958?v=4"}], :body "(require '[clojure.spec.alpha :as s])\n\n(s/conform\n (s/cat :tag keyword? :children (s/& (s/+ integer?) #(-> % count (>= 2))))\n [:a 3])\n;=> :clojure.spec.alpha/invalid\n(s/conform\n (s/cat :tag keyword? :children (s/& (s/+ integer?) #(-> % count (>= 2))))\n [:a 3 4 5])\n;=> {:tag :a, :children [3 4 5]}\n", :author {:avatar-url "https://avatars1.githubusercontent.com/u/624958?v=4", :account-source "github", :login "holyjak"}, :created-at 1561635215512, :updated-at 1561635233952, :_id "5d14a98fe4b0ca44402ef771"}], :macro true, :notes nil, :arglists ["re & preds"], :doc "takes a regex op re, and predicates. Returns a regex-op that consumes\n input as per re but subjects the resulting value to the\n conjunction of the predicates, and any conforming they might perform.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/&"} {:ns "clojure.spec.alpha", :name "nilable-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1829, :examples nil, :notes nil, :arglists ["form pred gfn"], :doc "Do not call this directly, use 'nilable'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/nilable-impl"} {:ns "clojure.spec.alpha", :name "*recursion-limit*", :file "clojure/spec/alpha.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 19, :examples [{:editors [{:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}], :body ";; Limit the recursion to 1\n(binding [s/*recursion-limit* 1]\n (gen/generate (s/gen my-spec)))", :author {:avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4", :account-source "github", :login "bfontaine"}, :created-at 1542797640693, :updated-at 1542797667795, :_id "5bf53948e4b00ac801ed9f02"}], :notes nil, :arglists [], :doc "A soft limit on how many times a branching spec (or/alt/*/opt-keys/multi-spec)\n can be recursed through during generation. After this a\n non-recursive branch will be chosen.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/*recursion-limit*"} {:ns "clojure.spec.alpha", :name "*coll-error-limit*", :file "clojure/spec/alpha.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 33, :examples nil, :notes nil, :arglists [], :doc "The number of errors reported by explain in a collection spec'ed with 'every'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/*coll-error-limit*"} {:ns "clojure.spec.alpha", :name "fspec", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos nil, :line 669, :examples nil, :macro true, :notes nil, :arglists ["& {:keys [args ret fn gen], :or {ret (quote clojure.core/any?)}}"], :doc "takes :args :ret and (optional) :fn kwargs whose values are preds\n and returns a spec whose conform/explain take a fn and validates it\n using generative testing. The conformed value is always the fn itself.\n\n See 'fdef' for a single operation that creates an fspec and\n registers it, as well as a full description of :args, :ret and :fn\n\n fspecs can generate functions that validate the arguments and\n fabricate a return value compliant with the :ret spec, ignoring\n the :fn spec if present.\n\n Optionally takes :gen generator-fn, which must be a fn of no args\n that returns a test.check generator.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/fspec"} {:ns "clojure.spec.alpha", :name "explain-printer", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 227, :examples nil, :notes nil, :arglists ["ed"], :doc "Default printer for explain-data. nil indicates a successful validation.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/explain-printer"} {:ns "clojure.spec.alpha", :name "Specize", :file "clojure/spec/alpha.clj", :type "var", :column 1, :see-alsos nil, :line 121, :examples nil, :notes nil, :arglists [], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/Specize"} {:ns "clojure.spec.alpha", :name "every", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos nil, :line 515, :examples nil, :macro true, :notes nil, :arglists ["pred & {:keys [into kind count max-count min-count distinct gen-max gen], :as opts}"], :doc "takes a pred and validates collection elements against that pred.\n\n Note that 'every' does not do exhaustive checking, rather it samples\n *coll-check-limit* elements. Nor (as a result) does it do any\n conforming of elements. 'explain' will report at most *coll-error-limit*\n problems. Thus 'every' should be suitable for potentially large\n collections.\n\n Takes several kwargs options that further constrain the collection:\n\n :kind - a pred that the collection type must satisfy, e.g. vector?\n (default nil) Note that if :kind is specified and :into is\n not, this pred must generate in order for every to generate.\n :count - specifies coll has exactly this count (default nil)\n :min-count, :max-count - coll has count (<= min-count count max-count) (defaults nil)\n :distinct - all the elements are distinct (default nil)\n\n And additional args that control gen\n\n :gen-max - the maximum coll size to generate (default 20)\n :into - one of [], (), {}, #{} - the default collection to generate into\n (default: empty coll as generated by :kind pred if supplied, else [])\n \n Optionally takes :gen generator-fn, which must be a fn of no args that\n returns a test.check generator\n\n See also - coll-of, every-kv\n", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/every"} {:ns "clojure.spec.alpha", :name "keys*", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos [{:created-at 1549644522869, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "keys", :ns "clojure.spec.alpha"}, :_id "5c5db2eae4b0ca44402ef66a"}], :line 1789, :examples nil, :macro true, :notes nil, :arglists ["& kspecs"], :doc "takes the same arguments as spec/keys and returns a regex op that matches sequences of key/values,\n converts them into a map, and conforms that map with a corresponding\n spec/keys call:\n\n user=> (s/conform (s/keys :req-un [::a ::c]) {:a 1 :c 2})\n {:a 1, :c 2}\n user=> (s/conform (s/keys* :req-un [::a ::c]) [:a 1 :c 2])\n {:a 1, :c 2}\n\n the resulting regex op can be composed into a larger regex:\n\n user=> (s/conform (s/cat :i1 integer? :m (s/keys* :req-un [::a ::c]) :i2 integer?) [42 :a 1 :c 2 :d 4 99])\n {:i1 42, :m {:a 1, :c 2, :d 4}, :i2 99}", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/keys*"} {:ns "clojure.spec.alpha", :name "alt-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1442, :examples nil, :notes nil, :arglists ["ks ps forms"], :doc "Do not call this directly, use 'alt'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/alt-impl"} {:ns "clojure.spec.alpha", :name "def-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 322, :examples nil, :notes nil, :arglists ["k form spec"], :doc "Do not call this directly, use 'def'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/def-impl"} {:ns "clojure.spec.alpha", :name "*explain-out*", :file "clojure/spec/alpha.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 252, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/*explain-out*"} {:ns "clojure.spec.alpha", :name "regex-spec-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1692, :examples nil, :notes nil, :arglists ["re gfn"], :doc "Do not call this directly, use 'spec' with a regex op argument", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/regex-spec-impl"} {:ns "clojure.spec.alpha", :name "merge-spec-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1190, :examples nil, :notes nil, :arglists ["forms preds gfn"], :doc "Do not call this directly, use 'merge'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/merge-spec-impl"} {:ns "clojure.spec.alpha", :name "explain-data*", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 211, :examples nil, :notes nil, :arglists ["spec path via in x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/explain-data*"} {:ns "clojure.spec.alpha", :name "check-asserts", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1950, :examples nil, :notes [{:author {:login "allmonty", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4502764?v=4"}, :updated-at 1678998355863, :created-at 1678998355863, :body "You can also **enable check-asserts globally** using deps.edn you can add it to a profile. It is a jvm option. In your **deps.edn** you can add this:\n\n```\n:aliases {:dev {:jvm-opts [\"-Dclojure.spec.check-asserts=true\"]}}\n```", :_id "64137b53e4b08cf8563f4b7e"}], :arglists ["flag"], :doc "Enable or disable spec asserts that have been compiled\nwith '*compile-asserts*' true. See 'assert'.\n\nInitially set to boolean value of clojure.spec.check-asserts\nsystem property. Defaults to false.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/check-asserts"} {:ns "clojure.spec.alpha", :name "assert*", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1959, :examples nil, :notes nil, :arglists ["spec x"], :doc "Do not call this directly, use 'assert'.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/assert*"} {:ns "clojure.spec.alpha", :name "inst-in-range?", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1884, :examples nil, :notes nil, :arglists ["start end inst"], :doc "Return true if inst at or after start and before end", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/inst-in-range_q"} {:ns "clojure.spec.alpha", :name "nilable", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos nil, :line 1855, :examples [{:editors [{:login "escherize", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/343288?v=4"}], :body "(def ::my-spec (nilable int?))\n\n(valid? ::my-spec 2)\n;;=> true\n\n(valid ::my-spec 3.3)\n;;=> false\n\n(valid? ::my-spec nil)\n;;=> true", :author {:avatar-url "https://avatars2.githubusercontent.com/u/343288?v=4", :account-source "github", :login "escherize"}, :created-at 1521476741313, :updated-at 1521476829553, :_id "5aafe485e4b0316c0f44f92f"}], :macro true, :notes nil, :arglists ["pred"], :doc "returns a spec that accepts nil and values satisfying pred", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/nilable"} {:ns "clojure.spec.alpha", :name "and-spec-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1146, :examples nil, :notes nil, :arglists ["forms preds gfn"], :doc "Do not call this directly, use 'and'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/and-spec-impl"} {:ns "clojure.spec.alpha", :name "describe*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["spec"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/describe*"} {:ns "clojure.spec.alpha", :name "map-spec-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 817, :examples nil, :notes nil, :arglists ["{:keys [req-un opt-un keys-pred pred-exprs opt-keys req-specs req req-keys opt-specs pred-forms opt gfn], :as argm}"], :doc "Do not call this directly, use 'spec' with a map argument", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/map-spec-impl"} {:ns "clojure.spec.alpha", :name "coll-of", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos [{:created-at 1535112883796, :author {:login "maiwald", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/355026?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "map-of", :ns "clojure.spec.alpha"}, :_id "5b7ff6b3e4b00ac801ed9e71"} {:created-at 1535112895156, :author {:login "maiwald", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/355026?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "every", :ns "clojure.spec.alpha"}, :_id "5b7ff6bfe4b00ac801ed9e72"}], :line 574, :examples [{:updated-at 1535329349336, :created-at 1535329349336, :author {:login "veix", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/31626014?v=4"}, :body "(def suit? #{:heart :diamond :club :spade})\n(def rank?\n (into #{:ace :king :queen :jack} (range 2 11)))\n\n(def deck (for [s suit? r rank?] [s r])) \n\n(s/def ::card (s/tuple suit? rank?)) \n(s/def ::deck (s/coll-of ::card :distinct true :into [] :count 52)))\n", :_id "5b834445e4b00ac801ed9e7a"}], :macro true, :notes nil, :arglists ["pred & opts"], :doc "Returns a spec for a collection of items satisfying pred. Unlike\n 'every', coll-of will exhaustively conform every value.\n\n Same options as 'every'. conform will produce a collection\n corresponding to :into if supplied, else will match the input collection,\n avoiding rebuilding when possible.\n\n See also - every, map-of", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/coll-of"} {:ns "clojure.spec.alpha", :name "cat", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos nil, :line 637, :examples [{:updated-at 1553623784678, :created-at 1553623784678, :author {:login "yanisurbis", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/9294910?v=4"}, :body "(require '[clojure.spec.alpha :as s])\n\n(let [spec (s/cat :e even? :o odd?)]\n [(s/conform spec [22 11])\n (s/conform spec [22])\n (s/conform spec [22 11 22])\n (s/conform spec 22)\n (s/conform spec \"22\")])\n;; => [{:e 22, :o 11}\n;; :clojure.spec.alpha/invalid\n;; :clojure.spec.alpha/invalid\n;; :clojure.spec.alpha/invalid\n;; :clojure.spec.alpha/invalid]", :_id "5c9a6ae8e4b0ca44402ef6cc"}], :macro true, :notes nil, :arglists ["& key-pred-forms"], :doc "Takes key+pred pairs, e.g.\n\n (s/cat :e even? :o odd?)\n\n Returns a regex op that matches (all) values in sequence, returning a map\n containing the keys of each pred and the corresponding value.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/cat"} {:ns "clojure.spec.alpha", :name "*", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos [{:created-at 1549644413188, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "+", :ns "clojure.spec.alpha"}, :_id "5c5db27de4b0ca44402ef667"} {:created-at 1549644433319, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "?", :ns "clojure.spec.alpha"}, :_id "5c5db291e4b0ca44402ef668"}], :line 602, :examples nil, :macro true, :notes nil, :arglists ["pred-form"], :doc "Returns a regex op that matches zero or more values matching\n pred. Produces a vector of matches iff there is at least one match", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/*"} {:ns "clojure.spec.alpha", :name "explain", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos [{:created-at 1628867588311, :author {:login "ferdinand-beyer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/23474334?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "explain-data", :ns "clojure.spec.alpha"}, :_id "61168c04e4b0b1e3652d752f"}], :line 260, :examples [{:editors [{:login "yanisurbis", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/9294910?v=4"}], :body "(require '[clojure.spec.alpha :as s])\n\n(s/def ::oop-languages #{\"java\" \"python\" \"ruby\" \"c++\" \"smalltalk\" \"simula\"})\n\n(s/explain ::oop-languages \"clojure\")\n;; val: \"clojure\" fails spec: :user/oop-languages predicate:\n;; #{\"simula\" \"java\" \"c++\" \"smalltalk\" \"ruby\" \"python\"}\n;; => nil\n\n(s/explain ::oop-languages \"python\")]\n;; Success!\n;; => nil\n\n;; read more at https://clojure.org/guides/spec#_explain", :author {:avatar-url "https://avatars0.githubusercontent.com/u/9294910?v=4", :account-source "github", :login "yanisurbis"}, :created-at 1553627032812, :updated-at 1553627141914, :_id "5c9a7798e4b0ca44402ef6cd"}], :notes nil, :arglists ["spec x"], :doc "Given a spec and a value that fails to conform, prints an explanation to *out*.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/explain"} {:ns "clojure.spec.alpha", :name "with-gen*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["spec gfn"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/with-gen*"} {:ns "clojure.spec.alpha", :name "or-spec-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos [{:created-at 1549644601886, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "or", :ns "clojure.spec.alpha"}, :_id "5c5db339e4b0ca44402ef66b"}], :line 1056, :examples nil, :notes nil, :arglists ["keys forms preds gfn"], :doc "Do not call this directly, use 'or'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/or-spec-impl"} {:ns "clojure.spec.alpha", :name "*fspec-iterations*", :file "clojure/spec/alpha.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 25, :examples nil, :notes nil, :arglists [], :doc "The number of times an anonymous fn specified by fspec will be (generatively) tested during conform", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/*fspec-iterations*"} {:ns "clojure.spec.alpha", :name "Spec", :file "clojure/spec/alpha.clj", :type "var", :column 1, :see-alsos nil, :line 37, :examples nil, :notes nil, :arglists [], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/Spec"} {:ns "clojure.spec.alpha", :name "unform", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos [{:created-at 1524219315965, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "conform", :ns "clojure.spec.alpha"}, :_id "5ad9bdb3e4b045c27b7fac47"} {:created-at 1588732338488, :author {:login "jdf-id-au", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/9016301?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "conformer", :ns "clojure.spec.alpha"}, :_id "5eb221b2e4b087629b5a1902"}], :line 166, :examples [{:updated-at 1560617844690, :created-at 1560617844690, :author {:login "enocom", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1175430?v=4"}, :body "(require '[clojure.spec.alpha :as s])\n\n;; define spec as a sequential concatenation of two more specs:\n;; pos? and one of possible units (:meters :miles)\n;; :amount and :unit are the names we are giving to each position\n(s/def ::distance (s/cat :amount (s/and number? pos?)\n :unit #{:meters :miles}))\n\n(s/conform ::distance [3 :meters])\n;; => {:amount 3, :unit :meters}\n\n(s/unform ::distance {:amount 3, :unit :meters})\n;; => (3 :meters)\n\n(s/unform ::distance {:amount 3, :unit :foo})\n;; => (3 :foo)\n\n(s/unform ::distance {:amount 3, :foo :miles})\n;; => (3)\n\n(s/unform ::distance {:bar 3, :foo :miles})\n;; => ()\n", :_id "5d052374e4b0ca44402ef759"}], :notes nil, :arglists ["spec x"], :doc "Given a spec and a value created by or compliant with a call to\n 'conform' with the same spec, returns a value with all conform\n destructuring undone.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/unform"} {:ns "clojure.spec.alpha", :name "valid?", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 765, :examples [{:updated-at 1549644718642, :created-at 1549644718642, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :body "(s/def ::ok boolean?)\n\n(s/valid? ::ok true) ; true\n(s/valid? ::ok false) ; true\n(s/valid? ::ok 42) ; false\n(s/valid? ::ok \"true\") ; false", :_id "5c5db3aee4b0ca44402ef66f"}], :notes nil, :arglists ["spec x" "spec x form"], :doc "Helper function that returns true when x is valid for spec.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/valid_q"} {:ns "clojure.spec.alpha", :name "gen", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos [{:created-at 1579285770113, :author {:login "yuhan0", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/22216124?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "with-gen", :ns "clojure.spec.alpha"}, :_id "5e21fd0ae4b0ca44402ef81a"}], :line 285, :examples [{:updated-at 1593619687739, :created-at 1593619687739, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :body ";; get a generator for the spec 'int?' and generate a sample from it\n(gen/sample (s/gen int?))\n; => (-1 0 0 -1 7 2 1 0 59 -6)", :_id "5efcb4e7e4b0b1e3652d731d"} {:updated-at 1602570052630, :created-at 1602570052630, :author {:login "deadghost", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1156996?v=4"}, :body ";; Generator override example\n(s/def :foo/bar\n (s/keys :req [:biz/baz]))\n\n(s/def :biz/baz int?)\n\n(comment\n (gen/sample\n (s/gen :foo/bar {:biz/baz #(s/gen #{1 10 100})}) 5)\n ;; Example Result\n (#:biz{:baz 100}\n #:biz{:baz 100}\n #:biz{:baz 1}\n #:biz{:baz 10}\n #:biz{:baz 10}))\n\n;; Note that \"Spec does not trust custom generators and any values they produce\n;; will also be checked by their associated spec to guarantee they pass\n;; conformance.\"\n;; See: https://clojure.org/guides/spec#_custom_generators\n", :_id "5f854744e4b0b1e3652d73d8"}], :notes nil, :arglists ["spec" "spec overrides"], :doc "Given a spec, returns the generator for it, or throws if none can\n be constructed. Optionally an overrides map can be provided which\n should map spec names or paths (vectors of keywords) to no-arg\n generator-creating fns. These will be used instead of the generators at those\n names/paths. Note that parent generator (in the spec or overrides\n map) will supersede those of any subtrees. A generator for a regex\n op must always return a sequential collection (i.e. a generator for\n s/? should return either an empty sequence/vector or a\n sequence/vector with one item in it)", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/gen"} {:ns "clojure.spec.alpha", :name "every-kv", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos [{:created-at 1549873931835, :author {:login "pieterbreed", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/448604?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "map-of", :ns "clojure.spec.alpha"}, :_id "5c61330be4b0ca44402ef676"} {:created-at 1549873947107, :author {:login "pieterbreed", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/448604?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "every", :ns "clojure.spec.alpha"}, :_id "5c61331be4b0ca44402ef677"}], :line 563, :examples nil, :macro true, :notes nil, :arglists ["kpred vpred & opts"], :doc "like 'every' but takes separate key and val preds and works on associative collections.\n\n Same options as 'every', :into defaults to {}\n\n See also - map-of", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/every-kv"} {:ns "clojure.spec.alpha", :name "int-in", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos [{:created-at 1549644745851, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "int-in-range?", :ns "clojure.spec.alpha"}, :_id "5c5db3c9e4b0ca44402ef671"} {:created-at 1549644762559, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "double-in", :ns "clojure.spec.alpha"}, :_id "5c5db3dae4b0ca44402ef672"}], :line 1909, :examples nil, :macro true, :notes nil, :arglists ["start end"], :doc "Returns a spec that validates fixed precision integers in the\n range from start (inclusive) to end (exclusive).", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/int-in"} {:ns "clojure.spec.alpha", :name "alt", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos [{:created-at 1534374735387, :author {:login "ryoakg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/23413?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "or", :ns "clojure.spec.alpha"}, :_id "5b74b34fe4b00ac801ed9e5d"}], :line 620, :examples [{:updated-at 1534374875088, :created-at 1534374875088, :author {:login "ryoakg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/23413?v=4"}, :body "(require '[clojure.spec.alpha :as s])\n\n(let [spec (s/alt :n number? :b boolean?)]\n [(s/conform spec [1])\n (s/conform spec [true])\n (s/conform spec [\"str\"])])\n;; => [[:n 1] [:b true] :clojure.spec.alpha/invalid]", :_id "5b74b3dbe4b00ac801ed9e5f"} {:editors [{:login "rgkirch", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6143833?v=4"}], :body "(require '[clojure.spec.alpha :as s])\n\n(s/def ::type-hinted-destructure\n (s/* (s/alt :hinted (s/cat :symbol symbol?\n :separator #(= :- %)\n :schema any?)\n :not-hinted (s/cat :symbol symbol?))))\n\n(s/conform ::type-hinted-destructure\n '[first :- string? ; `first :- string?` not `[first :- string?]`\n last])\n;; [[:hinted {:symbol first, :separator :-, :schema string?}] [:not-hinted {:symbol last}]]\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/6143833?v=4", :account-source "github", :login "rgkirch"}, :created-at 1651545031079, :updated-at 1651545677032, :_id "627093c7e4b0b1e3652d75e0"}], :macro true, :notes nil, :arglists ["& key-pred-forms"], :doc "Takes key+pred pairs, e.g.\n\n (s/alt :even even? :small #(< % 42))\n\n Returns a regex op that returns a map entry containing the key of the\n first matching pred and the corresponding value. Thus the\n 'key' and 'val' functions can be used to refer generically to the\n components of the tagged return", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/alt"} {:ns "clojure.spec.alpha", :name "nonconforming", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1808, :examples nil, :notes nil, :arglists ["spec"], :doc "takes a spec and returns a spec that has the same properties except\n 'conform' returns the original (not the conformed) value. Note, will specize regex ops.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/nonconforming"} {:ns "clojure.spec.alpha", :name "unform*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["spec y"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/unform*"} {:ns "clojure.spec.alpha", :name "abbrev", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 179, :examples nil, :notes nil, :arglists ["form"], :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/abbrev"} {:ns "clojure.spec.alpha", :name "regex?", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 78, :examples nil, :notes nil, :arglists ["x"], :doc "returns x if x is a (clojure.spec) regex op, else logical false", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/regex_q"} {:ns "clojure.spec.alpha", :name "int-in-range?", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos [{:created-at 1549644736832, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "int-in", :ns "clojure.spec.alpha"}, :_id "5c5db3c0e4b0ca44402ef670"}], :line 1903, :examples nil, :notes nil, :arglists ["start end val"], :doc "Return true if start <= val, val < end and val is a fixed\n precision integer.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/int-in-range_q"} {:ns "clojure.spec.alpha", :name "or", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos [{:created-at 1534374718106, :author {:login "ryoakg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/23413?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "alt", :ns "clojure.spec.alpha"}, :_id "5b74b33ee4b00ac801ed9e5c"} {:created-at 1542797828176, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "*recursion-limit*", :ns "clojure.spec.alpha"}, :_id "5bf53a04e4b00ac801ed9f04"} {:created-at 1549644313245, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "and", :ns "clojure.spec.alpha"}, :_id "5c5db219e4b0ca44402ef666"}], :line 471, :examples [{:updated-at 1534374833278, :created-at 1534374833278, :author {:login "ryoakg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/23413?v=4"}, :body "(require '[clojure.spec.alpha :as s])\n\n(let [spec (s/or :n number? :b boolean?)]\n [(s/conform spec 1)\n (s/conform spec true)\n (s/conform spec \"str\")])\n;; => [[:n 1] [:b true] :clojure.spec.alpha/invalid]", :_id "5b74b3b1e4b00ac801ed9e5e"} {:editors [{:login "rgkirch", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6143833?v=4"}], :body "(require '[clojure.spec.alpha :as s])\n\n(s/def ::type-hinted-destructure\n (s/coll-of (s/or :hinted (s/cat :symbol symbol?\n :separator #(= :- %)\n :schema any?)\n :not-hinted (s/cat :symbol symbol?))\n :kind vector?))\n\n(s/conform ::type-hinted-destructure\n '[[first :- string?] ; `[first :- string?]` not `first :- string?`\n [last]])\n;; [[:hinted {:symbol first, :separator :-, :schema string?}] [:not-hinted {:symbol last}]]", :author {:avatar-url "https://avatars.githubusercontent.com/u/6143833?v=4", :account-source "github", :login "rgkirch"}, :created-at 1651545098589, :updated-at 1651963713471, :_id "6270940ae4b0b1e3652d75e1"}], :macro true, :notes nil, :arglists ["& key-pred-forms"], :doc "Takes key+pred pairs, e.g.\n\n (s/or :even even? :small #(< % 42))\n\n Returns a destructuring spec that returns a map entry containing the\n key of the first matching pred and the corresponding value. Thus the\n 'key' and 'val' functions can be used to refer generically to the\n components of the tagged return.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/or"} {:ns "clojure.spec.alpha", :name "spec?", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 72, :examples nil, :notes nil, :arglists ["x"], :doc "returns x if x is a spec object, else logical false", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/spec_q"} {:ns "clojure.spec.alpha", :name "registry", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 351, :examples nil, :notes nil, :arglists [""], :doc "returns the registry map, prefer 'get-spec' to lookup a spec by name", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/registry"} {:ns "clojure.spec.alpha", :name "rep+impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos [{:created-at 1549644629139, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "+", :ns "clojure.spec.alpha"}, :_id "5c5db355e4b0ca44402ef66d"}], :line 1408, :examples nil, :notes nil, :arglists ["form p"], :doc "Do not call this directly, use '+'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/rep+impl"} {:ns "clojure.spec.alpha", :name "exercise-fn", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1870, :examples nil, :notes nil, :arglists ["sym" "sym n" "sym-or-f n fspec"], :doc "exercises the fn named by sym (a symbol) by applying it to\n n (default 10) generated samples of its args spec. When fspec is\n supplied its arg spec is used, and sym-or-f can be a fn. Returns a\n sequence of tuples of [args ret]. ", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/exercise-fn"} {:ns "clojure.spec.alpha", :name "exercise", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1861, :examples [{:updated-at 1548441490507, :created-at 1548441490507, :author {:login "Activeghost", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10783037?v=4"}, :body "(...ns declaration...\n(:require [clojure.spec.alpha :as s]\n [clojure.spec.gen.alpha :as gen]))\n\n;; function spec\n;;\n(s/fdef map-to-tags\n :args (s/cat :record ::tag-record)\n :ret ::tag-model\n :fn (fn [{:keys [args ret]}]\n (s/valid? ::tag-model ret)))\n\n\n;; the actual fn\n;; extract a tag model from RDF query results\n;;\n(defn map-to-tags\n [record]\n {:pre [(s/valid? ::tag-record record)]\n :post [(s/valid? ::tag-model %)]}\n (log/infof \"[map-to-tags] mapping record: %s\" (pr-str record))\n (let [{:keys [type class name relevance]} record]\n (let [new-record {:tag-type (type :value)\n :tag-class (class :value)\n :tag-name (name :value)\n :tag-relevance (relevance :value)}]\n (log/debugf \"[map-to-tags] extracted record: %s\" new-record)\n new-record)))\n\nIn REPL:\n\n=> (s/exercise 'calais-response-processor.rdf-core/map-to-tags)\n([#object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"] #object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"]] [#object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"] #object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"]] [#object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"] #object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"]] [#object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"] #object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"]] [#object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"] #object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"]] [#object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"] #object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"]] [#object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"] #object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"]] [#object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"] #object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454\n0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"]] [#object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"] #object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"]] [#object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"] #object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"]])", :_id "5c4b5792e4b0ca44402ef62a"}], :notes nil, :arglists ["spec" "spec n" "spec n overrides"], :doc "generates a number (default 10) of values compatible with spec and maps conform over them,\n returning a sequence of [val conformed-val] tuples. Optionally takes\n a generator overrides map as per gen", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/exercise"} {:ns "clojure.spec.alpha", :name "multi-spec", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos nil, :line 380, :examples [{:updated-at 1534398043992, :created-at 1534398043992, :author {:login "jdf-id-au", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/9016301?v=4"}, :body "Use retag function to allow generative testing of multi-spec whose\nmultimethod has a :default dispatch method.\n\n(require '[clojure.spec.alpha :as s]\n '[clojure.spec.gen.alpha :as gen])\n\n(s/def ::tag #{:a :b :c :d})\n(s/def ::example-key keyword?)\n(s/def ::different-key keyword?)\n\n(defmulti tagmm :tag)\n(defmethod tagmm :a [_] (s/keys :req-un [::tag ::example-key]))\n(defmethod tagmm :default [_] (s/keys :req-un [::tag ::different-key]))\n\n(s/def ::example (s/multi-spec tagmm :tag))\n(gen/sample (s/gen ::example))\n;=> only get examples with :tag :a\n\n(s/def ::example (s/multi-spec tagmm (fn retag [gen-v dispatch-tag] gen-v)))\n(gen/sample (s/gen ::example))\n;=> get examples with all :tag options", :_id "5b750e5be4b00ac801ed9e60"} {:updated-at 1584169164619, :created-at 1584169164619, :author {:login "Activeghost", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10783037?v=4"}, :body "(def create-playlist (s/cat :command ::commands :type ::types :data (s/coll-of ::playlist)))\n(def create-song (s/cat :command ::commands :type ::types :data (s/coll-of ::song)))\n(def create-user (s/cat :command ::commands :type ::types :data (s/coll-of ::user)))\n\n(defmulti create-spec? second)\n(defmethod create-spec? :playlist [_] create-playlist)\n(defmethod create-spec? :song [_] create-song)\n(defmethod create-spec? :user [_] create-user)\n\n(def update-playlist (s/cat :command ::commands :type ::types :data (s/coll-of ::playlist-update)))\n(def update-song (s/cat :command ::commands :type ::types :data (s/coll-of ::song-update)))\n(def update-user (s/cat :command ::commands :type ::types :data (s/coll-of ::user-update)))\n\n(defmulti update-spec? second)\n(defmethod update-spec? :playlist [_] update-playlist)\n(defmethod update-spec? :song [_] update-song)\n(defmethod update-spec? :user [_] update-user)\n\n;; [:create :user [{:name \"bobby\"} {:name \"sally\"}{:name \"fred\"}]]\n(s/def ::create-action\n (s/with-gen #(s/multi-spec create-spec? %)\n #(gen/fmap vec (s/gen create-action-pattern))))\n\n;; [:update :user [\"1\"] [{:name \"bobby minerva\"}]]\n(s/def ::update-action\n (s/with-gen #(s/multi-spec update-spec? %)\n #(gen/fmap vec (s/gen update-action-pattern))))\n\n;; examples\n=> (s/explain ::create-action [:create :user [{:name \"bobby\"} {:name \"sally\"}{:name \"fred\"}]])\nSuccess!\nnil\n\n=> (s/explain ::update-action [:update :user [\"1\"] [{:name \"bobby minerva\"}]])\nSuccess!\nnil", :_id "5e6c80cce4b087629b5a18bb"}], :macro true, :notes nil, :arglists ["mm retag"], :doc "Takes the name of a spec/predicate-returning multimethod and a\n tag-restoring keyword or fn (retag). Returns a spec that when\n conforming or explaining data will pass it to the multimethod to get\n an appropriate spec. You can e.g. use multi-spec to dynamically and\n extensibly associate specs with 'tagged' data (i.e. data where one\n of the fields indicates the shape of the rest of the structure).\n\n (defmulti mspec :tag)\n\n The methods should ignore their argument and return a predicate/spec:\n (defmethod mspec :int [_] (s/keys :req-un [::tag ::i]))\n\n retag is used during generation to retag generated values with\n matching tags. retag can either be a keyword, at which key the\n dispatch-tag will be assoc'ed, or a fn of generated value and\n dispatch-tag that should return an appropriately retagged value.\n\n Note that because the tags themselves comprise an open set,\n the tag key spec cannot enumerate the values, but can e.g.\n test for keyword?.\n\n Note also that the dispatch values of the multimethod will be\n included in the path, i.e. in reporting and gen overrides, even\n though those values are not evident in the spec.\n", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/multi-spec"} {:ns "clojure.spec.alpha", :name "explain-data", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos [{:created-at 1591253326213, :author {:login "fredsh2k", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/38362977?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "explain", :ns "clojure.spec.alpha"}, :_id "5ed8994ee4b087629b5a1924"} {:created-at 1591253335898, :author {:login "fredsh2k", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/38362977?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "explain-str", :ns "clojure.spec.alpha"}, :_id "5ed89957e4b087629b5a1925"}], :line 218, :examples [{:editors [{:login "fredsh2k", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/38362977?v=4"} {:avatar-url "https://avatars.githubusercontent.com/u/4986865?v=4", :account-source "github", :login "nvseenu"}], :body "(require '[clojure.spec.alpha :as spec])\n\n(spec/def ::name string?)\n;;=> :ns/name\n\n(spec/explain-data ::name \"n0\")\n;;=> nil\n\n(spec/explain-data ::name 0)\n;;=>\n;;#:clojure.spec.alpha{:problems [{:path [],\n;; :pred clojure.core/string?,\n;; :val 0,\n;; :via [:ns/name],\n;; :in []}],\n;; :spec :ns.ns/name,\n;; :value 0\n\n\n;; To extract :problems alone \n(:clojure.spec.alpha/problems (spec/explain-data ::name 0)) \n;; => [{:path [],:pred clojure.core/string?,:val 0,:via [:ns/name],:in []}]", :author {:avatar-url "https://avatars2.githubusercontent.com/u/38362977?v=4", :account-source "github", :login "fredsh2k"}, :created-at 1591253258331, :updated-at 1665035425045, :_id "5ed8990ae4b087629b5a1923"}], :notes nil, :arglists ["spec x"], :doc "Given a spec and a value x which ought to conform, returns nil if x\n conforms, else a map with at least the key ::problems whose value is\n a collection of problem-maps, where problem-map has at least :path :pred and :val\n keys describing the predicate and the value that failed at that\n path.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/explain-data"} {:ns "clojure.spec.alpha", :name "tuple-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 991, :examples nil, :notes nil, :arglists ["forms preds" "forms preds gfn"], :doc "Do not call this directly, use 'tuple'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/tuple-impl"} {:ns "clojure.spec.alpha", :name "multi-spec-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos [{:created-at 1549644612774, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "multi-spec", :ns "clojure.spec.alpha"}, :_id "5c5db344e4b0ca44402ef66c"}], :line 941, :examples nil, :notes nil, :arglists ["form mmvar retag" "form mmvar retag gfn"], :doc "Do not call this directly, use 'multi-spec'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/multi-spec-impl"} {:ns "clojure.spec.alpha", :name "tuple", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos nil, :line 689, :examples nil, :macro true, :notes nil, :arglists ["& preds"], :doc "takes one or more preds and returns a spec for a tuple, a vector\n where each element conforms to the corresponding pred. Each element\n will be referred to in paths using its ordinal.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/tuple"} {:ns "clojure.spec.alpha", :name "conform", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos [{:created-at 1524130477189, :author {:login "anler", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/83847?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unform", :ns "clojure.spec.alpha"}, :_id "5ad862ade4b045c27b7fac40"} {:created-at 1524130485944, :author {:login "anler", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/83847?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "explain", :ns "clojure.spec.alpha"}, :_id "5ad862b5e4b045c27b7fac41"} {:created-at 1524130495988, :author {:login "anler", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/83847?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "gen", :ns "clojure.spec.alpha"}, :_id "5ad862bfe4b045c27b7fac42"}], :line 160, :examples [{:updated-at 1560617617276, :created-at 1524130497300, :author {:login "anler", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/83847?v=4"}, :body "(require '[clojure.spec.alpha :as s])\n\n;; define spec as a sequential concatenation of two more specs:\n;; number? and pos? and one of possible units (:meters :miles)\n;; :amount and :unit are the names we are giving to each position\n(s/def ::distance (s/cat :amount (s/and number? pos?)\n :unit #{:meters :miles}))\n\n(s/conform ::distance [3 :meters])\n;; => {:amount 3, :unit :meters}\n\n(s/conform ::distance [3 :steps])\n;; => :clojure.spec.alpha/invalid", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/1175430?v=4", :account-source "github", :login "enocom"}], :_id "5ad862c1e4b045c27b7fac43"}], :notes nil, :arglists ["spec x"], :doc "Given a spec and a value, returns :clojure.spec.alpha/invalid \n\tif value does not match spec, else the (possibly destructured) value.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/conform"} {:ns "clojure.spec.alpha", :name "gen*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["spec overrides path rmap"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/gen*"} {:ns "clojure.spec.alpha", :name "fspec-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1740, :examples nil, :notes nil, :arglists ["argspec aform retspec rform fnspec fform gfn"], :doc "Do not call this directly, use 'fspec'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/fspec-impl"} {:ns "clojure.spec.alpha", :name "assert", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos [{:created-at 1538056781941, :author {:login "witek", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/209520?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "assert", :ns "clojure.core"}, :_id "5bace24de4b00ac801ed9eab"}], :line 1970, :examples [{:updated-at 1548971359388, :created-at 1548971359388, :author {:login "fhur", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/6452323?v=4"}, :body "; Notice that if you try to execute assert it will always return the given value:\n\n(require ['clojure.spec.alpha :as 's])\n\n(s/assert even? 1)\n=> 1\n\n; This is because asserts are turned off by default:\n(s/check-asserts?)\n=> false\n\n; To enable asserts, run this\n(s/check-asserts true)\n=> true\n\n; Now your asserts will properly fail\n(s/assert even? 3)\n; ExceptionInfo Spec assertion failed...\n\n```", :_id "5c536d5fe4b0ca44402ef661"}], :macro true, :notes nil, :arglists ["spec x"], :doc "spec-checking assert expression. Returns x if x is valid? according\nto spec, else throws an ex-info with explain-data plus ::failure of\n:assertion-failed.\n\nCan be disabled at either compile time or runtime:\n\nIf *compile-asserts* is false at compile time, compiles to x. Defaults\nto value of 'clojure.spec.compile-asserts' system property, or true if\nnot set.\n\nIf (check-asserts?) is false at runtime, always returns x. Defaults to\nvalue of 'clojure.spec.check-asserts' system property, or false if not\nset. You can toggle check-asserts? with (check-asserts bool).", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/assert"} {:ns "clojure.spec.alpha", :name "?", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos [{:created-at 1549644449353, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "+", :ns "clojure.spec.alpha"}, :_id "5c5db2a1e4b0ca44402ef669"}], :line 614, :examples [{:updated-at 1542798236106, :created-at 1542798236106, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :body ";; Think of this as a regex like \"ab?\"\n(s/def ::ab (s/cat :a #{:a}\n :b (s/? #{:b})))\n\n(s/valid? ::ab [:a :b])\n; => true\n\n(s/valid? ::ab [:a])\n; => true\n\n(s/valid? ::ab [:a :c])\n; => false", :_id "5bf53b9ce4b00ac801ed9f05"}], :macro true, :notes nil, :arglists ["pred-form"], :doc "Returns a regex op that matches zero or one value matching\n pred. Produces a single value (not a collection) if matched.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/_q"} {:ns "clojure.spec.alpha", :name "*coll-check-limit*", :file "clojure/spec/alpha.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 29, :examples nil, :notes nil, :arglists [], :doc "The number of elements validated in a collection spec'ed with 'every'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/*coll-check-limit*"} {:ns "clojure.spec.alpha", :name "merge", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos nil, :line 498, :examples [{:editors [{:login "manawardhana", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1821789?v=4"}], :body "\n(s/def ::fname string?)\n(s/def ::lname string?)\n(s/def ::street string?)\n(s/def ::city string?)\n\n(s/def ::person (s/keys :req [::fname ::lname]))\n(s/def ::address (s/keys :req [::street ::city]))\n\n;; Merging...\n(s/def ::contact (s/merge ::person ::address))\n\n(s/valid? ::contact {::fname \"Rich\" ::lname \"Hickey\"\n ::street \"Some Street\" ::city \"New York\"})\n;;=> true", :author {:avatar-url "https://avatars1.githubusercontent.com/u/1821789?v=4", :account-source "github", :login "manawardhana"}, :created-at 1527764482905, :updated-at 1527765280946, :_id "5b0fd602e4b045c27b7fac87"}], :macro true, :notes nil, :arglists ["& pred-forms"], :doc "Takes map-validating specs (e.g. 'keys' specs) and\n returns a spec that returns a conformed map satisfying all of the\n specs. Unlike 'and', merge can generate maps satisfying the\n union of the predicates.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/merge"} {:ns "clojure.spec.alpha", :name "get-spec", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 356, :examples nil, :notes nil, :arglists ["k"], :doc "Returns spec registered for keyword/symbol/var k, or nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/get-spec"} {:ns "clojure.spec.alpha", :name "conformer", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos [{:created-at 1588732306293, :author {:login "jdf-id-au", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/9016301?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unform", :ns "clojure.spec.alpha"}, :_id "5eb22192e4b087629b5a1901"}], :line 661, :examples [{:editors [{:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}], :body ";; One use of clojure.spec.alpha/conformer is to convert inputs to a data\n;; structure more suitable for further conforming. In this sketch we use a regex\n;; spec to describe a string representing a binary number.\n\n(require '[clojure.spec.alpha :as s]\n '[clojure.spec.gen.alpha :as gen])\n\n(s/def ::str->chars (s/conformer seq #(apply str %)))\n\n(s/def ::binary-digits (s/cat :initial #{\\1}, :more (s/* #{\\0 \\1})))\n\n;; Look, no \"re-matches\"!\n(s/def ::binary-string\n (s/with-gen (s/and string? ::str->chars ::binary-digits)\n (fn []\n (gen/fmap #(s/unform ::str->chars %) (s/gen ::binary-digits)))))\n\n(s/conform ::binary-string \"1011\")\n;;=> {:initial \\1, :more [\\0 \\1 \\1]}\n\n(gen/sample (s/gen ::binary-string))\n;;=> (\"1\" \"1\" \"11\" \"1\" \"1001\" \"11\" \"1100\" \"110011\" \"111111\" \"10\")\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4", :account-source "github", :login "glts"}, :created-at 1526667363901, :updated-at 1568125324402, :_id "5aff1863e4b045c27b7fac6f"} {:updated-at 1592829288019, :created-at 1592829288019, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/8271291?v=4"}, :body "(s/conform map? {:a 1})\n;;=> {:a 1}\n\n(s/conform (s/conformer map?) {:a 1})\n;;=> true\n\n-------------------------------\n\n(s/conform second [:a :b :c])\n;;=> [:a :b :c]\n\n(s/conform (s/conformer second) [:a :b :c])\n;;=> :b", :_id "5ef0a568e4b0b1e3652d730b"}], :macro true, :notes nil, :arglists ["f" "f unf"], :doc "takes a predicate function with the semantics of conform i.e. it should return either a\n (possibly converted) value or :clojure.spec.alpha/invalid, and returns a\n spec that uses it as a predicate/conformer. Optionally takes a\n second fn that does unform of result of first", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/conformer"} {:ns "clojure.spec.alpha", :name "every-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1240, :examples nil, :notes nil, :arglists ["form pred opts" "form pred {conform-into :into, describe-form :clojure.spec.alpha/describe, :keys [kind :clojure.spec.alpha/kind-form count max-count min-count distinct gen-max :clojure.spec.alpha/kfn :clojure.spec.alpha/cpred conform-keys :clojure.spec.alpha/conform-all], :or {gen-max 20}, :as opts} gfn"], :doc "Do not call this directly, use 'every', 'every-kv', 'coll-of' or 'map-of'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/every-impl"} {:ns "clojure.spec.alpha", :name "spec", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos nil, :line 361, :examples [{:updated-at 1548443679521, :created-at 1548443679521, :author {:login "Activeghost", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10783037?v=4"}, :body "(ns ... some namespace declaration \n (:require [clojure.spec.alpha :as s]\n [clojure.spec.gen.alpha :as gen]))\n\n;; for more info see https://clojure.org/guides/spec#_getting_started\n\n;; different types of specs\n\n;; data spec defining a custom generator\n(s/def ::significant-string (s/with-gen \n (s/and string? #(not= % nil?) #(not= % \"\"))\n (fn [] (gen/such-that #(not= % \"\")\n (gen/string-alphanumeric)))))\n\n=> (gen/sample (s/gen '::significant-string))\n;(\"u\" \"p\" \"XG\" \"63\" \"3\" \"HI\" \"e0Ksv\" \"wr9sj3J\" \"600343\" \"D1n9Vz8v\")\n\n;; data spec referring to another spec as a definition\n(s/def ::value ::significant-string)\n\n;; a spec using (s/and ...) with another spec and regex matching\n(s/def ::file-location (s/and ::significant-string #(re-matches constants/filename-regex %)))\n\n;; a map spec asserting required keys (the keys are also specs you would have to define)\n(s/def ::tag-record (s/keys :req-un [::type ::class ::name ::relevance]))\n\n=> (gen/sample (s/gen '::tag-record))\n;({:type {:value \"g\"}, :class {:value \"7X\"}, :name {:value \"3\"}, :relevance {:value \"h\"}} ... many more})\n\n;; defining a spec that is a collection of tag models\n;; see https://clojure.org/guides/spec#_collections \n(s/def ::tag-models (s/coll-of ::tag-model))\n\n=> (gen/sample (s/gen '::tag-models))\n;({[{:tag-type \"G\", :tag-class \"FVrYDZcS\", :tag-name \"7t5u\", :tag-relevance \"1EZ7I32\"} {:tag-type \"Ax0\", :tag-class \"6hfP\", :tag-name \"9Z7v7\", :tag-relevance \"eG\"} {:tag-type \"Tb\", :tag-class \"9EVg46p\", :tag-name \"n1E5Nsl84\", :tag-relevance \"34Q4F\"}] [{:tag-type \"2\", :tag-class \"gy\", :tag-name \"xY9Pmhd43\", :tag-relevance \"QqA1k1G5\"} {:tag-type \"81j\", :tag-class \"52\", :tag-name \"3BrXji\", :tag-relevance \"o6A3t\"} {:tag-type \"Pm2t\", :tag-class \"sW9FH\", :tag-name \"wI2kt\", :tag-relevance \"B\"} {:tag-type \"6p17s\", :tag-class \"4\", :tag-name \"wuV63bjo4\", :tag-relevance \"l77Suzj\"}] ... removed ... })\n\n;; a function spec\n;; see https://clojure.org/guides/spec#_specing_functions \n(s/fdef string->stream\n :args (s/cat :s ::significant-string)\n :ret ::byte-stream\n :fn (fn [{:keys [args ret]}]\n (instance? java.io.ByteArrayInputStream ret)))\n\n;; for this function\n (defn string->stream\n \"Given a string, return a java.io.ByteArrayInputStream\"\n ([s] {:pre [(s/valid? ::significant-string s)]\n :post [(s/valid? ::byte-stream %)]}\n (string->stream s \"UTF-8\"))\n ([s encoding]\n (-> s\n (.getBytes encoding)\n (java.io.ByteArrayInputStream.))))\n", :_id "5c4b601fe4b0ca44402ef62b"}], :macro true, :notes nil, :arglists ["form & {:keys [gen]}"], :doc "Takes a single predicate form, e.g. can be the name of a predicate,\n like even?, or a fn literal like #(< % 42). Note that it is not\n generally necessary to wrap predicates in spec when using the rest\n of the spec macros, only to attach a unique generator\n\n Can also be passed the result of one of the regex ops -\n cat, alt, *, +, ?, in which case it will return a regex-conforming\n spec, useful when nesting an independent regex.\n ---\n\n Optionally takes :gen generator-fn, which must be a fn of no args that\n returns a test.check generator.\n\n Returns a spec.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/spec"} {:ns "clojure.spec.alpha", :name "keys", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos nil, :line 409, :examples [{:editors [{:login "penguin2774", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/22309?v=4"}], :body "(s/def ::id integer?)\n(s/def ::name string?)\n\n(s/def ::user (s/keys :req-un [::id ::name]))\n\n(s/valid? ::user {}) ; false\n(s/valid? ::user {:id 0}) ; false\n(s/valid? ::user {:name \"bob\"}) ; false\n(s/valid? ::user {:id 1 :name \"bob\"}) ; true", :author {:avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4", :account-source "github", :login "bfontaine"}, :created-at 1549644274548, :updated-at 1595098386693, :_id "5c5db1f2e4b0ca44402ef664"} {:updated-at 1582243144778, :created-at 1582243144778, :author {:login "robertfw", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/814818?v=4"}, :body ";; Demonstrating validation of *all* namespace-qualified keys\n\n(s/def ::id integer?)\n(s/def ::name string?)\n\n(s/def ::user (s/keys))\n\n(s/valid? ::user {}) ; true\n(s/valid? ::user {::id \"bob\"}) ; false\n(s/valid? ::user {::name 1}) ; false\n(s/valid? ::user {::id 1 ::name \"bob\"}) ; true", :_id "5e4f1d48e4b087629b5a189d"}], :macro true, :notes nil, :arglists ["& {:keys [req req-un opt opt-un gen]}"], :doc "Creates and returns a map validating spec. :req and :opt are both\n vectors of namespaced-qualified keywords. The validator will ensure\n the :req keys are present. The :opt keys serve as documentation and\n may be used by the generator.\n\n The :req key vector supports 'and' and 'or' for key groups:\n\n (s/keys :req [::x ::y (or ::secret (and ::user ::pwd))] :opt [::z])\n\n There are also -un versions of :req and :opt. These allow\n you to connect unqualified keys to specs. In each case, fully\n qualfied keywords are passed, which name the specs, but unqualified\n keys (with the same name component) are expected and checked at\n conform-time, and generated during gen:\n\n (s/keys :req-un [:my.ns/x :my.ns/y])\n\n The above says keys :x and :y are required, and will be validated\n and generated by specs (if they exist) named :my.ns/x :my.ns/y \n respectively.\n\n In addition, the values of *all* namespace-qualified keys will be validated\n (and possibly destructured) by any registered specs. Note: there is\n no support for inline value specification, by design.\n\n Optionally takes :gen generator-fn, which must be a fn of no args that\n returns a test.check generator.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/keys"} {:ns "clojure.spec.alpha", :name "spec-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 908, :examples nil, :notes nil, :arglists ["form pred gfn cpred?" "form pred gfn cpred? unc"], :doc "Do not call this directly, use 'spec'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/spec-impl"} {:ns "clojure.spec.alpha", :name "+", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos nil, :line 608, :examples nil, :macro true, :notes nil, :arglists ["pred-form"], :doc "Returns a regex op that matches one or more values matching\n pred. Produces a vector of matches", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/+"} {:ns "clojure.spec.alpha", :name "invalid?", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 155, :examples nil, :notes nil, :arglists ["ret"], :doc "tests the validity of a conform return value", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/invalid_q"} {:ns "clojure.spec.alpha", :name "amp-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1413, :examples nil, :notes nil, :arglists ["re re-form preds pred-forms"], :doc "Do not call this directly, use '&'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/amp-impl"} {:ns "clojure.spec.alpha", :name "map-of", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos [{:created-at 1549873907812, :author {:login "pieterbreed", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/448604?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "every-kv", :ns "clojure.spec.alpha"}, :_id "5c6132f3e4b0ca44402ef675"} {:created-at 1549874043452, :author {:login "pieterbreed", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/448604?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "every", :ns "clojure.spec.alpha"}, :_id "5c61337be4b0ca44402ef679"} {:created-at 1549874097531, :author {:login "pieterbreed", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/448604?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "coll-of", :ns "clojure.spec.alpha"}, :_id "5c6133b1e4b0ca44402ef67a"}], :line 587, :examples [{:updated-at 1555060942358, :created-at 1555060942358, :author {:login "codxse", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/5813694?v=4"}, :body "(require '[clojure.spec.alpha :as spec])\n\n(spec/def ::animals (spec/map-of #{:duck :cat :chicken} (spec/and int? #(> % 1))))\n\n(spec/valid? ::animals {:duck 2})\n\n;;=> true\n\n(spec/valid? ::animals {:duck 1})\n\n;;=> false", :_id "5cb058cee4b0ca44402ef707"} {:updated-at 1557337699513, :created-at 1557337699513, :author {:login "funkrider", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/12958644?v=4"}, :body ";; Validating that the value of a map is related to the key \n;; can not normally be done with map-of as the predicates \n;; are applied independently.\n\n(require '[clojure.spec.alpha :as s])\n(require '[clojure.spec.gen.alpha :as gen])\n\n(s/def ::id pos-int?)\n(s/def ::name string?)\n\n(s/def ::tag (s/keys :req-un [::id ::name]))\n(s/def ::tags (s/map-of ::id ::tag))\n\n(gen/sample (s/gen ::tags))\n;; => ({1 {:id 2, :name \"\"}, 2 {:id 3, :name \"\"}}...)\n\n;; The key has no relation to the value.\n\n;; Lets try again and add in another spec that validates the key and value\n(s/def ::tags (s/and \n (s/map-of ::id ::tag) \n (s/every (fn [[k v]] (= (:id v) k)))))\n\n(s/valid? ::tags {101 {:id 101 :name \"foo\"}})\n;; => true\n(s/valid? ::tags {33 {:id 101 :name \"foo\"}})\n;; => false\n\n(s/explain ::tags {33 {:id 101 :name \"foo\"}})\n;; => [33 {:id 101, :name \"foo\"}] - failed: (fn [[k v]] (= (:id v) k)) in: [0] ;; ;; => spec: :user/tags\n\n;; Spec seems good - lets try generators\n\n(gen/sample (s/gen ::tags))\n;; => #error {:message \"Couldn't satisfy such-that predicate after 100 tries.\", :data {}}...\n\n;; Dang, must create a generator ourselves.\n\n(s/def ::tags (s/with-gen\n (s/and\n (s/map-of ::id ::tag)\n (s/every (fn [[k v]](= (:id v) k))))\n #(gen/fmap (fn [c]\n ;; Create a map from the collection\n (apply hash-map (->> c\n (map (juxt :id identity))\n (flatten))))\n ;; Generates a collection of the generated vals\n (s/gen (s/coll-of ::tag))))) \n\n(gen/sample (s/gen ::tags))\n;; =>({2 {:id 2, :name \"wx3p3BPir\"},\n;; => 3 {:id 3, :name \"jq8\"},\n;; => 4 {:id 4, :name \"q3I\"},\n;; => 38 {:id 38, :name \"dhPlIf4\"},\n;; => 7 {:id 7, :name \"t\"},\n;; => 67 {:id 167, :name \"KS9uDEYS\"},\n;; => 11 {:id 11, :name \"\"}, \n;; => 147 {:id 147, :name \"hmSAKGpZ\"}}...)", :_id "5cd31663e4b0ca44402ef71c"}], :macro true, :notes nil, :arglists ["kpred vpred & opts"], :doc "Returns a spec for a map whose keys satisfy kpred and vals satisfy\n vpred. Unlike 'every-kv', map-of will exhaustively conform every\n value.\n\n Same options as 'every', :kind defaults to map?, with the addition of:\n\n :conform-keys - conform keys as well as values (default false)\n\n See also - every-kv", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/map-of"} {:ns "clojure.spec.alpha", :name "cat-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1392, :examples nil, :notes nil, :arglists ["ks ps forms"], :doc "Do not call this directly, use 'cat'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/cat-impl"} {:ns "clojure.spec.alpha", :name "explain-str", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos [{:created-at 1591273515390, :author {:login "fredsh2k", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/38362977?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "explain", :ns "clojure.spec.alpha"}, :_id "5ed8e82be4b087629b5a1928"} {:created-at 1591273531958, :author {:login "fredsh2k", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/38362977?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "explain-data", :ns "clojure.spec.alpha"}, :_id "5ed8e83be4b087629b5a1929"}], :line 265, :examples [{:updated-at 1591273493420, :created-at 1591273493420, :author {:login "fredsh2k", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/38362977?v=4"}, :body "(require '[clojure.spec.alpha :as spec])\n\n(spec/def ::name string?)\n;;=> :ns/name\n\n(spec/explain-str ::name \"0\")\n;;=> \"Success!\\n\"\n\n(spec/explain-str ::name 0)\n;; => \"0 - failed: string? spec: :ns/name\\n\"", :_id "5ed8e815e4b087629b5a1927"}], :notes nil, :arglists ["spec x"], :doc "Given a spec and a value that fails to conform, returns an explanation as a string.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/explain-str"} {:ns "clojure.spec.alpha", :name "*compile-asserts*", :file "clojure/spec/alpha.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 1934, :examples nil, :notes nil, :arglists [], :doc "If true, compiler will enable spec asserts, which are then\nsubject to runtime control via check-asserts? If false, compiler\nwill eliminate all spec assert overhead. See 'assert'.\n\nInitially set to boolean value of clojure.spec.compile-asserts\nsystem property. Defaults to true.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/*compile-asserts*"} {:ns "clojure.spec.alpha", :name "with-gen", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos [{:created-at 1524133491325, :author {:login "anler", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/83847?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "gen", :ns "clojure.spec.alpha"}, :_id "5ad86e73e4b045c27b7fac44"}], :line 203, :examples [{:updated-at 1524133985001, :created-at 1524133985001, :author {:login "anler", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/83847?v=4"}, :body "(require '[clojure.spec.alpha :as s]\n '[clojure.spec.gen.alpha :as g])\n\n;; generator for int? includes positive and negative integers\n(-> int?\n s/gen\n g/generate)\n;; => -31\n;; => -177\n;; => 7\n\n;; there's a pos-int? generator that generates only positive integers, but\n;; for the sake of this example let's pretend it doesn't exist\n(-> pos-int?\n s/gen\n g/generate)\n;; => 848961\n;; => 11767\n;; => 3479479\n\n;; let's attach a new generator to int? so it generates only positive integers\n(require '[clojure.test.check.generators :as test.g])\n\n(defn abs [^long v] (Math/abs v))\n\n;; let's generate only positive int? values\n(-> int?\n (s/with-gen #(test.g/fmap abs (s/gen int?)))\n s/gen\n g/generate)\n;; => 299578\n;; => 438034\n;; => 315023\n;; => 31\n\n", :_id "5ad87061e4b045c27b7fac45"} {:editors [{:login "holyjak", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/624958?v=4"} {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}], :body "(require '[clojure.spec.alpha :as s]\n '[clojure.spec.gen.alpha :as g])\n\n;; How to add a generator to a named spec\n;; Remember that spec expects a fn returning a generator,\n;; not the generator directly!\n(def gen-rand-digit (g/elements (range 10)))\n(s/def ::small-num (s/with-gen\n (s/int-in 0 10)\n (constantly gen-rand-digit)))", :author {:avatar-url "https://avatars1.githubusercontent.com/u/624958?v=4", :account-source "github", :login "holyjak"}, :created-at 1557576794355, :updated-at 1593619477647, :_id "5cd6bc5ae4b0ca44402ef71f"}], :notes nil, :arglists ["spec gen-fn"], :doc "Takes a spec and a no-arg, generator-returning fn and returns a version of that spec that uses that generator", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/with-gen"} {:ns "clojure.spec.alpha", :name "conform*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["spec x"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/conform*"} {:ns "clojure.spec.alpha", :name "check-asserts?", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1945, :examples nil, :notes nil, :arglists [""], :doc "Returns the value set by check-asserts.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/check-asserts_q"} {:ns "clojure.spec.alpha", :name "rep-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1404, :examples nil, :notes nil, :arglists ["form p"], :doc "Do not call this directly, use '*'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/rep-impl"} {:ns "clojure.spec.alpha", :name "double-in", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos [{:created-at 1549644769131, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "int-in", :ns "clojure.spec.alpha"}, :_id "5c5db3e1e4b0ca44402ef673"}], :line 1916, :examples nil, :macro true, :notes nil, :arglists ["& {:keys [infinite? NaN? min max], :or {infinite? true, NaN? true}, :as m}"], :doc "Specs a 64-bit floating point number. Options:\n\n :infinite? - whether +/- infinity allowed (default true)\n :NaN? - whether NaN allowed (default true)\n :min - minimum value (inclusive, default none)\n :max - maximum value (inclusive, default none)", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/double-in"} {:ns "clojure.spec.alpha", :name "inst-in", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos nil, :line 1891, :examples nil, :macro true, :notes nil, :arglists ["start end"], :doc "Returns a spec that validates insts in the range from start\n(inclusive) to end (exclusive).", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/inst-in"} {:ns "clojure.spec.alpha", :name "describe", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 198, :examples nil, :notes nil, :arglists ["spec"], :doc "returns an abbreviated description of the spec as data", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/describe"} {:ns "clojure.spec.alpha", :name "explain-out", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 254, :examples nil, :notes nil, :arglists ["ed"], :doc "Prints explanation data (per 'explain-data') to *out* using the printer in *explain-out*,\n by default explain-printer.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/explain-out"} {:ns "clojure.spec.alpha", :name "and", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos [{:created-at 1549644301185, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "or", :ns "clojure.spec.alpha"}, :_id "5c5db20de4b0ca44402ef665"}], :line 488, :examples [{:updated-at 1586209849180, :created-at 1586209849180, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :body "(require '[clojure.spec.alpha :as s])\n\n(s/conform (s/and int? pos?) 3) ;=> 3", :_id "5e8ba439e4b087629b5a18cd"}], :macro true, :notes nil, :arglists ["& pred-forms"], :doc "Takes predicate/spec-forms, e.g.\n\n (s/and even? #(< % 42))\n\n Returns a spec that returns the conformed value. Successive\n conformed values propagate through rest of predicates.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/and"} {:ns "clojure.spec.alpha", :name "specize*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["_" "_ form"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/specize*"} {:ns "clojure.spec.alpha", :name "def", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos nil, :line 342, :examples [{:updated-at 1659267005892, :created-at 1659267005892, :author {:login "m1nhtu99-hoan9", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19143075?v=4"}, :body "```clojure\n(ns my-app.entry \n (:require [clojure.spec.alpha :as s]\n [clojure.repl :refer [doc]]))\n\n;; the :: macro will automatically prepend current namespace into \n;; the qualified :entry-state spec keyword\n(s/def ::entry-state #{:entered :exited})\n\n;; check it out:\n(doc :my-app.entry/entry-state)\n;; -------------------------\n;; :my-app.entry/entry-state\n;; Spec\n;; #{:entered :exited}\n```", :_id "62e667bde4b0b1e3652d7635"}], :macro true, :notes nil, :arglists ["k spec-form"], :doc "Given a namespace-qualified keyword or resolvable symbol k, and a\n spec, spec-name, predicate or regex-op makes an entry in the\n registry mapping k to the spec. Use nil to remove an entry in\n the registry for k.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/def"} {:ns "clojure.spec.alpha", :name "maybe-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos [{:created-at 1549644646995, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "?", :ns "clojure.spec.alpha"}, :_id "5c5db366e4b0ca44402ef66e"}], :line 1446, :examples nil, :notes nil, :arglists ["p form"], :doc "Do not call this directly, use '?'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/maybe-impl"} {:ns "clojure.spec.alpha", :name "explain*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["spec path via in x"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/explain*"} {:ns "clojure.spec.alpha", :name "fdef", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos nil, :line 709, :examples [{:updated-at 1531338068729, :created-at 1531337930997, :author {:login "pianostringquartet", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/18562836?v=4"}, :body ";; Example from Clojure.org spec guide:\n;; https://clojure.org/guides/spec\n\n(require '[clojure.spec.alpha :as s])\n\n(s/fdef ranged-rand\n :args (s/and (s/cat :start int? :end int?)\n #(< (:start %) (:end %)))\n :ret int?\n :fn (s/and #(>= (:ret %) (-> % :args :start))\n #(< (:ret %) (-> % :args :end))))", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/18562836?v=4", :account-source "github", :login "pianostringquartet"}], :_id "5b465ccae4b00ac801ed9e25"} {:updated-at 1548440412226, :created-at 1548440412226, :author {:login "Activeghost", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10783037?v=4"}, :body "(...ns declaration...\n(:require [clojure.spec.alpha :as s]\n [clojure.spec.gen.alpha :as gen]))\n\n;; lets say I created a set of specs to build up the fn.\n;;\n(s/def ::significant-string (s/with-gen \n (s/and string? #(not (nil? %)))\n (fn [] (gen/such-that #(not= % \"\")\n (gen/string-alphanumeric)))))\n\n(s/def ::byte-stream \n (s/with-gen #(instance? java.io.ByteArrayInputStream %)\n (gen/fmap #(string->stream %) (gen/string-alphanumeric))))\n\n;; :args spec is invoked with an argument list\n;; using cat to reach into the argument list and test conformity to the\n;; ::significant-string spec.\n;; :ret is invoked with the return value (testing conformity to a ::byte-stream)\n;; :fn spec is invoked with a map of the input and return values. (not using args here)\n(s/fdef string->stream\n :args (s/cat :s ::significant-string)\n :ret ::byte-stream\n :fn (fn [{:keys [args ret]}]\n (instance? java.io.ByteArrayInputStream ret)))\n\n;;\n;; the actual fn\n;;\n(defn string->stream\n \"Given a string, return a java.io.ByteArrayInputStream\"\n ([s] {:pre [(s/valid? ::significant-string s)]\n :post [(s/valid? ::byte-stream %)]}\n (string->stream s \"UTF-8\"))\n ([s encoding]\n (-> s\n (.getBytes encoding)\n (java.io.ByteArrayInputStream.))))\n\n;; note, the post condition in this example is redundant with the :fn spec.\n;; and given we aren't using the args value in the :fn spec I would drop that one \n;; in practical use.\n\n", :_id "5c4b535ce4b0ca44402ef629"}], :macro true, :notes nil, :arglists ["fn-sym & specs"], :doc "Takes a symbol naming a function, and one or more of the following:\n\n :args A regex spec for the function arguments as they were a list to be\n passed to apply - in this way, a single spec can handle functions with\n multiple arities\n :ret A spec for the function's return value\n :fn A spec of the relationship between args and ret - the\n value passed is {:args conformed-args :ret conformed-ret} and is\n expected to contain predicates that relate those values\n\n Qualifies fn-sym with resolve, or using *ns* if no resolution found.\n Registers an fspec in the global registry, where it can be retrieved\n by calling get-spec with the var or fully-qualified symbol.\n\n Once registered, function specs are included in doc, checked by\n instrument, tested by the runner clojure.spec.test.alpha/check, and (if\n a macro) used to explain errors during macroexpansion.\n\n Note that :fn specs require the presence of :args and :ret specs to\n conform values, and so :fn specs will be ignored if :args or :ret\n are missing.\n\n Returns the qualified fn-sym.\n\n For example, to register function specs for the symbol function:\n\n (s/fdef clojure.core/symbol\n :args (s/alt :separate (s/cat :ns string? :n string?)\n :str string?\n :sym symbol?)\n :ret symbol?)", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/fdef"} {:added "1.1", :ns "clojure.stacktrace", :name "print-stack-trace", :file "clojure/stacktrace.clj", :type "function", :column 1, :see-alsos [{:created-at 1518042239168, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "catch", :ns "clojure.core"}, :_id "5a7b7c7fe4b0316c0f44f8a5"} {:created-at 1518042247997, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ex-info", :ns "clojure.core"}, :_id "5a7b7c87e4b0316c0f44f8a6"}], :line 48, :examples [{:updated-at 1508791426015, :created-at 1374649676000, :body "(clojure.stacktrace/print-stack-trace (Exception. \"foo\"))\n; java.lang.Exception: foo\n; at user$eval112.invoke (NO_SOURCE_FILE:1)\n; clojure.lang.Compiler.eval (Compiler.java:6619)\n; clojure.lang.Compiler.eval (Compiler.java:6582)\n; clojure.core$eval.invoke (core.clj:2852)\n; clojure.main$repl$read_eval_print__6588$fn__6591.invoke (main.clj:259)\n; clojure.main$repl$read_eval_print__6588.invoke (main.clj:259)\n; clojure.main$repl$fn__6597.invoke (main.clj:277)\n; clojure.main$repl.doInvoke (main.clj:277)\n; clojure.lang.RestFn.invoke (RestFn.java:1096)\n; clojure.tools.nrepl.middleware.interruptible_eval$evaluate$fn__3615.invoke (interruptible_eval.clj:56)\n; clojure.lang.AFn.applyToHelper (AFn.java:159)\n; clojure.lang.AFn.applyTo (AFn.java:151)\n; clojure.core$apply.invoke (core.clj:617)\n; clojure.core$with_bindings_STAR_.doInvoke (core.clj:1788)\n; clojure.lang.RestFn.invoke (RestFn.java:425)\n; clojure.tools.nrepl.middleware.interruptible_eval$evaluate.invoke (interruptible_eval.clj:41)\n; clojure.tools.nrepl.middleware.interruptible_eval$interruptible_eval$fn__3656$fn__3659.invoke (interruptible_eval.clj:171)\n; clojure.core$comp$fn__4154.invoke (core.clj:2330)\n; clojure.tools.nrepl.middleware.interruptible_eval$run_next$fn__3649.invoke (interruptible_eval.clj:138)\n; clojure.lang.AFn.run (AFn.java:24)\n; java.util.concurrent.ThreadPoolExecutor.runWorker (:-1)\n; java.util.concurrent.ThreadPoolExecutor$Worker.run (:-1)\n; java.lang.Thread.run (:-1)\n;=> nil\n\n(clojure.stacktrace/print-stack-trace (Exception. \"foo\") 4)\n; java.lang.Exception: foo\n; at user$eval124.invoke (NO_SOURCE_FILE:1)\n; clojure.lang.Compiler.eval (Compiler.java:6619)\n; clojure.lang.Compiler.eval (Compiler.java:6582)\n; clojure.core$eval.invoke (core.clj:2852)\n;=> nil", :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/627acfa99fdd2a4e0c5aab58825b6ffd?r=PG&default=identicon", :account-source "clojuredocs", :login "sjm"}, :_id "542692d7c026201cdc3270fd"} {:updated-at 1508791292657, :created-at 1508791292657, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body ";; if you need to capture the stack trace in a string.\n(with-out-str (clojure.stacktrace/print-stack-trace (Exception. \"foo\") 4))\n;; \"\\n clojure.core/eval core.clj: 3211\\n ... \\n boot.user$eval1726.invoke : 1\\nboot.user$eval1726.invokeStatic : 1\\njava.lang.Exception: foo\\n\"", :_id "59ee53fce4b03026fe14ea94"}], :notes nil, :arglists ["tr" "tr n"], :doc "Prints a Clojure-oriented stack trace of tr, a Throwable.\n Prints a maximum of n stack frames (default: unlimited).\n Does not print chained exceptions (causes).", :library-url "https://github.com/clojure/clojure", :href "/clojure.stacktrace/print-stack-trace"} {:added "1.1", :ns "clojure.stacktrace", :name "print-trace-element", :file "clojure/stacktrace.clj", :type "function", :column 1, :see-alsos nil, :line 26, :examples [{:updated-at 1508791733815, :created-at 1508791733815, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body "(clojure.stacktrace/print-trace-element (Exception. \"foo\"))\n; \n;=> nil", :_id "59ee55b5e4b03026fe14ea98"}], :notes nil, :arglists ["e"], :doc "Prints a Clojure-oriented view of one element in a stack trace.", :library-url "https://github.com/clojure/clojure", :href "/clojure.stacktrace/print-trace-element"} {:added "1.1", :ns "clojure.stacktrace", :name "print-cause-trace", :file "clojure/stacktrace.clj", :type "function", :column 1, :see-alsos [{:created-at 1433792931008, :author {:login "JarredLHumphrey", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2120888?v=3"}, :to-var {:ns "clojure.stacktrace", :name "print-stack-trace", :library-url "https://github.com/clojure/clojure"}, :_id "5575f1a3e4b03e2132e7d18a"}], :line 70, :examples [{:editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :body "(clojure.stacktrace/print-cause-trace (Exception. \"foo\") 4)\n; clojure.core/eval core.clj: 3211\n; ... \n; boot.user$eval1731.invoke : 1\n; boot.user$eval1731.invokeStatic : 1\n; java.lang.Exception: foo\n;=> nil\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}, :created-at 1508791543258, :updated-at 1508791574495, :_id "59ee54f7e4b03026fe14ea96"}], :notes nil, :arglists ["tr" "tr n"], :doc "Like print-stack-trace but prints chained exceptions (causes).", :library-url "https://github.com/clojure/clojure", :href "/clojure.stacktrace/print-cause-trace"} {:added "1.1", :ns "clojure.stacktrace", :name "e", :file "clojure/stacktrace.clj", :type "function", :column 1, :see-alsos nil, :line 80, :examples [{:editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :body "(/ 1 0)\n\n;;ArithmeticException Divide by zero clojure.lang.Numbers.divide (Numbers.java:156)\n\n(clojure.stacktrace/e)\n\n;;java.lang.ArithmeticException: Divide by zero\n;; at clojure.lang.Numbers.divide (Numbers.java:156)\n;; clojure.lang.Numbers.divide (Numbers.java:3731)\n;; user$eval11696.invoke (form-init813878306514169279.clj:1)\n;; clojure.lang.Compiler.eval (Compiler.java:6703)\n;; clojure.lang.Compiler.eval (Compiler.java:6666)\n;; clojure.core$eval.invoke (core.clj:2927)\n;; clojure.main$repl$read_eval_print__6625$fn__6628.invoke (main.clj:239)\n;; clojure.main$repl$read_eval_print__6625.invoke (main.clj:239)\n\n;; => nil", :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :created-at 1443937645032, :updated-at 1508791980228, :_id "5610bd6de4b0686557fcbd52"}], :notes nil, :arglists [""], :doc "REPL utility. Prints a brief stack trace for the root cause of the\n most recent exception.", :library-url "https://github.com/clojure/clojure", :href "/clojure.stacktrace/e"} {:added "1.1", :ns "clojure.stacktrace", :name "root-cause", :file "clojure/stacktrace.clj", :type "function", :column 1, :see-alsos nil, :line 18, :examples [{:updated-at 1508792641035, :created-at 1508792641035, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body ";; make an exception\n(def anex (try (/ 1 0) (catch Exception ex ex)))\n\n;; get the root cause\n(clojure.stacktrace/root-cause anex)\n;;=> #error {\n;; :cause \"Divide by zero\"\n;; :via\n;; [{:type java.lang.ArithmeticException\n;; :message \"Divide by zero\"\n;; :at [clojure.lang.Numbers divide \"Numbers.java\" 163]}]\n;; :trace\n;; [[clojure.lang.Numbers divide \"Numbers.java\" 163]\n;; [clojure.lang.Numbers divide \"Numbers.java\" 3833]\n;; ...\n;; [java.lang.Thread run \"Thread.java\" 748]]}\n", :_id "59ee5941e4b03026fe14ea9e"}], :notes nil, :arglists ["tr"], :doc "Returns the last 'cause' Throwable in a chain of Throwables.", :library-url "https://github.com/clojure/clojure", :href "/clojure.stacktrace/root-cause"} {:added "1.1", :ns "clojure.stacktrace", :name "print-throwable", :file "clojure/stacktrace.clj", :type "function", :column 1, :see-alsos [{:created-at 1508792399533, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "print-stack-trace", :ns "clojure.stacktrace"}, :_id "59ee584fe4b03026fe14ea9c"} {:created-at 1508792411207, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "print-cause-trace", :ns "clojure.stacktrace"}, :_id "59ee585be4b03026fe14ea9d"}], :line 38, :examples [{:editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :body ";; let's make an exception\n(def anex (try (/ 1 0) (catch Exception ex ex)))\n\n;; now print the exception\n(clojure.stacktrace/print-throwable anex)\n;; java.lang.ArithmeticException: Divide by zero\n;=> nil\n\n;; and catch it in a string\n(def msg (with-out-str (clojure.stacktrace/print-throwable anex)))\n;=> #'boot.user/msg\n\nmsg\n;=> \"java.lang.ArithmeticException: Divide by zero\"\n\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}, :created-at 1508792234572, :updated-at 1508792362516, :_id "59ee57aae4b03026fe14ea9a"}], :notes nil, :arglists ["tr"], :doc "Prints the class and message of a Throwable. Prints the ex-data map\n if present.", :library-url "https://github.com/clojure/clojure", :href "/clojure.stacktrace/print-throwable"} {:added "1.8", :ns "clojure.string", :name "ends-with?", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1543591000911, :author {:login "iGEL", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/36442?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "starts-with?", :ns "clojure.string"}, :_id "5c015458e4b0ca44402ef5d4"} {:created-at 1676935186431, :author {:login "oakmac", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/98485?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "includes?", :ns "clojure.string"}, :_id "63f40012e4b08cf8563f4b70"}], :line 366, :examples [{:updated-at 1476954122056, :created-at 1476954122056, :author {:login "dalzony", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/562341?v=3"}, :body "(use 'clojure.string)\n\n(ends-with? \"Minsun\" \"sun\")\n;;=> true\n(ends-with? \"Minsun\" \"suns\")\n;;=> false\n(ends-with? \"Minsun\" \"un\")\n;;=> true", :_id "5808880ae4b001179b66bdd4"}], :notes nil, :arglists ["s substr"], :doc "True if s ends with substr.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/ends-with_q"} {:added "1.2", :ns "clojure.string", :name "capitalize", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1330171018000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.string", :name "upper-case", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b62"} {:created-at 1330171022000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.string", :name "lower-case", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b63"}], :line 196, :examples [{:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "teyc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd6e62afb4881ab0f617611b8b65d003?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (require 'clojure.string)\nnil\n\nuser=> (clojure.string/capitalize \"MiXeD cAsE\")\n\"Mixed case\"\n\nuser=> (clojure.string/capitalize \"mIxEd CaSe\")\n\"Mixed case\"\n", :created-at 1282324695000, :updated-at 1285487692000, :_id "542692d1c026201cdc326f12"} {:editors [{:avatar-url "https://avatars.githubusercontent.com/u/40753?v=2", :account-source "github", :login "sir-pinecone"} {:avatar-url "https://avatars.githubusercontent.com/u/99447?v=3", :account-source "github", :login "olivergeorge"}], :updated-at 1452219646078, :created-at 1415122766154, :author {:avatar-url "https://avatars.githubusercontent.com/u/40753?v=2", :account-source "github", :login "sir-pinecone"}, :body "(defn capitalize-words \n \"Capitalize every word in a string\"\n [s]\n (->> (string/split (str s) #\"\\b\") \n (map string/capitalize)\n string/join))\n\n(capitalize-words \"a bunch of words/text\")\n;;=> \"A Bunch Of Words/Text\"", :_id "54590f4ee4b0dc573b892fb8"} {:updated-at 1518738391882, :created-at 1518738391882, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :body ";; Warning: If you deal with Unicode characters often, note that some do not\n;; fit into a single 16-bit Java char. Yes, such Unicode characters exist.\n;; The JVM encodes them in strings in memory using UTF-16, as 2 consecutive\n;; 16-bit values, each with their own separate index in the string's array\n;; of chars.\n\n;; https://en.wikipedia.org/wiki/UTF-16\n\n;; clojure.string/capitalize should not be used for such strings, as it\n;; operates by feeding the first 16-bit Java char for capitalization, and the rest\n;; of the Java chars for converting to lower case.\n\n;; I wouldn't bother filing (another) bug on Clojure for this, since it is\n;; unlikely to change in this regard. If you are dealing with many languages\n;; in the Unicode character set on a regular basis, then you likely\n;; want to use a library like ICU4J, which is much more sophisticated in its\n;; capabilities than anything built into Clojure.\n\n;; ICU4J (also ICU4C): http://site.icu-project.org", :_id "5a861bd7e4b0316c0f44f8c4"}], :notes nil, :tag "java.lang.String", :arglists ["s"], :doc "Converts first character of the string to upper-case, all other\n characters to lower-case.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/capitalize"} {:added "1.2", :ns "clojure.string", :name "reverse", :file "clojure/string.clj", :type "function", :column 1, :see-alsos nil, :line 48, :examples [{:updated-at 1557853754276, :created-at 1291916345000, :body ";; This demonstrates clojure.core/reverse, and not clojure.string/reverse, to be clear.\n\nuser> (reverse \"foo\")\n(\\o \\o \\f)\n\nuser> (apply str (reverse \"foo\"))\n\"oof\"", :editors [{:avatar-url "https://www.gravatar.com/avatar/73dfb1eb77844f0dbae599ff9b81e78f?r=PG&default=identicon", :account-source "clojuredocs", :login "mudge"} {:avatar-url "https://avatars3.githubusercontent.com/u/13070019?v=4", :account-source "github", :login "krizk"} {:login "bpringe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/12722744?v=4"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692d1c026201cdc326f10"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; clojure.string/reverse correctly treats UTF-16 surrogate pairs\n;; as a unit, and does not reverse the 2 Java chars of the pair. Good!\nuser=> (def s \"smily \\ud83d\\ude03.\")\n#'user/s\nuser=> (def x (str/reverse s))\n#'user/x\nuser=> (map #(format \"%04X\" (int %)) s)\n(\"0073\" \"006D\" \"0069\" \"006C\" \"0079\" \"0020\" \"D83D\" \"DE03\" \"002E\")\nuser=> (map #(format \"%04X\" (int %)) x)\n(\"002E\" \"D83D\" \"DE03\" \"0020\" \"0079\" \"006C\" \"0069\" \"006D\" \"0073\")\n", :created-at 1329876696000, :updated-at 1329876696000, :_id "542692d7c026201cdc32710b"}], :notes nil, :tag "java.lang.String", :arglists ["s"], :doc "Returns s with its characters reversed.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/reverse"} {:added "1.2", :ns "clojure.string", :name "join", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1314291144000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "split-at", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d3a"} {:created-at 1314291148000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "split-with", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d3b"} {:created-at 1334733670000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "interpose", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e48"} {:created-at 1627950208675, :author {:login "Okwori", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/16775439?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "apply", :ns "clojure.core"}, :_id "61088c80e4b0b1e3652d752b"}], :line 180, :examples [{:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "morty", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3272?v=3"}], :body "user=> (clojure.string/join \", \" [1 2 3])\n\"1, 2, 3\"", :created-at 1282320829000, :updated-at 1416262356224, :_id "542692d0c026201cdc326f00"} {:author {:login "Santosh", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/851ccd369a1501c72f5e08af19ff9dc1?r=PG&default=identicon"}, :editors [{:login "Santosh", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/851ccd369a1501c72f5e08af19ff9dc1?r=PG&default=identicon"} {:login "Santosh", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/851ccd369a1501c72f5e08af19ff9dc1?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Splits a string on space character and joins \n;; the resulting collection with a line feed character\n\n(use '[clojure.string :only (join split)])\n\nuser=> (println\n (join \"\\n\"\n (split \"The Quick Brown Fox\" #\"\\s\")))\nThe\nQuick\nBrown\nFox\nnil", :created-at 1286103547000, :updated-at 1286115114000, :_id "542692d0c026201cdc326f01"} {:updated-at 1442089276535, :created-at 1442089276535, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :body ";; Note that empty strings and nils will appear as blank items\n;; in the result:\n\n(require '[clojure.string :as string])\n\n(string/join \", \" [\"spam\" nil \"eggs\" \"\" \"spam\"])\n;;=> \"spam, , eggs, , spam\"\n\n;; If you'd like to avoid this, you might do something like this:\n\n(string/join \", \" (remove string/blank? [\"spam\" nil \"eggs\" \"\" \"spam\"]))\n;;=> \"spam, eggs, spam\"", :_id "55f4893ce4b06a9ffaad4fbc"} {:editors [{:login "timjimsmith", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/23392266?v=4"}], :body "(require '[clojure.string :as string])\n\n;; No separator means no separation\n(string/join [1 2 3])\n;; => \"123\"", :author {:avatar-url "https://avatars3.githubusercontent.com/u/23392266?v=4", :account-source "github", :login "timjimsmith"}, :created-at 1551217121626, :updated-at 1551217186482, :_id "5c75b1e1e4b0ca44402ef6a8"}], :notes nil, :tag "java.lang.String", :arglists ["coll" "separator coll"], :doc "Returns a string of all elements in coll, as returned by (seq coll),\n separated by an optional separator.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/join"} {:added "1.2", :ns "clojure.string", :name "replace-first", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1323919307000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.string", :name "replace", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c57"} {:created-at 1324450151000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "re-pattern", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c58"} {:created-at 1379040099000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "subs", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c59"} {:created-at 1534291088264, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "re-quote-replacement", :ns "clojure.string"}, :_id "5b736c90e4b00ac801ed9e57"}], :line 138, :examples [{:updated-at 1497950006591, :created-at 1323919917000, :body "user=> (use '[clojure.string :only (replace-first)])\n\n;; Only replace the first match.\nuser=> (replace-first \"A good day to you, sir. Good day.\" #\"day\" \"night\")\n\"A good night to you, sir. Good day.\"\n\n;; If there are no matches, return the original string.\nuser=> (replace-first \"A good day to you, sir.\" #\"madam\" \"master\")\n\"A good day to you, sir.\"\n\n;; (?i) at the beginning of a pattern makes the entire thing match\n;; case-insensitively, at least for US ASCII characters. (?u) does\n;; the corresponding thing for Unicode.\nuser=> (replace-first \"Day need not be SHOUTED.\" #\"(?i)day\" \"night\")\n\"night need not be SHOUTED.\"\n\n;; See here for many details on regex patterns:\n;; http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html\n;; Also the book \"Mastering Regular Expressions\" by Jeffrey Friedl.\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}, :_id "542692d7c026201cdc327104"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body "user=> (use '[clojure.string :only (replace-first)])\n\n;; Pattern matches from beginning of string (signified by ^) up to the\n;; last occurrence of /, because by default * is greedy, i.e. it\n;; matches as much as possible.\nuser=> (replace-first \"/path/to/file/name\" #\"^.*/\" \"\")\n\"name\"\n\n;; Use *? to match as little as possible.\nuser=> (replace-first \"/path/to/file/name\" #\"^.*?/\" \"\")\n\"path/to/file/name\"\n", :created-at 1323919934000, :updated-at 1323919934000, :_id "542692d7c026201cdc327107"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; Note: When replace-first or replace have a regex pattern as their\n;; match argument, dollar sign ($) and backslash (\\) characters in\n;; the replacement string are treated specially.\n\n;; Example: pattern matches string \"fodder\", with (o+) matching \"o\"\n;; and (\\S+) matching \"dder\". Replacement string says to replace the\n;; entire match \"fodder\" with $2, the string matched by the second\n;; parenthesized group, \"dder\", followed by $1, \"o\".\nuser=> (str/replace-first \"fabulous fodder foo food\" #\"f(o+)(\\S+)\" \"$2$1\")\n\"fabulous ddero foo food\"\n\n;; To avoid this special treatment of $ and \\, you must escape them with\n;; \\. Because it is in a Clojure string, to get one \\ we must escape\n;; *that* with its own \\.\nuser=> (str/replace-first \"fabulous fodder foo food\" #\"f(o+)(\\S+)\" \"\\\\$2\\\\$1\")\n\"fabulous $2$1 foo food\"\n\n;; To ensure the replacement is treated literally, call\n;; java.util.regex.Matcher/quoteReplacement on it. A shorter name\n;; like re-qr can be handy.\nuser=> (import '(java.util.regex Matcher))\njava.util.regex.Matcher\n\nuser=> (defn re-qr [replacement]\n (Matcher/quoteReplacement replacement))\n#'user/re-qr\n\nuser=> (str/replace-first \"fabulous fodder foo food\" #\"f(o+)(\\S+)\" (re-qr \"$2$1\"))\n\"fabulous $2$1 foo food\"\n", :created-at 1324449916000, :updated-at 1325401081000, :_id "542692d7c026201cdc327108"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; Note: See clojure.core/subs for discussion of behavior of substrings\n;; holding onto references of the original strings, which can\n;; significantly affect your memory usage in some cases.", :created-at 1379040092000, :updated-at 1379040092000, :_id "542692d7c026201cdc32710a"}], :notes nil, :tag "java.lang.String", :arglists ["s match replacement"], :doc "Replaces the first instance of match with replacement in s.\n\n match/replacement can be:\n\n char / char\n string / string\n pattern / (string or function of match).\n\n See also replace.\n\n The replacement is literal (i.e. none of its characters are treated\n specially) for all cases above except pattern / string.\n\n For pattern / string, $1, $2, etc. in the replacement string are\n substituted with the string that matched the corresponding\n parenthesized group in the pattern. If you wish your replacement\n string r to be used literally, use (re-quote-replacement r) as the\n replacement argument. See also documentation for\n java.util.regex.Matcher's appendReplacement method.\n\n Example:\n (clojure.string/replace-first \"swap first two words\"\n #\"(\\w+)(\\s+)(\\w+)\" \"$3$2$1\")\n -> \"first swap two words\"", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/replace-first"} {:added "1.8", :ns "clojure.string", :name "starts-with?", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1676935139053, :author {:login "oakmac", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/98485?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ends-with?", :ns "clojure.string"}, :_id "63f3ffe3e4b08cf8563f4b6e"} {:created-at 1676935157532, :author {:login "oakmac", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/98485?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "includes?", :ns "clojure.string"}, :_id "63f3fff5e4b08cf8563f4b6f"}], :line 360, :examples [{:editors [{:login "elias94", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8095533?v=4"}], :body "(ns tst.xyz.core\n (:use clojure.test )\n (:require [clojure.string :as string] ))\n\n(deftest t-starts-with?\n (is (string/starts-with? \"abcde\" \"a\"))\n (is (string/starts-with? \"abcde\" \"ab\"))\n (is (string/starts-with? \"abcde\" \"abc\"))\n\n (is (not (string/starts-with? \"abcde\" \"b\")))\n (is (not (string/starts-with? \"abcde\" \"bc\")))\n\n (is (not (string/starts-with? \"a\" \"ab\")))\n (is (not (string/starts-with? \"ab\" \"abc\"))))", :author {:avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3", :account-source "github", :login "cloojure"}, :created-at 1472592967082, :updated-at 1635628021204, :_id "57c5fc47e4b0709b524f04dd"}], :notes [{:author {:login "oivulf", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3288506?v=4"}, :updated-at 1638567826166, :created-at 1638567826166, :body "why not support toffset as java does?", :_id "61aa8f92e4b0b1e3652d757e"}], :arglists ["s substr"], :doc "True if s starts with substr.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/starts-with_q"} {:added "1.2", :ns "clojure.string", :name "escape", :file "clojure/string.clj", :type "function", :column 1, :see-alsos nil, :line 300, :examples [{:updated-at 1451890503592, :created-at 1298559035000, :body ";; There should be no space between the \\ and the &, but I don't know how\n;; to create that in an example yet.\nuser=> (clojure.string/escape \"I want 1 < 2 as HTML, & other good things.\"\n {\\< \"<\", \\> \">\", \\& \"&\"})\n\"I want 1 < 2 as HTML, & other good things.\"", :editors [{:avatar-url "https://www.gravatar.com/avatar/e1237fa7ee270ace2ebb53c8cab91a6b?r=PG&default=identicon", :account-source "clojuredocs", :login "dyba"} {:login "pho-coder", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6576686?v=3"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}, :_id "542692d1c026201cdc326f15"} {:editors [{:login "educoutinho", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/3706894?v=4"}], :body "(ns test1.core\n (:require [clojure.string :as str]))\n\n(def text1 \"Hello Clojure World!\")\n\n;; Escape each character '!'\n(str/escape text1 {\\! \"!!!\"})\n;; => \"Hello Clojure World!!!\"\n\n;; Escape each space character\n(str/escape text1 {\\ \"-\"})\n;; => \"Hello-Clojure-World!\"\n\n;; Escape each characters '!' or space\n(str/escape text1 {\\! \"!!!\" \\ \"-\"})\n;; => \"Hello-Clojure-World!!!\"", :author {:avatar-url "https://avatars3.githubusercontent.com/u/3706894?v=4", :account-source "github", :login "educoutinho"}, :created-at 1516793634961, :updated-at 1516793653706, :_id "5a686f22e4b09621d9f53a77"} {:updated-at 1531760345824, :created-at 1531760345824, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :body ";; Note it correctly handles the case where a replacement string contains\n;; a char that’s in the replacement map:\n\n(clojure.string/escape \"123\" {\\1 \"2\" \\2 \"3\" \\3 \"4\"})\n;; => \"234\"\n\n(clojure.string/escape \"ab\" {\\a \"b\" \\b \"a\"})\n;; => \"ba\"", :_id "5b4cced9e4b00ac801ed9e28"} {:updated-at 1598459216961, :created-at 1598459216961, :author {:login "GSvensk", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/17110145?v=4"}, :body ";; Escape can be called with a function as the second argument.\n\n(defn convert [val]\n (case val\n \\a \\B\n \\b \\A\n \\C))\n\n(clojure.string/escape \"ab\" convert)\n;; => \"BA\"\n\n(clojure.string/escape \"ak\" convert)\n;; => BC", :_id "5f468d50e4b0b1e3652d73ae"}], :notes nil, :tag "java.lang.String", :arglists ["s cmap"], :doc "Return a new string, using cmap to escape each character ch\n from s as follows:\n \n If (cmap ch) is nil, append ch to the new string.\n If (cmap ch) is non-nil, append (str (cmap ch)) instead.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/escape"} {:added "1.8", :ns "clojure.string", :name "last-index-of", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1472459225244, :author {:login "hatappo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1096084?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "index-of", :ns "clojure.string"}, :_id "57c3f1d9e4b0709b524f04db"}], :line 339, :examples [{:editors [{:login "dalzony", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/562341?v=3"}], :body ";; 1. Just find index of char\n\nuser=> (last-index-of \"aaaaaa\" \"a\")\n5\nuser=> (last-index-of \"abcde\" \"c\")\n2\n\n;; 2. Optionally searching example\n\nuser=> (last-index-of \"abcde\" \"e\" 0)\n;;=> nil\nuser=> (last-index-of \"abcde\" \"e\" 1)\n;;=> nil\nuser=> (last-index-of \"abcde\" \"e\" 2)\n;;=> nil\nuser=> (last-index-of \"abcde\" \"e\" 3)\n;;=> nil\nuser=> (last-index-of \"abcde\" \"e\" 4)\n;;=> 4\nuser=> (last-index-of \"abcde\" \"e\" 5)\n;;=> 4\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/562341?v=3", :account-source "github", :login "dalzony"}, :created-at 1476955531813, :updated-at 1476955666691, :_id "58088d8be4b001179b66bdd6"}], :notes nil, :arglists ["s value" "s value from-index"], :doc "Return last index of value (string or char) in s, optionally\n searching backward from from-index. Return nil if value not found.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/last-index-of"} {:added "1.5", :ns "clojure.string", :name "re-quote-replacement", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1534291404302, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "replace", :ns "clojure.string"}, :_id "5b736dcce4b00ac801ed9e59"}], :line 54, :examples [{:body ";; Special characters are escaped\n\n(use '[clojure.string :only (re-quote-replacement)])\n\nuser=> (re-quote-replacement \"string \\\\ $\")\n\"string \\\\\\\\ \\\\$\"", :author {:login "mzenzie", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1862891?v=3"}, :created-at 1433165381448, :updated-at 1433165381448, :_id "556c5e45e4b03e2132e7d182"} {:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; Use with s/replace to prevent unwanted reference\n;; to matching groups (i.e. $1, $2 etc.)\n\n(require '[clojure.string :as s])\n(def s \"May 2018, June 2019\")\n(s/replace s #\"May|June\" \"10$\") ;; IllegalArgumentException\n(s/replace s #\"May|June\" (s/re-quote-replacement \"10$ in\"))\n;; \"10$ in 2018, 10$ in 2019\"", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1534291388494, :updated-at 1656679988330, :_id "5b736dbce4b00ac801ed9e58"}], :notes nil, :tag "java.lang.String", :arglists ["replacement"], :doc "Given a replacement string that you wish to be a literal\n replacement for a pattern match in replace or replace-first, do the\n necessary escaping of special characters in the replacement.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/re-quote-replacement"} {:added "1.8", :ns "clojure.string", :name "includes?", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1552344296239, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "re-matches", :ns "clojure.core"}, :_id "5c86e4e8e4b0ca44402ef6b2"} {:created-at 1552344313247, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "index-of", :ns "clojure.string"}, :_id "5c86e4f9e4b0ca44402ef6b3"}], :line 372, :examples [{:editors [{:login "fasiha", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/37649?v=3"} {:login "tanrax", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/4553672?v=4"}], :body ";; String-oriented alternative to regular-expression functions in core\n(clojure.string/includes? \"clojure\" \"cl\")\n;;=> true\n\n;; Does *not* work with regular expressions!\n(clojure.string/includes? \"clojure\" #\"cl\")\n;;=> java.util.regex.Pattern cannot be cast to java.lang.CharSequence\n;; (java.lang.ClassCastException)", :author {:avatar-url "https://avatars.githubusercontent.com/u/37649?v=3", :account-source "github", :login "fasiha"}, :created-at 1481745619651, :updated-at 1583219409606, :_id "5851a4d3e4b004d3a355e2b7"} {:updated-at 1670311423805, :created-at 1670311423805, :author {:login "Yacobh", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/9374390?v=4"}, :body "\n;; Be careful when you uses with maps \n(includes? (str (:name {})) \"Bob Alice\")\n;;=> false\n\n(includes? (:name {}) \"Bob Alice\")\n;;=> Execution error (NullPointerException) at user/eval63454 (REPL:1).\n;;Cannot invoke \"Object.toString()\" because \"s\" is null", :_id "638eedffe4b0b1e3652d7694"}], :notes nil, :arglists ["s substr"], :doc "True if s includes substr.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/includes_q"} {:added "1.2", :ns "clojure.string", :name "replace", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1318625174000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "subs", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e64"} {:created-at 1318625263000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "split", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e65"} {:created-at 1323919331000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.string", :name "replace-first", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e66"} {:created-at 1534289083122, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "re-quote-replacement", :ns "clojure.string"}, :_id "5b7364bbe4b00ac801ed9e54"}], :line 75, :examples [{:updated-at 1507930108317, :created-at 1284347892000, :body "(clojure.string/replace \"The color is red\" #\"red\" \"blue\")\n;=> \"The color is blue\"", :editors [{:avatar-url "https://www.gravatar.com/avatar/e2051c4ebaaa8c22fa9c0bb2f32f64fd?r=PG&default=identicon", :account-source "clojuredocs", :login "rustem.suniev"} {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/e2051c4ebaaa8c22fa9c0bb2f32f64fd?r=PG&default=identicon", :account-source "clojuredocs", :login "rustem.suniev"}, :_id "542692d1c026201cdc326f0b"} {:author {:login "JD Huntington", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a3d6887041bc564a5d60cdc811ae4ef9?r=PG&default=identicon"}, :editors [{:login "Domon", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3fe8ae238c14d716a9fc16734a70765b?r=PG&default=identicon"} {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"} {:login "Panthevm", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/43318093?v=4"}], :body "(clojure.string/replace \"The color is red.\" #\"[aeiou]\" #(str %1 %1))\n;=> \"Thee cooloor iis reed.\"\n", :created-at 1295092425000, :updated-at 1604318073825, :_id "542692d1c026201cdc326f0e"} {:updated-at 1534289397632, :created-at 1324450115000, :body ";; Note: When replace-first or replace have a regex pattern as their\n;; match argument, dollar sign ($) and backslash (\\) characters in\n;; the replacement string are treated specially.\n\n;; Example: first substring that the pattern matches is \"fodder\", with\n;; (o+) matching \"o\" and (\\S+) matching \"dder\". Replacement string\n;; says to replace the entire match \"fodder\" with $2, the string\n;; matched by the second parenthesized group, \"dder\", followed by $1,\n;; \"o\".\n(str/replace \"fabulous fodder foo food\" #\"f(o+)(\\S+)\" \"$2$1\")\n;=> \"fabulous ddero oo doo\"\n\n;; To avoid this special treatment of $ and \\, you must escape them with\n;; \\. Because it is in a Clojure string, to get one \\ we must escape\n;; *that* with its own \\.\n(str/replace \"fabulous fodder foo food\" #\"f(o+)(\\S+)\" \"\\\\$2\\\\$1\")\n;=> \"fabulous $2$1 $2$1 $2$1\"\n\n;; To ensure the replacement is treated literally, call\n;; java.util.regex.Matcher/quoteReplacement on it. A shorter name\n;; like re-qr can be handy.\n(import '(java.util.regex Matcher))\n;=> java.util.regex.Matcher\n\n(defn re-qr [replacement]\n (Matcher/quoteReplacement replacement))\n;=> #'user/re-qr\n\n(str/replace \"fabulous fodder foo food\" #\"f(o+)(\\S+)\" (re-qr \"$2$1\"))\n;=> \"fabulous $2$1 $2$1 $2$1\"\n\n;; Since 1.5, re-qr can be replaced by clojure.string/re-quote-replacement\n(str/replace \"fabulous fodder foo food\" #\"f(o+)(\\S+)\" (str/re-quote-replacement \"$2$1\"))\n;=> \"fabulous $2$1 $2$1 $2$1\"", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"} {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}, :_id "542692d7c026201cdc3270fe"} {:updated-at 1507930204780, :created-at 1344740223000, :body ";; replaces all a's with 1 and all b's with 2\n(clojure.string/replace \"a b a\" #\"a|b\" {\"a\" \"1\" \"b\" \"2\"})\n;=> \"1 2 1\"", :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon", :account-source "clojuredocs", :login "dansalmo"}, :_id "542692d7c026201cdc327100"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; Note: See clojure.core/subs for discussion of behavior of substrings\n;; holding onto references of the original strings, which can\n;; significantly affect your memory usage in some cases.", :created-at 1379040065000, :updated-at 1379040065000, :_id "542692d7c026201cdc327101"} {:author {:login "Corin", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/58ca01bfad092685652c8ea2b7bb3008?r=PG&default=identicon"}, :editors [{:login "Corin", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/58ca01bfad092685652c8ea2b7bb3008?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; To title case\n(clojure.string/replace \"hello world\" #\"\\b.\" #(.toUpperCase %1))\n\"Hello World\"\n\n;; Note that a vector is passed to your replacement function\n;; when pattern contains capturing groups (see re-groups)\n(clojure.string/replace \"hello world\" #\"\\b(.)\" #(.toUpperCase (%1 1)))\n\"Hello World\"\n", :created-at 1397250241000, :updated-at 1412843380347, :_id "542692d7c026201cdc327102"} {:updated-at 1464723944272, :created-at 1464723944272, :author {:login "alexbispo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6197542?v=3"}, :body ";; Note that the s \"Vegeta\" is returned as is, because there is no matching.\n(clojure.string/replace \"Vegeta\" #\"Goku\" \"Gohan\")\n\"Vegeta\"", :_id "574de9e8e4b0bafd3e2a046c"} {:updated-at 1636733826696, :created-at 1636733826696, :author {:login "wdhowe", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4631165?v=4"}, :body ";; Removing characters, while ignoring case.\n(clojure.string/replace \"Hello hello!\" #\"(?i)[h!]\" \"\")\n\n;=> \"ello ello\"", :_id "618e9382e4b0b1e3652d7572"}], :notes [{:updated-at 1351132541000, :body "How can i replace \".\" with #\"\\s\"", :created-at 1351132541000, :author {:login "TejasBhatt", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2953c9d9a1566f643e6910c4aa392525?r=PG&default=identicon"}, :_id "542692edf6e94c6970521ff2"}], :tag "java.lang.String", :arglists ["s match replacement"], :doc "Replaces all instance of match with replacement in s.\n\n match/replacement can be:\n\n string / string\n char / char\n pattern / (string or function of match).\n\n See also replace-first.\n\n The replacement is literal (i.e. none of its characters are treated\n specially) for all cases above except pattern / string.\n\n For pattern / string, $1, $2, etc. in the replacement string are\n substituted with the string that matched the corresponding\n parenthesized group in the pattern. If you wish your replacement\n string r to be used literally, use (re-quote-replacement r) as the\n replacement argument. See also documentation for\n java.util.regex.Matcher's appendReplacement method.\n\n Example:\n (clojure.string/replace \"Almost Pig Latin\" #\"\\b(\\w)(\\w+)\\b\" \"$2$1ay\")\n -> \"lmostAay igPay atinLay\"", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/replace"} {:added "1.2", :ns "clojure.string", :name "split-lines", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1329986651000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.string", :name "split", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bce"}], :line 228, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (clojure.string/split-lines \"test \\n string\")\n[\"test \" \" string\"]", :created-at 1281617355000, :updated-at 1332953156000, :_id "542692d0c026201cdc326f08"} {:updated-at 1470989747427, :created-at 1470989747427, :author {:login "mdemare", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4588?v=3"}, :body "; ignores trailing newlines\nuser=> (clojure.string/split-lines \"test\\n\\n\")\n[\"test\"]", :_id "57ad85b3e4b0bafd3e2a04e6"} {:editors [{:login "PEZ", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/30010?v=4"}], :body ";; About ignoring trailing newlines: split-lines is implemented something like:\nuser=> (clojure.string/split s #\"\\r?\\n\")\n\n;; To always get all the lines, you need to use split instead,\n;; and supply a negative third argument:\nuser=> (clojure.string/split \"\\ntest\\n\\n\" #\"\\r?\\n\" -1)\n;;=> [\"\" \"test\" \"\" \"\"]", :author {:avatar-url "https://avatars2.githubusercontent.com/u/30010?v=4", :account-source "github", :login "PEZ"}, :created-at 1530254196315, :updated-at 1530254213480, :_id "5b35d374e4b00ac801ed9e21"}], :notes nil, :arglists ["s"], :doc "Splits s on \\n or \\r\\n.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/split-lines"} {:added "1.2", :ns "clojure.string", :name "lower-case", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1330171039000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.string", :name "upper-case", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f4d"} {:created-at 1330171043000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.string", :name "capitalize", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f4e"}], :line 213, :examples [{:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (clojure.string/lower-case \"MiXeD cAsE\")\n\"mixed case\"", :created-at 1282324622000, :updated-at 1332951955000, :_id "542692d0c026201cdc326ef9"}], :notes nil, :tag "java.lang.String", :arglists ["s"], :doc "Converts string to all lower-case.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/lower-case"} {:added "1.2", :ns "clojure.string", :name "trim-newline", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1285923216000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "trim", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521de8"} {:created-at 1285923222000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "triml", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521de9"} {:created-at 1285923228000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "trimr", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dea"}], :line 274, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [], :body "
    \r\nuser=> (clojure.string/trim-newline \"test\\n\\r\")\r\n\"test\"\r\n
    ", :created-at 1280737509000, :updated-at 1280737509000, :_id "542692d1c026201cdc326f18"}], :notes nil, :tag "java.lang.String", :arglists ["s"], :doc "Removes all trailing newline \\n or return \\r characters from\n string. Similar to Perl's chomp.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/trim-newline"} {:added "1.2", :ns "clojure.string", :name "upper-case", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1330171029000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.string", :name "lower-case", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521af0"} {:created-at 1330171033000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.string", :name "capitalize", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521af1"}], :line 207, :examples [{:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (clojure.string/upper-case \"MiXeD cAsE\")\n\"MIXED CASE\"", :created-at 1282324576000, :updated-at 1332951710000, :_id "542692d0c026201cdc326f05"} {:author {:login "nickzam", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/89377?v=2"}, :editors [], :body ";; Non-character symbols will be returned back\nuser=> (clojure.string/upper-case \",.!@#$%^&*()\")\n\",.!@#$%^&*()\"", :created-at 1386881910000, :updated-at 1386881910000, :_id "542692d7c026201cdc327113"} {:updated-at 1520347173061, :created-at 1520347173061, :author {:login "lov3machine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/13834519?v=4"}, :body ";; upper-case can't handle nil \nuser=> (clojure.string/upper-case nil) ;;=> NullPointerException ", :_id "5a9ea825e4b0316c0f44f90c"}], :notes nil, :tag "java.lang.String", :arglists ["s"], :doc "Converts string to all upper-case.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/upper-case"} {:added "1.2", :ns "clojure.string", :name "split", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1318625222000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "subs", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f59"} {:created-at 1318625227000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "replace", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f5a"} {:created-at 1318625367000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "re-seq", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f5b"} {:created-at 1329986664000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.string", :name "split-lines", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f5c"} {:created-at 1519238766963, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "trim", :ns "clojure.string"}, :_id "5a8dbe6ee4b0316c0f44f8da"} {:created-at 1612477021984, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "join", :ns "clojure.string"}, :_id "601c725de4b0b1e3652d7447"}], :line 219, :examples [{:author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"} {:avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3", :account-source "github", :login "cloojure"} {:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"}], :body "user=> (require '[clojure.string :as str])\n\nuser=> (str/split \"Clojure is awesome!\" #\" \")\n[\"Clojure\" \"is\" \"awesome!\"]\n\nuser=> (str/split \"q1w2e3r4t5y6u7i8o9p0\" #\"\\d+\")\n[\"q\" \"w\" \"e\" \"r\" \"t\" \"y\" \"u\" \"i\" \"o\" \"p\"]\n\n;; Note that the 'limit' arg is the maximum number of strings to\n;; return (not the number of splits)\nuser=> (str/split \"q1w2e3r4t5y6u7i8o9p0\" #\"\\d+\" 5)\n[\"q\" \"w\" \"e\" \"r\" \"t5y6u7i8o9p0\"]\n\n;; to get back all the characters of a string, as a vector of strings:\nuser=> (str/split \" q1w2 \" #\"\")\n[\" \" \"q\" \"1\" \"w\" \"2\" \" \"]\n;; Note: sequence, in contrast, would return characters.\n\n;; Using lookarounds (lookahead, lookbehind) one can keep the matching characters:\nuser=> (str/split \" something and ACamelName \" #\"(?=[A-Z])\")\n[\" something and \" \"A\" \"Camel\" \"Name \"]\n\n;; If the pattern is not found, we get back the original string untouched:\nuser=> (str/split \"a\" #\"b\")\n[\"a\"]\n\nuser=> (str/split \" \" #\"b\")\n[\" \"]\n\nuser=> (str/split \"\" #\"b\")\n[\"\"]\n\n;; If everything matches, an empty vector is returned!\nuser=> (str/split \"a\" #\"a\")\n[]\n\nuser=> (str/split \"aaa\" #\"a\")\n[]\n\n;; but:\nuser=> (str/split \"\" #\"\")\n[\"\"]", :created-at 1279388024000, :updated-at 1519255116562, :_id "542692d0c026201cdc326efb"} {:author {:login "Santosh", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/851ccd369a1501c72f5e08af19ff9dc1?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Splits a string on space character and joins \n;; the resulting collection with a line feed character\n\n(use '[clojure.string :only (join split)])\n\nuser=> (println\n (join \"\\n\"\n (split \"The Quick Brown Fox\" #\"\\s\")))\nThe\nQuick\nBrown\nFox\nnil", :created-at 1286103685000, :updated-at 1286115074000, :_id "542692d0c026201cdc326efe"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "(use '[clojure.string :only (split triml)])\n\n;; Splitting on whitespace is a common desire.\nuser=> (split \"Some words to split\" #\"\\s+\")\n[\"Some\" \"words\" \"to\" \"split\"]\n\n;; By using the pattern #\"\\s+\", we split on all occurrences of one or\n;; more consecutive whitespace characters.\nuser=> (split \"Some words with\\tother whitespace \\n\" #\"\\s+\")\n[\"Some\" \"words\" \"with\" \"other\" \"whitespace\"]\n\n;; If you are used to Perl's special behavior of split(' ', $str),\n;; where it ignores leading whitespace in the string to be split, this\n;; does not quite do it.\nuser=> (split \" Leading whitespace causes empty first string\" #\"\\s+\")\n[\"\" \"Leading\" \"whitespace\" \"causes\" \"empty\" \"first\" \"string\"]\n\n;; This will do it.\nuser=> (defn perl-split-on-space [s]\n (split (triml s) #\"\\s+\"))\n#'user/perl-split-on-space\nuser=> (perl-split-on-space \" This is often what you want \")\n[\"This\" \"is\" \"often\" \"what\" \"you\" \"want\"]\n\n;; There might be cases where you want this instead.\nuser=> (split \"Some words with\\tother whitespace \\n\" #\"\\s\")\n[\"Some\" \"\" \"\" \"\" \"words\" \"\" \"\" \"with\" \"other\" \"whitespace\"]\n", :created-at 1323918291000, :updated-at 1324028976000, :_id "542692d7c026201cdc32710c"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body "(use '[clojure.string :only (split)])\n\n;; Split on every occurrence of : character\nuser=> (split \"root:*:0:0:admin:/var/root:/bin/sh\" #\":\")\n[\"root\" \"*\" \"0\" \"0\" \"admin\" \"/var/root\" \"/bin/sh\"]\n\n;; Empty strings are returned when two colons appear consecutively in\n;; the string to be split.\nuser=> (split \"root::0:0::/var/root:/bin/sh\" #\":\")\n[\"root\" \"\" \"0\" \"0\" \"\" \"/var/root\" \"/bin/sh\"]\n\n;; Without specifying a limit, any empty strings at the end are\n;; omitted.\nuser=> (split \"root::0:0:admin:/var/root:\" #\":\")\n[\"root\" \"\" \"0\" \"0\" \"admin\" \"/var/root\"]\nuser=> (split \"root::0:0:admin::\" #\":\")\n[\"root\" \"\" \"0\" \"0\" \"admin\"]\n\n;; If you want all of the fields, even trailing empty ones, use a\n;; negative limit.\nuser=> (split \"root::0:0:admin:/var/root:\" #\":\" -1)\n[\"root\" \"\" \"0\" \"0\" \"admin\" \"/var/root\" \"\"]\nuser=> (split \"root::0:0:admin::\" #\":\" -1)\n[\"root\" \"\" \"0\" \"0\" \"admin\" \"\" \"\"]\n\n;; Use a positive limit of n to limit the maximum number of strings in\n;; the return value to n. If it returns exactly n strings, the last\n;; contains everything left over after splitting off the n-1 earlier\n;; strings.\nuser=> (split \"root::0:0:admin:/var/root:\" #\":\" 2)\n[\"root\" \":0:0:admin:/var/root:\"]\nuser=> (split \"root::0:0:admin:/var/root:\" #\":\" 3)\n[\"root\" \"\" \"0:0:admin:/var/root:\"]\nuser=> (split \"root::0:0:admin:/var/root:\" #\":\" 4)\n[\"root\" \"\" \"0\" \"0:admin:/var/root:\"]\nuser=> (split \"root::0:0:admin:/var/root:\" #\":\" 15)\n[\"root\" \"\" \"0\" \"0\" \"admin\" \"/var/root\" \"\"]\n", :created-at 1323918517000, :updated-at 1323918517000, :_id "542692d7c026201cdc327110"} {:author {:login "octopusgrabbus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon"}, :editors [], :body "(:require [clojure.string :as cstr])\n\n(def legal-ref \"1321-61\")\n\n(cstr/split legal-ref #\"-\")\n[\"1321\" \"61\"]", :created-at 1358660615000, :updated-at 1358660615000, :_id "542692d7c026201cdc327111"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; Note: See clojure.core/subs for discussion of behavior of substrings\n;; holding onto references of the original strings, which can\n;; significantly affect your memory usage in some cases.", :created-at 1379040081000, :updated-at 1379040081000, :_id "542692d7c026201cdc327112"} {:updated-at 1519238946118, :created-at 1519238946118, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :body ";; Note: see clojure.string/trim for an example where\n;; (split ... #\"\\s\") might not do what you expect!", :_id "5a8dbf22e4b0316c0f44f8db"} {:updated-at 1601051069239, :created-at 1601051069239, :author {:login "themustafabasit", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/24441401?v=4"}, :body "(let [response {:headers {\"authorization\" \"Token /VwzFIKzVgFOZUeykendtzbKRS/uUvBtfF+LjYB0XRI=\"\n \"host\" \"localhost:7000\"}}]\n (-> response\n :headers\n (get \"authorization\")\n (clojure.string/split #\"\\s\")\n second))\n;; => /VwzFIKzVgFOZUeykendtzbKRS/uUvBtfF+LjYB0XRI=", :_id "5f6e19bde4b0b1e3652d73c1"}], :notes [{:updated-at 1280043062000, :body "user=> (clojure.string/split \"foo bar\")\r\njava.lang.ClassNotFoundException: clojure.string\r\n\r\nDo I need to require / use anything?", :created-at 1280043062000, :author {:login "Jacolyte", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f89"} {:updated-at 1284342879000, :body "You need to add a namespace:\r\nuser => (use 'clojure.string)", :created-at 1284342879000, :author {:login "rustem.suniev", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e2051c4ebaaa8c22fa9c0bb2f32f64fd?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f95"} {:updated-at 1306110858000, :body "I 've a doubt...in ruby if I've this:\r\n\r\nbignumber=\"2938434\"\r\n\r\nI can do this\r\n\r\nbignumber.split(\"\") \r\n\r\nand get\r\n(\"2\", \"9\", \"3\", \"8\" .....)\r\n\r\nHow can I do this with clojure?...thanks", :created-at 1306110858000, :author {:login "cocoOS", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8be1592fe29f2a7ac4e9e6ad683baaa1?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fbc"} {:updated-at 1315397601000, :body "Hi, cocoOS. You may want to do it like this:\r\n\r\n
    user=> (use '[clojure.string :only (split)])\r\nnil\r\nuser=> (def bignumber \"2938434\")\r\n#'user/bignumber\r\nuser=> (split bignumber #\"\")\r\n[\"\" \"2\" \"9\" \"3\" \"8\" \"4\" \"3\" \"4\"]\r\n
    \r\n\r\nYou will have to filter out the empty string.\r\n\r\n
    \r\n\r\nBut there are other ways, like:\r\n
    user=> (map str (vec bignumber))\r\n(\"2\" \"9\" \"3\" \"8\" \"4\" \"3\" \"4\")\r\n
    ", :created-at 1315395310000, :author {:login "Domon", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3fe8ae238c14d716a9fc16734a70765b?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fc9"} {:updated-at 1338786357000, :body "
    \r\nuser=> (seq \"2938434\")\r\n(\\2 \\9 \\3 \\8 \\4 \\3 \\4)\r\n
    \r\n\r\nmight also be what you want.", :created-at 1338786357000, :author {:login "Iceland_jack", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c889e0a95a3bb07f90ab28ad442f1127?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fe2"} {:updated-at 1365500709000, :body "Thanks for the help Domon and Iceland_jack, one more question:\r\n\r\nSay I have used sequence in the way:\r\n\r\nuser=> (seq \"2938434\")\r\n(\\2 \\9 \\3 \\8 \\4 \\3 \\4)\r\n\r\nIf I only wanted to access the 4th item in the sequence (which is 8), how would I do so? Aside from using (next (next (next ...))) ? Just trying to index it giving that I want position 4", :created-at 1365500563000, :author {:login "Instinct212", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2f71c013847ef7da0e6cf8ea7a2dec62?r=PG&default=identicon"}, :_id "542692edf6e94c6970522000"} {:body "When limit=1 the original string is returned\n\n
    \n(clojure.string/split \"abcd\" #\"a\" 1)\n=> [\"abcd\"]\n\n(clojure.string/split \"abcd\" #\"a\" 2)\n=> [\"\" \"bcd\"]\n
    ", :created-at 1419810351540, :updated-at 1419810380767, :author {:login "olivergeorge", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/99447?v=3"}, :_id "54a0962fe4b09260f767ca81"} {:body "@Instinct212\n
    \n(nth (seq \"2938434\") 3)\n=> \\8\n
    ", :created-at 1448240477083, :updated-at 1448240508295, :author {:avatar-url "https://avatars.githubusercontent.com/u/1740215?v=3", :account-source "github", :login "Yuhta"}, :_id "5652655de4b0538444398274"} {:author {:login "rux", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/11169?v=3"}, :updated-at 1489061703747, :created-at 1489061357001, :body "There is a change in behaviour between Java 7 and Java 8 that can affect the returned values. \"When there is a positive-width match at the beginning of this string then an empty leading substring is included at the beginning of the resulting array. A zero-width match at the beginning however never produces such empty leading substring.\" was added to the docs for split().\n\nBoth run with Clojure 1.8, the code below splits a string based on capital letters, but...\n\nin Java 7\n\n
    (clojure.string/split \"PrimaryEmailAddr\" #\"(?=[A-Z])\")\n=> [\"\" \"Primary\" \"Email\" \"Addr\"]
    \n\n⁠⁠⁠in Java 8\n\n
    (clojure.string/split \"PrimaryEmailAddr\" #\"(?=[A-Z])\")\n=> [\"Primary\" \"Email\" \"Addr\"]
    ", :_id "58c145ede4b01f4add58fe71"}], :arglists ["s re" "s re limit"], :doc "Splits string on a regular expression. Optional argument limit is\n the maximum number of splits. Not lazy. Returns vector of the splits.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/split"} {:added "1.2", :ns "clojure.string", :name "trimr", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1289214850000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "trim", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ad1"} {:created-at 1289214855000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "triml", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ad2"}], :line 263, :examples [{:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [], :body "(use 'clojure.string)\n(trimr \" my string \")\n=> \" my string\"", :created-at 1289214835000, :updated-at 1289214835000, :_id "542692d0c026201cdc326f07"} {:editors [{:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}], :body ";; Note: see an example at trim for the differences between\n;; \"whitespace\" for trim/trimr/triml and \n;; \"whitespace\" for regex (\\s)", :author {:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"}, :created-at 1519239707456, :updated-at 1519240323449, :_id "5a8dc21be4b0316c0f44f8de"}], :notes nil, :tag "java.lang.String", :arglists ["s"], :doc "Removes whitespace from the right side of string.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/trimr"} {:added "1.8", :ns "clojure.string", :name "index-of", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1472459205219, :author {:login "hatappo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1096084?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "last-index-of", :ns "clojure.string"}, :_id "57c3f1c5e4b0709b524f04da"}], :line 318, :examples [{:updated-at 1472460796969, :created-at 1472458615566, :author {:login "hatappo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1096084?v=3"}, :body "(use '[clojure.string :only [index-of]])\n\n(index-of \"ababc\" \"\")\n;;=> 0\n\n(index-of \"ababc\" \"a\")\n;;=> 0\n\n(index-of \"ababc\" \"ab\")\n;;=> 0\n\n(index-of \"ababc\" \"ab\" 1)\n;;=> 2\n\n(index-of \"ababc\" \"abc\")\n;;=> 2\n\n(index-of \"ababc\" \"abcd\")\n;;=> nil\n\n(index-of \"ababc\" \\c)\n;;=> 4\n\n\n;; same as .indexOf method\n\n(.indexOf \"ababc\" \"ab\")\n;;=> 0\n\n(.indexOf \"ababc\" \"ab\" 1)\n;;=> 2\n\n\n;; different from .indexOf method\n\n(.indexOf \"ababc\" \"abcd\")\n;;=> -1\n\n(.indexOf \"ababc\" \\c)\n;;=> IllegalArgumentException No matching method found: indexOf for class java.lang.String clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:80)\n\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/1096084?v=3", :account-source "github", :login "hatappo"}], :_id "57c3ef77e4b0709b524f04d7"} {:updated-at 1535012531564, :created-at 1535012531564, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Also works with other java.lang.CharSequence impls:\n\n(import 'java.lang.StringBuffer)\n(require '[clojure.string :as s])\n\n(s/index-of (StringBuffer. \"Bonjure Clojure\") \\j)\n;; 3", :_id "5b7e6eb3e4b00ac801ed9e6d"}], :notes nil, :arglists ["s value" "s value from-index"], :doc "Return index of value (string or char) in s, optionally searching\n forward from from-index. Return nil if value not found.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/index-of"} {:added "1.2", :ns "clojure.string", :name "trim", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1285923170000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "triml", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521de0"} {:created-at 1285923176000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "trimr", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521de1"} {:created-at 1285923182000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "trim-newline", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521de2"}], :line 234, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"} {:login "biggert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4029296?v=3"}], :body ";; Trim basically does what you'd expect. What the doc string\n;; does not tell you however is that:\n;; - null will cause an error\n;; - non-string parameters will cause an error\n\n(use 'clojure.string)\nuser=> (trim \" a \")\n\"a\"\nuser=> (trim nil) \njava.lang.NullPointerException (NO_SOURCE_FILE:0)\nuser=> (trim 1.1)\njava.lang.Double cannot be cast to java.lang.CharSequence\nuser=> (trim [1 2 3])\nclojure.lang.PersistentVector cannot be cast to java.lang.CharSequence\n", :created-at 1285923161000, :updated-at 1428428016646, :_id "542692d0c026201cdc326ef7"} {:editors [{:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}], :body ";; trim might not do what you expect\n;; if your string starts/ends with 'separator' ascii control codes.\n\n;; This is because these characters are treated as\n;; whitespace in trim (and trimr and triml), but\n;; non-whitespace in the regex #\"\\s\" (and \\S).\n\n;; In other words either you believe they are whitespaces or not whitespaces,\n;; you can be surprised when using trim/trimr/triml or when using #\"\\s\" or #\"\\S\":\n;; \"whitespace\" for trim is NOT the same as\n;; \"whitespace\" for \\s.\n\n(use 'clojure.string)\n\n(trim \"a \\u001F\")\n=> \"a\"\n\nbut\n\n(split \"a \\u001F\" #\"\\s+\")\n=> [\"a\" \"\\u001F\"]\n;; instead of [\"a\"], that could be expected based on trim's behaviour\n\n;; The exact list of these special \"characters\":\n;; Dec Hex (UTF-8) Unicode (UTF-16BE) Clojure Name Abbreviation\n;; 28 1C U+001C '\\u001C' File separator FS\n;; 29 1D U+001D '\\u001D' Group separator GS\n;; 30 1E U+001E '\\u001E' Record separator RS\n;; 31 1F U+001F '\\u001F' Unit separator US\n\n;; Background: Clojure's trim uses Java Character's isWhitespace,\n;; that has its own definition of whitespace,\n;; that differs from the definition of whitespace in the \\s\n;; \"whitespace character class\" of Java regex.\n\n;; References:\n;; Clojure trim's source: \n;; https://clojure.github.io/clojure/clojure.string-api.html#clojure.string/trim\n;; Java Character's isWhitespace: \n;; https://docs.oracle.com/javase/8/docs/api/java/lang/Character.html#isWhitespace-char-\n;; Java's \\s whitespace character class: \n;; https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html\n", :author {:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"}, :created-at 1519238263932, :updated-at 1519240206703, :_id "5a8dbc77e4b0316c0f44f8d9"} {:editors [{:login "saitouena", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/40712240?v=4"}], :body ";; No-Break Space \\u00a0 will not be trimmed.\n;; str/replace can be used for No-Break Space\n(str/replace s \"\\u00a0\" \"\")\n\n;; for inspection of codepoint for i-th char of string\n(int (nth (seq s) i))", :author {:avatar-url "https://avatars3.githubusercontent.com/u/40712240?v=4", :account-source "github", :login "saitouena"}, :created-at 1573620092287, :updated-at 1573620157344, :_id "5dcb897ce4b0ca44402ef7dc"}], :notes nil, :tag "java.lang.String", :arglists ["s"], :doc "Removes whitespace from both ends of string.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/trim"} {:added "1.2", :ns "clojure.string", :name "triml", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1285923245000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "trim", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d6c"} {:created-at 1285923254000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "trim-newline", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d6d"} {:created-at 1285923266000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "trimr", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d6e"}], :line 251, :examples [{:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [], :body "(use 'clojure.string)\n(triml \" my string \")\n=> \"my string \"\n", :created-at 1289214918000, :updated-at 1289214918000, :_id "542692d0c026201cdc326f0a"} {:updated-at 1519240299402, :created-at 1519239323396, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :body ";; Note: see an example at trim for the differences between\n;; \"whitespace\" for trim/trimr/triml and \n;; \"whitespace\" for regex (\\s)", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"}], :_id "5a8dc09be4b0316c0f44f8dc"}], :notes nil, :tag "java.lang.String", :arglists ["s"], :doc "Removes whitespace from the left side of string.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/triml"} {:added "1.2", :ns "clojure.string", :name "blank?", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1462633178615, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "trim", :ns "clojure.string"}, :_id "572e02dae4b0b27c121b214e"} {:created-at 1462633189164, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "triml", :ns "clojure.string"}, :_id "572e02e5e4b0b27c121b214f"} {:created-at 1462633194787, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "trimr", :ns "clojure.string"}, :_id "572e02eae4b0b27c121b2150"}], :line 287, :examples [{:updated-at 1496318959321, :created-at 1293672606000, :body "user> (clojure.string/blank? nil)\ntrue\n\nuser> (clojure.string/blank? \"\")\ntrue\n\nuser> (clojure.string/blank? \" \")\ntrue\n\nuser> (clojure.string/blank? \" a \")\nfalse\n\nuser> (clojure.string/blank? false)\ntrue\n\nuser> (clojure.string/blank? \"\\n\")\ntrue", :editors [{:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"} {:login "Azd325", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/426541?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon", :account-source "clojuredocs", :login "dakrone"}, :_id "542692d1c026201cdc326f17"} {:editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :body ";; A way to remove blanks from a string.\n(def astr \"This contains blanks \\n \\t \\r and other whitespace\")\n(->> astr \n (#(clojure.string/split % #\"\\s\")) \n (remove clojure.string/blank?) \n (clojure.string/join \" \"))\n\n;;=> \"This contains blanks and other whitespace\"\n\n;; Of course the task can be better performed other ways.\n;; The goal here is just to show how blank? works.\n(clojure.string/replace (clojure.string/trim astr) #\"\\s{2,}\" \" \")", :author {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}, :created-at 1526574308467, :updated-at 1526574971727, :_id "5afdace4e4b045c27b7fac69"} {:updated-at 1535021760000, :created-at 1535019305646, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; The list of the 25 whitespace chars in UTF-16. Using the \\uNNNN hex code\n;; when another representation is not available or not printable.\n;; \\u0020 is the common white space, AKA \" \" or '\\space' as a single char.\n\n(require '[clojure.string :as s])\n\n(s/blank? \"\\t \\n \\u000b \\f \\r \\u001c \\u001d \\u001e \\u001f\") ;; true\n(s/blank? \"\\u0020 \\u1680 \\u2000 \\u2001 \\u2002 \\u2003\") ;; true\n(s/blank? \"\\u2004 \\u2005 \\u2006 \\u2008 \\u2009\") ;; true\n(s/blank? \"\\u200a \\u2028 \\u2029 \\u205f \\u3000\") ;; true", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5b7e8929e4b00ac801ed9e6e"}], :notes nil, :arglists ["s"], :doc "True if s is nil, empty, or contains only whitespace.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/blank_q"} {:ns "clojure.template", :name "do-template", :file "clojure/template.clj", :type "macro", :column 1, :see-alsos nil, :line 45, :examples [{:updated-at 1339250655000, :created-at 1280117904000, :body ";; Because it is expanded at compile time, you can also use special \n;; forms as in full blown macros:\n\nuser=> (use 'clojure.template)\nuser=> (do-template [a b] (def a b) d 1 e 2 f 3)\n#'user/f\nuser=> d\n1\nuser=> e\n2\nuser=> f\n3\n\n;; and if you are curious why\nuser=> (use 'clojure.walk)\nuser=> (macroexpand-all '(do-template [a b] (def a b) d 1 e 2 f 3))\n(do (def d 1) (def e 2) (def f 3))\n\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}], :author {:avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon", :account-source "clojuredocs", :login "pkolloch"}, :_id "542692d1c026201cdc326f19"}], :macro true, :notes nil, :arglists ["argv expr & values"], :doc "Repeatedly copies expr (in a do block) for each group of arguments\n in values. values are automatically partitioned by the number of\n arguments in argv, an argument vector as in defn.\n\n Example: (macroexpand '(do-template [x y] (+ y x) 2 4 3 5))\n ;=> (do (+ 4 2) (+ 5 3))", :library-url "https://github.com/clojure/clojure", :href "/clojure.template/do-template"} {:ns "clojure.template", :name "apply-template", :file "clojure/template.clj", :type "function", :column 1, :see-alsos [{:created-at 1347013502000, :author {:login "siteshen", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a50fd1fe168786443e5fe62560ed03e8?r=PG&default=identicon"}, :to-var {:ns "clojure.template", :name "do-template", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dc1"}], :line 30, :examples [{:author {:login "sunil.nandihalli", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3b7fcae9384271fb8ca8cd0c612bebf3?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (apply-template '[a b c d e] '[d a b e c e b a d] '(1 2 3 4 5))\n[4 1 2 5 3 5 2 1 4] \n\nuser=> (apply-template '[a b c d e] '[d a b e c e b a d] '(1 [2 3] [4 5]))\n[d 1 [2 3] e [4 5] e [2 3] 1 d]", :created-at 1287072285000, :updated-at 1287673447000, :_id "542692d1c026201cdc326f1c"}], :notes nil, :arglists ["argv expr values"], :doc "For use in macros. argv is an argument list, as in defn. expr is\n a quoted expression using the symbols in argv. values is a sequence\n of values to be used for the arguments.\n\n apply-template will recursively replace argument symbols in expr\n with their corresponding values, returning a modified expr.\n\n Example: (apply-template '[x] '(+ x x) '[2])\n ;=> (+ 2 2)", :library-url "https://github.com/clojure/clojure", :href "/clojure.template/apply-template"} {:added "1.1", :ns "clojure.test", :name "are", :file "clojure/test.clj", :type "macro", :column 1, :see-alsos [{:created-at 1281856914000, :author {:login "looselytyped", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9bfc2e772db334c8b8516c86b9da7a0c?r=PG&default=identicon"}, :to-var {:ns "clojure.test", :name "is", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c6f"} {:created-at 1330170936000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.test", :name "deftest", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c70"} {:created-at 1541172463126, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "do-template", :ns "clojure.template"}, :_id "5bdc6cefe4b00ac801ed9eeb"}], :line 572, :examples [{:author {:login "looselytyped", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9bfc2e772db334c8b8516c86b9da7a0c?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; An alternate to the example in the documentation is \n\nuser=> (are [result arg-map] (= result (+ (:x arg-map) (:y arg-map)))\n 5 {:x 2 :y 3},\n 10 {:x 6 :y 4})\n\n\n", :created-at 1281856669000, :updated-at 1285494663000, :_id "542692d1c026201cdc326f27"}], :macro true, :notes nil, :arglists ["argv expr & args"], :doc "Checks multiple assertions with a template expression.\n See clojure.template/do-template for an explanation of\n templates.\n\n Example: (are [x y] (= x y) \n 2 (+ 1 1)\n 4 (* 2 2))\n Expands to: \n (do (is (= 2 (+ 1 1)))\n (is (= 4 (* 2 2))))\n\n Note: This breaks some reporting features, such as line numbers.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/are"} {:added "1.1", :ns "clojure.test", :name "test-all-vars", :file "clojure/test.clj", :type "function", :column 1, :see-alsos nil, :line 737, :examples nil, :notes nil, :arglists ["ns"], :doc "Calls test-vars on every var interned in the namespace, with fixtures.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/test-all-vars"} {:added "1.1", :ns "clojure.test", :name "test-var", :file "clojure/test.clj", :type "function", :column 1, :see-alsos nil, :dynamic true, :line 708, :examples nil, :notes nil, :arglists ["v"], :doc "If v has a function in its :test metadata, calls that function,\n with *testing-vars* bound to (conj *testing-vars* v).", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/test-var"} {:added "1.2", :ns "clojure.test", :name "do-report", :file "clojure/test.clj", :type "function", :column 1, :see-alsos nil, :line 351, :examples nil, :notes nil, :arglists ["m"], :doc "Add file and line information to a test result and call report.\n If you are writing a custom assert-expr method, call this function\n to pass test results to report.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/do-report"} {:added "1.1", :ns "clojure.test", :name "run-all-tests", :file "clojure/test.clj", :type "function", :column 1, :see-alsos [{:created-at 1417800372343, :author {:login "fordsfords", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7671908?v=3"}, :to-var {:ns "clojure.test", :name "run-tests", :library-url "https://github.com/clojure/clojure"}, :_id "5481eab4e4b0dc573b892fec"} {:created-at 1418219288042, :author {:login "fordsfords", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7671908?v=3"}, :to-var {:ns "clojure.core", :name "re-matches", :library-url "https://github.com/clojure/clojure"}, :_id "54884f18e4b04e93c519ffa2"}], :line 780, :examples [{:body ";; assuming current namespace is user\n(use 'clojure.test)\n(deftest eg-tests (is (= 1 1)))\n(run-all-tests)\n;;=> ... visits very many namespaces looking for tests to run\n;;=> {:type :summary, :fail 0, :error 0, :pass 1, :test 1}\n\n(run-all-tests #\"us.*\") ; only matches \"user\"\n;;=> Testing user\n;;=> Ran 1 tests containing 1 assertions.\n;;=> 0 failures, 0 errors.\n;;=> {:type :summary, :fail 0, :error 0, :pass 1, :test 1}\n", :author {:login "fordsfords", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7671908?v=3"}, :created-at 1417800504449, :updated-at 1417800504449, :_id "5481eb38e4b0dc573b892fed"}], :notes [{:author {:login "PEZ", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/30010?v=4"}, :updated-at 1605766888964, :created-at 1605766888964, :body "In ClojureScript this is a macro. The optional regular expression must be a literal.\n\n```clojure\n(let [rp (re-pattern \"foo\")] (cljs.test/run-all-tests rp))\n;;=> clojure.lang.ExceptionInfo: clojure.lang.Symbol cannot be cast to java.util.regex.Pattern\n```", :_id "5fb60ee8e4b0b1e3652d740e"}], :arglists ["" "re"], :doc "Runs all tests in all namespaces; prints results.\n Optional argument is a regular expression; only namespaces with\n names matching the regular expression (with re-matches) will be\n tested.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/run-all-tests"} {:added "1.1", :ns "clojure.test", :name "assert-any", :file "clojure/test.clj", :type "function", :column 1, :see-alsos nil, :line 455, :examples nil, :notes nil, :arglists ["msg form"], :doc "Returns generic assertion code for any test, including macros, Java\n method calls, or isolated symbols.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/assert-any"} {:added "1.1", :ns "clojure.test", :name "testing-contexts-str", :file "clojure/test.clj", :type "function", :column 1, :see-alsos nil, :line 307, :examples nil, :notes nil, :arglists [""], :doc "Returns a string representation of the current test context. Joins\n strings in *testing-contexts* with spaces.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/testing-contexts-str"} {:added "1.1", :ns "clojure.test", :name "file-position", :file "clojure/test.clj", :type "function", :column 1, :see-alsos nil, :line 282, :examples [{:updated-at 1534514881886, :created-at 1534514881886, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :body "(clojure.test/file-position 0)\n; => [\"test.clj\" 282]\n\n(take 5 (map clojure.test/file-position (range)))\n; => ([\"test.clj\" 282]\n; [\"test.clj\" 282]\n; [\"core.clj\" 2747]\n; [\"LazySeq.java\" 40]\n; [\"LazySeq.java\" 49])\n", :_id "5b76d6c1e4b00ac801ed9e64"}], :deprecated "1.2", :notes nil, :arglists ["n"], :doc "Returns a vector [filename line-number] for the nth call up the\n stack.\n\n Deprecated in 1.2: The information needed for test reporting is\n now on :file and :line keys in the result map.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/file-position"} {:added "1.1", :ns "clojure.test", :name "testing", :file "clojure/test.clj", :type "macro", :column 1, :see-alsos [{:created-at 1289286950000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.test", :name "is", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c2c"} {:created-at 1330170963000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.test", :name "deftest", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c2d"}], :line 597, :examples [{:updated-at 1567775824694, :created-at 1289286946000, :body "(:use 'clojure.test)\n\n; nest within `deftest` in source file\n(testing \"Arithmetic\"\n (testing \"with positive integers\"\n (is (= 4 (+ 2 2)))\n (is (= 7 (+ 3 4))))\n (testing \"with negative integers\"\n (is (= -4 (+ -2 -2)))\n (is (= -1 (+ 3 -4)))))\n=> true\n\n\n---------------------------------------------------------------------------\n\n; nest within `deftest` in source file\n(testing \"Arithmetic\"\n (testing \"with positive integers\"\n (is (= 4 (+ 2 2)))\n (is (= 7 (+ 3 4))))\n (testing \"with negative integers\"\n (is (= -5 (+ -2 -2))) ;error here\n (is (= -1 (+ 3 -4)))))\n\n=> FAIL in clojure.lang.PersistentList$EmptyList@1 (NO_SOURCE_FILE:641)\nArithmetic with negative integers ;bread crumb trail\nexpected: (= -5 (+ -2 -2))\n actual: (not (= -5 -4))\ntrue", :editors [{:avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon", :account-source "clojuredocs", :login "boxie"} {:avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon", :account-source "clojuredocs", :login "boxie"} {:login "cloojure", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/7083783?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon", :account-source "clojuredocs", :login "boxie"}, :_id "542692d1c026201cdc326f23"} {:updated-at 1477945021201, :created-at 1477945021201, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :body ";; this is also valid:\n\n(deftest alternate-use\n (testing \"test a vector of `is`\"\n [(is true)\n (is true)\n (is true)]))\n\n;; which is useful in the following example:\n(defn with-resource [f]\n (setup)\n (f \"expected\")\n (breakdown))\n\n(deftest alternate-use\n (testing \"test a vector of `is`\"\n (with-resource\n (fn [resource]\n [(is (= \"expected\" resource))]))))", :_id "5817a6bde4b024b73ca35a20"}], :macro true, :notes nil, :arglists ["string & body"], :doc "Adds a new string to the list of testing contexts. May be nested,\n but must occur inside a test function (deftest).", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/testing"} {:added "1.1", :ns "clojure.test", :name "join-fixtures", :file "clojure/test.clj", :type "function", :column 1, :see-alsos [{:created-at 1339790151000, :author {:login "mnicky", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/be261a601929eaf8eda9e1420b4781f9?r=PG&default=identicon"}, :to-var {:ns "clojure.test", :name "use-fixtures", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c69"} {:created-at 1339790157000, :author {:login "mnicky", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/be261a601929eaf8eda9e1420b4781f9?r=PG&default=identicon"}, :to-var {:ns "clojure.test", :name "compose-fixtures", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c6a"}], :line 696, :examples nil, :notes nil, :arglists ["fixtures"], :doc "Composes a collection of fixtures, in order. Always returns a valid\n fixture function, even if the collection is empty.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/join-fixtures"} {:added "1.1", :ns "clojure.test", :name "set-test", :file "clojure/test.clj", :type "macro", :column 1, :see-alsos nil, :line 648, :examples nil, :macro true, :notes nil, :arglists ["name & body"], :doc "Experimental.\n Sets :test metadata of the named var to a fn with the given body.\n The var must already exist. Does not modify the value of the var.\n\n When *load-tests* is false, set-test is ignored.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/set-test"} {:added "1.1", :ns "clojure.test", :name "get-possibly-unbound-var", :file "clojure/test.clj", :type "function", :column 1, :see-alsos nil, :line 416, :examples nil, :notes nil, :arglists ["v"], :doc "Like var-get but returns nil if the var is unbound.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/get-possibly-unbound-var"} {:ns "clojure.test", :name "assert-expr", :file "clojure/test.clj", :type "var", :column 1, :see-alsos [{:created-at 1561677525480, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "report", :ns "clojure.test"}, :_id "5d154ed5e4b0ca44402ef776"}], :line 476, :examples [{:updated-at 1561677432836, :created-at 1561676459536, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; \"assert-expr\" is a multimethod that can be used \n;; to register additional predicates for assert expression.\n;; The following adds a \"roughly\" predicate to check\n;; for numeric equivalence with some tolerance of decimal digits.\n\n(require '[clojure.test :refer [is deftest] :as t])\n\n(defmethod t/assert-expr 'roughly [msg form]\n `(let [op1# ~(nth form 1)\n op2# ~(nth form 2)\n tolerance# (if (= 4 ~(count form)) ~(last form) 2)\n decimals# (/ 1. (Math/pow 10 tolerance#))\n result# (< (Math/abs (- op1# op2#)) decimals#)]\n (t/do-report \n {:type (if result# :pass :fail)\n :message ~msg\n :expected (format \"%s should be roughly %s with %s tolerance\" \n op1# op2# decimals#)\n :actual result#})\n result#))\n\n(deftest PI-test\n (is (roughly 3.14 Math/PI 2))\n (is (roughly 3.14 Math/PI 3)))\n\n(t/test-var #'PI-test)\n\nFAIL in (PI-test)\nexpected: \"3.14 should be roughly 3.141592653589793 with 0.001 tolerance\"\n actual: false", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5d154aabe4b0ca44402ef773"}], :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.test/assert-expr"} {:added "1.1", :ns "clojure.test", :name "report", :file "clojure/test.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 324, :examples nil, :notes nil, :arglists [], :doc "Generic reporting function, may be overridden to plug in\n different report formats (e.g., TAP, JUnit). Assertions such as\n 'is' call 'report' to indicate results. The argument given to\n 'report' will be a map with a :type key. See the documentation at\n the top of test_is.clj for more information on the types of\n arguments for 'report'.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/report"} {:added "1.1", :ns "clojure.test", :name "compose-fixtures", :file "clojure/test.clj", :type "function", :column 1, :see-alsos [{:created-at 1515206621681, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "join-fixtures", :ns "clojure.test"}, :_id "5a5037dde4b0a08026c48cea"}], :line 689, :examples nil, :notes nil, :arglists ["f1 f2"], :doc "Composes two fixture functions, creating a new fixture function\n that combines their behavior.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/compose-fixtures"} {:added "1.1", :ns "clojure.test", :name "with-test", :file "clojure/test.clj", :type "macro", :column 1, :see-alsos [{:created-at 1289287480000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "test", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bb6"} {:created-at 1289287493000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "meta", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bb7"} {:created-at 1355984959000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.test", :name "deftest", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bb8"}], :line 609, :examples [{:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [], :body ";with test is the same as using {:test #((is...)(is...))} in the meta data of the function.\n\n(:use 'clojure.test)\n\n(with-test\n (defn my-function [x y]\n (+ x y))\n (is (= 4 (my-function 2 2)))\n (is (= 7 (my-function 3 4))))\n\n(test #'my-function) ;(test (var my-function))\n=> :ok", :created-at 1289287473000, :updated-at 1289287473000, :_id "542692d1c026201cdc326f29"}], :macro true, :notes nil, :arglists ["definition & body"], :doc "Takes any definition form (that returns a Var) as the first argument.\n Remaining body goes in the :test metadata function for that Var.\n\n When *load-tests* is false, only evaluates the definition, ignoring\n the tests.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/with-test"} {:added "1.1", :ns "clojure.test", :name "*stack-trace-depth*", :file "clojure/test.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 252, :examples nil, :notes nil, :arglists [], :doc "The maximum depth of stack traces to print when an Exception\n is thrown during a test. Defaults to nil, which means print the \n complete stack trace.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/*stack-trace-depth*"} {:added "1.1", :ns "clojure.test", :name "is", :file "clojure/test.clj", :type "macro", :column 1, :see-alsos [{:created-at 1330170895000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.test", :name "are", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bef"} {:created-at 1330170928000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.test", :name "deftest", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bf0"} {:created-at 1595376872402, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "testing", :ns "clojure.test"}, :_id "5f1784e8e4b0b1e3652d7324"}], :line 554, :examples [{:author {:login "JonNeale", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/52f685bf4240b827b1486b6551cfcd56?r=PG&default=identicon"}, :editors [{:login "JonNeale", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/52f685bf4240b827b1486b6551cfcd56?r=PG&default=identicon"}], :body "(use '[clojure.test :only [is]])\n\nuser=> (is (true? true))\ntrue\n\n;; false assertions print a message and evaluate to false\n\nuser=> (is (true? false))\nFAIL in clojure.lang.PersistentList$EmptyList@1 (NO_SOURCE_FILE:1)\nexpected: (true? false)\n actual: (not (true? false))\nfalse\n\n", :created-at 1350425559000, :updated-at 1350488982000, :_id "542692d7c026201cdc327114"} {:author {:login "Alan Thompson", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5b677647e3c6fb2bc89fa2f481461b11?r=PG&default=identicon"}, :editors [], :body "; Testing for thrown exceptions\n\n; Verifies that the specified exception is thrown\nuser=> (is (thrown? ArithmeticException (/ 1 0)))\n#\n\n; Verified that the exception is thrown, and that the error message matches the specified regular expression.\nuser=> (is (thrown-with-msg? ArithmeticException #\"Divide by zero\"\n #_=> (/ 1 0)))\n#\nuser=> \n\n", :created-at 1398819305000, :updated-at 1398819305000, :_id "542692d7c026201cdc327116"}], :macro true, :notes nil, :arglists ["form" "form msg"], :doc "Generic assertion macro. 'form' is any predicate test.\n 'msg' is an optional message to attach to the assertion.\n \n Example: (is (= 4 (+ 2 2)) \"Two plus two should be 4\")\n\n Special forms:\n\n (is (thrown? c body)) checks that an instance of c is thrown from\n body, fails if not; then returns the thing thrown.\n\n (is (thrown-with-msg? c re body)) checks that an instance of c is\n thrown AND that the message on the exception matches (with\n re-find) the regular expression re.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/is"} {:ns "clojure.test", :name "*report-counters*", :file "clojure/test.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 262, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.test/*report-counters*"} {:added "1.1", :ns "clojure.test", :name "*load-tests*", :file "clojure/test.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 245, :examples [{:updated-at 1619041908533, :created-at 1619041908533, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :body ";; Assuming \"mynamespace\" is available from the classpath and\n;; contains a mix of production and test code, the following prevents\n;; macros like \"deftest\" from producing test functions,\n;; removing them from any compiled AOT artifact:\n\n(require '[clojure.test :as t])\n(binding [t/*load-tests* false]\n (compile 'mynamespace))\n", :_id "60809e74e4b0b1e3652d74cd"}], :notes [{:body "In modern times, `*load-tests*` is almost never required, as build tools such as Leiningen or `clojure.tools.deps` enforce a conventional separation of tests from production code, preventing their presence in production artifacts.", :created-at 1619041938259, :updated-at 1619041967134, :author {:avatar-url "https://avatars.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :_id "60809e92e4b0b1e3652d74ce"}], :arglists [], :doc "True by default. If set to false, no test functions will\n be created by deftest, set-test, or with-test. Use this to omit\n tests when compiling or loading production code.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/*load-tests*"} {:added "1.1", :ns "clojure.test", :name "deftest", :file "clojure/test.clj", :type "macro", :column 1, :see-alsos [{:created-at 1289287593000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.test", :name "run-all-tests", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e90"} {:created-at 1289288265000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.test", :name "run-tests", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e91"} {:created-at 1330170918000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.test", :name "is", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e92"} {:created-at 1330170920000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.test", :name "are", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e93"} {:created-at 1330170973000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.test", :name "testing", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e94"} {:created-at 1366152324000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.test", :name "test-var", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e95"}], :line 622, :examples [{:author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}], :body ";successful test example\n(ns testing)\n(use 'clojure.test)\n\n\n(deftest addition\n (is (= 4 (+ 2 2)))\n (is (= 7 (+ 3 4))))\n=> #'testing/addition\n\n(deftest subtraction\n (is (= 1 (- 4 3)))\n (is (= 3 (- 7 4))))\n=> #'testing/subtraction\n\n;composing tests\n(deftest arithmetic\n (addition)\n (subtraction))\n=> #'testing/arithmetic\n\n(run-tests 'testing)\n\n=> Testing testing\n\nRan 6 tests containing 10 assertions.\n0 failures, 0 errors.\n{:type :summary, :test 6, :pass 10, :fail 0, :error 0}", :created-at 1280985983000, :updated-at 1289288085000, :_id "542692d1c026201cdc326f1e"} {:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [{:login "mikebridge", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/517ea04cf362ddc08f107f6ef98a12d9?r=PG&default=identicon"}], :body ";failure test example\n\n;there is nesting, so when a leaf test fails so does its parents, in this example 2 tests fail, though there was only one real error.\n\n(ns testing)\n(use 'clojure.test)\n\n\n(deftest addition\n (is (= 4 (+ 2 2)))\n (is (= 7 (+ 3 4))))\n=> #'testing/addition\n\n(deftest subtraction\n (is (= 1 (- 4 3)))\n (is (= 6 (- 7 4)))) ;error\n=> #'testing/subtraction\n\n;composing tests\n(deftest arithmetic\n (addition)\n (subtraction))\n=> #'testing/arithmetic\n\n(run-tests 'testing)\n\n=> Testing testing\n\nFAIL in (arithmetic subtraction) (NO_SOURCE_FILE:669)\nexpected: (= 6 (- 7 4))\n actual: (not (= 6 3))\n\nFAIL in (subtraction) (NO_SOURCE_FILE:669)\nexpected: (= 6 (- 7 4))\n actual: (not (= 6 3))\n\nRan 6 tests containing 10 assertions.\n2 failures, 0 errors.\n{:type :summary, :test 6, :pass 8, :fail 2, :error 0}", :created-at 1289288235000, :updated-at 1332332244000, :_id "542692d1c026201cdc326f21"}], :macro true, :notes nil, :arglists ["name & body"], :doc "Defines a test function with no arguments. Test functions may call\n other tests, so tests may be composed. If you compose tests, you\n should also define a function named test-ns-hook; run-tests will\n call test-ns-hook instead of testing all vars.\n\n Note: Actually, the test body goes in the :test metadata on the var,\n and the real function (the value of the var) calls test-var on\n itself.\n\n When *load-tests* is false, deftest is ignored.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/deftest"} {:added "1.1", :ns "clojure.test", :name "assert-predicate", :file "clojure/test.clj", :type "function", :column 1, :see-alsos nil, :line 436, :examples nil, :notes nil, :arglists ["msg form"], :doc "Returns generic assertion code for any functional predicate. The\n 'expected' argument to 'report' will contains the original form, the\n 'actual' argument will contain the form with all its sub-forms\n evaluated. If the predicate returns false, the 'actual' form will\n be wrapped in (not...).", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/assert-predicate"} {:added "1.1", :ns "clojure.test", :name "with-test-out", :file "clojure/test.clj", :type "macro", :column 1, :see-alsos nil, :line 273, :examples nil, :macro true, :notes nil, :arglists ["& body"], :doc "Runs body with *out* bound to the value of *test-out*.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/with-test-out"} {:added "1.1", :ns "clojure.test", :name "function?", :file "clojure/test.clj", :type "function", :column 1, :see-alsos [{:created-at 1494538047673, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "fn?", :ns "clojure.core"}, :_id "5914d73fe4b01f4add58feb6"}], :line 424, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [], :body "user> (defn foo [] (println \"foo\"))\n#'user/foo\n\nuser> (def bar \"bar\")\n#'user/bar\n\nuser> (clojure.test/function? foo)\ntrue\n\nuser> (clojure.test/function? bar)\nfalse", :created-at 1293673262000, :updated-at 1293673262000, :_id "542692d1c026201cdc326f26"}], :notes nil, :arglists ["x"], :doc "Returns true if argument is a function or a symbol that resolves to\n a function (not a macro).", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/function_q"} {:added "1.1", :ns "clojure.test", :name "deftest-", :file "clojure/test.clj", :type "macro", :column 1, :see-alsos [{:created-at 1289287570000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.test", :name "deftest", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b08"}], :line 639, :examples [{:updated-at 1589047680452, :created-at 1589047680452, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Create normal test functions which are not public in the current\n;; namespace, but evaluates normally when running tests.\n\n(in-ns 'user)\n(require '[clojure.test :refer :all])\n\n(deftest- this-is-not-public\n (is (= 2 (+ 1 1))))\n\n(ns-publics *ns*)\n;; {}\n\n(run-tests)\n;; Testing user\n;; Ran 1 tests containing 1 assertions.\n;; 0 failures, 0 errors.\n;; {:test 1, :pass 1, :fail 0, :error 0, :type :summary}", :_id "5eb6f180e4b087629b5a1909"}], :macro true, :notes nil, :arglists ["name & body"], :doc "Like deftest but creates a private var.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/deftest-"} {:added "1.6", :ns "clojure.test", :name "test-vars", :file "clojure/test.clj", :type "function", :column 1, :see-alsos nil, :line 723, :examples [{:editors [{:login "fdhenard", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/884972?v=4"}], :body "(clojure.test/test-vars [#'the-ns/the-test])\n\n;; credit to this SO answer by Alex Miller: https://stackoverflow.com/a/24974841/59439", :author {:avatar-url "https://avatars2.githubusercontent.com/u/884972?v=4", :account-source "github", :login "fdhenard"}, :created-at 1527161820493, :updated-at 1527161857196, :_id "5b06a3dce4b045c27b7fac77"}], :notes nil, :arglists ["vars"], :doc "Groups vars by their namespace and runs test-vars on them with\n appropriate fixtures applied.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/test-vars"} {:added "1.1", :ns "clojure.test", :name "try-expr", :file "clojure/test.clj", :type "macro", :column 1, :see-alsos [{:created-at 1289460897000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.test", :name "is", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cf6"}], :line 538, :examples [{:editors [{:avatar-url "https://avatars.githubusercontent.com/u/200617?v=3", :account-source "github", :login "bsima"}], :updated-at 1437772493560, :created-at 1415383686022, :author {:avatar-url "https://avatars.githubusercontent.com/u/200617?v=3", :account-source "github", :login "bsima"}, :body "(try-expr \"Can I call this function?\" (= 1 1))\n;; => \"No! I said you don't call this.\" - Rich Hickey", :_id "545d0a86e4b03d20a10242a0"}], :macro true, :notes nil, :arglists ["msg form"], :doc "Used by the 'is' macro to catch unexpected exceptions.\n You don't call this.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/try-expr"} {:added "1.1", :ns "clojure.test", :name "successful?", :file "clojure/test.clj", :type "function", :column 1, :see-alsos nil, :line 789, :examples nil, :notes nil, :arglists ["summary"], :doc "Returns true if the given test summary indicates all tests\n were successful, false otherwise.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/successful_q"} {:added "1.1", :ns "clojure.test", :name "use-fixtures", :file "clojure/test.clj", :type "var", :column 1, :see-alsos [{:created-at 1339790120000, :author {:login "mnicky", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/be261a601929eaf8eda9e1420b4781f9?r=PG&default=identicon"}, :to-var {:ns "clojure.test", :name "join-fixtures", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ceb"} {:created-at 1339790135000, :author {:login "mnicky", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/be261a601929eaf8eda9e1420b4781f9?r=PG&default=identicon"}, :to-var {:ns "clojure.test", :name "compose-fixtures", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cec"}], :line 670, :examples [{:author {:login "benkay", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/21acd4a2c781a436afdb28fead34b76a?r=PG&default=identicon"}, :editors [{:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"} {:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"}], :body "; See https://clojure.github.io/clojure/clojure.test-api.html for details\n\n; my-test-fixture will be passed a fn that will call all your tests \n; (e.g. test-using-db). Here you perform any required setup \n; (e.g. create-db), then call the passed function f, then perform \n; any required teardown (e.g. destroy-db).\n(defn my-test-fixture [f]\n (create-db)\n (f)\n (destroy-db))\n\n; Here we register my-test-fixture to be called once, wrapping ALL tests \n; in the namespace\n(use-fixtures :once my-test-fixture)\n \n; This is a regular test function, which is to be wrapped using my-test-fixture\n(deftest test-using-db\n (is ... \n))", :created-at 1375349400000, :updated-at 1405042589000, :_id "542692d7c026201cdc327117"} {:author {:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"}, :editors [{:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"} {:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"}], :body "; This fixture is intended to perform setup/teardown for each individual test in the namespace. Note that it assumes the :once fixture will handle creating/destroying the DB, while we only create/drop tables within the DB.\n(defn another-fixture [f]\n (create-db-table)\n (f)\n (drop-db-table))\n\n; Here we register another-fixture to wrap each test in the namespace\n(use-fixtures :each another-fixture)", :created-at 1405042717000, :updated-at 1405043050000, :_id "542692d7c026201cdc32711a"} {:updated-at 1456028182727, :created-at 1456028130697, :author {:login "charlespwd", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4990691?v=3"}, :body ";; `use-fixtures` supports multiples arguments. \n;; They wrap the tests in order (left-to-right).\n\n;; We define some fixtures that are to be run in order\n(defn with-db [f] \n (start-db)\n (f)\n (stop-db))\n\n(defn with-data [f] \n (fill-db)\n (f)\n (empty-db))\n\n;; Here we register them\n(use-fixtures :once with-db with-data)", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/4990691?v=3", :account-source "github", :login "charlespwd"}], :_id "56c939e2e4b0b41f39d96cd0"}], :notes nil, :arglists [], :doc "Wrap test runs in a fixture function to perform setup and\n teardown. Using a fixture-type of :each wraps every test\n individually, while :once wraps the whole run in a single function.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/use-fixtures"} {:added "1.1", :ns "clojure.test", :name "inc-report-counter", :file "clojure/test.clj", :type "function", :column 1, :see-alsos nil, :line 314, :examples nil, :notes nil, :arglists ["name"], :doc "Increments the named counter in *report-counters*, a ref to a map.\n Does nothing if *report-counters* is nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/inc-report-counter"} {:added "1.1", :ns "clojure.test", :name "testing-vars-str", :file "clojure/test.clj", :type "function", :column 1, :see-alsos nil, :line 294, :examples nil, :notes nil, :arglists ["m"], :doc "Returns a string representation of the current test. Renders names\n in *testing-vars* as a list, then the source file and line of\n current assertion.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/testing-vars-str"} {:ns "clojure.test", :name "*testing-contexts*", :file "clojure/test.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 269, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.test/*testing-contexts*"} {:added "1.1", :ns "clojure.test", :name "test-ns", :file "clojure/test.clj", :type "function", :column 1, :see-alsos nil, :line 743, :examples [{:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; Executes all tests in a namespace. \n;; One possible use of test-ns-hook is to temporary run a single test\n;; without having to comment all others out\n\n(ns lot-of-tests)\n(require '[clojure.test :refer [is deftest]])\n\n(deftest fail-a (is (= 1 (+ 2 2))))\n(deftest fail-b (is (= 1 (+ 2 2))))\n(deftest fail-c (is (= 1 (+ 2 2))))\n\n(defn test-ns-hook [] (fail-a))\n\n(ns user)\n(require '[clojure.test :refer [test-ns]])\n\n(t/test-ns 'lot-of-tests)\n;; Testing lot-of-tests\n\n;; FAIL in (fail-a) (NO_SOURCE_FILE:1)\n;; expected: (= 1 (+ 2 2))\n;; actual: (not (= 1 4))\n;; {:test 1, :pass 0, :fail 1, :error 0}", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1561721878563, :updated-at 1561721929000, :_id "5d15fc16e4b0ca44402ef779"}], :notes nil, :arglists ["ns"], :doc "If the namespace defines a function named test-ns-hook, calls that.\n Otherwise, calls test-all-vars on the namespace. 'ns' is a\n namespace object or a symbol.\n\n Internally binds *report-counters* to a ref initialized to\n *initial-report-counters*. Returns the final, dereferenced state of\n *report-counters*.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/test-ns"} {:added "1.1", :ns "clojure.test", :name "run-tests", :file "clojure/test.clj", :type "function", :column 1, :see-alsos [{:created-at 1417800283222, :author {:login "fordsfords", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7671908?v=3"}, :to-var {:ns "clojure.test", :name "run-all-tests", :library-url "https://github.com/clojure/clojure"}, :_id "5481ea5be4b03d20a10242c4"}], :line 768, :examples [{:body ";; assuming current namespace is user\n(use 'clojure.test)\n(deftest eg-tests (is (= 1 1)))\n(run-tests)\n;;=> Testing user\n;;=> Ran 1 tests containing 1 assertions.\n;;=> 0 failures, 0 errors.\n;;=> {:type :summary, :fail 0, :error 0, :pass 1, :test 1}\n\n(run-tests 'user) ; if supplying a namespace to test, must quote\n;;=> Testing user\n;;=> Ran 1 tests containing 1 assertions.\n;;=> 0 failures, 0 errors.\n;;=> {:type :summary, :fail 0, :error 0, :pass 1, :test 1}", :author {:login "fordsfords", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7671908?v=3"}, :created-at 1417800300379, :updated-at 1417800300379, :_id "5481ea6ce4b0dc573b892feb"}], :notes nil, :arglists ["" "& namespaces"], :doc "Runs all tests in the given namespaces; prints results.\n Defaults to current namespace if none given. Returns a map\n summarizing test results.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/run-tests"} {:ns "clojure.test", :name "*testing-vars*", :file "clojure/test.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 267, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.test/*testing-vars*"} {:ns "clojure.test", :name "*test-out*", :file "clojure/test.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 271, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.test/*test-out*"} {:ns "clojure.test", :name "*initial-report-counters*", :file "clojure/test.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 264, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.test/*initial-report-counters*"} {:ns "clojure.test.junit", :name "junit-report", :file "clojure/test/junit.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 142, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/junit-report"} {:ns "clojure.test.junit", :name "start-case", :file "clojure/test/junit.clj", :type "function", :column 1, :see-alsos nil, :line 89, :examples nil, :notes nil, :arglists ["name classname"], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/start-case"} {:ns "clojure.test.junit", :name "suite-attrs", :file "clojure/test/junit.clj", :type "function", :column 1, :see-alsos nil, :line 97, :examples nil, :notes nil, :arglists ["package classname"], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/suite-attrs"} {:ns "clojure.test.junit", :name "start-suite", :file "clojure/test/junit.clj", :type "function", :column 1, :see-alsos nil, :line 104, :examples nil, :notes nil, :arglists ["name"], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/start-suite"} {:ns "clojure.test.junit", :name "indent", :file "clojure/test/junit.clj", :type "function", :column 1, :see-alsos nil, :line 51, :examples nil, :notes nil, :arglists [""], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/indent"} {:ns "clojure.test.junit", :name "finish-suite", :file "clojure/test/junit.clj", :type "function", :column 1, :see-alsos nil, :line 109, :examples nil, :notes nil, :arglists [""], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/finish-suite"} {:ns "clojure.test.junit", :name "finish-element", :file "clojure/test/junit.clj", :type "function", :column 1, :see-alsos nil, :line 70, :examples nil, :notes nil, :arglists ["tag pretty"], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/finish-element"} {:ns "clojure.test.junit", :name "failure-el", :file "clojure/test/junit.clj", :type "function", :column 1, :see-alsos nil, :line 128, :examples nil, :notes nil, :arglists ["message expected actual"], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/failure-el"} {:ns "clojure.test.junit", :name "message-el", :file "clojure/test/junit.clj", :type "function", :column 1, :see-alsos nil, :line 113, :examples nil, :notes nil, :arglists ["tag message expected-str actual-str"], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/message-el"} {:ns "clojure.test.junit", :name "*depth*", :file "clojure/test/junit.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 49, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/*depth*"} {:ns "clojure.test.junit", :name "*var-context*", :file "clojure/test/junit.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 48, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/*var-context*"} {:added "1.1", :ns "clojure.test.junit", :name "with-junit-output", :file "clojure/test/junit.clj", :type "macro", :column 1, :see-alsos nil, :line 182, :examples nil, :macro true, :notes nil, :arglists ["& body"], :doc "Execute body with modified test-is reporting functions that write\n JUnit-compatible XML output.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/with-junit-output"} {:ns "clojure.test.junit", :name "start-element", :file "clojure/test/junit.clj", :type "function", :column 1, :see-alsos nil, :line 55, :examples nil, :notes nil, :arglists ["tag pretty & [attrs]"], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/start-element"} {:ns "clojure.test.junit", :name "package-class", :file "clojure/test/junit.clj", :type "function", :column 1, :see-alsos nil, :line 82, :examples nil, :notes nil, :arglists ["name"], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/package-class"} {:ns "clojure.test.junit", :name "element-content", :file "clojure/test/junit.clj", :type "function", :column 1, :see-alsos nil, :line 66, :examples nil, :notes nil, :arglists ["content"], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/element-content"} {:ns "clojure.test.junit", :name "finish-case", :file "clojure/test/junit.clj", :type "function", :column 1, :see-alsos nil, :line 93, :examples nil, :notes nil, :arglists [""], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/finish-case"} {:ns "clojure.test.junit", :name "error-el", :file "clojure/test/junit.clj", :type "function", :column 1, :see-alsos nil, :line 132, :examples nil, :notes nil, :arglists ["message expected actual"], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/error-el"} {:ns "clojure.test.junit", :name "test-name", :file "clojure/test/junit.clj", :type "function", :column 1, :see-alsos nil, :line 77, :examples nil, :notes nil, :arglists ["vars"], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/test-name"} {:added "1.1", :ns "clojure.test.tap", :name "print-tap-fail", :file "clojure/test/tap.clj", :type "function", :column 1, :see-alsos [{:created-at 1617958686413, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "print-tap-pass", :ns "clojure.test.tap"}, :_id "6070171ee4b0b1e3652d74bb"}], :line 65, :examples nil, :notes nil, :arglists ["msg"], :doc "Prints a TAP 'not ok' line. msg is a string, with no line breaks", :library-url "https://github.com/clojure/clojure", :href "/clojure.test.tap/print-tap-fail"} {:added "1.1", :ns "clojure.test.tap", :name "print-tap-pass", :file "clojure/test/tap.clj", :type "function", :column 1, :see-alsos [{:created-at 1617958703255, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "print-tap-fail", :ns "clojure.test.tap"}, :_id "6070172fe4b0b1e3652d74bc"}], :line 59, :examples nil, :notes nil, :arglists ["msg"], :doc "Prints a TAP 'ok' line. msg is a string, with no line breaks", :library-url "https://github.com/clojure/clojure", :href "/clojure.test.tap/print-tap-pass"} {:ns "clojure.test.tap", :name "print-diagnostics", :file "clojure/test/tap.clj", :type "function", :column 1, :see-alsos nil, :line 78, :examples nil, :notes nil, :arglists ["data"], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.tap/print-diagnostics"} {:added "1.1", :ns "clojure.test.tap", :name "print-tap-plan", :file "clojure/test/tap.clj", :type "function", :column 1, :see-alsos nil, :line 45, :examples nil, :notes nil, :arglists ["n"], :doc "Prints a TAP plan line like '1..n'. n is the number of tests", :library-url "https://github.com/clojure/clojure", :href "/clojure.test.tap/print-tap-plan"} {:added "1.1", :ns "clojure.test.tap", :name "with-tap-output", :file "clojure/test/tap.clj", :type "macro", :column 1, :see-alsos nil, :line 117, :examples nil, :macro true, :notes nil, :arglists ["& body"], :doc "Execute body with modified test reporting functions that produce\n TAP output", :library-url "https://github.com/clojure/clojure", :href "/clojure.test.tap/with-tap-output"} {:ns "clojure.test.tap", :name "tap-report", :file "clojure/test/tap.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 72, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.tap/tap-report"} {:added "1.1", :ns "clojure.test.tap", :name "print-tap-diagnostic", :file "clojure/test/tap.clj", :type "function", :column 1, :see-alsos nil, :line 51, :examples nil, :notes nil, :arglists ["data"], :doc "Prints a TAP diagnostic line. data is a (possibly multi-line)\n string.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test.tap/print-tap-diagnostic"} {:added "1.1", :ns "clojure.walk", :name "postwalk", :file "clojure/walk.clj", :type "function", :column 1, :see-alsos [{:created-at 1321428795000, :author {:login "srid", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd3a68d670372cd09876c26270a4299a?r=PG&default=identicon"}, :to-var {:ns "clojure.walk", :name "prewalk", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521db9"} {:created-at 1348453793000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.walk", :name "postwalk-demo", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dba"} {:created-at 1348453807000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.walk", :name "postwalk-replace", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dbb"}], :line 53, :examples [{:author {:login "sunil.nandihalli", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3b7fcae9384271fb8ca8cd0c612bebf3?r=PG&default=identicon"}, :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/382011?v=4", :account-source "github", :login "bolasblack"}], :body "(require '[clojure.walk :refer [postwalk]])\n(let [counter (atom -1)\n line-counter (atom 0)\n print-touch (fn [x]\n (print (swap! line-counter inc) \":\" (pr-str x) \"→ \"))\n change (fn [x]\n (let [new-x (swap! counter inc)]\n (prn new-x)\n [new-x x]))]\n (postwalk (fn [x]\n (print-touch x)\n (change x))\n {:a 1 :b 2}))\n\n;; printed output:\n\n1 : :a → 0\n2 : 1 → 1\n3 : [[0 :a] [1 1]] → 2\n4 : :b → 3\n5 : 2 → 4\n6 : [[3 :b] [4 2]] → 5\n7 : {2 [[0 :a] [1 1]], 5 [[3 :b] [4 2]]} → 6\n\n;; returned value:\n\n[6 {2 [[0 :a] [1 1]], 5 [[3 :b] [4 2]]}]", :created-at 1287073344000, :updated-at 1521646144691, :_id "542692d1c026201cdc326f2b"} {:updated-at 1672398839535, :created-at 1359706452000, :body ";;example of removing namespaces from all keys in a nested data structure\n(def thing {:page/tags [{:tag/category \"lslsls\"}]})\n(postwalk #(if (keyword? %) (keyword (name %)) %) thing)\n{:tags [{:category \"lslsls\"}]}", :editors [{:avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon", :account-source "clojuredocs", :login "boxie"} {:login "daveliepmann", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/974443?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon", :account-source "clojuredocs", :login "boxie"}, :_id "542692d7c026201cdc327122"} {:updated-at 1491425591876, :created-at 1491425591876, :author {:login "wmatson", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/3883798?v=3"}, :body "(use 'clojure.walk)\n\n;;example of evaluating an expression tree, starting at the leaves\n(def expression-tree\n {:function +\n :children\n [1 {:function *\n :children [2 6]}]})\n\n(defn evaluate [node]\n (if-let [f (:function node)]\n (apply f (:children node))\n node))\n\n(postwalk evaluate expression-tree)\n\n=> 13", :_id "58e55937e4b01f4add58fe83"} {:editors [{:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}], :body ";; an example to show the differences between postwalk and prewalk\n;; (see the counterpart at prewalk)\n\n(let [counter (atom 0)\n print-touch (fn [x]\n (print (swap! counter inc) \":\" (pr-str x) \"→ \"))\n change-type (fn [x]\n (let [new-x (if (vector? x)\n (apply list x)\n (str x))]\n (prn new-x)\n new-x))]\n (clojure.walk/postwalk (fn [x]\n (print-touch x)\n (change-type x))\n [:a [:ba :bb] :c]))\n\n;; printed output:\n\n1 : :a → \":a\"\n2 : :ba → \":ba\"\n3 : :bb → \":bb\"\n4 : [\":ba\" \":bb\"] → (\":ba\" \":bb\")\n5 : :c → \":c\"\n6 : [\":a\" (\":ba\" \":bb\") \":c\"] → (\":a\" (\":ba\" \":bb\") \":c\")\n\n;; returned value:\n\n=> (\":a\" (\":ba\" \":bb\") \":c\")", :author {:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"}, :created-at 1519076695677, :updated-at 1519084470249, :_id "5a8b4557e4b0316c0f44f8d0"}], :notes [{:author {:login "pesterhazy", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/106328?v=4"}, :updated-at 1519696583504, :created-at 1519696583504, :body "As of 1.9.0, postwalk passes the k/v pairs of a map to `f` not, as one might expect, as type `clojure.lang.MapEntry` but as `clojure.lang.PersistentVector` ([JIRA](https://dev.clojure.org/jira/browse/CLJ-2031)). As a result, `f` cannot distinguish k/v pairs from other two-element vectors.", :_id "5a94bac7e4b0316c0f44f8ff"} {:author {:login "finalfantasia", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/2316604?v=4"}, :updated-at 1541807954318, :created-at 1541807954318, :body "Alex Miller's article [\"Tree visitors in Clojure\"](https://www.ibm.com/developerworks/library/j-treevisit/index.html) might be helpful in understanding general tree traversal and the usage of `clojure.walk/postwalk`.\n", :_id "5be61f52e4b00ac801ed9ef1"} {:author {:login "leo-ppp", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/72382759?v=4"}, :updated-at 1615827306990, :created-at 1615827306990, :body "> As of 1.9.0, postwalk passes the k/v pairs of a map to f not, as one might expect, as type clojure.lang.MapEntry but as clojure.lang.PersistentVector (JIRA). As a result, f cannot distinguish k/v pairs from other two-element vectors.\n\nThis was [fixed in 1.10.0](https://github.com/clojure/clojure/blob/master/changes.md#42-api), and one can use `(map-entry? v)` to distinguish a k/v pair from a vector when `walk`ing. ", :_id "604f916ae4b0b1e3652d7497"} {:author {:login "jeff303", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3521562?v=4"}, :updated-at 1632884419953, :created-at 1632884419953, :body "Updated link to \"Tree visitors in Clojure\", mentioned above (PDF):\n\nhttps://insideclojure.org/images/j-treevisit-pdf.pdf", :_id "6153d6c3e4b0b1e3652d754a"}], :arglists ["f form"], :doc "Performs a depth-first, post-order traversal of form. Calls f on\n each sub-form, uses f's return value in place of the original.\n Recognizes all Clojure data structures. Consumes seqs as with doall.", :library-url "https://github.com/clojure/clojure", :href "/clojure.walk/postwalk"} {:added "1.1", :ns "clojure.walk", :name "keywordize-keys", :file "clojure/walk.clj", :type "function", :column 1, :see-alsos [{:created-at 1429291271248, :author {:login "Chort409", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1062637?v=3"}, :to-var {:ns "clojure.core", :name "keyword", :library-url "https://github.com/clojure/clojure"}, :_id "55314107e4b01bb732af0a84"} {:created-at 1440158846927, :author {:login "BernhardBln", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4759839?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "stringify-keys", :ns "clojure.walk"}, :_id "55d7147ee4b0831e02cddf17"}], :line 94, :examples [{:updated-at 1457839421545, :created-at 1287070176000, :body "(require 'clojure.walk)\n(clojure.walk/keywordize-keys {\"a\" 1 \"b\" 2})\n;;=> {:a 1 :b 2}", :editors [{:login "fasiha", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/37649?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/3b7fcae9384271fb8ca8cd0c612bebf3?r=PG&default=identicon", :account-source "clojuredocs", :login "sunil.nandihalli"}, :_id "542692d1c026201cdc326f2a"} {:updated-at 1476953810286, :created-at 1476953810286, :author {:login "eunmin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1837478?v=3"}, :body "(use 'clojure.walk)\n\n(keywordize-keys {\"a\" 1, \"b\" {\"c\" {\"d\" 2}}})\n;;=> {:a 1, :b {:c {:d 2}}}", :_id "580886d2e4b001179b66bdd2"} {:updated-at 1610750233661, :created-at 1610750233661, :author {:login "Luke1298", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/7078861?v=4"}, :body ";; The input object also doesn't have to be a dictionary\n(require 'clojure.walk)\n(clojure.walk/keywordize-keys [{\"hello\" \"goodbye\"}])\n;;=>[{:hello \"goodbye\"}]", :_id "60021919e4b0b1e3652d7432"}], :notes nil, :arglists ["m"], :doc "Recursively transforms all map keys from strings to keywords.", :library-url "https://github.com/clojure/clojure", :href "/clojure.walk/keywordize-keys"} {:added "1.1", :ns "clojure.walk", :name "walk", :file "clojure/walk.clj", :type "function", :column 1, :see-alsos [{:created-at 1337310249000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.walk", :name "postwalk", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d11"} {:created-at 1337310268000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.walk", :name "prewalk", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d12"}], :line 35, :examples [{:updated-at 1519744662463, :created-at 1330654697000, :body "(use 'clojure.walk)\n\n(walk #(* 2 %) #(apply + %) [1 2 3 4 5])\n;=> 30\n\n(walk second #(apply max %) [ [1 2] [3 4] [5 6] ])\n;=> 6\n\n(walk first #(apply max %) [ [1 2] [3 4] [5 6] ])\n;=> 5\n\n(walk first reverse [ [1 2] [3 4] [5 6] ])\n;=> (5 3 1)", :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/ef581bba2f97adb539c67a35465b3e1b?r=PG&default=identicon", :account-source "clojuredocs", :login "jjcomer"}, :_id "542692d7c026201cdc327133"} {:updated-at 1519744710013, :created-at 1335333358000, :body "(require '[clojure.walk :as w])\n\n(w/walk (fn [[k v]] [k (* 10 v)]) identity {:a 1 :b 2 :c 3})\n;=> {:a 10, :c 30, :b 20}\n\n(w/postwalk #(if (number? %) (* 2 %) %) [[1 2 3] [4 7 2] [2 5 2]])\n;=> [[2 4 6] [8 14 4] [4 10 4]]\n\n(let [s [1 '(2 3 [1])]] \n (w/postwalk #(if (seq? %) (vec %) %) s))\n;=> [1 [2 3 [1]]]\n\n(w/walk (comp vec reverse) identity {0 :start 1 :inprogress 2 :end})\n;=> {:start 0, :inprogress 1, :end 2}", :editors [{:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692d7c026201cdc327134"} {:updated-at 1633012838790, :created-at 1633012838790, :author {:login "burinc", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19825136?v=4"}, :body ";; Recursively sort nested map\n(require '[clojure.walk :as w])\n\n(def m {:b 2, :c 3, :a 1, :d {:x 10, :c 3, :a 11, :b 22}})\n\n(w/postwalk (fn [x] (if (map? x) (into (sorted-map) x) x)) m)\n;;=> {:a 1, :b 2, :c 3, :d {:a 11, :b 22, :c 3, :x 10}}\n", :_id "6155cc66e4b0b1e3652d754c"}], :notes nil, :arglists ["inner outer form"], :doc "Traverses form, an arbitrary data structure. inner and outer are\n functions. Applies inner to each element of form, building up a\n data structure of the same type, then applies outer to the result.\n Recognizes all Clojure data structures. Consumes seqs as with doall.", :library-url "https://github.com/clojure/clojure", :href "/clojure.walk/walk"} {:added "1.1", :ns "clojure.walk", :name "prewalk-replace", :file "clojure/walk.clj", :type "function", :column 1, :see-alsos [{:created-at 1281619206000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.walk", :name "postwalk-replace", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521df9"} {:created-at 1281619213000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "replace", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dfa"} {:created-at 1348453766000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.walk", :name "prewalk", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dfb"}], :line 110, :examples [{:author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (clojure.walk/prewalk-replace '{a b} '(c (d a)))\n(c (d b))", :created-at 1281563651000, :updated-at 1332953005000, :_id "542692d1c026201cdc326f2c"} {:author {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}, :editors [], :body "(use 'clojure.walk)\n\n(prewalk-replace {:a 1 :b 2} [:a :b])\n;=> [1 2]\n\n(prewalk-replace {:a 1 :b 2} [:a :b :c])\n;=> [1 2 :c]\n\n(prewalk-replace {:a 1 :b 2} [:a :b [:a :b] :c])\n;=> [1 2 [1 2] :c]", :created-at 1397943558000, :updated-at 1397943558000, :_id "542692d7c026201cdc32712f"}], :notes nil, :arglists ["smap form"], :doc "Recursively transforms form by replacing keys in smap with their\n values. Like clojure/replace but works on any data structure. Does\n replacement at the root of the tree first.", :library-url "https://github.com/clojure/clojure", :href "/clojure.walk/prewalk-replace"} {:added "1.1", :ns "clojure.walk", :name "stringify-keys", :file "clojure/walk.clj", :type "function", :column 1, :see-alsos [{:created-at 1440158810607, :author {:login "BernhardBln", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4759839?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "keywordize-keys", :ns "clojure.walk"}, :_id "55d7145ae4b072d7f27980e9"}], :line 102, :examples [{:author {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}, :editors [{:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"} {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}], :body "(use 'clojure.walk)\n\n(stringify-keys {:a 1 :b 2})\n;=> {\"a\" 1, \"b\" 2}", :created-at 1397941537000, :updated-at 1397943447000, :_id "542692d7c026201cdc327130"} {:updated-at 1476953480559, :created-at 1476953480559, :author {:login "eunmin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1837478?v=3"}, :body "(use 'clojure.walk)\n\n(stringify-keys {:a 1 :b {:c {:d 2}}})\n;=> {\"a\" 1, \"b\" {\"c\" {\"d\" 2}}}", :_id "58088588e4b001179b66bdd1"} {:updated-at 1624571487187, :created-at 1624571487187, :author {:login "kevo1ution", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8290559?v=4"}, :body "(use 'clojure.walk)\n\n(stringify-keys {:hello/world 1})\n;=> {\"world\" 1}", :_id "60d4fe5fe4b0b1e3652d750f"}], :notes [{:body "Recursively transforms all map keys and values from strings to keywords.\n\n
    \n(use 'clojure.walk)\n(defn stringify-keys-and-vals\n  \"Recursively transforms all map keys and values from keywords to strings.\"\n  [m]\n  (let [kf (fn [[k v]] (if (keyword? k) [(name k) v] [k v]))\n        vf (fn [[k v]] (if (keyword? v) [k (name v)] [k v]))]\n    ;; only apply to maps\n    (postwalk (fn [x] (if (map? x) (into {} (map #(-> % kf vf) x)) x)) m))) \n
    \n\nExample:\n\n
    \n(stringify-keys-and-vals {:a :hello :b :world})\n;=> {\"a\" \"hello\", \"b\" \"world\"}\n(stringify-keys-and-vals {:a {:hello :world} :b [{:love :clojure} {:hate :other}]})\n;=> {\"a\" {\"hello\" \"world\"}, \"b\" [{\"love\" \"clojure\"} {\"hate\" \"other\"}]}\n
    \n\n", :created-at 1615188831849, :updated-at 1615189007982, :author {:avatar-url "https://avatars.githubusercontent.com/u/278430?v=4", :account-source "github", :login "gongpengjun"}, :_id "6045d35fe4b0b1e3652d7473"}], :arglists ["m"], :doc "Recursively transforms all map keys from keywords to strings.", :library-url "https://github.com/clojure/clojure", :href "/clojure.walk/stringify-keys"} {:added "1.1", :ns "clojure.walk", :name "prewalk", :file "clojure/walk.clj", :type "function", :column 1, :see-alsos [{:created-at 1321428775000, :author {:login "srid", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd3a68d670372cd09876c26270a4299a?r=PG&default=identicon"}, :to-var {:ns "clojure.walk", :name "postwalk", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c84"} {:created-at 1348453563000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.walk", :name "prewalk-demo", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c85"} {:created-at 1348453577000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.walk", :name "prewalk-replace", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c86"}], :line 61, :examples [{:author {:login "srid", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd3a68d670372cd09876c26270a4299a?r=PG&default=identicon"}, :editors [], :body ";; From http://stackoverflow.com/questions/8089074/idiomatically-iterating-over-a-2-or-higher-dimensional-sequence-in-clojure/8091544#8091544\n\n(def matrix [[1 2 3]\n [4 5 6]\n [7 8 9]])\n(use 'clojure.walk :only [prewalk])\n\n(prewalk #(if (number? %) (inc %) %) matrix)\n=> [[2 3 4] [5 6 7] [8 9 10]]", :created-at 1321428749000, :updated-at 1321428749000, :_id "542692d7c026201cdc32712a"} {:editors [{:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}], :body ";; an example to show the differences between postwalk and prewalk\n;; (see the counterpart at postwalk)\n\n(let [counter (atom 0)\n print-touch (fn [x]\n (print (swap! counter inc) \":\" (pr-str x) \"→ \"))\n change-type (fn [x]\n (let [new-x (if (vector? x)\n (apply list x)\n (str x))]\n (prn new-x)\n new-x))]\n (clojure.walk/prewalk (fn [x]\n (print-touch x)\n (change-type x))\n [:a [:ba :bb] :c]))\n\n;; printed output:\n\n1 : [:a [:ba :bb] :c] → (:a [:ba :bb] :c)\n2 : :a → \":a\"\n3 : [:ba :bb] → (:ba :bb)\n4 : :ba → \":ba\"\n5 : :bb → \":bb\"\n6 : :c → \":c\"\n\n;; returned value:\n\n=> (\":a\" (\":ba\" \":bb\") \":c\")", :author {:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"}, :created-at 1519076844559, :updated-at 1519084512666, :_id "5a8b45ece4b0316c0f44f8d1"} {:editors [{:login "dan-f", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/2146312?v=4"}], :body "(postwalk\n (fn [x]\n (let [new (if (number? x) (* x 2) x)]\n (printf \"%s -> %s\\n\" x new)\n new))\n '(1 (2 3))) ;; => (2 (4 6))\n\n;; console output\n;; 1 -> 2\n;; 2 -> 4\n;; 3 -> 6\n;; (4 6) -> (4 6)\n;; (2 (4 6)) -> (2 (4 6))\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/2146312?v=4", :account-source "github", :login "dan-f"}, :created-at 1544197160620, :updated-at 1544197323000, :_id "5c0a9428e4b0ca44402ef5e6"}], :notes nil, :arglists ["f form"], :doc "Like postwalk, but does pre-order traversal.", :library-url "https://github.com/clojure/clojure", :href "/clojure.walk/prewalk"} {:added "1.1", :ns "clojure.walk", :name "postwalk-demo", :file "clojure/walk.clj", :type "function", :column 1, :see-alsos [{:created-at 1447033235869, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "postwalk", :ns "clojure.walk"}, :_id "563ff993e4b04b157a6648ed"} {:created-at 1447033255822, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "postwalk-replace", :ns "clojure.walk"}, :_id "563ff9a7e4b0290a56055d23"}], :line 80, :examples [{:author {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}, :editors [{:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"} {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}], :body "(use 'clojure.walk)\n\nuser> (postwalk-demo [[1 2] [3 4 [5 6]] [7 8]])\nWalked: 1\nWalked: 2\nWalked: [1 2]\nWalked: 3\nWalked: 4\nWalked: 5\nWalked: 6\nWalked: [5 6]\nWalked: [3 4 [5 6]]\nWalked: 7\nWalked: 8\nWalked: [7 8]\nWalked: [[1 2] [3 4 [5 6]] [7 8]]\n[[1 2] [3 4 [5 6]] [7 8]]\n\nuser> (postwalk-demo {:a 1 :b 2})\nWalked: :a\nWalked: 1\nWalked: [:a 1]\nWalked: :b\nWalked: 2\nWalked: [:b 2]\nWalked: {:a 1, :b 2}\n{:a 1, :b 2}", :created-at 1397942586000, :updated-at 1397943097000, :_id "542692d7c026201cdc327124"}], :notes nil, :arglists ["form"], :doc "Demonstrates the behavior of postwalk by printing each form as it is\n walked. Returns form.", :library-url "https://github.com/clojure/clojure", :href "/clojure.walk/postwalk-demo"} {:added "1.1", :ns "clojure.walk", :name "prewalk-demo", :file "clojure/walk.clj", :type "function", :column 1, :see-alsos [{:created-at 1348453549000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.walk", :name "prewalk", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d48"}], :line 87, :examples [{:author {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}, :editors [{:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"} {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"} {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}], :body "(use 'clojure.walk)\n\nuser> (prewalk-demo [[1 2] [3 4 [5 6]] [7 8]])\nWalked: [[1 2] [3 4 [5 6]] [7 8]]\nWalked: [1 2]\nWalked: 1\nWalked: 2\nWalked: [3 4 [5 6]]\nWalked: 3\nWalked: 4\nWalked: [5 6]\nWalked: 5\nWalked: 6\nWalked: [7 8]\nWalked: 7\nWalked: 8\n[[1 2] [3 4 [5 6]] [7 8]]\n\nuser> (prewalk-demo {:a 1 :b 2})\nWalked: {:a 1, :b 2}\nWalked: [:a 1]\nWalked: :a\nWalked: 1\nWalked: [:b 2]\nWalked: :b\nWalked: 2\n{:a 1, :b 2}", :created-at 1397942432000, :updated-at 1397943044000, :_id "542692d7c026201cdc32712b"}], :notes nil, :arglists ["form"], :doc "Demonstrates the behavior of prewalk by printing each form as it is\n walked. Returns form.", :library-url "https://github.com/clojure/clojure", :href "/clojure.walk/prewalk-demo"} {:added "1.1", :ns "clojure.walk", :name "macroexpand-all", :file "clojure/walk.clj", :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "macroexpand-1", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1339248731000, :_id "542692ebf6e94c6970521de6"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "macroexpand", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1339248761000, :_id "542692ebf6e94c6970521de7"}], :line 126, :examples [{:updated-at 1339248698000, :created-at 1339248698000, :body "user=> (use 'clojure.walk)\nuser=> (macroexpand-all '(-> c (+ 3) (* 2)))\n(* (+ c 3) 2)", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :_id "542692d7c026201cdc32711d"} {:author {:login "Sgeo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bf4e0e4e4f0b1f703b1372a8dd7b0735?r=PG&default=identicon"}, :editors [], :body "user=> (use 'clojure.walk)\n\n; tryclj.com and lazybot on #clojure get the following wrong\nuser=> (let [-> inc] (-> 5)) \n6\n\n; Below macroexpansion is supposed to result in equivalent code to the above\nuser=> (macroexpand-all '(let [-> inc] (-> 5)))\n(let* [-> inc] 5)\nuser=> (let* [-> inc] 5)\n5\n\n; However, as is clear above, it does not", :created-at 1355181392000, :updated-at 1355181392000, :_id "542692d7c026201cdc32711e"} {:author {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}, :editors [{:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"} {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}], :body ";; differences between macroexpand-1, macroexpand and macroexpand-all \n\n(require '[clojure.pprint :as pp]\n '[clojure.walk :as walk])\n\n(alter-var-root #'pp/*print-suppress-namespaces* (constantly true))\n\n\n(defmacro plus [n1 n2]\n `(+ ~n1 ~n2))\n\n(pp/pprint (macroexpand-1 '(plus 3 4))) ;=> (+ 3 4)\n(pp/pprint (macroexpand '(plus 3 4))) ;=> (+ 3 4)\n\n\n(defmacro pl [p1 p2]\n `(plus ~p1 ~p2))\n\n(pp/pprint (macroexpand-1 '(pl 3 4))) ;=> (plus 3 4)\n(pp/pprint (macroexpand '(pl 3 4))) ;=> (+ 3 4)\n\n\n(defmacro minus [m1 m2]\n `(- ~m1 ~m2))\n\n(defmacro calc [c1 c2]\n `(pl ~c1 (minus ~c1 ~c2)))\n\n(pp/pprint (macroexpand-1 '(calc 20 30)))\n;=> (pl 20 (minus 20 30))\n\n(pp/pprint (macroexpand '(calc 20 30)))\n;=> (+ 20 (minus 20 30))\n\n(pp/pprint (walk/macroexpand-all '(calc 20 30)))\n;=> (+ 20 (- 20 30))", :created-at 1397943977000, :updated-at 1397944114000, :_id "542692d7c026201cdc32711f"} {:updated-at 1689437697116, :created-at 1689437656976, :author {:login "owenRiddy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8080718?v=4"}, :body "; macroexpand-all can give different results to what is generated in a real\n; evaluation. Here is a code sample that should normally evaluates to `dummy`, \n; but `macroexpand-all` generates code that evaluates to `nil`.\n\n(defmacro d []\n (let [probably-dummy# (-> &env keys first)]\n `(quote ~probably-dummy#)))\n\n(letfn [(dummy [] true)]\n (d))\n; => dummy\n\n(clojure.walk/macroexpand-all\n '(letfn [(dummy [] true)]\n (d)))\n; => (letfn* [dummy (fn* dummy ([] true))] (quote nil))\n\n(eval \n (clojure.walk/macroexpand-all\n '(letfn [(dummy [] true)]\n (d))))\n; => nil", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/8080718?v=4", :account-source "github", :login "owenRiddy"}], :_id "64b2c5d8e4b08cf8563f4bd2"}], :notes [{:updated-at 1351086771000, :body "DO NOT USE THIS FUNCTION, it doesn't handle special forms at all, and, as such, does not in fact expand into the ultimate macroexpansion of the form.\r\n\r\nFor example,\r\n
    (require '[clojure.walk :as walk])\r\n(println (walk/macroexpand-all '(quote (let [a 1] a))))\r\n
    \r\nWill print\r\n
    (quote (let* [a 1] a))\r\n
    \r\nWhen the correct answer is\r\n
    (quote (let [a 1] a))\r\n
    \r\nShowing an utter unawareness of proper handling of special forms\r\n\r\nDO NOT USE THIS FUNCTION", :created-at 1351086666000, :author {:login "Sgeo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bf4e0e4e4f0b1f703b1372a8dd7b0735?r=PG&default=identicon"}, :_id "542692edf6e94c6970521ff0"} {:updated-at 1354211038000, :body "@Sgeo - `let` is just a macro for `let*`:\r\n\r\n (clojure.repl/source let) =>\r\n\r\n (defmacro let\r\n \"binding => binding-form init-expr\r\n\r\n Evaluates the exprs in a lexical context in which the symbols in\r\n the binding-forms are bound to their respective init-exprs or parts\r\n therein.\"\r\n {:added \"1.0\", :special-form true, :forms '[(let [bindings*] exprs*)]}\r\n [bindings & body]\r\n (assert-args let\r\n (vector? bindings) \"a vector for its binding\"\r\n (even? (count bindings)) \"an even number of forms in binding vector\")\r\n `(let* ~(destructure bindings) ~@body))", :created-at 1354211038000, :author {:login "Cubic", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b6678a430a805dd78366d6e135b49f2d?r=PG&default=identicon"}, :_id "542692edf6e94c6970521ff6"} {:updated-at 1354485217000, :body "(quote (let [a 1] a)) is '(let [a 1] a) which evaluates to a list containing the symbol let, a vector [a 1], and a symbol a. In this context, the (let [a 1] a) is not code, but mere data, and as such, should not be macroexpanded at all, anymore than a string like \"(-> a b c)\" should be macroexpanded into \"(c (b a))\" (and yes, I know that's not the exact macroexpansion).", :created-at 1354484499000, :author {:login "Sgeo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bf4e0e4e4f0b1f703b1372a8dd7b0735?r=PG&default=identicon"}, :_id "542692edf6e94c6970521ff7"}], :arglists ["form"], :doc "Recursively performs all possible macroexpansions in form.", :library-url "https://github.com/clojure/clojure", :href "/clojure.walk/macroexpand-all"} {:added "1.1", :ns "clojure.walk", :name "postwalk-replace", :file "clojure/walk.clj", :type "function", :column 1, :see-alsos [{:created-at 1281619231000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.walk", :name "prewalk-replace", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c82"} {:created-at 1281619236000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "replace", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c83"} {:created-at 1585850917002, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "postwalk", :ns "clojure.walk"}, :_id "5e862a25e4b087629b5a18ca"}], :line 118, :examples [{:author {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}, :editors [{:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"} {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}], :body "(use 'clojure.walk)\n\n(postwalk-replace {:a 1 :b 2} [:a :b])\n;=> [1 2]\n\n(postwalk-replace {:a 1 :b 2} [:a :b :c])\n;=> [1 2 :c]\n\n(postwalk-replace {:a 1 :b 2} [:a :b [:a :b] :c])\n;=> [1 2 [1 2] :c]", :created-at 1397943421000, :updated-at 1397943663000, :_id "542692d7c026201cdc327127"} {:updated-at 1463496047122, :created-at 1463496047122, :author {:login "x", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/693546?v=3"}, :body "(postwalk-replace {nil :NIL} {:a 1, :b nil, :c 3, nil 4})\n;=> {:NIL 4, :a 1, :b :NIL, :c 3}", :_id "573b2d6fe4b05c05173143fb"}], :notes nil, :arglists ["smap form"], :doc "Recursively transforms form by replacing keys in smap with their\n values. Like clojure/replace but works on any data structure. Does\n replacement at the leaves of the tree first.", :library-url "https://github.com/clojure/clojure", :href "/clojure.walk/postwalk-replace"} {:ns "clojure.xml", :name "tag", :file "clojure/xml.clj", :type "var", :column 1, :see-alsos nil, :line 22, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.xml/tag"} {:ns "clojure.xml", :name "*sb*", :file "clojure/xml.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 18, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.xml/*sb*"} {:ns "clojure.xml", :name "*state*", :file "clojure/xml.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 17, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.xml/*state*"} {:ns "clojure.xml", :name "*stack*", :file "clojure/xml.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 15, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.xml/*stack*"} {:ns "clojure.xml", :name "element", :file "clojure/xml.clj", :type "var", :column 1, :see-alsos [{:created-at 1324592891000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.xml", :name "emit-element", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ec8"} {:created-at 1324592934000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "struct", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ec9"} {:created-at 1324592937000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "struct-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eca"} {:created-at 1324592944000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.xml", :name "parse", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ecb"} {:created-at 1324593203000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-out-str", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ecc"}], :line 20, :examples [{:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [{:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"} {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}], :body "(use 'clojure.zip)\n\n;;using our old friend struct for performance in maps \n(struct element :httplink {:href \"http://clojure.org\"} nil)\n=>\n{:tag :httplink, \n :attrs {:href \"http://clojure.org\"}, \n :content nil}\n\n;;these elements can be output to ordinary xml strings with emit-element\n(emit-element (struct element :httplink {:href \"http://clojure.org\"} nil))\n=>\n\n;;this is printed - can be catched with macro with-out-str\n\n;;make hierarchies:\n(struct element :parent {:name \"Barbara\"} \n [(struct element :children {:name \"Gina\"} nil) \n (struct element :children {:name \"John\"} nil)])\n=>\n{:tag :parent, :attrs {:name \"Barbara\"}, :content \n [{:tag :children, :attrs {:name \"Gina\"}, :content nil} \n {:tag :children, :attrs {:name \"John\"}, :content nil}]}\n\n;;which can be emit-elemented as well\n\n(emit-element {:tag :parent, :attrs {:name \"Barbara\"}, :content [{:tag :children, :attrs {:name \"Gina\"}, :content nil} {:tag :children, :attrs {:name \"John\"}, :content nil}]})\n=>\n\n \n \n", :created-at 1324592984000, :updated-at 1324593242000, :_id "542692d7c026201cdc327136"}], :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.xml/element"} {:ns "clojure.xml", :name "*current*", :file "clojure/xml.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 16, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.xml/*current*"} {:ns "clojure.xml", :name "content", :file "clojure/xml.clj", :type "var", :column 1, :see-alsos nil, :line 24, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.xml/content"} {:ns "clojure.xml", :name "content-handler", :file "clojure/xml.clj", :type "var", :column 1, :see-alsos nil, :line 26, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.xml/content-handler"} {:added "1.0", :ns "clojure.xml", :name "parse", :file "clojure/xml.clj", :type "function", :column 1, :see-alsos [{:created-at 1324593911000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.xml", :name "emit-element", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cf3"} {:created-at 1324593914000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-out-str", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cf4"} {:created-at 1324593922000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.xml", :name "element", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cf5"}], :line 78, :examples [{:updated-at 1430664126603, :created-at 1324593962000, :body "(require '[clojure.xml :as xml]\n '[clojure.zip :as zip])\n\n;;convenience function, first seen at nakkaya.com later in clj.zip src\n(defn zip-str [s]\n (zip/xml-zip \n (xml/parse (java.io.ByteArrayInputStream. (.getBytes s)))))\n\n;;parse from xml-strings to internal xml representation\nuser=> (zip-str \"
    \")\n[{:tag :a, :attrs {:href \"nakkaya.com\"}, :content nil} nil]\n\n;;root can be rendered with xml/emit-element\nuser=> (xml/emit-element (zip/root [{:tag :a, :attrs {:href \"nakkaya.com\"}, :content nil} nil]))\n\n\n;;printed (to assure it's not lazy and for performance), can be caught to string variable with with-out-str", :editors [{:avatar-url "https://www.gravatar.com/avatar/9a562ca6891212ffed05e29cc69c9124?r=PG&default=identicon", :account-source "clojuredocs", :login "balamkej"} {:avatar-url "https://www.gravatar.com/avatar/6f4c4cb023ca9033b53a6a517ed89153?r=PG&default=identicon", :account-source "clojuredocs", :login "Lowgain"} {:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"} {:avatar-url "https://avatars.githubusercontent.com/u/353113?v=3", :account-source "github", :login "claj"}], :author {:avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon", :account-source "clojuredocs", :login "Claj"}, :_id "542692d7c026201cdc32713c"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; Use the \"startparse\" parameter to disable \n;; validation and network requests for external DTDs\n\n(require '[clojure.xml :as xml]\n '[clojure.java.io :as io])\n(import '[javax.xml.parsers SAXParserFactory])\n\n(def conforming\n \"\n \n \n
    Hello
    \n \")\n\n(defn non-validating [s ch]\n (..\n (doto\n (SAXParserFactory/newInstance)\n (.setFeature \n \"http://apache.org/xml/features/nonvalidating/load-external-dtd\" false))\n (newSAXParser)\n (parse s ch)))\n\n(def xml\n (-> conforming .getBytes io/input-stream (xml/parse non-validating)))\n\n;; {:tag :html,\n;; :attrs {:xmlns \"http://www.w3.org/1999/xhtml\"},\n;; :content [{:tag :article, :attrs nil, :content [\"Hello\"]}]}\n", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1559323024229, :updated-at 1559334683073, :_id "5cf16190e4b0ca44402ef73b"}], :notes nil, :arglists ["s" "s startparse"], :doc "Parses and loads the source s, which can be a File, InputStream or\n String naming a URI. Returns a tree of the xml/element struct-map,\n which has the keys :tag, :attrs, and :content. and accessor fns tag,\n attrs, and content. Other parsers can be supplied by passing\n startparse, a fn taking a source and a ContentHandler and returning\n a parser", :library-url "https://github.com/clojure/clojure", :href "/clojure.xml/parse"} {:ns "clojure.xml", :name "startparse-sax", :file "clojure/xml.clj", :type "function", :column 1, :see-alsos nil, :line 75, :examples nil, :notes nil, :arglists ["s ch"], :library-url "https://github.com/clojure/clojure", :href "/clojure.xml/startparse-sax"} {:ns "clojure.xml", :name "emit", :file "clojure/xml.clj", :type "function", :column 1, :see-alsos [{:created-at 1323923286000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-out-str", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e6f"}], :line 111, :examples [{:body "(use 'clojure.xml)\n;;attrs stores the attributes of a tag and content contains the children\n(emit {:tag :parent :attrs {:value \"Hello\"} :content[\n\t{:tag :child1 :attrs {:value \"World\"}}\n\t{:tag :child2 :attrs {:value \"Clojure\"}}\n\t]})\n\n;; prints this to *out*:\n\n\n\n\n", :author {:login "finiterecursion", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4407459?v=3"}, :created-at 1425400719581, :updated-at 1438720830296, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/353113?v=3", :account-source "github", :login "claj"}], :_id "54f5e38fe4b0b716de7a652f"}], :notes [{:updated-at 1325286942000, :body "this one have a problem when trying to export xml with string containing & etc (should be escaped). Contribs prxml has this functionality.", :created-at 1325286942000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fd5"} {:updated-at 1328074886000, :body "A 1.3 compatible version of prxml can be found here:\r\n\r\nhttps://github.com/weissjeffm/clojure.prxml", :created-at 1328074886000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fd8"}], :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.xml/emit"} {:ns "clojure.xml", :name "attrs", :file "clojure/xml.clj", :type "var", :column 1, :see-alsos nil, :line 23, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.xml/attrs"} {:ns "clojure.xml", :name "emit-element", :file "clojure/xml.clj", :type "function", :column 1, :see-alsos [{:created-at 1323923092000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-out-str", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ed5"} {:created-at 1324592254000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.xml", :name "element", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ed6"}], :line 95, :examples [{:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [{:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"} {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"} {:login "dyba", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/296219?v=3"}], :body "(use 'clojure.xml)\n\n;;If just a string it's text inside or something. just print it\n(emit-element \"hello\")\nhello\n\n;;we want a map with a tag\n(emit-element {:tag :hello})\n\n\n;;strings works as well (since we're using the \"name\" function)\n(emit-element {:tag \"hello\"})\n\n\n;;:attrs is for all the attributes\n(emit-element {:tag :hello :attrs {:place \"world\"}})\n\n\n;;:content is for all the children in the element\n(emit-element {:tag :parent :attrs {:id \"22\" :name \"fritz\"} :content [\n {:tag :child :attrs {:id \"56\"}} \n {:tag :child :attrs {:id \"57\"}]}))\n\n\n\n\n\n;; also, look out for not supplying :content with another xml-ish map\n;; or at minimum a vector containing the string you want to put as the content:\n(emit-element {:tag :hello :content \"world\"})\n\njava.lang.NullPointerException (NO_SOURCE_FILE:0)\n\n(emit-element {:tag :hello :content [\"world\"])\nworld\n", :created-at 1323922631000, :updated-at 1420944718054, :_id "542692d7c026201cdc327139"}], :notes [{:updated-at 1323923133000, :body "you can catch the printed code with the macro
    with-out-str
    if you want to catch it in variables.", :created-at 1323923133000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fd2"}], :arglists ["e"], :library-url "https://github.com/clojure/clojure", :href "/clojure.xml/emit-element"} {:added "1.0", :ns "clojure.zip", :name "rightmost", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1497531575982, :author {:login "tkocmathla", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/183459?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "leftmost", :ns "clojure.zip"}, :_id "594284b7e4b06e730307db33"}], :line 157, :examples nil, :notes nil, :arglists ["loc"], :doc "Returns the loc of the rightmost sibling of the node at this loc, or self", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/rightmost"} {:added "1.0", :ns "clojure.zip", :name "insert-child", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1329432152000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "zipper", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521edf"} {:created-at 1357860181000, :author {:login "juan.facorro", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d6f59d93cc17c698f16e550034a2d1ad?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "append-child", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ee0"}], :line 216, :examples [{:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [], :body "(use 'clojure.zip) ;;warnings OK\n\n(def zp (zipper vector? seq (fn [_ c] c) [[1 2 3] [4 [5 6] 7] [8 9]]) )\n\n(root (insert-child (-> zp down right) 42))\n=>([1 2 3] (42 4 [5 6] 7) [8 9])\n\n\n(def zp2 (zipper vector? seq (fn [_ c] c) [74 75])\n\n(root (insert-right (-> zp down right) zp2))\n=>([1 2 3] [4 [5 6] 7] [[74 75] nil] [8 9])\n\n(root (insert-left (-> zp down right) zp2))\n=>([1 2 3] [[74 75] nil] [4 [5 6] 7] [8 9])\n\n\n\n", :created-at 1329432685000, :updated-at 1329432685000, :_id "542692d7c026201cdc327140"}], :notes nil, :arglists ["loc item"], :doc "Inserts the item as the leftmost child of the node at this loc,\n without moving", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/insert-child"} {:added "1.0", :ns "clojure.zip", :name "left", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos nil, :line 166, :examples nil, :notes nil, :arglists ["loc"], :doc "Returns the loc of the left sibling of the node at this loc, or nil", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/left"} {:added "1.0", :ns "clojure.zip", :name "path", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos nil, :line 90, :examples [{:updated-at 1559115788133, :created-at 1534083516071, :author {:login "abhi18av", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/12799326?v=4"}, :body "\n(def nested-vecs\n [:foo [:bar :baz [:bork]]])\n\n;; now let's make a zipper\n(def z (zip/vector-zip nested-vecs))\n\n;; \"path\" only returns the \"down nodes\" necessary to reach the destination.\n;; Any other horizontal movement is not collected:\n\n(-> z\n zip/down ;; down1 [:foo [:bar :baz [:bork]]]\n zip/right\n zip/down ;; down2 [:bar :baz [:bork]]\n zip/rightmost\n zip/down ;; down3 [:bork]\n zip/path)\n\n;; [[:foo [:bar :baz [:bork]]] \n;; [:bar :baz [:bork]] \n;; [:bork]]\n\n\n\n", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5b7041bce4b00ac801ed9e53"}], :notes nil, :arglists ["loc"], :doc "Returns a seq of nodes leading to this loc", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/path"} {:added "1.0", :ns "clojure.zip", :name "leftmost", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1497531567628, :author {:login "tkocmathla", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/183459?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "rightmost", :ns "clojure.zip"}, :_id "594284afe4b06e730307db32"}], :line 174, :examples nil, :notes nil, :arglists ["loc"], :doc "Returns the loc of the leftmost sibling of the node at this loc, or self", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/leftmost"} {:added "1.0", :ns "clojure.zip", :name "append-child", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1558985943586, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "insert-child", :ns "clojure.zip"}, :_id "5cec3cd7e4b0ca44402ef72e"}], :line 223, :examples [{:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; \"append-child\" adds a new child as the rightmost element. \n;; \"insert-child\" does the same, but leftmost. The node needs to be a branch.\n\n(require '[clojure.zip :as zip])\n\n(def vzip\n (zip/vector-zip\n [[1 2]\n [3 4 [5 10 [11 12]]]\n [13 14]])) \n\n(-> vzip zip/down zip/rightmost (zip/append-child 'INS) zip/up zip/node)\n;; [[1 2] [3 4 [5 10 [11 12]]] [13 14 INS]]\n\n(-> vzip zip/down zip/rightmost (zip/insert-child 'INS) zip/up zip/node)\n;; [[1 2] [3 4 [5 10 [11 12]]] [INS 13 14]]\n\n(-> vzip zip/down zip/rightmost zip/down (zip/append-child 'INS))\n;; Exception called children on a leaf node\n", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1558985910358, :updated-at 1683123974927, :_id "5cec3cb6e4b0ca44402ef72d"} {:updated-at 1574335186052, :created-at 1574335186052, :author {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/24317401?v=4"}, :body "(use 'clojure.zip)\n;; def a tree struct\n;; .\n;; / \\\n;; . 0\n;; / \\\n;; 1 2\n(def tree\n (vector-zip\n [[1 2] 0]))\n\n(-> tree\n down\n (append-child 3))\n;; .\n;; / \\\n;; x 0\n;; /|\\\n;; 1 2 3\n;;\n;; 3 inserted, location x unchanged", :_id "5dd672d2e4b0ca44402ef7e3"}], :notes nil, :arglists ["loc item"], :doc "Inserts the item as the rightmost child of the node at this loc,\n without moving", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/append-child"} {:added "1.0", :ns "clojure.zip", :name "branch?", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos nil, :line 69, :examples [{:updated-at 1574334564922, :created-at 1574334564922, :author {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/24317401?v=4"}, :body "(use 'clojure.zip)\n;; def a tree struct\n;; .\n;; / \\\n;; . 0\n;; / \\\n;; 1 2\n(def tree\n (vector-zip\n [[1 2] 0]))\n\n;; #0 #1 #2\n;; x . .\n;; / \\ / \\ / \\\n;; . 0 x 0 . x\n;; / \\ / \\ / \\\n;; 1 2 1 2 1 2\n\n;; #0\n(-> tree\n branch?) ;; => true\n;; #1\n(-> tree\n down\n branch?) ;; => true\n;; #2\n(-> tree\n down\n next\n branch?) ;; => false\n\n;; false for leaves", :_id "5dd67064e4b0ca44402ef7e2"}], :notes nil, :arglists ["loc"], :doc "Returns true if the node at loc is a branch", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/branch_q"} {:added "1.0", :ns "clojure.zip", :name "children", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1455292742761, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "zipper", :ns "clojure.zip"}, :_id "56be0146e4b0b0491b9ed178"}], :line 75, :examples [{:updated-at 1574339327098, :created-at 1574335336603, :author {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/24317401?v=4"}, :body "(use 'clojure.zip)\n;; def a tree struct\n;; .\n;; / \\\n;; . 0\n;; / \\\n;; 1 2\n(def tree\n (vector-zip\n [[1 2] 0]))\n\n;; #0 #1 #2\n;; x . .\n;; / \\ / \\ / \\\n;; . 0 x 0 . 0\n;; / \\ / \\ / \\\n;; 1 2 1 2 x 2\n\n;; #0\n(-> tree\n children) ;; => ([1 2] 0)\n;; #1\n(-> tree\n down\n children) ;; => (1 2)\n;; #2\n(-> tree\n down\n down\n children) ;; => Exception called children on a leaf node", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/24317401?v=4", :account-source "github", :login "loeschzwerg"}], :_id "5dd67368e4b0ca44402ef7e4"}], :notes nil, :arglists ["loc"], :doc "Returns a seq of the children of node at loc, which must be a branch", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/children"} {:added "1.0", :ns "clojure.zip", :name "remove", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos nil, :line 264, :examples [{:updated-at 1558973394746, :created-at 1558973394746, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body "(require '[clojure.zip :as zip])\n\n(def vzip\n (zip/vector-zip\n [[1 2]\n [3 4 [5 10 [11 12]]]\n [13 14]])) ;; target for removal\n\n(-> vzip zip/down zip/rightmost zip/remove zip/root)\n;; [[1 2] [3 4 [5 10 [11 12]]]]", :_id "5cec0bd2e4b0ca44402ef72c"} {:editors [{:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/24317401?v=4"}], :body "(use 'clojure.zip)\n;; def a tree struct\n;; .\n;; / \\\n;; . 0\n;; / \\\n;; 1 2\n(def tree\n (vector-zip\n [[1 2] 0]))\n\n;; #1 #2\n;; x x\n;; / \\ /|\\\n;; 1 0 1 - 0\n;; / \\\n;; 1 2\n\n;; #1\n(-> tree\n down\n (replace 1)\n up\n node) ;; => [1 0]\n;; #2\n(-> tree\n down\n (insert-left 1)\n remove ;; cut desired node\n up\n node) ;; => [1 0]", :author {:avatar-url "https://avatars3.githubusercontent.com/u/24317401?v=4", :account-source "github", :login "loeschzwerg"}, :created-at 1574337342956, :updated-at 1574337519515, :_id "5dd67b3ee4b0ca44402ef7e7"}], :notes nil, :arglists ["loc"], :doc "Removes the node at loc, returning the loc that would have preceded\n it in a depth-first walk.", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/remove"} {:added "1.0", :ns "clojure.zip", :name "down", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1455292674651, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "zipper", :ns "clojure.zip"}, :_id "56be0102e4b060004fc217c0"}], :line 109, :examples [{:updated-at 1574335586383, :created-at 1574335586383, :author {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/24317401?v=4"}, :body "(use 'clojure.zip)\n;; def a tree struct\n;; .\n;; / \\\n;; . 0\n;; / \\\n;; 1 2\n(def tree\n (vector-zip\n [[1 2] 0]))\n\n;; #0 #1 #2\n;; x . .\n;; / \\ / \\ / \\\n;; . 0 x 0 . 0\n;; / \\ / \\ / \\\n;; 1 2 1 2 x 2\n\n;; #0\n(-> tree\n node) ;; => [[1 2] 0]\n;; #1\n(-> tree\n down\n node) ;; => [1 2]\n;; #2\n(-> tree\n down\n down\n node) ;; => 1\n\n;; notice the leftmost child / first element", :_id "5dd67462e4b0ca44402ef7e5"}], :notes nil, :arglists ["loc"], :doc "Returns the loc of the leftmost child of the node at this loc, or\n nil if no children", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/down"} {:added "1.0", :ns "clojure.zip", :name "replace", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1357860115000, :author {:login "juan.facorro", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d6f59d93cc17c698f16e550034a2d1ad?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "edit", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c4b"}], :line 203, :examples [{:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [], :body "(use 'clojure.zip)\n\n(def vz (vector-zip [1 2 [73 88] 4]))\n\n(root (replace (-> vz down right right) 3))\n=>[1 2 3 4]", :created-at 1329434106000, :updated-at 1329434106000, :_id "542692d7c026201cdc327142"}], :notes [{:author {:login "nsadeh", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/15837587?v=4"}, :updated-at 1688429049053, :created-at 1688429049053, :body "This throws an error if you replace the end node btw", :_id "64a361f9e4b08cf8563f4bd1"}], :arglists ["loc node"], :doc "Replaces the node at this loc, without moving", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/replace"} {:added "1.0", :ns "clojure.zip", :name "zipper", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1329431493000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "down", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d93"} {:created-at 1329431497000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "up", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d94"} {:created-at 1329431508000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "right", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d95"} {:created-at 1364881252000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "left", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d96"} {:created-at 1364881303000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "children", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d97"} {:created-at 1417358040306, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.zip", :name "node", :library-url "https://github.com/clojure/clojure"}, :_id "547b2ad8e4b0dc573b892fe5"} {:created-at 1455304623314, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "replace", :ns "clojure.zip"}, :_id "56be2fafe4b060004fc217c3"}], :line 18, :examples [{:updated-at 1406155327000, :created-at 1287950611000, :body ";; Some clojure.zip functions will overwrite clojure.core's definitions\n(use 'clojure.zip)\n\n;; You may wish to require :as in order to avoid the above\n(require '[clojure.zip :as z])\n\n;; For the purposes of keeping the examples that follow clean,\n;; assume we have taken the former route: (use 'clojure.zip)\n\n(use 'clojure.pprint)\n(def p pprint)\n\nuser> (def z [[1 2 3] [4 [5 6] 7] [8 9]])\n#'user/z\n\nuser> (def zp (zipper vector? seq (fn [_ c] c) z))\n#'user/zp\n\nuser> zp\n[[[1 2 3] [4 [5 6] 7] [8 9]] nil]\n\nuser=> (p (-> zp down))\n[[1 2 3]\n {:l [],\n :pnodes [[[1 2 3] [4 [5 6] 7] [8 9]]],\n :ppath nil,\n :r ([4 [5 6] 7] [8 9])}]\n \nuser> (first (-> zp down))\n[1 2 3]\n\nuser=> (p (-> zp down right))\n[[4 [5 6] 7]\n {:l [[1 2 3]],\n :pnodes [[[1 2 3] [4 [5 6] 7] [8 9]]],\n :ppath nil,\n :r ([8 9])}]\n\nuser> (first (-> zp down right))\n[4 [5 6] 7]\n\nuser=> (p (-> zp down right down right))\n[[5 6]\n {:l [4],\n :pnodes [[[1 2 3] [4 [5 6] 7] [8 9]] [4 [5 6] 7]],\n :ppath\n {:l [[1 2 3]],\n :pnodes [[[1 2 3] [4 [5 6] 7] [8 9]]],\n :ppath nil,\n :r ([8 9])},\n :r (7)}]\n\nuser=> (p (-> zp down right down right down))\n[5\n {:l [],\n :pnodes [[[1 2 3] [4 [5 6] 7] [8 9]] [4 [5 6] 7] [5 6]],\n :ppath\n {:l [4],\n :pnodes [[[1 2 3] [4 [5 6] 7] [8 9]] [4 [5 6] 7]],\n :ppath\n {:l [[1 2 3]],\n :pnodes [[[1 2 3] [4 [5 6] 7] [8 9]]],\n :ppath nil,\n :r ([8 9])},\n :r (7)},\n :r (6)}]\n\nuser=> (p (-> zp down right down right (replace \"hello\")))\n[\"hello\"\n {:changed? true,\n :l [4],\n :pnodes [[[1 2 3] [4 [5 6] 7] [8 9]] [4 [5 6] 7]],\n :ppath\n {:l [[1 2 3]],\n :pnodes [[[1 2 3] [4 [5 6] 7] [8 9]]],\n :ppath nil,\n :r ([8 9])},\n :r (7)}]\n\nuser=> (p (-> zp down right down right (replace \"hello\") up))\n[(4 \"hello\" 7)\n {:changed? true,\n :l [[1 2 3]],\n :pnodes [[[1 2 3] [4 [5 6] 7] [8 9]]],\n :ppath nil,\n :r ([8 9])}]\n\nuser=> (p (-> zp down right down right (replace \"hello\") up root))\n([1 2 3] (4 \"hello\" 7) [8 9])", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"} {:avatar-url "https://www.gravatar.com/avatar/e21945030cedebfd5b4a4f04ad3843e8?r=PG&default=identicon", :account-source "clojuredocs", :login "elben"}], :author {:avatar-url "https://www.gravatar.com/avatar/4bc423f6653d93f9185a5cdc9f5cd84f?r=PG&default=identicon", :account-source "clojuredocs", :login "bhenry"}, :_id "542692d1c026201cdc326f2e"} {:body "(require '[clojure.zip :as zip])\n\n;; Adds zip support for maps.\n;; (Source: http://stackoverflow.com/a/15020649/42188)\n(defn map-zipper [m]\n (zip/zipper \n (fn [x] (or (map? x) (map? (nth x 1))))\n (fn [x] (seq (if (map? x) x (nth x 1))))\n (fn [x children] \n (if (map? x) \n (into {} children) \n (assoc x 1 (into {} children))))\n m))\n\n(def m {:a 3 :b {:x true :y false} :c 4})\n\n;; Note that hash-maps are not ordered:\n(-> (map-zipper m) zip/down zip/right zip/node)\n;;=> [:b {:y false, :x true}]\n\n;; Treat nodes as [key value] pairs:\n(-> (map-zipper m) \n zip/down\n (zip/edit (fn [[k v]] [k (inc v)]))\n zip/root)\n;;=> {:c 5, :b {:y false, :x true}, :a 3}", :author {:login "muhuk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/40178?v=3"}, :created-at 1423511905733, :updated-at 1423511905733, :_id "54d91161e4b081e022073c72"} {:updated-at 1481022698534, :created-at 1480941951575, :author {:login "PetrGlad", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/124476?v=3"}, :body ";; A version of zipper that allows mixing maps and vectors \n;; Note that it traverses map entries too\n(require '[clojure.zip :as z])\n(defn map-vec-zipper [m]\n (z/zipper\n (fn [x] (or (map? x) (sequential? x)))\n seq\n (fn [p xs]\n (if (isa? (type p) clojure.lang.MapEntry)\n (into [] xs)\n (into (empty p) xs)))\n m))\n(-> (map-vec-zipper [{1 [21 22] 3 [4]}])\n z/down\n (z/edit assoc :e 99)\n z/down\n ;; Note that the map does not guarantee particular entries ordering.\n z/down ;; Getting into map entry. \n z/next\n (z/edit conj 77)\n z/root)\n;;=> [{1 [21 22 77], 3 [4], :e 99}]", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/124476?v=3", :account-source "github", :login "PetrGlad"}], :_id "5845617fe4b0782b632278d3"} {:updated-at 1481023902325, :created-at 1481023619209, :author {:login "PetrGlad", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/124476?v=3"}, :body ";; Get sequence of all visited nodes\n(require '[clojure.zip :as z])\n(->> (z/vector-zip [[1 2] 3 [[4 5]]])\n (iterate z/next)\n (take-while #(not (z/end? %))) ;; Zipper's \"end of iteration\" condition. \n (map z/node))\n;;=> ([[1 2] 3 [[4 5]]] \n;; [1 2] \n;; 1 2\n;; 3 \n;; [[4 5]] \n;; [4 5]\n;; 4 5)", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/124476?v=3", :account-source "github", :login "PetrGlad"}], :_id "5846a083e4b0782b632278d9"}], :notes [{:updated-at 1287977279000, :body "For more info on zippers:\r\n\r\n* [Brian Marick](http://clojuredocs.org/profile/Brian%20Marick): [“Editingâ€� trees in Clojure with clojure.zip](http://www.exampler.com/blog/2010/09/01/editing-trees-in-clojure-with-clojurezip/)\r\n* Alex Miller: [Zippers with records in Clojure](http://tech.puredanger.com/2010/10/22/zippers-with-records-in-clojure/)", :created-at 1287977279000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :_id "542692ecf6e94c6970521f9e"} {:updated-at 1333789044000, :body "Tutorials on zippers:\r\n\r\n* Brian Marick: [\"Editing\" trees in Clojure with clojure.zip](http://www.exampler.com/blog/2010/09/01/editing-trees-in-clojure-with-clojurezip)\r\n\r\n* Alex Miller: [Zippers with records in Clojure](http://tech.puredanger.com/2010/10/22/zippers-with-records-in-clojure/)", :created-at 1333787145000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :_id "542692ecf6e94c6970521fdd"} {:author {:login "PetrGlad", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/124476?v=3"}, :updated-at 1480942234308, :created-at 1480942234308, :body "To work with nested structures you can also use\n* clojure.core/get-in, clojure.core/assoc-in, clojure.core/update-in \n* Balagan library https://github.com/clojurewerkz/balagan\n* Specter library https://github.com/nathanmarz/specter ", :_id "5845629ae4b0782b632278d4"}], :arglists ["branch? children make-node root"], :doc "Creates a new zipper structure. \n\n branch? is a fn that, given a node, returns true if can have\n children, even if it currently doesn't.\n\n children is a fn that, given a branch node, returns a seq of its\n children.\n\n make-node is a fn that, given an existing node and a seq of\n children, returns a new branch node with the supplied children.\n root is the root node.", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/zipper"} {:added "1.0", :ns "clojure.zip", :name "end?", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1455299357645, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "zipper", :ns "clojure.zip"}, :_id "56be1b1de4b0b0491b9ed179"}], :line 258, :examples nil, :notes nil, :arglists ["loc"], :doc "Returns true if loc represents the end of a depth-first walk", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/end_q"} {:added "1.0", :ns "clojure.zip", :name "edit", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1448013007225, :author {:login "damianfijorek", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/963492?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "root", :ns "clojure.zip"}, :_id "564eeccfe4b0be225c0c4797"} {:created-at 1455304694999, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "zipper", :ns "clojure.zip"}, :_id "56be2ff6e4b0b0491b9ed17a"} {:created-at 1574336768778, :author {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/24317401?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "replace", :ns "clojure.zip"}, :_id "5dd67900e4b0ca44402ef7e6"}], :line 210, :examples [{:updated-at 1447940484310, :created-at 1447940484310, :author {:login "damianfijorek", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/963492?v=3"}, :body "(require '[clojure.xml :as xml]\n '[clojure.zip :as zip])\n\n;; get xml with content added to root child\n(let [root (zip/xml-zip (xml/parse-str \"\"))\n child (zip/down root)\n new-child (zip/edit child #(assoc-in % [:content] \"content\"))\n new-root (zip/root new-child)]\n (xml/emit-str new-root))\n;;=> \"content\"", :_id "564dd184e4b0538444398273"}], :notes nil, :arglists ["loc f & args"], :doc "Replaces the node at this loc with the value of (f node args)", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/edit"} {:added "1.0", :ns "clojure.zip", :name "make-node", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos nil, :line 83, :examples [{:updated-at 1559115957031, :created-at 1559073900810, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Useful to perform operations on locations without knowing the\n;; internals of the zipper. For example, here's a generic remove-child to remove\n;; the first children from a node\n(require '[clojure.zip :as zip])\n\n(def vzip\n (zip/vector-zip\n [[1 2]\n [3 4 [5 10 [11 12]]]\n [13 14]]))\n\n(defn remove-child [loc]\n (zip/replace loc \n (zip/make-node loc (zip/node loc) (rest (zip/children loc)))))\n\n(-> vzip zip/down zip/rightmost remove-child zip/root)\n;; [[1 2] [3 4 [5 10 [11 12]]] [14]]", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5ced946ce4b0ca44402ef730"}], :notes nil, :arglists ["loc node children"], :doc "Returns a new branch node, given an existing node and new\n children. The loc is only used to supply the constructor.", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/make-node"} {:added "1.0", :ns "clojure.zip", :name "vector-zip", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1283300922000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "seq-zip", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d72"} {:created-at 1283300949000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "xml-zip", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d73"} {:created-at 1320037497000, :author {:login "Arnoldo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a60ef262d016a9a38f5268e088ab32?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "next", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d74"} {:created-at 1320037502000, :author {:login "Arnoldo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a60ef262d016a9a38f5268e088ab32?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "end?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d75"}], :line 44, :examples [{:author {:login "Arnoldo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a60ef262d016a9a38f5268e088ab32?r=PG&default=identicon"}, :editors [{:login "Arnoldo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a60ef262d016a9a38f5268e088ab32?r=PG&default=identicon"} {:login "Arnoldo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a60ef262d016a9a38f5268e088ab32?r=PG&default=identicon"} {:login "Jules", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/77c985628bea3a3ff10e76cefcc929c4?r=PG&default=identicon"}], :body "\n(require '[clojure.zip :as zip])\n\n(defn zip-map [f loc]\n \" Map f over every node of the zipper.\n The function received has the form (f node-value loc),\n the node value and its location\"\n (loop [z loc]\n (if (zip/end? z)\n (zip/root z) ; perhaps you can call zip/seq-zip or zip/vector-zip?\n (recur (zip/next (zip/edit z f z))))))\n\n;; Multiply by 100 every node in the tree\nuser=> (zip-map (fn [n nx] (if (vector? n) n (* n 100) )) (zip/vector-zip '[5 [10 20 30] [1 2 3] ]))\n;; Be careful! the returned result by zip/root is not a zipper anymore!\n[500 [1000 2000 3000] [100 200 300]]\n", :created-at 1320036944000, :updated-at 1373138099000, :_id "542692d7c026201cdc327144"} {:updated-at 1587100167390, :created-at 1587100167390, :author {:login "funkrider", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/12958644?v=4"}, :body ";; It may not be obvious however it is worth pointing out that \n;; this implementation assumes that all vectors are branches, \n;; and all non vector data is therefore a leaf node. \n\n;; A vector \"Tree\" [5 [10 20 30] [1 2 3]]) can be visualised as\n;;\n;; --- ♦ ---\n;; / | \\\n;; 5 ♦ ♦\n;; / | \\ / | \\\n;; 10 20 30 1 2 3\n\n;; If you want to put data into a branch node for example a binary tree\n;; you can not use the default zip/vector-zip. Rather you need use zip/zipper\n;; and give a new children function to specify where the children are.\n;; See: https://stackoverflow.com/questions/26268098/can-someone-give-an-example-of-how-edit-function-for-clojure-zip-works", :_id "5e993a07e4b087629b5a18d4"}], :notes nil, :arglists ["root"], :doc "Returns a zipper for nested vectors, given a root vector", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/vector-zip"} {:added "1.0", :ns "clojure.zip", :name "node", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos nil, :line 64, :examples [{:author {:login "Victor", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc41ebab54cc0e0fbe99d753876d45ce?r=PG&default=identicon"}, :editors [{:login "Victor", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc41ebab54cc0e0fbe99d753876d45ce?r=PG&default=identicon"} {:login "Victor", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc41ebab54cc0e0fbe99d753876d45ce?r=PG&default=identicon"}], :body "user=>(require '[clojure.zip :as zip])\nnil\nuser=> (def original [1 '(a b c) 2])\n#'user/original\nuser=> (def root-loc (zip/seq-zip (seq original)))\n#'user/root-loc\n\nuser=> (zip/node (zip/down root-loc))\n1\n", :created-at 1291935344000, :updated-at 1291935456000, :_id "542692d1c026201cdc326f32"}], :notes [{:updated-at 1291935491000, :body "See tutorial of clojure.zip at \r\nhttp://www.exampler.com/blog/2010/09/01/editing-trees-in-clojure-with-clojurezip/", :created-at 1291935491000, :author {:login "Victor", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc41ebab54cc0e0fbe99d753876d45ce?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fad"}], :arglists ["loc"], :doc "Returns the node at loc", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/node"} {:added "1.0", :ns "clojure.zip", :name "up", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1283300764000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "down", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cda"} {:created-at 1283300777000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "left", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cdb"} {:created-at 1283300781000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "right", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cdc"} {:created-at 1283300826000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "next", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cdd"} {:created-at 1283300881000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "seq-zip", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cde"} {:created-at 1413255010369, :author {:login "tway24", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/9206853?v=2"}, :to-var {:ns "clojure.zip", :name "zipper", :library-url "https://github.com/clojure/clojure"}, :_id "543c8f62e4b001b88094c7ef"}], :line 123, :examples nil, :notes nil, :arglists ["loc"], :doc "Returns the loc of the parent of the node at this loc, or nil if at\n the top", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/up"} {:added "1.0", :ns "clojure.zip", :name "insert-right", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos nil, :line 193, :examples [{:body ";;; zip is not default required in clj\n(require '[clojure.zip :as zip])\n\n(def root-tree (zip/seq-zip '(:root (:1st-left-child ) (:1st-right-child\n))))\n\n;;; get the location , in this case is the root of the tree\n(def location (-> root-tree zip/next))\n\n\n(zip/insert-right location :inserted)\n\n;; = > [:root\n;; {:changed? true,\n;; :l [],\n;; :pnodes [(:root (:1st-left-child) (:1st-right-child))],\n;; :ppath nil,\n;; :r (:inserted (:1st-left-child) (:1st-right-child))}]", :author {:login "zacyang", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/898449?v=3"}, :created-at 1433170538137, :updated-at 1433170538137, :_id "556c726ae4b03e2132e7d183"}], :notes nil, :arglists ["loc item"], :doc "Inserts the item as the right sibling of the node at this loc,\n without moving", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/insert-right"} {:added "1.0", :ns "clojure.zip", :name "rights", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos nil, :line 102, :examples nil, :notes nil, :arglists ["loc"], :doc "Returns a seq of the right siblings of this loc", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/rights"} {:added "1.0", :ns "clojure.zip", :name "root", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1448013056620, :author {:login "damianfijorek", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/963492?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "edit", :ns "clojure.zip"}, :_id "564eed00e4b0be225c0c4798"}], :line 137, :examples nil, :notes nil, :arglists ["loc"], :doc "zips all the way up and returns the root node, reflecting any\n changes.", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/root"} {:added "1.0", :ns "clojure.zip", :name "next", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1559164398312, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "prev", :ns "clojure.zip"}, :_id "5ceef5eee4b0ca44402ef736"}], :line 230, :examples [{:updated-at 1559164278848, :created-at 1559164278848, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; zip-walk takes a transformation function f and a zipper z.\n;; f takes a location and returns location. Applies f\n;; to the nodes in the zipper maintaining the original nesting.\n\n(require '[clojure.zip :as zip])\n\n(defn zip-walk [f z]\n (if (zip/end? z)\n (zip/root z)\n (recur f (zip/next (f z)))))\n\n(zip-walk\n (fn [loc] \n (if (zip/branch? loc) \n loc \n (zip/edit loc * 2)))\n (zip/vector-zip [1 2 [3 4]]))\n\n;; [2 4 [6 8]]\n", :_id "5ceef576e4b0ca44402ef735"}], :notes nil, :arglists ["loc"], :doc "Moves to the next loc in the hierarchy, depth-first. When reaching\n the end, returns a distinguished loc detectable via end?. If already\n at the end, stays there.", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/next"} {:added "1.0", :ns "clojure.zip", :name "seq-zip", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1283300897000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "xml-zip", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e84"} {:created-at 1283300907000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "vector-zip", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e85"}], :line 35, :examples [{:author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :editors [], :body "user=> (require '[clojure.zip :as zip])\r\nnil\r\nuser=> (def zz (zip/seq-zip '(a b (c d e) (f (g h) i) j)))\r\n#'user/zz\r\nuser=> zz\r\n[(a b (c d e) (f (g h) i) j) nil]", :created-at 1320013293000, :updated-at 1320013293000, :_id "542692d7c026201cdc327143"}], :notes nil, :arglists ["root"], :doc "Returns a zipper for nested sequences, given a root sequence", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/seq-zip"} {:added "1.0", :ns "clojure.zip", :name "insert-left", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1433170800901, :author {:login "zacyang", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/898449?v=3"}, :to-var {:ns "clojure.zip", :name "insert-right", :library-url "https://github.com/clojure/clojure"}, :_id "556c7370e4b03e2132e7d184"}], :line 183, :examples [{:body ";;; zip is not default required in clj\n(require '[clojure.zip :as zip])\n\n(def root-tree (zip/seq-zip '(:root (:1st-left-child ) (:1st-right-child\n))))\n\n;;; get the location , in this case is the root of the tree\n(def location (-> root-tree zip/next))\n\n\n(zip/insert-left location :inserted)\n\n;;; then the :inserted is on the left of the original tree\n;;;=>[:root\n;;; {:changed? true,\n;;; :l [:inserted],\n;;; :pnodes [(:root (:1st-left-child) (:1st-right-child))],\n;;; :ppath nil,\n;;; :r ((:1st-left-child) (:1st-right-child))}]", :author {:login "zacyang", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/898449?v=3"}, :created-at 1433170211818, :updated-at 1433170211818, :_id "556c7123e4b01ad59b65f4ec"}], :notes nil, :arglists ["loc item"], :doc "Inserts the item as the left sibling of the node at this loc,\n without moving", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/insert-left"} {:added "1.0", :ns "clojure.zip", :name "prev", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos nil, :line 246, :examples nil, :notes nil, :arglists ["loc"], :doc "Moves to the previous loc in the hierarchy, depth-first. If already\n at the root, returns nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/prev"} {:added "1.0", :ns "clojure.zip", :name "right", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1455292718902, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "zipper", :ns "clojure.zip"}, :_id "56be012ee4b0b0491b9ed177"}], :line 149, :examples nil, :notes nil, :arglists ["loc"], :doc "Returns the loc of the right sibling of the node at this loc, or nil", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/right"} {:added "1.0", :ns "clojure.zip", :name "lefts", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1358376302000, :author {:login "juan.facorro", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d6f59d93cc17c698f16e550034a2d1ad?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "rights", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b4f"}], :line 96, :examples [{:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [], :body "(def vz (vector-zip [1 2 3 4 5]))\n\n;; root\n;; |________\n;; | | | | |\n;; 1 2[3]4 5\n\n;;go down and then right twice, what's to the left of me now?\n(-> vz down right right lefts)\n=>(1 2)\n\n;;equivalent:\n(-> vz down right right rights)\n=>(4 5)\n\n", :created-at 1329433215000, :updated-at 1329433215000, :_id "542692d7c026201cdc327141"}], :notes nil, :arglists ["loc"], :doc "Returns a seq of the left siblings of this loc", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/lefts"} {:added "1.0", :ns "clojure.zip", :name "xml-zip", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1413924240105, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.xml", :name "parse", :library-url "https://github.com/clojure/clojure"}, :_id "5446c590e4b03d20a1024275"}], :line 53, :examples [{:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [], :body "(def xmlzipper (clojure.zip/xml-zip (clojure.xml/parse \"resources/somedata.xml\")))\n\n;;make a zippper pointing at the children to the topnode in somedata.xml\n(clojure.zip/children xmlzipper)\n\n \n\n\n\n\n", :created-at 1323729937000, :updated-at 1323729937000, :_id "542692d7c026201cdc327148"} {:updated-at 1413924196033, :created-at 1335333199000, :body "(require '[clojure.zip :as z])\n\n;; The following example make use of an xml-tree ...\n;; foo barbar\n;; Notice that the xml-parse will not produce the exact \n;; xml object as the \"foo\" and \"bar\" strings are combined.\n\n;; Travel over the zipper in classic lisp style\n(z/right\n (z/down\n (z/xml-zip \n {:tag :root :content [{:tag :any :content [\"foo\" \"bar\"]} \"bar\"]})))\n\n;;=> [\"bar\" {:l [{:content [\"foo\" \"bar\"], :tag :any}], \n;;+> :pnodes [{:content [{:content [\"foo\" \"bar\"], :tag :any} \"bar\"], :tag :root}],\n;;+> :ppath nil, :r nil}]\n\n;; The above can also be written like this using the thread macro style\n(->{:tag :root :content [{:tag :any :content [\"foo\" \"bar\"]} \"bar\"]}\n z/xml-zip \n z/down \n z/right)\n\n;;=> [\"bar\" {:l [{:content [\"foo\" \"bar\"], :tag :any}], \n;;+> :pnodes [{:content [{:content [\"foo\" \"bar\"], :tag :any} \"bar\"], :tag :root}],\n;;+> :ppath nil, :r nil}]\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=2", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692d7c026201cdc327149"} {:body "(require '[clojure.xml :as xml]\n '[clojure.zip :as zip])\n\n;; Looking at the whole zipper is usually not the goal.\n;; Here is a case where the \"bar\" element is extracted.\n;; The following is derived from the following xml.\n;; foobar\n(->{:tag :root :content [{:tag :any :content [\"foo\"]} \"bar\"]}\n zip/xml-zip\n zip/down\n zip/right\n zip/node)\n;;=> \"bar\"\n\n;; The following shows a slightly larger example including the parser.\n(def data\n \"\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \" )\n\n;; Here is an example of the parser in action\n(def xml-tree\n (-> data \n .getBytes \n java.io.ByteArrayInputStream. \n xml/parse ))\n\n;; Traversing the xml using a zipper\n(-> xml-tree\n zip/xml-zip \n zip/down\n zip/down\n zip/down\n zip/node\n )\n;;=> {:tag :geom, :attrs {:name \"ab1x\"}, :content nil}", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1413923803557, :updated-at 1413923803557, :_id "5446c3dbe4b03d20a1024274"}], :notes [{:body "There are also other libraries for processing xml that provide additional features.\nhttps://github.com/clojure/data.xml", :created-at 1413924401226, :updated-at 1413924401226, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :_id "5446c631e4b0dc573b892fa4"}], :arglists ["root"], :doc "Returns a zipper for xml elements (as from xml/parse),\n given a root element", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/xml-zip"}]} \ No newline at end of file +{:created-at 1691400422810, :description "ClojureDocs Data Export", :vars [{:ns "clojure.core", :name "def", :type "var", :see-alsos [{:created-at 1289040035000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defn", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b15"} {:created-at 1289040039000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "fn", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b16"} {:created-at 1289040051000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defmacro", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b17"} {:created-at 1289040055000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defmulti", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b18"} {:created-at 1421928720188, :author {:login "Gitward", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8510849?v=3"}, :to-var {:ns "clojure.core", :name "defonce", :library-url "https://github.com/clojure/clojure"}, :_id "54c0e910e4b0e2ac61831cce"} {:created-at 1426949770053, :author {:login "ryoakg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/23413?v=3"}, :to-var {:ns "clojure.core", :name "ns-unmap", :library-url "https://github.com/clojure/clojure"}, :_id "550d868ae4b056ca16cfecf8"}], :examples [{:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (def my-val 5)\n#'user/my-val\n\nuser=> my-val\n5", :created-at 1289040027000, :updated-at 1411962925119, :_id "542692cfc026201cdc326e95"} {:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [], :body "user=> (def my-function (fn [x] (* x x x)))\n#'user/my-function\nuser=> (my-function 4)\n64", :created-at 1289040110000, :updated-at 1289040110000, :_id "542692cfc026201cdc326e96"} {:author {:login "puredanger", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/89c8afd032c7b3473f67c9b00d3acd5a?r=PG&default=identicon"}, :editors [{:login "puredanger", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/89c8afd032c7b3473f67c9b00d3acd5a?r=PG&default=identicon"} {:login "pjlegato", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4ce55cfd8b3ae2f63f5ecbc8fc1c05d4?r=PG&default=identicon"} {:login "pjlegato", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4ce55cfd8b3ae2f63f5ecbc8fc1c05d4?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; This is an example of setting a docstring during a def.\n;; (Note that the clojure.repl namespace which contains the\n;; doc function is not loaded by default in Emacs' SLIME mode.)\n\nuser> (def ted-nugent \"The nuge rocks\" 123)\n#'user/ted-nugent\nuser> (doc ted-nugent)\n-------------------------\nuser/ted-nugent\n The nuge rocks\nuser> ted-nugent\n123\n", :created-at 1300830366000, :updated-at 1411962895678, :_id "542692cfc026201cdc326e97"} {:author {:login "jamesqiu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc1268deaa7f2e78fe2b5ea76e6481d8?r=PG&default=identicon"}, :editors [{:login "jamesqiu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc1268deaa7f2e78fe2b5ea76e6481d8?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; give function another name\nuser=> (def sys-map map)\n\n;; give macro another name\nuser=> (def #^{:macro true} sys-loop #'loop)", :created-at 1313515810000, :updated-at 1411962917894, :_id "542692cfc026201cdc326e9b"} {:updated-at 1518778836326, :created-at 1518778836326, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;Assign a Function to a Variable\n\n(def say-hello\n (fn [name]\n (str \"Hello \" name)))\n\n(say-hello \"World\")\n;;\"Hello World\"\n\n\n;;the same but using an anonymous function\n(def say-hello\n #(str \"Hello \" %))\n\n(say-hello \"World\")\n;;\"Hello World\"\n\n\n;;anonymous function using two arguments\n(def hello-doc #(str \"Hello \" %1 %2))\n\n(hello-doc \"Dr.\" \"House\")\n;;\"Hello Dr.House\"\n\n", :_id "5a86b9d4e4b0316c0f44f8c6"} {:updated-at 1640101185494, :created-at 1640101185494, :author {:login "deadghost", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1156996?v=4"}, :body ";; Private var\n(def ^:private foobar\n \"I am the docstring.\"\n \"I am the value.\")\n", :_id "61c1f541e4b0b1e3652d758c"} {:updated-at 1654772119878, :created-at 1654772119878, :author {:login "clojer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/107184681?v=4"}, :body "\n;; function checks: variable = 9 or not\nuser=> (def ?9 #(= % 9))\n#'user/?9\nuser=> (?9 9)\ntrue\nuser=> (?9 5)\nfalse", :_id "62a1d197e4b0b1e3652d75fa"}], :notes nil, :arglists [], :doc "Creates and interns or locates a global var with the name of symbol and a\nnamespace of the value of the current namespace (*ns*). See\nhttp://clojure.org/special_forms for more information.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/def"} {:ns "clojure.core", :name "if", :type "var", :see-alsos [{:created-at 1302510837000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "cond", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e12"} {:created-at 1311797747000, :author {:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "when", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e13"} {:created-at 1334293230000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "if-let", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e14"} {:created-at 1340541172000, :author {:login "jhulten", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b15299ac3f0bf5347d14a1232338b1cd?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "if-not", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e15"} {:created-at 1545243343724, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "when-let", :ns "clojure.core"}, :_id "5c1a8acfe4b0ca44402ef5ed"}], :examples [{:author {:login "Victor", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc41ebab54cc0e0fbe99d753876d45ce?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "(defn is-small? [number]\n (if (< number 100) \"yes\" \"no\"))\n\nuser=> (is-small? 50)\n\"yes\"\n\nuser=> (is-small? 500)\n\"no\"", :created-at 1288222254000, :updated-at 1288871229000, :_id "542692cfc026201cdc326e9d"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; Be aware that the only two values considered \"logical false\" in Clojure\n;; are nil and false, where Clojure's \"false\" is the Java value Boolean/FALSE\n;; under the hood. Everything else is \"logical true\". Particularly surprising\n;; may be that the Java Object with class Boolean and value (Boolean. false) is\n;; considered logical true.\n\n;; This notion of logical true and logical false holds for at least the following\n;; conditional statements in Clojure: if, cond, when, if-let, when-let.\n;; It also applies to functions like filter, remove, and others that use\n;; these conditional statements in their implementation.\n\n;; nil and false are logical false\nuser=> (if nil \"logical true\" \"logical false\")\n\"logical false\"\nuser=> (if false \"logical true\" \"logical false\")\n\"logical false\"\n;; Boolean/FALSE is how Clojure's \"false\" is represented internally.\nuser=> (if Boolean/FALSE \"logical true\" \"logical false\")\n\"logical false\"\n\n;; Everything else that is the value of the condition, including numbers (even 0),\n;; characters, strings (even the empty string), vectors, maps, _and_ a freshly\n;; constructed Boolean class object (Boolean. false), is logical true.\n\nuser=> (if 0 \"logical true\" \"logical false\")\n\"logical true\"\n;; A vector containing nil is not the same as nil.\nuser=> (if [nil] \"logical true\" \"logical false\")\n\"logical true\"\nuser=> (if (first [nil]) \"logical true\" \"logical false\")\n\"logical false\"\n\n;; Bad idea even in Java. See below for more details.\nuser=> (if (Boolean. false) \"logical true\" \"logical false\")\n\"logical true\"\n\n;; Java documentation itself warns:\n;; Note: It is rarely appropriate to use this constructor. Unless a new instance\n;; is required, the static factory valueOf(boolean) is generally a better choice.\n;; It is likely to yield significantly better space and time performance.\n\n;; (boolean x) converts a value to a primitive boolean. It converts nil, false,\n;; and (Boolean. false) to primitive false.\nuser=> (if (boolean (Boolean. false)) \"logical true\" \"logical false\")\n\"logical false\"\n\n;; (Boolean/valueOf ) is similar:\nuser=> (if (Boolean/valueOf (Boolean. false)) \"logical true\" \"logical false\")\n\"logical false\"\n", :created-at 1334293223000, :updated-at 1422027142917, :_id "542692d6c026201cdc3270cc"} {:updated-at 1603184553184, :created-at 1603184553184, :author {:login "agodde", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/18694682?v=4"}, :body ";; if vs. when\n\n;; An if without an else branch...\nuser=> (if true \"then branch\")\n\"then branch\"\nuser=> (if false \"then branch\")\nnil\n\n;; ...is the same as when.\nuser=> (when true \"then branch\")\n\"then branch\"\nuser=> (when false \"then branch\")\nnil\n\n;; Use of when instead of if is recommended in cases where you do not need the else branch.", :_id "5f8ea7a9e4b0b1e3652d73e6"}], :notes [{:author {:login "kimtg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7685905?v=3"}, :updated-at 1441174250945, :created-at 1441174250945, :body "```\nuser=> (doc if)\n-------------------------\nif\n (if test then else?)\nSpecial Form\n Evaluates test. If not the singular values nil or false,\n evaluates and yields then, otherwise, evaluates and yields else. If\n else is not supplied it defaults to nil.\n\n Please see http://clojure.org/special_forms#if\n```\nhttp://clojure.org/special_forms#if", :_id "55e692eae4b0efbd681fbb92"}], :arglists [], :doc "Evaluates test.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/if"} {:ns "clojure.core", :name "do", :type "var", :see-alsos nil, :examples [{:author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; do is used to evaluate multiple expressions in order, usually for the\n;; purpose of evaluating exprs that have side-effects (such as printing\n;; or I/O). do returns the value of its last expression.\n;;\n;; do w/o args returns nil.\n\n=> (do\n (println \"LOG: Computing...\")\n (+ 1 1))\nLOG: Computing...\n2\n\n=> (do)\nnil\n", :created-at 1287999552000, :updated-at 1287999682000, :_id "542692cfc026201cdc326e9f"} {:body ";; `fn` (`defn` by extension) and `let` have an implicit `do`\n\n=> ((fn []\n (println \"Something\") ; printed in stdout\n (str \"Return this\")))\n\"Return this\"\n\n=> (defn do-example []\n (println \"Something\") ; printed in stdout\n (str \"Return this\")))\n=> (do-example)\n\"Return this\"\n\n=> (let [name \"John\"]\n (println \"Something\") ; printed in stdout\n (str \"Hello \" name))\n\"Hello John\"", :author {:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"}, :created-at 1432926921112, :updated-at 1432927054881, :editors [{:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"}], :_id "5568bac9e4b03e2132e7d180"} {:updated-at 1456676930045, :created-at 1456676817498, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body "user=> (if (> 2 1)\n (do\n (print \"2 greater than 1\") ; with 'do' you can extend if block\n true))\n\n;;=>\"2 greater than 1\"\n;;=>true", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3", :account-source "github", :login "ertugrulcetin"}], :_id "56d31fd1e4b0b41f39d96cd6"} {:updated-at 1500223229802, :created-at 1500223229802, :author {:login "joncorr", :account-source "github", :avatar-url "https://avatars6.githubusercontent.com/u/908484?v=4"}, :body ";; Print the result of time without the output of (range 1000)\n\n=> (do (time (range 1000)) nil)", :_id "596b96fde4b0d19c2ce9d6fe"}], :notes nil, :arglists [], :doc "Evaluates the expressions in order and returns the value of the last. If no\nexpressions are supplied, returns nil. See http://clojure.org/special_forms\nfor more information.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/do"} {:ns "clojure.core", :name "quote", :type "var", :see-alsos [{:created-at 1537911884113, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unquote", :ns "clojure.core"}, :_id "5baaac4ce4b00ac801ed9ea7"}], :examples [{:updated-at 1650678469915, :created-at 1293674217000, :body ";; ' is the shortcut for quote\nuser> (= 'a (quote a))\ntrue\n\n;; quoting keeps something from being evaluated\nuser> (quote (println \"foo\"))\n(println \"foo\")\n\n=> *clojure-version*\n{:major 1, :minor 5, :incremental 0, :qualifier \"RC17\"}\n=> (quote)\nnil\n=> (quote 1)\n1\n=> (quote 1 2 3 4 5) ; this worked in Clojure 1.0 through 1.7 but stopped working in 1.8\n1\n=> quote\nCompilerException java.lang.RuntimeException: Unable to resolve symbol: quote in this context, compiling:(NO_SOURCE_PATH:1:42)\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon", :account-source "clojuredocs", :login "AtKaaZ"} {:avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon", :account-source "clojuredocs", :login "AtKaaZ"} {:login "seancorfield", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/43875?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon", :account-source "clojuredocs", :login "dakrone"}, :_id "542692d0c026201cdc326ea2"} {:body ";; Proof that ' is just a syntactic sugar for quote:\nuser=> (macroexpand ''(1 2 3))\n(quote (1 2 3))\n\n;; Two ' must be used because reader processes and removes the first one", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423019653856, :updated-at 1423019653856, :_id "54d18e85e4b081e022073c54"} {:updated-at 1549280175530, :created-at 1549280175530, :author {:login "Bost", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1174677?v=4"}, :body ";; Quote returns the argument you pass it, without evaluation. So:\n;; In the expression `(quote 42)` the argument is the number 42 and...\nuser> (= (quote 42) 42)\ntrue ;; ... it is returned without any evaluation and...\nuser> (= (type (quote 42)) (type 42) java.lang.Long)\ntrue ;; ... as expected, without changing it's type.\n\n;; In the expression `(quote (quote 42))` the argument is the list of two\n;; elements `(quote 42)` ...\nuser> (= (quote (quote 42)) (list (read-string \"quote\") (read-string \"42\")))\ntrue ;; ... and it is returned without any evaluation and...\nuser> (= (type (quote (quote 42))) (type (list \"1st-elem\" \"2nd-elem\"))\n clojure.lang.PersistentList)\ntrue ;; ... again, without changing it's type.", :_id "5c5823afe4b0ca44402ef662"} {:editors [{:login "soulawaker", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/5372217?v=4"}], :body ";; Since clojure 1.9, if all keys in a map have the same namespace qualifier\n;; then the common namespace become the prefix of the map.\nuser> 'org.clojure/clojure\norg.clojure/clojure\n\nuser> '{org.clojure/clojure 3}\n#:org.clojure{clojure 3} ;; expecting {org.clojure/clojure 3} but not\n\nuser> '{org.clojure/clojure 3 :k 8}\n{org.clojure/clojure 3, :k 8} ;; Because of the keys' different namespaces \n\n;; If you want to avoid second case then flip *print-namespace-maps* temporally.\nuser> (binding [*print-namespace-maps* false]\n (pprint '{org.clojure/clojure 3}))\n{org.clojure/clojure 3}\nnil\n\n;; 'This is not a thing about quote. It is about map with key of namespaced keyword.'\n;; (@ShiTianshu's reply is quoted from below link)\n;; To know the detail reason, go to the below link and see the reply of @didibus.\n;; https://clojureverse.org/t/the-quote-special-form-behaves-strangely-on-maps/4879#post_2", :author {:avatar-url "https://avatars2.githubusercontent.com/u/5372217?v=4", :account-source "github", :login "soulawaker"}, :created-at 1569190020566, :updated-at 1569354172296, :_id "5d87f084e4b0ca44402ef7ba"}], :notes [{:updated-at 1289668928000, :body "Quote gives you the unevaluated form. That is:\r\n\r\n
    user=> '(foo bar baz)
    \r\n\r\nWill not attempt to evaluate foo as a function but rather just return the data structure as is (with the three symbols unevaluated).
    ", :created-at 1289662273000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fa3"} {:updated-at 1371659988000, :body "I found this blog post interesting: http://blog.8thlight.com/colin-jones/2012/05/22/quoting-without-confusion.html\r\n\r\nCheers", :created-at 1371659988000, :author {:login "santeron", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/27a696b2606968635d5f4a5c6e2c7871?r=PG&default=identicon"}, :_id "542692edf6e94c6970522006"}], :arglists [], :doc "Yields the unevaluated form. See http://clojure.org/special_forms for more\ninformation.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/quote"} {:ns "clojure.core", :name "var", :type "var", :see-alsos [{:created-at 1289212861000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "meta", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c12"} {:created-at 1289212876000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "symbol", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c13"} {:created-at 1289212908000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "symbol?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c14"} {:created-at 1289212912000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "var?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c15"} {:created-at 1349393081000, :author {:login "eric", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2b0c9ae6f1da9716451e7c86bc87230b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "binding", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c17"} {:created-at 1349393092000, :author {:login "eric", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2b0c9ae6f1da9716451e7c86bc87230b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-redefs", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c18"} {:created-at 1349393097000, :author {:login "eric", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2b0c9ae6f1da9716451e7c86bc87230b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-redefs-fn", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c19"} {:created-at 1349393197000, :author {:login "eric", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2b0c9ae6f1da9716451e7c86bc87230b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "set!", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c1a"} {:created-at 1362015211000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "var-set", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c1b"} {:created-at 1362015214000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "var-get", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c1c"} {:created-at 1362015219000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-local-vars", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c1d"}], :examples [{:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body ";;getting meta-data for a defined symbol (as opposed to what it's pointing to.\n\nuser=> meta\n#\n\nuser=> (var meta)\n#'clojure.core/meta\n\n;; Reader shortcut for var is #'\nuser=> #'meta\n#'clojure.core/meta\n\nuser=> (meta (var meta))\n{:ns #, :name meta, :file \"clojure/core.clj\", :line 178, :arglists ([obj]), :doc \"Returns the metadata of obj, returns nil if there is no metadata.\", :added \"1.0\"}\n", :created-at 1289212848000, :updated-at 1423522981079, :_id "542692d0c026201cdc326ea5"} {:author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :editors [{:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}], :body "=> *clojure-version*\n{:major 1, :minor 5, :incremental 0, :qualifier \"RC17\"}\n=> var\n;CompilerException java.lang.RuntimeException: Unable to resolve symbol: var in this context, compiling:(NO_SOURCE_PATH:1:42) \n=> (var)\n;CompilerException java.lang.NullPointerException, compiling:(NO_SOURCE_PATH:1:1) \n=> (var 1)\n;CompilerException java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.Symbol, compiling:(NO_SOURCE_PATH:1:1) \n=> (var defn)\n#'clojure.core/defn\n=> (var defn 1 2 3 4)\n#'clojure.core/defn\n", :created-at 1362014971000, :updated-at 1362015006000, :_id "542692d6c026201cdc3270d0"} {:editors [{:login "beoliver", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1413969?v=4"}], :body "user> (def a 1)\n#'user/a\n\nuser> (def b (var a))\n#'user/b\n\nuser> (alter-var-root (var a) inc)\n2\n\nuser> (alter-var-root b inc)\n3\n\nuser> (deref b)\n3\n", :author {:avatar-url "https://avatars2.githubusercontent.com/u/1413969?v=4", :account-source "github", :login "beoliver"}, :created-at 1509263736051, :updated-at 1509263779264, :_id "59f58978e4b0a08026c48c80"}], :notes nil, :arglists [], :doc "The symbol must resolve to a var, and the Var object itself (not its value)\nis returned. The reader macro #'x expands to (var x). See\nhttp://clojure.org/special_forms for more information.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/var"} {:ns "clojure.core", :name "recur", :type "var", :see-alsos [{:created-at 1289618026000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "loop", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e3a"} {:created-at 1289618032000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "trampoline", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e3b"}], :examples [{:updated-at 1524485644327, :created-at 1290256018000, :body "(def factorial\n (fn [n]\n (loop [cnt n\n acc 1]\n (if (zero? cnt)\n acc\n (recur (dec cnt) (* acc cnt))\n; in loop cnt will take the value (dec cnt)\n; and acc will take the value (* acc cnt)\n))))", :editors [{:avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon", :account-source "clojuredocs", :login "john.r.woodward"} {:login "allentiak", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1922297?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/a06d0fc5d5b9a1d254e566c1d0e449a8?r=PG&default=identicon", :account-source "clojuredocs", :login "ique"}, :_id "542692d0c026201cdc326ea6"} {:author {:login "ique", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a06d0fc5d5b9a1d254e566c1d0e449a8?r=PG&default=identicon"}, :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/1922297?v=4", :account-source "github", :login "allentiak"}], :body "; A loop that sums the numbers 10 + 9 + 8 + ...\n\n; Set initial values count (cnt) from 10 and down\n(loop [sum 0\n cnt 10]\n ; If count reaches 0 then exit the loop and return sum\n (if (= cnt 0)\n sum\n ; Otherwise add count to sum, decrease count and \n ; use recur to feed the new values back into the loop\n (recur (+ cnt sum) (dec cnt))))", :created-at 1290256169000, :updated-at 1524485722720, :_id "542692d0c026201cdc326ea8"} {:author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :editors [], :body "(loop [i 0] \n (when (< i 5) \n (println i) \n (recur (inc i)); loop i will take this value\n))", :created-at 1342658004000, :updated-at 1342658004000, :_id "542692d6c026201cdc3270d2"} {:author {:login "azkesz", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/467196a4f2498080c9740a81fcbde855?r=PG&default=identicon"}, :editors [{:login "azkesz", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/467196a4f2498080c9740a81fcbde855?r=PG&default=identicon"}], :body "(defn compute-across [func elements value]\n (if (empty? elements)\n value\n (recur func (rest elements) (func value (first elements)))))\n\n(defn total-of [numbers]\n (compute-across + numbers 0))\n\n(defn larger-of [x y]\n (if (> x y) x y))\n\n(defn greatest-of [numbers]\n (compute-across larger-of numbers (first numbers)))", :created-at 1345941881000, :updated-at 1345942092000, :_id "542692d6c026201cdc3270d3"} {:editors [{:login "jdwaterson", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2714395?v=3"}], :body "; Note that recur can be surprising when using variadic functions.\n\n(defn foo [& args]\n (let [[x & more] args]\n (prn x)\n (if more (recur more) nil)))\n\n(defn bar [& args]\n (let [[x & more] args]\n (prn x)\n (if more (bar more) nil)))\n\n; The key thing to note here is that foo and bar are identical, except\n; that foo uses recur and bar uses \"normal\" recursion. And yet...\n\nuser=> (foo :a :b :c)\n:a\n:b\n:c\nnil\n\nuser=> (bar :a :b :c)\n:a\n(:b :c)\nnil\n\n; The difference arises because recur does not gather variadic/rest args\n; into a seq.", :author {:avatar-url "https://avatars.githubusercontent.com/u/2714395?v=3", :account-source "github", :login "jdwaterson"}, :created-at 1442790612342, :updated-at 1442872934681, :_id "55ff3cd4e4b08e404b6c1c7f"} {:updated-at 1443215990041, :created-at 1443215347637, :author {:login "teymuri", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/13352033?v=3"}, :body ";;This will generate the first 1000 Fibonacci numbers \n;;(using incrementing and decrementing): \n\n(loop [res [0 1]]\n (if (>= (count res) 1000)\n res\n (recur (conj res (+' (inc (last res)) (dec (last (butlast res))))))))", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/13352033?v=3", :account-source "github", :login "teymuri"}], :_id "5605b7f3e4b08e404b6c1c82"} {:editors [{:login "clojurianix", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19415437?v=3"}], :body ";; The recursion point can be a 'loop' or a 'fn' method.\n\n(loop [n (bigint 5), accumulator 1]\n (if (zero? n)\n accumulator ; we're done\n (recur (dec n) (* accumulator n))))\n;;=> 120N\n\n\n((fn factorial\n ([n] (factorial n 1))\n\n ([n accumulator]\n (if (zero? n)\n accumulator ; we're done\n (recur (dec n) (* accumulator n)))))\n\n (bigint 5))\n;;=> 120N", :author {:avatar-url "https://avatars.githubusercontent.com/u/19415437?v=3", :account-source "github", :login "clojurianix"}, :created-at 1463825907835, :updated-at 1463826090672, :_id "574035f3e4b0a1a06bdee495"} {:updated-at 1608716871582, :created-at 1608716871582, :author {:login "caumond", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11491686?v=4"}, :body ";; Trailing position could be multiple\n(loop [x 1]\n (println \"x= \" x)\n (cond\n (> x 10) (println \"ending at \" x )\n (even? x) (recur (* 2 x))\n :else (recur (+ x 1))))", :_id "5fe31247e4b0b1e3652d7420"}], :notes nil, :arglists [], :doc "Evaluates the exprs in order, then, in parallel, rebinds the bindings of\nthe recursion point to the values of the exprs. See\nhttp://clojure.org/special_forms for more information.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/recur"} {:ns "clojure.core", :name "throw", :type "var", :see-alsos [{:created-at 1341631202000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "try", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f2e"} {:created-at 1341631204000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "catch", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f2f"} {:created-at 1341631207000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "finally", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f30"} {:created-at 1430235342019, :author {:login "ljosa", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/197881?v=3"}, :to-var {:ns "clojure.core", :name "ex-info", :library-url "https://github.com/clojure/clojure"}, :_id "553fa8cee4b06eaacc9cda7f"} {:created-at 1460277375628, :author {:login "ryoakg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/23413?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ex-data", :ns "clojure.core"}, :_id "570a107fe4b075f5b2c864df"}], :examples [{:author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :editors [], :body "=> (throw (Exception. \"my exception message\"))\njava.lang.Exception: my exception message (NO_SOURCE_FILE:0)\n", :created-at 1288000015000, :updated-at 1288000015000, :_id "542692d0c026201cdc326ea9"} {:editors [{:login "green-coder", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4"}], :body ";; Different types of exception can be thrown\n=> (throw (AssertionError. \"Wrong input.\"))\njava.lang.AssertionError: Wrong input.", :author {:avatar-url "https://avatars3.githubusercontent.com/u/10631263?v=4", :account-source "github", :login "asiegfried"}, :created-at 1501935005004, :updated-at 1533054136477, :_id "5985b59de4b0d19c2ce9d70b"} {:updated-at 1603831007076, :created-at 1603831007076, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/8271291?v=4"}, :body ";; ClojureScript usage\n=> (throw (js/Error. \"something went wrong...\"))", :_id "5f9884dfe4b0b1e3652d73f6"}], :notes nil, :arglists [], :doc "The expr is evaluated and thrown, therefore it should yield an instance of\nsome derivee of Throwable. Please see http://clojure.org/special_forms#throw", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/throw"} {:ns "clojure.core", :name "try", :type "var", :see-alsos [{:created-at 1287995793000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "catch", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f49"} {:created-at 1341631154000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "finally", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f4a"} {:created-at 1341631196000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "throw", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f4b"} {:created-at 1517506079914, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ex-info", :ns "clojure.core"}, :_id "5a734e1fe4b076dac5a728af"} {:created-at 1517506631341, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ex-data", :ns "clojure.core"}, :_id "5a735047e4b076dac5a728b0"}], :examples [{:author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :editors [], :body "=> (try\n (/ 1 0)\n (catch Exception e (str \"caught exception: \" (.getMessage e))))\n\n\"caught exception: Divide by zero\"", :created-at 1287995834000, :updated-at 1287995834000, :_id "542692d0c026201cdc326eaa"} {:author {:login "acagle", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7df8ebcd99fdbdd4a2f7682513897692?r=PG&default=identicon"}, :editors [], :body ";; for Clojurescript use js/Object as type\n(try\n (/ 1 0)\n (catch js/Object e\n (.log js/console e)))", :created-at 1344400343000, :updated-at 1344400343000, :_id "542692d6c026201cdc3270d5"} {:editors [{:login "masmatsum", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8317204?v=4"}], :body ";; Example with multiple catch clauses and a finally clause.\n(try (f)\n (catch SQLException se (prn (.getNextException e)))\n (catch Exception2 e (prn \"Handle generic exception\"))\n (finally (prn \"Release some resource\")))", :author {:avatar-url "https://avatars.githubusercontent.com/u/632775?v=3", :account-source "github", :login "Rovanion"}, :created-at 1463816138311, :updated-at 1633612258613, :_id "57400fcae4b00a9b70be566b"} {:editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :body ";; The catch/finally clause is an implicit do.\n(try\n (/ 1 0)\n (catch Exception ex \n (.printStackTrace ex)\n (str \"caught exception: \" (.getMessage ex))))\n;; java.lang.ArithmeticException: Divide by zero\n;;\tat clojure.lang.Numbers.divide(Numbers.java:163)\n;;\tat clojure.lang.Numbers.divide(Numbers.java:3833)\n;; ...\n;; at main.java:37)\n;;=> \"caught exception: Divide by zero\"\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}, :created-at 1513121596628, :updated-at 1513202809575, :_id "5a30673ce4b0a08026c48cd4"} {:updated-at 1554055517810, :created-at 1554055517810, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :body ";; try multiple expressions\n(try (println \"expression 1\")\n (println \"expression 2\")\n (/ 1 0)\n (println \"expression 4\")\n (catch Exception e (println \"expression 3 throws\")))\n;;=> expression 1\n;;=> expression 2\n;;=> expression 3 throws", :_id "5ca1015de4b0ca44402ef6f4"} {:updated-at 1661740260118, :created-at 1661740260118, :author {:login "Obscerno", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33399601?v=4"}, :body ";; The last value in the body of try will be returned.\n(try \"I will not be returned.\"\n \"I will be returned\"\n (catch Exception e (.getMessage e))\n (finally \"I will also not be returned.\"))\n;; => \"I will be returned\"\n\n;; If there's an exception the last value in the body of catch will be returned.\n(try (throw (RuntimeException.))\n \"I will not be returned\"\n (catch Exception e \"I will be returned\")\n (finally \"I will also not be returned.\"))\n;; => \"I will be returned\"", :_id "630c24e4e4b0b1e3652d765d"}], :notes nil, :arglists [], :doc "The exprs are evaluated and, if no exceptions occur, the value of the last\nis returned. If an exception occurs and catch clauses are provided, each is\nexamined in turn and the first for which the thrown exception is an instance\nof the named class is considered a matching catch clause. If there is a\nmatching catch clause, its exprs are evaluated in a context in which name is\nbound to the thrown exception, and the value of the last is the return value\nof the function. If there is no matching catch clause, the exception\npropagates out of the function. Before returning, normally or abnormally,\nany finally exprs will be evaluated for their side effects. See\nhttp://clojure.org/special_forms for more information.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/try"} {:ns "clojure.core", :name "catch", :type "var", :see-alsos [{:created-at 1287995785000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "try", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ad9"} {:created-at 1288000232000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "finally", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ada"} {:created-at 1517620569282, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "throw", :ns "clojure.core"}, :_id "5a750d59e4b0e2d9c35f740b"} {:created-at 1517620590089, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ex-data", :ns "clojure.core"}, :_id "5a750d6ee4b0e2d9c35f740c"} {:created-at 1517620611031, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ex-info", :ns "clojure.core"}, :_id "5a750d83e4b0e2d9c35f740d"} {:created-at 1518042276700, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "print-stack-trace", :ns "clojure.stacktrace"}, :_id "5a7b7ca4e4b0316c0f44f8a7"}], :examples [{:author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :editors [], :body "=> (try\n (/ 1 0)\n (catch Exception e (str \"caught exception: \" (.getMessage e))))\n\n\"caught exception: Divide by zero\"", :created-at 1287995772000, :updated-at 1287995772000, :_id "542692d0c026201cdc326eae"} {:updated-at 1474647298976, :created-at 1474647298976, :author {:login "JoshAaronJones", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19951591?v=3"}, :body ";; multiple catch clauses which handle different exceptions\n\n=> (let [divisor [2 0 \"clojure\"]]\n (try\n (/ 4 (rand-nth divisor))\n (catch ArithmeticException e\n (println \"Probably trying to divide by zero...\")\n 111)\n (catch ClassCastException e\n (println \"Did you try to do math with a string?\")\n 222)\n (catch Exception e\n (println \"Some other exception, won't be caught in this case...\")\n 333)\n (finally\n (println \"Always executed but won't return a value!\"))))\n\n;; first case\nAlways executed but won't return a value!\n=> 2\n\n;; second case\nProbably trying to divide by zero...\nAlways executed but won't return a value!\n=> 111\n\n;; third case\nDid you try to do math with a string?\nAlways executed but won't return a value!\n=> 222", :_id "57e55502e4b0709b524f050a"} {:updated-at 1482420504337, :created-at 1482420504337, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :body ";; Note that in ClojureScript, one can use (catch :default e ...) to catch any \n;; type of value, roughly equivalent to (catch Exception e ...) in JVM Clojure.\n\n(try\n (/ 2 (rand-nth [0 \"oops\"]))\n (catch :default e ; Note: ClojureScript only!\n (println \"Error!\" e)))\n\n;; This is not currently possible in JVM Clojure, though the ticket CLJ-1293 \n;; proposes adding the same behavior there and has some background info.", :_id "585bf118e4b0123d4c9dfa35"}], :notes nil, :arglists [], :doc "The exprs are evaluated and, if no exceptions occur, the value of the last\nis returned. If an exception occurs and catch clauses are provided, each is\nexamined in turn and the first for which the thrown exception is an instance\nof the named class is considered a matching catch clause. If there is a\nmatching catch clause, its exprs are evaluated in a context in which name is\nbound to the thrown exception, and the value of the last is the return value\nof the function. If there is no matching catch clause, the exception\npropagates out of the function. Before returning, normally or abnormally,\nany finally exprs will be evaluated for their side effects. See\nhttp://clojure.org/special_forms for more information.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/catch"} {:ns "clojure.core", :name "finally", :type "var", :see-alsos [{:created-at 1288000213000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "try", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e23"} {:created-at 1288000217000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "catch", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e24"} {:created-at 1517617085736, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ex-data", :ns "clojure.core"}, :_id "5a74ffbde4b0e2d9c35f7406"} {:created-at 1517620981684, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "throw", :ns "clojure.core"}, :_id "5a750ef5e4b0e2d9c35f7410"}], :examples [{:updated-at 1317221828000, :created-at 1288260604000, :body "(try\n (/ 1 0)\n (catch ArithmeticException e (str \"caught exception: \" (.getMessage e)))\n (finally (prn \"final exception.\")))\n\"final exception.\"\n\"caught exception: Divide by zero\"", :editors [{:avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon", :account-source "clojuredocs", :login "philos99"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692d0c026201cdc326eaf"} {:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; finally will always run before returning, even if there is no exception.\n(try\n (+ 1 1)\n (catch ArithmeticException e (str \"caught exception: \" (.getMessage e)))\n (finally (prn \"final print.\")))\n\"final print.\"\n2\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4", :account-source "github", :login "huahaiy"}, :created-at 1592604689313, :updated-at 1663143524487, :_id "5eed3811e4b0b1e3652d7309"}], :notes nil, :arglists [], :doc "The exprs are evaluated and, if no exceptions occur, the value of the last\nis returned. If an exception occurs and catch clauses are provided, each is\nexamined in turn and the first for which the thrown exception is an instance\nof the named class is considered a matching catch clause. If there is a\nmatching catch clause, its exprs are evaluated in a context in which name is\nbound to the thrown exception, and the value of the last is the return value\nof the function. If there is no matching catch clause, the exception\npropagates out of the function. Before returning, normally or abnormally,\nany finally exprs will be evaluated for their side effects. See\nhttp://clojure.org/special_forms for more information.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/finally"} {:ns "clojure.core", :name ".", :type "var", :see-alsos [{:created-at 1461732266533, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "..", :ns "clojure.core"}, :_id "572043aae4b0fc95a97eab5c"}], :examples [{:updated-at 1514391136118, :created-at 1461732237604, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=3"}, :body "(def date (java.util.Date.))\n;; => #'date\n(. date getMonth)\n;; => 11 ; 0-based, so this indicates \"December\"", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/430319?v=4", :account-source "github", :login "jcburley"}], :_id "5720438de4b0fc95a97eab5a"} {:updated-at 1471001203866, :created-at 1471001203866, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body "user=> (. \"abc\" (toUpperCase)) \n;;=> \"ABC\"\n\nuser=> (. \"abc\" toUpperCase) \n;;=> \"ABC\"\n;;if function has one arg you can use non-parenthesis form\n\n", :_id "57adb273e4b0bafd3e2a04f0"} {:updated-at 1555179101611, :created-at 1555175138250, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; '.' For static access\n(. Thread sleep 1000) ; static method of 1 arg.\n(. Math random) ; static field access first, static method of no args next.\n(. Math (random)) ; static method of no args (unambiguously).\n(. Math -PI) ; static field access (unambiguously).\n(. Thread$State NEW) ; inner class static method.\n\n;; Corresponding slashed forms are converted internally to dotted:\n(Thread/sleep 1000) ; static method of 1 arg.\n(Math/random) ; static field access first, static method of no args next.\n(Math/-PI) ; static field access (unambiguously).\n\n;; For instance access \n(import 'java.awt.Point)\n(. (Point. 1 2) x) ; instance field first, method of no args next\n(.x (Point. 1 2)) ; same as above\n(. (Point. 1 2) (getX)) ; instance method (unambiguously)\n(.-x (Point. 1 2)) ; instance field (unambiguously)\n\n;; Showing how to compose names dynamically\n(eval `(. (Point. 1 2) ~(symbol (str \"get\" \"X\"))))\n;; 1.0", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5cb216e2e4b0ca44402ef708"}], :notes nil, :arglists [], :doc "The '.' special form is the basis for access to Java. It can be considered\na member-access operator, and/or read as 'in the scope of'. See\nhttp://clojure.org/special_forms for more information.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/_."} {:ns "clojure.core", :name "set!", :type "var", :see-alsos [{:created-at 1361164008000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "reset!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dc5"} {:created-at 1361164022000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "binding", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dc6"} {:created-at 1361164032000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "alter-var-root", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dc7"} {:created-at 1546021427673, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "atom", :ns "clojure.core"}, :_id "5c266a33e4b0ca44402ef603"}], :examples [{:author {:login "ninjudd", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7ced25585a7556e9b9b975c1f9e136e3?r=PG&default=identicon"}, :editors [], :body "(set! var-symbol expr)", :created-at 1307137727000, :updated-at 1307137727000, :_id "542692d0c026201cdc326ead"} {:author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :editors [], :body "(set! *warn-on-reflection* true)", :created-at 1361163932000, :updated-at 1361163932000, :_id "542692d6c026201cdc3270d6"} {:updated-at 1552509115019, :created-at 1552509115019, :author {:login "nhlx2", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4058121?v=4"}, :body "user=> (let [object (java.awt.Point. 1 2)]\n (set! (. object -y) 8)\n (bean object)\n )\n{:class java.awt.Point, :location #object[java.awt.Point 0x383fc59b \"java.awt.Point[x=1,y=8]\"], :x 1.0, :y 8.0}\n", :_id "5c8968bbe4b0ca44402ef6b4"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; A mutable (and thread unsafe) Counter class.\n;; set! is used to mutate the internal cnt attribute.\n\n(deftype Counter [^:unsynchronized-mutable cnt]\n clojure.lang.IFn\n (invoke [this] (set! cnt (inc cnt))))\n\n(def counter (->Counter 0))\n(counter) ;; 1\n(counter) ;; 2", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1554278192236, :updated-at 1554278208406, :_id "5ca46730e4b0ca44402ef6fb"}], :notes [{:updated-at 1298369674000, :body "As of Clojure 1.2, the basic info for set! has moved to http://clojure.org/vars.", :created-at 1298369674000, :author {:login "gregg-williams", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/58610a64fc8638eec8d2239d80d4046f?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fb3"}], :arglists [], :doc "Assignment special form. When the first operand is a field member access\nform, the assignment is to the corresponding field. If it is an instance\nfield, the instance expr will be evaluated, then the expr. In all cases\nthe value of expr is returned. Note - you cannot assign to function params\nor local bindings. Only Java fields, Vars, Refs and Agents are mutable in\nClojure. See http://clojure.org/special_forms for more information.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/set!"} {:ns "clojure.core", :name "monitor-enter", :type "var", :see-alsos nil, :examples nil, :notes [{:body "\"should be avoided\". OK. But why is it available? How might it be used?\n\nhttp://stackoverflow.com/questions/36485155/use-locking-macro-or-monitor-enter-and-monitor-exit-in-java-from-clojure/36485607", :created-at 1461052938480, :updated-at 1461053268343, :author {:avatar-url "https://avatars.githubusercontent.com/u/11754710?v=3", :account-source "github", :login "terjedahl"}, :_id "5715e60ae4b0fc95a97eab4e"}], :arglists [], :doc "A synchronization primitive that should be avoided in user code. Use the\nlocking macro. See http://clojure.org/special_forms for more information.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/monitor-enter"} {:ns "clojure.core", :name "monitor-exit", :type "var", :see-alsos nil, :examples nil, :notes nil, :arglists [], :doc "A synchronization primitive that should be avoided in user code. Use the\nlocking macro. See http://clojure.org/special_forms for more information.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/monitor-exit"} {:ns "clojure.core", :name "new", :type "var", :see-alsos [{:created-at 1352083329000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name ".", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bf1"}], :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; Create a Java ArrayList using the 0 argument constructor\nuser=> (def a (new java.util.ArrayList))\n#'user/a\nuser=> (.add a \"aaa\")\ntrue\nuser=> (.add a \"bbb\")\ntrue\nuser=> a\n#\n", :created-at 1313491605000, :updated-at 1313491605000, :_id "542692d0c026201cdc326eab"} {:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; Create another ArrayList and add integers using the doto macro\nuser=> (def ai (doto (new java.util.ArrayList) (.add 1) (.add 2) (.add 0)))\n#'user/ai\nuser=> ai\n#", :created-at 1313491629000, :updated-at 1313491629000, :_id "542692d0c026201cdc326eac"}], :notes nil, :arglists [], :doc "Instantiate a class. See http://clojure.org/java_interop#new for\nmore information.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/new"} {:ns "clojure.core", :name "primitives-classnames", :file "clojure/core_print.clj", :type "var", :column 1, :see-alsos nil, :line 372, :examples [{:body "user=> (use 'clojure.pprint)\nuser=> (pprint primitives-classnames)\n{float \"Float/TYPE\",\n int \"Integer/TYPE\",\n long \"Long/TYPE\",\n boolean \"Boolean/TYPE\",\n char \"Character/TYPE\",\n double \"Double/TYPE\",\n byte \"Byte/TYPE\",\n short \"Short/TYPE\"}", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423019236792, :updated-at 1423019236792, :_id "54d18ce4e4b081e022073c53"}], :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/primitives-classnames"} {:added "1.0", :ns "clojure.core", :name "+'", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1412881252224, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "+", :library-url "https://github.com/clojure/clojure"}, :_id "5436db64e4b06dbffbbb00c0"} {:created-at 1423526974611, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "unchecked-add", :library-url "https://github.com/clojure/clojure"}, :_id "54d94c3ee4b081e022073c83"}], :line 972, :examples [{:body "(+')\n;;=> 0\n\n(+' 1)\n;;=> 1\n\n(+' -10)\n;;=> -10\n\n(+' 1 2)\n;;=> 3\n\n(+' 1 2 3)\n;;=> 6\n\n(apply + (range 10000000000000 10000000001000))\n;; ArithmeticException: integer overflow\n\n(apply +' (range 10000000000000 10000000001000))\n;;=> 1000000000499500", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1412881234729, :updated-at 1412881548215, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :_id "5436db52e4b0ae7956031576"} {:body "(class 1)\n;; => java.lang.Long\n\n(+ 1 Long/MAX_VALUE)\n;; => java.lang.ArithmeticException: integer overflow\n;; Numbers.java:1388 clojure.lang.Numbers.throwIntOverflow\n;; Numbers.java:1687 clojure.lang.Numbers.add\n\n(+' 1 Long/MAX_VALUE)\n;; => 9223372036854775808N\n\n(class (+' 1 Long/MAX_VALUE))\n;; => clojure.lang.BigInt\n", :author {:login "yangwansu", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/89217?v=3"}, :created-at 1422876391721, :updated-at 1422876391721, :_id "54cf5ee7e4b081e022073c3e"}], :notes nil, :arglists ["" "x" "x y" "x y & more"], :doc "Returns the sum of nums. (+') returns 0. Supports arbitrary precision.\n See also: +", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/+'"} {:added "1.0", :ns "clojure.core", :name "decimal?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1496006134313, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "bigdec?", :ns "clojure.core"}, :_id "592b3df6e4b093ada4d4d78b"} {:created-at 1496006153201, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "double?", :ns "clojure.core"}, :_id "592b3e09e4b093ada4d4d78c"} {:created-at 1496006158570, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "float?", :ns "clojure.core"}, :_id "592b3e0ee4b093ada4d4d78d"}], :line 3598, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [], :body "user=> (decimal? 1)\nfalse\n\nuser=> (decimal? 1.0)\nfalse\n\nuser=> (decimal? 1M)\ntrue\n\nuser=> (decimal? 99999999999999999999999999999999999)\nfalse\n\nuser=> (decimal? 1.0M)\ntrue", :created-at 1286508904000, :updated-at 1286508904000, :_id "542692cbc026201cdc326bd0"}], :notes nil, :arglists ["n"], :doc "Returns true if n is a BigDecimal", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/decimal_q"} {:added "1.2", :ns "clojure.core", :name "restart-agent", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1326769275000, :author {:login "Mark", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4d7c9ac1dd03a71c7d6b548e80c9d4f9?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "agent-error", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b32"} {:created-at 1326769279000, :author {:login "Mark", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4d7c9ac1dd03a71c7d6b548e80c9d4f9?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "agent", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b33"}], :line 2177, :examples [{:updated-at 1497900418842, :created-at 1497900418842, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/7083783?v=3"}, :body "(deftest t-rstart\n (future (println \"running in a thread...\"))\n (let [agt (agent 0)\n\n ; This doesn't work\n h01 (fn [a e]\n (println :10 \"agent error found:\" )\n (println :11 \"restarting agent...\")\n (restart-agent a 100)\n (Thread/sleep 100)\n (println :12 \"agent restarted, state=\" @a))\n\n ; This works. Need to call restart-agent in a separate thread\n h02 (fn [a e]\n (println :20 \"agent error found:\" )\n (future\n (println :21 \"restarting agent...\")\n (restart-agent a 200)\n (println :22 \"agent restarted, state=\" @a))) ;=> 200\n ]\n (set-error-handler! agt h02)\n (send agt inc)\n (Thread/sleep 100) (println :01 @agt) ;=> 1\n (Thread/sleep 100) (send agt #(/ % 0))\n (Thread/sleep 100) (println :02 @agt) ;=> 200\n (Thread/sleep 100) (send agt inc)\n (Thread/sleep 100) (println :03 @agt) ;=> 201\n))\n\n; Output\n; running in a thread...\n; :01 1\n; :20 agent error found:\n; :21 restarting agent...\n; :22 agent restarted, state= 200\n; :02 200\n; :03 201\n", :_id "59482582e4b06e730307db3b"}], :notes nil, :arglists ["a new-state & options"], :doc "When an agent is failed, changes the agent state to new-state and\n then un-fails the agent so that sends are allowed again. If\n a :clear-actions true option is given, any actions queued on the\n agent that were being held while it was failed will be discarded,\n otherwise those held actions will proceed. The new-state must pass\n the validator if any, or restart will throw an exception and the\n agent will remain failed with its old state and error. Watchers, if\n any, will NOT be notified of the new state. Throws an exception if\n the agent is not failed.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/restart-agent"} {:added "1.0", :ns "clojure.core", :name "sort-by", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1302917800000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sort", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ca1"} {:created-at 1361334368000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "compare", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ca2"}], :line 3119, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user=> (sort-by count [\"aaa\" \"bb\" \"c\"])\n(\"c\" \"bb\" \"aaa\")\n\nuser=> (sort-by first [[1 2] [2 2] [2 3]]) \n([1 2] [2 2] [2 3])\n\nuser=> (sort-by first > [[1 2] [2 2] [2 3]]) \n([2 2] [2 3] [1 2])", :created-at 1281552743000, :updated-at 1423276838828, :_id "542692cbc026201cdc326c28"} {:author {:login "kotarak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (sort-by :rank [{:rank 2} {:rank 3} {:rank 1}])\n({:rank 1} {:rank 2} {:rank 3})", :created-at 1281554134000, :updated-at 1332949762000, :_id "542692cbc026201cdc326c2a"} {:updated-at 1465979342950, :created-at 1305342274000, :body "(def x [{:foo 2 :bar 11}\n {:bar 99 :foo 1}\n {:bar 55 :foo 2}\n {:foo 1 :bar 77}])\n\n;sort by :foo, and where :foo is equal, sort by :bar\n(sort-by (juxt :foo :bar) x)\n;=>({:foo 1, :bar 77} {:bar 99, :foo 1} {:foo 2, :bar 11} {:bar 55, :foo 2})", :editors [{:avatar-url "https://www.gravatar.com/avatar/d1906fc5df2c8ce5b2d58cc6ea855aab?r=PG&default=identicon", :account-source "clojuredocs", :login "shuaybi"} {:avatar-url "https://www.gravatar.com/avatar/47018db2b156f6c7f606950e19cf6134?r=PG&default=identicon", :account-source "clojuredocs", :login "ordnungswidrig"} {:login "bfontaine", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1334295?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/d1906fc5df2c8ce5b2d58cc6ea855aab?r=PG&default=identicon", :account-source "clojuredocs", :login "shuaybi"}, :_id "542692cbc026201cdc326c2c"} {:author {:login "jamesqiu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc1268deaa7f2e78fe2b5ea76e6481d8?r=PG&default=identicon"}, :editors [], :body "(def x [{:foo 2 :bar 11}\n {:bar 99 :foo 1}\n {:bar 55 :foo 2}\n {:foo 1 :bar 77}])\n; sort-by given key order (:bar)\n(def order [55 77 99 11])\n(sort-by \n #((into {} (map-indexed (fn [i e] [e i]) order)) (:bar %)) \n x)\n;=> ({:bar 55, :foo 2} {:foo 1, :bar 77} {:bar 99, :foo 1} {:foo 2, :bar 11})", :created-at 1313489274000, :updated-at 1313489274000, :_id "542692cbc026201cdc326c2f"} {:author {:login "Yogthos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a2640fb40f901598b3789ac2f5c5b701?r=PG&default=identicon"}, :editors [{:login "Yogthos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a2640fb40f901598b3789ac2f5c5b701?r=PG&default=identicon"}], :body ";sort entries in a map by value\nuser=> (sort-by val > {:foo 7, :bar 3, :baz 5})\n([:foo 7] [:baz 5] [:bar 3])", :created-at 1327752237000, :updated-at 1327752286000, :_id "542692d5c026201cdc327090"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; Warning: You can sort a Java array and get back a sorted immutable Clojure\n;; data structure, but it will also change the input Java array, by sorting it.\n;; Copy the array before sorting if you want to avoid this.\n\nuser=> (def x (to-array [32 -5 4 11]))\n#'user/x\n\nuser=> (seq x)\n(32 -5 4 11)\n\nuser=> (def y (sort-by - x))\n#'user/y\n\n;; Return sorted sequence\nuser=> y\n(32 11 4 -5)\n\n;; but also modifies x, because it used the array to do the sorting.\nuser=> (seq x)\n(32 11 4 -5)\n\n;; One way to avoid this is copying the array before sorting:\nuser=> (def y (sort-by - (aclone x)))\n#'user/y", :created-at 1331771914000, :updated-at 1332833698000, :_id "542692d5c026201cdc327092"} {:body ";;; from the joy of clojure 2nd\n;;; function as arguments\n\n(def plays [{:band \"Burial\", :plays 979, :loved 9}\n {:band \"Eno\", :plays 2333, :loved 15}\n {:band \"Bill Evans\", :plays 979, :loved 9}\n {:band \"Magma\", :plays 2665, :loved 31}])\n\n(def sort-by-loved-ratio (partial sort-by #(/ (:plays %) (:loved %))))\n\n(sort-by-loved-ratio plays)\n\n;=> ({:band \"Magma\", :plays 2665, :loved 31}\n {:band \"Burial\", :plays 979, :loved 9}\n {:band \"Bill Evans\", :plays 979, :loved 9}\n {:band \"Eno\", :plays 2333, :loved 15})\n\n\n;;; others.\n(sort-by second [[:a 7], [:c 13], [:b 21]])\n;;=> ([:a 7] [:c 13] [:b 21])\n\n(sort-by str [\"z\" \"x\" \"a\" \"aa\" 1 5 8])\n;;=> (1 5 8 \"a\" \"aa\" \"x\" \"z\")\n\n(sort-by :age [{:age 99}, {:age 13}, {:age 7}])\n;;=> ({:age 7} {:age 13} {:age 99})", :author {:login "foxlog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/150418?v=3"}, :created-at 1429710293523, :updated-at 1429710293523, :_id "5537a5d5e4b033f34014b770"} {:updated-at 1551027269645, :created-at 1471045254496, :author {:login "egracer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4086884?v=3"}, :body ";; you can pass a comparator to specify the order to sort in\n\n;; typical sort, low to high\n(sort-by :value [{:value 1 :label \"a\"} {:value 3 :label \"c\"} {:value 2 :label \"b\"}])\n;=> ({:value 1, :label \"a\"} {:value 2, :label \"b\"} {:value 3, :label \"c\"})\n\n;; override the default comparator to sort high to low\n(sort-by :value #(> %1 %2) [{:value 1 :label \"a\"} {:value 3 :label \"c\"} {:value 2 :label \"b\"}])\n;=> ({:value 3 :label \"c\"} {:value 2, :label \"b\"} {:value 1, :label \"a\"})\n\n;; sort-by behavior when :value is absent\n(sort-by :value [{:value 1 :label \"a\"} {:label \"c\"} {:value 2 :label \"b\"}])\n=> ({:label \"c\"} {:value 1, :label \"a\"} {:value 2, :label \"b\"})\n\n;; now if you provide custom comparator when :value is absent you will get NullPointerException\n(sort-by :value #(> %1 %2) [{:value 1 :label \"a\"} {:label \"c\"} {:value 2 :label \"b\"}])\n=> Execution error (NullPointerException) at user/eval1515$fn (form-init71750676547201835.clj:1).\nnull\n\n;; make above working by simple or; considering absence of \"value\" as invaluable or highest value :)\n(sort-by :value #(> (or %1 Integer/MAX_VALUE) (or %2 Integer/MAX_VALUE)) [{:value 1 :label \"a\"} {:label \"c\"} {:value 2 :label \"b\"}])\n=> ({:label \"c\"} {:value 2, :label \"b\"} {:value 1, :label \"a\"})", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/4086884?v=3", :account-source "github", :login "egracer"} {:login "gautamr", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/70894?v=4"}], :_id "57ae5e86e4b0bafd3e2a04f1"} {:editors [{:login "overset", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/34342?v=3"}], :body ";; to sort by nested hash-map values\n;; with the help of get-in and custom comparator\n\n> (sort-by #(get-in (val %) [:price]) {:chair {:price 10} :table {:price 9} :lamp {:price 9}})\n;;=> ([:table {:price 9}] [:lamp {:price 9}] [:chair {:price 10}])\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/34342?v=3", :account-source "github", :login "overset"}, :created-at 1488583557264, :updated-at 1488842435985, :_id "58b9fb85e4b01f4add58fe69"} {:updated-at 1557361208644, :created-at 1557361208644, :author {:login "fdhenard", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/884972?v=4"}, :body ";; sort-by descending (reverse)\n\nuser=> (sort-by :rank #(compare %2 %1) [{:rank 2} {:rank 3} {:rank 1}])\n({:rank 3} {:rank 2} {:rank 1})", :_id "5cd37238e4b0ca44402ef71d"} {:editors [{:login "cgaustin", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/16307176?v=4"}], :body ";; Warning: sort-by will not apply the keyfn on coll's of length 1\n\nuser=> (sort-by (fn [i] (nth i) 4) [[1 2 3]])\n([1 2 3])\n\nuser=> (nth [1 2 3] 4)\n; IndexOutOfBoundsException clojure.lang.PersistentVector.arrayFor (PersistentVector.java:158)...", :author {:avatar-url "https://avatars2.githubusercontent.com/u/16307176?v=4", :account-source "github", :login "cgaustin"}, :created-at 1602184227139, :updated-at 1602184337489, :_id "5f7f6423e4b0b1e3652d73cf"} {:editors [{:login "naxels", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3195443?v=4"}], :body ";; Using comp as a way to sort descending\n(def unordered '({:created_at 1612637437}\n {:created_at 1610998684}\n {:created_at 1622245799}))\n\n(sort-by (comp - :created_at) unordered)\n;;=> ({:created_at 1622245799} {:created_at 1612637437} {:created_at 1610998684})\n\n;; Note: using the negative - as a comparator won't work\n;; so you need to combine the functions\n;; same example without comp:\n(sort-by #(- (:created_at %)) unordered)\n;;=> ({:created_at 1622245799} {:created_at 1612637437} {:created_at 1610998684})", :author {:avatar-url "https://avatars.githubusercontent.com/u/3195443?v=4", :account-source "github", :login "naxels"}, :created-at 1622382371391, :updated-at 1622382870076, :_id "60b39723e4b0b1e3652d7504"}], :notes nil, :arglists ["keyfn coll" "keyfn comp coll"], :doc "Returns a sorted sequence of the items in coll, where the sort\n order is determined by comparing (keyfn item). If no comparator is\n supplied, uses compare. comparator must implement\n java.util.Comparator. Guaranteed to be stable: equal elements will\n not be reordered. If coll is a Java array, it will be modified. To\n avoid this, sort a copy of the array.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/sort-by"} {:added "1.0", :ns "clojure.core", :name "macroexpand", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1284957731000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "macroexpand-1", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d2e"} {:created-at 1304099187000, :author {:login "pauldoo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5cb916d3c8abc9f45a093209e72489fb?r=PG&default=identicon"}, :to-var {:ns "clojure.walk", :name "macroexpand-all", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d2f"}], :line 4026, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [], :body ";; It is useful to combine macroexpand with pprint as the\n;; default output can be hard to read.\nuser=> (clojure.pprint/pprint (macroexpand '(time (print \"timing\"))))\n(let*\n [start__3917__auto__\n (. java.lang.System (clojure.core/nanoTime))\n ret__3918__auto__\n (print \"timing\")]\n (clojure.core/prn\n (clojure.core/str\n \"Elapsed time: \"\n (clojure.core//\n (clojure.core/double\n (clojure.core/-\n (. java.lang.System (clojure.core/nanoTime))\n start__3917__auto__))\n 1000000.0)\n \" msecs\"))\n ret__3918__auto__)\n\n;; Even after pretty printing you may benefit from some\n;; manual cleanup.\n\n;; Also worth noting that most of the time macroexpand-1 is\n;; a better alternative to avoid over expanding down too \n;; many levels.", :created-at 1286272649000, :updated-at 1286272649000, :_id "542692ccc026201cdc326c5e"} {:author {:login "BertrandDechoux", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/528360?v=3"}, :editors [{:login "raxod502", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6559064?v=3"}], :body "user=> (macroexpand '(-> c (+ 3) (* 2))) \n(* (+ c 3) 2)\n", :created-at 1339248908000, :updated-at 1457991523840, :_id "542692d4c026201cdc326ff9"}], :notes nil, :arglists ["form"], :doc "Repeatedly calls macroexpand-1 on form until it no longer\n represents a macro form, then returns it. Note neither\n macroexpand-1 nor macroexpand expand macros in subforms.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/macroexpand"} {:added "1.0", :ns "clojure.core", :name "ensure", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1299215930000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "commute", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bfa"} {:created-at 1299215941000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref-set", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bfb"} {:created-at 1364879934000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bfc"} {:created-at 1371688442000, :author {:login "juan.facorro", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d6f59d93cc17c698f16e550034a2d1ad?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "alter", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bfd"}], :line 2488, :examples [{:updated-at 1553541533678, :created-at 1553536468220, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Count votes to elect the favorite color.\n;; Batches of votes are processed concurrently using a map of shared refs.\n;; The competition stops immediately if there are more than 3 \"honeypots\" votes.\n;; \"ensure\" ensures other transactions cannot change the honeypot count,\n;; guaranteeing no votes are counted after a possible fraud.\n\n(def colors\n {:blue (ref 0)\n :green (ref 0)\n :red (ref 0)\n :honeypots (ref 0)})\n\n(defn batch [prefs]\n (future\n (dosync\n (ensure (:honeypots colors))\n (doseq [color prefs\n :while (< @(:honeypots colors) 3)]\n (update colors color commute inc)))))\n\n(let [b1 (batch [:red :honeypots :green :blue :blue :red :honeypots])\n b2 (batch [:green :blue :blue :green :red :blue :red :red])\n b3 (batch [:honeypots :blue :red :red :blue :green :green :red])]\n [@b1 @b2 @b3]\n {:total-votes (reduce + (map deref (vals colors)))\n :winner (ffirst (sort-by (comp deref second) > colors))\n :fraud? (= @(:honeypots colors) 3)})\n\n;; {:total-votes 16, :winner :blue, :fraud? true}", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5c9915d4e4b0ca44402ef6c2"}], :notes [{:updated-at 1299280980000, :body "This is for preventing [write skew](http://clojure.higher-order.net/?p=50), which Clojure's concurrency model is susceptible to. If you have a transaction where several refs' values must remain in some consistent relationship to each other, but you are only writing to some of them, you should use ensure on the other refs to prevent other transactions from writing to them in the meantime.", :created-at 1299215917000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fb6"} {:author {:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}, :updated-at 1574323395658, :created-at 1574323395658, :body "The doc string says:\n\n> Allows for more concurrency than (ref-set ref @ref)\n\nWhat it doesn’t say is that `ensure` may degrade performance very seriously, as\nit is prone to livelock: see\n[CLJ-2301](https://clojure.atlassian.net/projects/CLJ/issues/CLJ-2301).\n`(ref-set ref @ref)` is certainly more reliable than `(ensure ref)`.\n", :_id "5dd644c3e4b0ca44402ef7e1"}], :arglists ["ref"], :doc "Must be called in a transaction. Protects the ref from modification\n by other transactions. Returns the in-transaction-value of\n ref. Allows for more concurrency than (ref-set ref @ref)", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ensure"} {:ns "clojure.core", :name "chunk-first", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1443934291486, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-next", :ns "clojure.core"}, :_id "5610b053e4b08e404b6c1c93"} {:created-at 1443934297249, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-rest", :ns "clojure.core"}, :_id "5610b059e4b0686557fcbd44"}], :line 701, :examples [{:updated-at 1443934874463, :created-at 1443934874463, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :body "(let [chunked-cons (seq (range 1 42))\n first-chunk (chunk-first chunked-cons)]\n\n (class chunked-cons)\n ;; => clojure.lang.ChunkedCons\n\n (class first-chunk)\n ;; clojure.lang.ArrayChunk\n\n ;; Demonstrating chunk size of 32.\n (.nth first-chunk 0)\n ;; => 1\n (.nth first-chunk 31)\n ;; => 32\n)", :_id "5610b29ae4b08e404b6c1c94"}], :notes nil, :tag "clojure.lang.IChunk", :arglists ["s"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/chunk-first"} {:added "1.7", :ns "clojure.core", :name "eduction", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1496674622028, :author {:login "vspinu", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1363467?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "transduce", :ns "clojure.core"}, :_id "5935713ee4b06e730307db2a"} {:created-at 1496674683706, :author {:login "vspinu", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1363467?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reduce", :ns "clojure.core"}, :_id "5935717be4b06e730307db2b"} {:created-at 1496674762346, :author {:login "vspinu", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1363467?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reductions", :ns "clojure.core"}, :_id "593571cae4b06e730307db2c"} {:created-at 1520634073209, :author {:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "sequence", :ns "clojure.core"}, :_id "5aa308d9e4b0316c0f44f918"}], :line 7694, :examples [{:editors [{:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"} {:login "JoshAaronJones", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19951591?v=3"} {:avatar-url "https://avatars0.githubusercontent.com/u/1363467?v=3", :account-source "github", :login "vspinu"} {:login "Bost", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1174677?v=4"}], :body ";; `eduction` calls the stack of transformers on each element, each time.\n;; `->>` calls the transformer named 'left' on a collection, then the transformer\n;; named 'right' on the result, etc.\n\n(def cnt (atom nil))\n\n;; inc with debugging output\n(defn inc-with-print [fn-id coll-idx x]\n (printf \";; fn-id: %s; coll-idx: %s; cnt: %s; x: %s\\n\" fn-id coll-idx @cnt x)\n (swap! cnt inc)\n (inc x))\n\n(reset! cnt 0)\n(eduction\n (map-indexed (fn [coll-idx x] (inc-with-print \" left\" coll-idx x)))\n (map-indexed (fn [coll-idx x] (inc-with-print \"right\" coll-idx x)))\n (range 3))\n\n;; fn-id: left; coll-idx: 0; cnt: 0; x: 0\n;; fn-id: right; coll-idx: 0; cnt: 1; x: 1\n;; fn-id: left; coll-idx: 1; cnt: 2; x: 1\n;; fn-id: right; coll-idx: 1; cnt: 3; x: 2\n;; fn-id: left; coll-idx: 2; cnt: 4; x: 2\n;; fn-id: right; coll-idx: 2; cnt: 5; x: 3\n;;=> (2 3 4)\n\n(reset! cnt 0)\n(->> (range 3)\n (map-indexed (fn [coll-idx x] (inc-with-print \" left\" coll-idx x)))\n (map-indexed (fn [coll-idx x] (inc-with-print \"right\" coll-idx x))))\n\n;; fn-id: left; coll-idx: 0; cnt: 0; x: 0\n;; fn-id: left; coll-idx: 1; cnt: 1; x: 1\n;; fn-id: left; coll-idx: 2; cnt: 2; x: 2\n;; fn-id: right; coll-idx: 0; cnt: 3; x: 1\n;; fn-id: right; coll-idx: 1; cnt: 4; x: 2\n;; fn-id: right; coll-idx: 2; cnt: 5; x: 3\n;;=> (2 3 4)", :author {:avatar-url "https://avatars.githubusercontent.com/u/17842?v=3", :account-source "github", :login "ghiden"}, :created-at 1452742324167, :updated-at 1608819387090, :_id "569716b4e4b060004fc217ad"} {:editors [{:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"} {:login "JoshAaronJones", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19951591?v=3"}], :body ";; eduction: just run an xform over a collection\n\n(eduction (map inc) [1 2 3]) ; => (2 3 4)\n(eduction (filter even?) (range 5)) ; => (0 2 4)\n\n;; several transducers can be given, without using 'comp'\n(eduction (filter even?) (map inc)\n (range 5)) ; => (1 3 5)\n\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3", :account-source "github", :login "freckletonj"}, :created-at 1480456257096, :updated-at 1485277360753, :_id "583df841e4b0782b632278cd"} {:updated-at 1483046915116, :created-at 1483046915116, :author {:login "jvanderhyde", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6516608?v=3"}, :body ";; This will run out of memory eventually,\n;; because the entire seq is realized, \n;; because the head of the lazy seq is retained.\n(let \n [s (range 100000000)] \n (do (apply print s) (first s)))\n\n;; This iterates through the lazy seq without realizing the seq.\n(let \n [s (eduction identity (range 100000000))] \n (do (apply print s) (first s)))\n\n", :_id "58658003e4b0fd5fb1cc964c"} {:editors [{:login "vspinu", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1363467?v=3"} {:avatar-url "https://avatars0.githubusercontent.com/u/1174677?v=4", :account-source "github", :login "Bost"} {:login "jngbng", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/552977?v=4"}], :body ";; Result of eduction is of the `clojure.core.Eduction` type which acts as a\n;; lazy collection that re-executes all the steps again and again. This could be\n;; useful when you don't want to store the collection separately.\n;;\n;; Eductions can be efficiently used with `reduce` and `transduce`.\n\n(defn inc-with-print [x]\n (println \";;\" x)\n (inc x))\n\n(def ed (eduction (map inc-with-print) (map inc-with-print) (range 3)))\n\n(defn identity-with-print [x]\n (println \"identity:\" x)\n x)\n\n(map identity-with-print ed)\n;; 0\n;; 1\n;; 1\n;; 2\n;; 2\n;; 3\n;; identity: 2\n;; identity: 3\n;; identity: 4\n;; => (2 3 4)\n\n(defn sum-with-print [x y]\n (println \"sum:\" x \"+\" y)\n (+ x y))\n\n(reduce sum-with-print ed)\n;; 0\n;; 1\n;; 1\n;; 2\n;; sum: 2 + 3\n;; 2\n;; 3\n;; sum: 5 + 4\n;; => 9\n\n;; The above line does not work in Clojure 1.10.1\n;; Execution error (ClassCastException) at user/eval193 (REPL:1).\n;; clojure.core.Eduction cannot be cast to clojure.lang.IReduce\n\n\n(transduce (map identity-with-print) + ed)\n;; 0\n;; 1\n;; identity: 2\n;; 1\n;; 2\n;; identity: 3\n;; 2\n;; 3\n;; identity: 4\n;; => 9\n", :author {:avatar-url "https://avatars0.githubusercontent.com/u/1363467?v=3", :account-source "github", :login "vspinu"}, :created-at 1496674440865, :updated-at 1633576431878, :_id "59357088e4b06e730307db26"}], :notes [{:author {:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}, :updated-at 1520634037505, :created-at 1520634037505, :body "`eduction` is particularly useful as an adapter for collection-processing functions that don’t have a transducers arity. For example, you might want to transform a collection before passing it to `frequencies`. `eduction` makes that possible and efficient:\n\n
    \n(->> coll\n     (eduction (map #(quot % 5))\n               (filter odd?))\n     frequencies)\n
    \n\nSo `eduction` turns out to be quite powerful in that it brings the benefits of transducers to all collection-processing functions, even those that predate transducers: `first`, `last`, `group-by`, `run!`, `str/join`, …\n", :_id "5aa308b5e4b0316c0f44f917"} {:author {:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}, :updated-at 1520634630501, :created-at 1520634630501, :body "Interesting background about `sequence` versus `eduction`: https://groups.google.com/d/msg/clojure/9I6MtgOTD0w/NiG5PimBCP8J", :_id "5aa30b06e4b0316c0f44f919"} {:body "`eduction` does not cache the result while `sequence` does. `eduction` is intended to be used when you are eventually going to `reduce` over the sequence.\n\nhttps://groups.google.com/d/msg/clojure/9I6MtgOTD0w/NiG5PimBCP8J", :created-at 1577794782807, :updated-at 1577824559009, :author {:avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4", :account-source "github", :login "Hindol"}, :_id "5e0b3cdee4b0ca44402ef803"}], :arglists ["xform* coll"], :doc "Returns a reducible/iterable application of the transducers\n to the items in coll. Transducers are applied in order as if\n combined with comp. Note that these applications will be\n performed every time reduce/iterator is called.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/eduction"} {:added "1.0", :ns "clojure.core", :name "tree-seq", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1454531860990, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "walk", :ns "clojure.walk"}, :_id "56b26514e4b060004fc217bb"} {:created-at 1519124143092, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "file-seq", :ns "clojure.core"}, :_id "5a8bfeafe4b0316c0f44f8d5"}], :line 4931, :examples [{:updated-at 1454531766626, :created-at 1280776531000, :body ";; Each node is a number or a seq, \n;; so branch?==seq? and children==identity\n;; \n;; .\n;; / \\\n;; . .\n;; /|\\ |\n;; 1 2 . 4\n;; | \n;; 3\n;;\n;; ... each sub-tree is serialized in depth-first order\n(tree-seq seq? identity '((1 2 (3)) (4)))\n\n;;=> (((1 2 (3)) (4)) \n;; (1 2 (3)) \n;; 1 \n;; 2 \n;; (3) \n;; 3 \n;; (4) \n;; 4)\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/4b71cdf53bc76edd1a2ab66c446954b5?r=PG&default=identicon", :account-source "clojuredocs", :login "algal"} {:avatar-url "https://www.gravatar.com/avatar/4b71cdf53bc76edd1a2ab66c446954b5?r=PG&default=identicon", :account-source "clojuredocs", :login "algal"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692ccc026201cdc326c82"} {:updated-at 1454531340455, :created-at 1321413864000, :body "(tree-seq map? #(interleave (keys %) (vals %)) {:a 1 :b {:c 3 :d 4 :e {:f 6 :g 7}}})\n;;=> ({:a 1, :b {:c 3, :d 4, :e {:f 6, :g 7}}} \n;; :a 1 :b {:c 3, :d 4, :e {:f 6, :g 7}} \n;; :c 3 :d 4 :e {:f 6, :g 7} \n;; :f 6 :g 7)", :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/d790f5851d80da498e475ece4487e92?r=PG&default=identicon", :account-source "clojuredocs", :login "patazj"}, :_id "542692d5c026201cdc3270aa"} {:updated-at 1454530812433, :created-at 1321841153000, :body ";; Each node is a (node-root child1 child2 ...),\n;; so branch?==next and children==rest\n;;\n;; A\n;; / \\\n;; B C\n;; / \\ |\n;; D E F\n;;\n(map first (tree-seq next rest '(:A (:B (:D) (:E)) (:C (:F)))))\n;;=> (:A :B :D :E :C :F)", :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/4b71cdf53bc76edd1a2ab66c446954b5?r=PG&default=identicon", :account-source "clojuredocs", :login "algal"}, :_id "542692d5c026201cdc3270ab"} {:author {:login "gregginca", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bad5f5cb177b0968d4288596691ec3cd?r=PG&default=identicon"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :body ";; The previous example seems to be a flatten function,\n;; where every node's value is added to the returned sequence\n;; as it is visited in a depth first search.\n;; That is not the case as the following example illustrates: \n;; *\n;; / \\\n;; * 4\n;; /|\\\n;; 1 2 *\n;; |\n;; 3\n(map first (tree-seq next rest '((1 2 (3)) (4))))\n;;=> ((1 2 (3)) 4)\n\n;; For a proper 'flatten' function see below.", :created-at 1334020823000, :updated-at 1454531099621, :_id "542692d5c026201cdc3270ac"} {:updated-at 1471103831802, :created-at 1335429840000, :body ";; The nodes are filtered based on their collection type, \n;; here they must be a list.\n(tree-seq seq? seq [[1 2 [3]] [4]])\n;;=> ([[1 2 [3]] [4]])\n\n;; notice the difference between seq? and sequential?\n(tree-seq sequential? seq [[1 2 [3]] [4]])\n;;=> ([[1 2 [3]] [4]] [1 2 [3]] 1 2 [3] 3 [4] 4)\n\n;; If the nodes in the tree are a specific type of collection...\n;; a vector\n(tree-seq vector? seq [[1 2 [3]] [4]])\n([[1 2 [3]] [4]] [1 2 [3]] 1 2 [3] 3 [4] 4)\n\n;; ... or a list\n(tree-seq seq? seq '((1 2 (3)) (4)))\n(((1 2 (3)) (4)) (1 2 (3)) 1 2 (3) 3 (4) 4)\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "bbakersmith", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1828358?v=3"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692d5c026201cdc3270ad"} {:editors [{:avatar-url "https://avatars.githubusercontent.com/u/89076?v=3", :account-source "github", :login "shark8me"} {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :updated-at 1519124120018, :created-at 1423128977650, :author {:avatar-url "https://avatars.githubusercontent.com/u/89076?v=3", :account-source "github", :login "shark8me"}, :body ";; Use tree-seq to recursively find all files \n;; given a root directory (here for didactic purposes. See file-seq)\n(let [directory (clojure.java.io/file \"/path/to/directory/\")\n dir? #(.isDirectory %)]\n ;we want only files, therefore filter items that are not directories.\n (filter (comp not dir?) \n (tree-seq dir? #(.listFiles %) directory)))", :_id "54d33991e4b0e2ac61831d15"} {:editors [{:login "zackteo", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/7510179?v=4"}], :body "\n(def t '((1 2 (3)) (4)))\n;;=> #'user/t\n\n;; Here the tree-seq uses 'sequential?' as the 'branch?' predicate.\n;; This causes the 'children' function to run for any collection.\n;; The 'seq' ('children') function recurses on all items in the collection.\n;; This results in a sequence of sub-trees, rooted at each node.\n(tree-seq sequential? seq t)\n;;=> (((1 2 (3)) (4))\n;; (1 2 (3)) 1 2 \n;; (3) 3 (4) 4)\n\n;; (The following example is from 4Clojure)\n;; It returns the leaves of a tree as a sequence.\n;; \n(defn flatten [x]\n (filter (complement sequential?)\n (rest (tree-seq sequential? seq x))))\n(flatten t)\n;;=> (1 2 3 4)\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}, :created-at 1454529390718, :updated-at 1603927166586, :_id "56b25b6ee4b060004fc217b6"} {:updated-at 1503909100023, :created-at 1503908769269, :author {:login "MokkeMeguru", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/30849444?v=4"}, :body "(tree-seq seq? identity '(1 2 (3 (4))))\n;; ((1 2 (3 (4))) 1 2 (3 (4)) 3 (4) 4)\n\n;; It's same as ...\n(tree-seq seq? seq '(1 2 (3 (4))))\n(tree-seq sequential? seq '(1 2 (3 (4))))\n;; ((1 2 (3 (4))) 1 2 (3 (4)) 3 (4) 4)\n\n;; This processing ...\n(sequential? '(1 2 (3 (4)))) ;; returns true ... -> (1 2 (3 (4))) <--- !!!\n(sequential? 1) ;; returns false ... -> 1\n(sequential? 2) ;; returns false ... -> 2\n(sequential? '(3 (4)) ;; returns true ... -> (3 (4)) <--- !!! \n(sequential? 3) ;; returns false ... -> 3\n(sequential? '(4)) ;; returns true ... -> (4) <--- !!!\n(sequential? 4) ;; return false ... -> 4\n\n;; so, #tree-seq returns...\n;; ((1 2 (3 (4))) 1 2 (3 (4)) 3 (4) 4)", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/30849444?v=4", :account-source "github", :login "MokkeMeguru"}], :_id "59a3d3a1e4b09f63b945ac54"} {:editors [{:login "kovasap", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8763010?v=4"}], :body ";; When traversing a map tree, it's sometimes useful to have a back-reference\n;; to the parent. This tree-seq variant provides that.\n\n(defn tree-seq-adding-parent\n \"Like tree-seq, but takes in a tree of maps and a unique :parent key to each map.\"\n [branch? children root]\n (let [walk (fn walk [parent node]\n (lazy-seq\n (cons (assoc node :parent parent)\n (when (branch? node)\n (mapcat (partial walk node) (children node))))))]\n (walk nil root)))\n\n(def map-tree\n {:name \"root\"\n :children [{:name \"child1\"\n :children [{:name \"grandchild1\"}\n {:name \"grandchild2\"}]}\n {:name \"child2\"}]})\n\n(tree-seq-adding-parent associative? :children map-tree)\n;; =>\n;; ({:name \"root\",\n;; :children\n;; [{:name \"child1\",\n;; :children [{:name \"grandchild1\"} {:name \"grandchild2\"}]}\n;; {:name \"child2\"}],\n;; :parent nil\n;; {:name \"child1\",\n;; :children [{:name \"grandchild1\"} {:name \"grandchild2\"}],\n;; :parent\n;; {:name \"root\",\n;; :children\n;; [{:name \"child1\",\n;; :children [{:name \"grandchild1\"} {:name \"grandchild2\"}]}\n;; {:name \"child2\"}]}}\n;; {:name \"grandchild1\",\n;; :parent\n;; {:name \"child1\",\n;; :children [{:name \"grandchild1\"} {:name \"grandchild2\"}]}}\n;; {:name \"grandchild2\",\n;; :parent\n;; {:name \"child1\",\n;; :children [{:name \"grandchild1\"} {:name \"grandchild2\"}]}}\n;; {:name \"child2\",\n;; :parent\n;; {:name \"root\",\n;; :children\n;; [{:name \"child1\",\n;; :children [{:name \"grandchild1\"} {:name \"grandchild2\"}]}\n;; {:name \"child2\"}]}})\n\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/8763010?v=4", :account-source "github", :login "kovasap"}, :created-at 1652035527222, :updated-at 1652035548192, :_id "62780fc7e4b0b1e3652d75ea"}], :notes [{:body "The 'branch?' and 'children' functions perform different types of filtering.\nThe 'branch?' function examines a node and determines whether there are children that need to be included in the processing.\nThe 'children' function selects (or generates) the children to be included in the returned sequence.", :created-at 1454529614571, :updated-at 1508445428109, :author {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}, :_id "56b25c4ee4b0ceed88ce8d21"} {:author {:login "lostdiaspora", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4893998?v=3"}, :updated-at 1462851110244, :created-at 1462851110244, :body "Example 5 has for the second example \n(tree-seq seq? seq [[1 2 [3]] [4]])\nwhen it should be \n(tree-seq sequential? seq [[1 2 [3]] [4]])", :_id "57315626e4b012fa59bdb2ed"}], :arglists ["branch? children root"], :doc "Returns a lazy sequence of the nodes in a tree, via a depth-first walk.\n branch? must be a fn of one arg that returns true if passed a node\n that can have children (but may not). children must be a fn of one\n arg that returns a sequence of the children. Will only be called on\n nodes for which branch? returns true. Root is the root node of the\n tree.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/tree-seq"} {:added "1.0", :ns "clojure.core", :name "unchecked-remainder-int", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 1240, :examples nil, :notes nil, :arglists ["x y"], :doc "Returns the remainder of division of x by y, both int.\n Note - uses a primitive operator subject to truncation.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-remainder-int"} {:added "1.0", :ns "clojure.core", :name "seq", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1323104884000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "seq?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f01"} {:created-at 1350272113000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "empty?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f02"} {:created-at 1398980077000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "iterator-seq", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f03"} {:created-at 1495638720841, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "seqable?", :ns "clojure.core"}, :_id "5925a2c0e4b093ada4d4d727"} {:created-at 1550706027921, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "sequential?", :ns "clojure.core"}, :_id "5c6de56be4b0ca44402ef69d"} {:created-at 1550706149555, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "sequence", :ns "clojure.core"}, :_id "5c6de5e5e4b0ca44402ef69e"}], :line 126, :examples [{:updated-at 1552553839711, :created-at 1280777400000, :body "(seq '(1)) ;;=> (1)\n(seq [1 2]) ;;=> (1 2)\n(seq \"abc\") ;;=> (\\a \\b \\c)\n\n;; Corner cases\n(seq nil) ;;=> nil\n(seq '()) ;;=> nil\n(seq []) ;;=> nil\n(seq \"\") ;;=> nil", :editors [{:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"} {:login "notake", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/17588518?v=4"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692cac026201cdc326b53"} {:author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :editors [{:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; (seq x) is the recommended idiom for testing if a collection is not empty\n(every? seq [\"1\" [1] '(1) {:1 1} #{1}])\n;;=> true", :created-at 1350272074000, :updated-at 1422038529310, :_id "542692d5c026201cdc327079"} {:author {:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:login "osipaandr", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/14186734?v=4"}], :body ";; 'seq' can be used to turn a map into a list of vectors.\n;; Notice how the list is built adding elements to the beginning \n;; of the seq (list) not to the end, as with vectors.\n;; (Of course, the order that items are \n;; taken from a map should not be relied upon\n;; unless a deterministic 'sorted-map' is used.)\n(seq {:key1 \"value1\" :key2 \"value2\"})\n;;=> ([:key2 \"value2\"] [:key1 \"value1\"])", :created-at 1380601368000, :updated-at 1616180554494, :_id "542692d5c026201cdc32707b"} {:updated-at 1585288063944, :created-at 1470910164741, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body ";; Here is the difference between seq and sequence\n\n(seq nil)\n;;=> nil\n\n(seq ())\n;;=> nil\n\n(sequence ())\n;;=> ()\n\n(sequence nil)\n;;=> ()", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4", :account-source "github", :login "green-coder"}], :_id "57ac4ed4e4b0bafd3e2a04e1"} {:editors [{:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"} {:login "osipaandr", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/14186734?v=4"}], :body ";; seq is very similar to not-empty:\n\n(every? seq [\"1\" [1] '(1) {:1 1} #{1}])\n;;=> true\n(every? not-empty [\"1\" [1] '(1) {:1 1} #{1}])\n;;=> true\n\n(seq '(1)) ;;=> (1)\n(not-empty '(1)) ;;=> (1)\n\n(seq [1 2]) ;;=> (1 2)\n(not-empty [1 2]) ;;=> [1 2]\n\n\n(seq \"abc\") ;;=> (\\a \\b \\c)\n(not-empty \"abc\") ;;=> \"abc\"\n\n(map seq [nil '() [] \"\" {}])\n;;=> (nil nil nil nil nil)\n\n(map not-empty [nil '() [] \"\" {}])\n;;=> (nil nil nil nil nil)", :author {:avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4", :account-source "github", :login "bfontaine"}, :created-at 1602257369027, :updated-at 1616180682337, :_id "5f8081d9e4b0b1e3652d73d1"}], :notes nil, :tag "clojure.lang.ISeq", :arglists ["coll"], :doc "Returns a seq on the collection. If the collection is\n empty, returns nil. (seq nil) returns nil. seq also works on\n Strings, native Java arrays (of reference types) and any objects\n that implement Iterable. Note that seqs cache values, thus seq\n should not be used on any Iterable whose iterator repeatedly\n returns the same mutable object.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/seq"} {:added "1.0", :ns "clojure.core", :name "reduce", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1289800599000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "reductions", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e01"} {:created-at 1289816968000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "apply", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e02"} {:created-at 1289816979000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "frequencies", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e03"} {:created-at 1416151510249, :author {:login "ljos", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/585174?v=2"}, :to-var {:ns "clojure.core", :name "reduced", :library-url "https://github.com/clojure/clojure"}, :_id "5468c1d6e4b0dc573b892fd2"} {:created-at 1416151518003, :author {:login "ljos", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/585174?v=2"}, :to-var {:ns "clojure.core", :name "reduced?", :library-url "https://github.com/clojure/clojure"}, :_id "5468c1dee4b03d20a10242aa"} {:created-at 1461185368746, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reduce-kv", :ns "clojure.core"}, :_id "5717eb58e4b0fc95a97eab4f"} {:created-at 1514410007011, :author {:login "jcburley", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/430319?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "fold", :ns "clojure.core.reducers"}, :_id "5a441017e4b0a08026c48cdf"} {:created-at 1550086607808, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "partition-by", :ns "clojure.core"}, :_id "5c6471cfe4b0ca44402ef683"}], :line 6810, :examples [{:updated-at 1453975469787, :created-at 1278185820000, :body "(reduce + [1 2 3 4 5]) ;;=> 15\n(reduce + []) ;;=> 0\n(reduce + [1]) ;;=> 1\n(reduce + [1 2]) ;;=> 3\n(reduce + 1 []) ;;=> 1\n(reduce + 1 [2 3]) ;;=> 6", :editors [{:avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon", :account-source "clojuredocs", :login "dakrone"} {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "mobyte", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/207296?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/43db6edb2c82a7c76cb5b5911391f02a?r=PG&default=identicon", :account-source "clojuredocs", :login "cody"}, :_id "542692ccc026201cdc326c36"} {:updated-at 1561377314389, :created-at 1278632532000, :body ";; Converting a vector to a set:\n\n(reduce conj #{} [:a :b :c])\n;; => #{:a :c :b}\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon", :account-source "clojuredocs", :login "boxie"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "IwoHerka", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/9204550?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/693b9bfd287e55741c2a4af6f7de0d72?r=PG&default=identicon", :account-source "clojuredocs", :login "jkkramer"}, :_id "542692ccc026201cdc326c39"} {:updated-at 1343775932000, :created-at 1279060391000, :body ";; Create a word frequency map out of a large string s.\n\n;; `s` is a long string containing a lot of words :)\n(reduce #(assoc %1 %2 (inc (%1 %2 0)))\n {}\n (re-seq #\"\\w+\" s))\n\n; (This can also be done using the `frequencies` function.)\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon", :account-source "clojuredocs", :login "boxie"} {:avatar-url "https://www.gravatar.com/avatar/34f159f89cbd1d9beac0276f5a7af552?r=PG&default=identicon", :account-source "clojuredocs", :login "uvtc"} {:avatar-url "https://www.gravatar.com/avatar/34f159f89cbd1d9beac0276f5a7af552?r=PG&default=identicon", :account-source "clojuredocs", :login "uvtc"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/1453?v=4", :account-source "github", :login "ghoseb"}, :_id "542692ccc026201cdc326c3b"} {:author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "goodmike", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/42e0998c3077ba0ac435423941a3978e?r=PG&default=identicon"} {:login "goodmike", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/42e0998c3077ba0ac435423941a3978e?r=PG&default=identicon"} {:login "goodmike", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/42e0998c3077ba0ac435423941a3978e?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; Calculate primes until 1000\n\n(reduce\n (fn [primes number]\n (if (some zero? (map (partial mod number) primes))\n primes\n (conj primes number)))\n [2]\n (take 1000 (iterate inc 3)))\n\n;;=> [2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 \n;; 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 \n;; 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 \n;; 257 263 269 271 277 281 283 293 307 311 313 317 331 337 347 349 \n;; 353 359 367 373 379 383 389 397 401 409 419 421 431 433 439 443 \n;; 449 457 461 463 467 479 487 491 499 503 509 521 523 541 547 557 \n;; 563 569 571 577 587 593 599 601 607 613 617 619 631 641 643 647 \n;; 653 659 661 673 677 683 691 701 709 719 727 733 739 743 751 757 \n;; 761 769 773 787 797 809 811 821 823 827 829 839 853 857 859 863 \n;; 877 881 883 887 907 911 919 929 937 941 947 953 967 971 977 983 \n;; 991 997]", :created-at 1279066766000, :updated-at 1420654061502, :_id "542692ccc026201cdc326c40"} {:author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; Add one collection to another (combining sequences is done with cons):\n(reduce conj [1 2 3] [4 5 6])\n;;=> [1 2 3 4 5 6]\n\n(reduce #(cons %2 %1) [1 2 3] [4 5 6])\n;;=> '(6 5 4 1 2 3)", :created-at 1279163552000, :updated-at 1420654295036, :_id "542692ccc026201cdc326c46"} {:author {:login "gradysw", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a2d549191f2863bf87489949edebb548?r=PG&default=identicon"}, :editors [{:login "gradysw", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a2d549191f2863bf87489949edebb548?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; Combine a vector of collections into a single collection \n;; of the type of the first collection in the vector.\n(reduce into [[1 2 3] [:a :b :c] '([4 5] 6)])\n;;=> [1 2 3 :a :b :c [4 5] 6]\n\n;; The flatten function can be used to completely fuse \n;; all of the items of a nested tree into a single sequence.\n;; Sometimes all that is needed is to fuse the first level\n;; of a tree. This can be done with 'reduce' and 'into'.\n(reduce into [] '([] [[10 18]] [[8 18]] [[10 12]] [[0 -6]] [[2 6]]))\n;;=> [[10 18] [8 18] [10 12] [0 -6] [2 6]]\n", :created-at 1325573490000, :updated-at 1426023239324, :_id "542692d5c026201cdc327064"} {:author {:login "octopusgrabbus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon"}, :editors [], :body "(defn key-pres?\n \"This function accepts a value (cmp-val) and a vector of vectors\n (parsed output from clojure-csv) and returns the match value\n back if found and nil if not found. \n\n Using reduce, the function searches every vector row to see \n if cmp-val is at the col-idx location in the vector.\"\n\n [cmp-val cmp-idx csv-data]\n (reduce\n (fn [ret-rc csv-row]\n (if (= cmp-val (nth csv-row col-idx nil))\n (conj ret-rc cmp-val)))\n [] \n csv-data))", :created-at 1334260928000, :updated-at 1334260928000, :_id "542692d5c026201cdc327066"} {:author {:login "octopusgrabbus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon"}, :editors [{:login "octopusgrabbus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon"}], :body "(defn reduce-csv-row\n \"Accepts a csv-row (a vector) a list of columns to extract, \n and reduces (and returns) a csv-row to a subset based on \n selection using the values in col-nums (a vector of integer \n vector positions.)\"\n\n [csv-row col-nums]\n\n (reduce\n (fn [out-csv-row col-num]\n ; Don't consider short vectors containing junk.\n (if-not (<= (count csv-row) 1)\n (conj out-csv-row (nth csv-row col-num nil))))\n []\n col-nums))\n\n", :created-at 1334261221000, :updated-at 1334261450000, :_id "542692d5c026201cdc327067"} {:editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "IwoHerka", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/9204550?v=4"}], :updated-at 1561323174151, :created-at 1426023157581, :author {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}, :body ";; Some functions update a collection with a single item.\n;; A number of functions have a 'more' argument which lets\n;; them work over collections.\n;; These functions can benefit 'reduce' which lets them work \n;; a collection of items...\n(into {} {:dog :food})\n\n(reduce into {} [{:dog :food} {:cat :chow}])\n;;=> {:dog :food, :cat :chow}", :_id "54ff62f5e4b0b716de7a6539"} {:updated-at 1561377338656, :created-at 1441139931232, :author {:login "lwm", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1991377?v=3"}, :body ";; The reduction will terminate early if an intermediate result uses the \n;; `reduced` function.\n\n(defn limit [x y] \n (let [sum (+ x y)] \n (if (> sum 10) (reduced sum) sum)))\n\n(reduce + 0 (range 10))\n;; => 45\n\n(reduce limit 0 (range 10))\n;; => 15", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/25400?v=3", :account-source "github", :login "miner"} {:login "IwoHerka", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/9204550?v=4"}], :_id "55e60cdbe4b072d7f27980f5"} {:editors [{:login "teymuri", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/13352033?v=3"} {:login "IwoHerka", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/9204550?v=4"}], :body ";; This will generate the first 100 Fibonacci numbers\n;; (size of (range) + 2):\n\n(reduce \n (fn [a b] (conj a (+' (last a) (last (butlast a))))) \n [0 1] \n (range 98))\n\n;; [0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155 165580141 267914296 433494437 701408733 1134903170 1836311903 2971215073 4807526976 7778742049 12586269025 20365011074 32951280099 53316291173 86267571272 139583862445 225851433717 365435296162 591286729879 956722026041 1548008755920 2504730781961 4052739537881 6557470319842 10610209857723 17167680177565 27777890035288 44945570212853 72723460248141 117669030460994 190392490709135 308061521170129 498454011879264 806515533049393 1304969544928657 2111485077978050 3416454622906707 5527939700884757 8944394323791464 14472334024676221 23416728348467685 37889062373143906 61305790721611591 99194853094755497 160500643816367088 259695496911122585 420196140727489673 679891637638612258 1100087778366101931 1779979416004714189 2880067194370816120 4660046610375530309 7540113804746346429 12200160415121876738N 19740274219868223167N 31940434634990099905N 51680708854858323072N 83621143489848422977N 135301852344706746049N 218922995834555169026N]", :author {:avatar-url "https://avatars.githubusercontent.com/u/13352033?v=3", :account-source "github", :login "teymuri"}, :created-at 1443219853505, :updated-at 1561377380394, :_id "5605c98de4b08e404b6c1c85"} {:editors [{:login "IwoHerka", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/9204550?v=4"}], :body ";; Reduce can be used to reimplement a map function:\n\n(defn map* [f & c]\n (let [c* (partition (count c)\n (apply interleave c))]\n (reduce (fn [s k] (conj s (apply f k))) [] c*)))\n\n;; user=> (map* * [0.5 0.5 0.5] (range))\n;; [0.0 0.5 1.0]\n;; user=> (map* str \"clojure\" (range))\n;; [\"c0\" \"l1\" \"o2\" \"j3\" \"u4\" \"r5\" \"e6\"]\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/13352033?v=3", :account-source "github", :login "teymuri"}, :created-at 1447891132480, :updated-at 1561323290402, :_id "564d10bce4b0538444398272"} {:editors [{:login "IwoHerka", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/9204550?v=4"}], :body ";; Update map entries:\n(defn update-map-entries [m e]\n (reduce #(update-in %1 [(first %2)] (fn [_] (last %2))) m e))\n\n;; => (update-map-entries {:a 1 :b 2 :c 3} {:a 5 :b 9})\n;; {:a 5, :b 9, :c 3}\n;; => (update-map-entries {:a 1 :b 2 :c 3} {:a 5 :b 9 :d 8})\n;; {:a 5, :b 9, :c 3, :d 8}", :author {:avatar-url "https://avatars.githubusercontent.com/u/1223207?v=3", :account-source "github", :login "hadielmougy"}, :created-at 1470237574017, :updated-at 1561377421060, :_id "57a20b86e4b0bafd3e2a04c5"} {:editors [{:login "IwoHerka", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/9204550?v=4"}], :body ";; Flatten values in a map.\n(reduce\n (fn [flattened [k v]]\n (clojure.set/union flattened v))\n #{}\n {:e #{:m :f}, :c #{:f}, :b #{:c :f}, :d #{:m :f}, :a #{:c :f}})\n\n;; => #{:m :c :f}", :author {:avatar-url "https://avatars.githubusercontent.com/u/528932?v=3", :account-source "github", :login "sleyzerzon"}, :created-at 1471131155930, :updated-at 1561323131079, :_id "57afae13e4b02d8da95c26fa"} {:editors [{:login "IwoHerka", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/9204550?v=4"}], :body ";; A simple factorial function using reduce:\n\n(defn fact\n [x] \n (reduce * (range 1 (inc x))))", :author {:avatar-url "https://avatars.githubusercontent.com/u/2006175?v=3", :account-source "github", :login "cloxure"}, :created-at 1479851336416, :updated-at 1561377519723, :_id "5834bd48e4b0782b632278c7"} {:updated-at 1561377553253, :created-at 1485475889351, :author {:login "mahonbaldwin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2431381?v=3"}, :body ";; Reduce over maps by destructuring keys:\n(def x {:a 1 :b 2})\n\n(reduce (fn [p [k v]]\n (into p {k (+ 1 v)}))\n {} ; First value for p\n x)\n\n;; => {:a 2, :b 3}", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/838526?v=3", :account-source "github", :login "isaacm"} {:login "IwoHerka", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/9204550?v=4"}], :_id "588a9031e4b01f4add58fe32"} {:editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :body ";; conj! over transient array for speed.\n;; This example flattens over one level.\n;; To do so uses reduce twice.\n(persistent!\n (reduce\n (fn [acc0 item-vector]\n (reduce \n (fn [acc1 item]\n (conj! acc1 item))\n acc0 item-vector))\n (transient [])\n [[:foo :bar :baz] [] [:fred :barney]]))\n ;;=> [:foo :bar :baz :fred :barney] ", :author {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}, :created-at 1508890297162, :updated-at 1508890336628, :_id "59efd6b9e4b0a08026c48c76"} {:updated-at 1516050550051, :created-at 1516050550051, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;reduce with side effects\n;;given a collection return a new collection\n\n(def initial-coll [1 2 3 4 5])\n\n(defn byten\n [coll]\n (reduce (fn [new-coll unit]\n (into new-coll [(* 10 unit)]))\n []\n coll))\n\n(byten initial-coll)\n;;[10 20 30 40 50]\n\n\n", :_id "5a5d1876e4b0a08026c48cf5"} {:editors [{:login "IwoHerka", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/9204550?v=4"}], :body ";; Reduce with side effects using an anonymous function\n;; given a collection return a new collection:\n\n(def initial-coll [1 2 3 4 5])\n\n(defn byten\n [coll]\n (reduce #(into %1 [(* 10 %2)])\n []\n coll))\n\n(byten initial-coll)\n;; => [10 20 30 40 50]", :author {:avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4", :account-source "github", :login "ibercode"}, :created-at 1516050752043, :updated-at 1561377738301, :_id "5a5d1940e4b0a08026c48cf6"} {:editors [{:login "IwoHerka", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/9204550?v=4"}], :body ";; A practical example of mapping over values\n;; in a hash-map with the `upper-case` function:\n\n(reduce\n (fn [acc [k v]]\n (assoc acc k (clojure.string/upper-case v)))\n {}\n {:a \"aaaaaaa\" :b \"bbbbbbb\"})\n\n;; => {:a \"AAAAAAA\", :b \"BBBBBBB\"}", :author {:avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4", :account-source "github", :login "ibercode"}, :created-at 1517738937897, :updated-at 1561377698196, :_id "5a76dbb9e4b0e2d9c35f7418"} {:editors [{:login "ftravers", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/443507?v=4"}], :body "(reduce\n (fn [accumulator current-item] ; <-- accumulator is FIRST argument to function\n ...) ; <-- your fn definition goes here\n [] ; <-- initial value for your accumulator \n [:a :b]) ; <-- collection to operate on\n", :author {:avatar-url "https://avatars1.githubusercontent.com/u/443507?v=4", :account-source "github", :login "ftravers"}, :created-at 1555521629477, :updated-at 1555521659756, :_id "5cb7605de4b0ca44402ef70b"} {:editors [{:login "tanrax", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/4553672?v=4"}], :body "(reduce #(str %1 %2) \"\" [\"Woody\" \"Potato\" \"Buzz\"])\n;;=> \"WoodyPotatoBuzz\"\n\n;; or\n\n(reduce (fn [accumulator current-item] (str accumulator current-item)) \"\" [\"Woody\" \"Potato\" \"Buzz\"])\n;;=> \"WoodyPotatoBuzz\"\n\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/4553672?v=4", :account-source "github", :login "tanrax"}, :created-at 1583079460917, :updated-at 1584265812224, :_id "5e5be024e4b087629b5a18b0"}], :notes [{:updated-at 1278794710000, :body "clojure.core/reduce seems to be a special case of a function that's defined twice in core.clj, and the first definition (at the line cited above: 773) is just a temporary definition; the real definition is later at line 5323, which contains the docstring.", :created-at 1278794710000, :author {:login "JoshuaEckroth", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ef8bb10e14b41f71f8ea9ed9d66d07b7?r=PG&default=identicon"}, :_id "542692ebf6e94c6970521f80"} {:author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :updated-at 1505006701520, :created-at 1505006701520, :body "The reducing function f is of shape:\n\n(f [accumulator next-element] ...)", :_id "59b4946de4b09f63b945ac67"} {:author {:login "iljaf", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/35742698?v=4"}, :updated-at 1598124872512, :created-at 1598124872512, :body "The 4th example (generating prime numbers) is kind of nice conceptually, but running it for the first 1m integers is taking 2 min on i7 2.7GHz machine, so it seems to be a very inefficient way of generating prime numbers. ", :_id "5f417348e4b0b1e3652d7385"}], :arglists ["f coll" "f val coll"], :doc "f should be a function of 2 arguments. If val is not supplied,\n returns the result of applying f to the first 2 items in coll, then\n applying f to that result and the 3rd item, etc. If coll contains no\n items, f must accept no arguments as well, and reduce returns the\n result of calling f with no arguments. If coll has only 1 item, it\n is returned and f is not called. If val is supplied, returns the\n result of applying f to val and the first item in coll, then\n applying f to that result and the 2nd item, etc. If coll contains no\n items, returns val and f is not called.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/reduce"} {:added "1.0", :ns "clojure.core", :name "when-first", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1405367822000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "when-let", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b77"}], :line 4600, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user=> (when-first [a [1 2 3]] a)\n1\nuser=> (when-first [a []] :x)\nnil\nuser=> (when-first [a nil] :x)\nnil", :created-at 1280737783000, :updated-at 1423524033466, :_id "542692cac026201cdc326b30"} {:editors [{:login "totorigolo", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1183296?v=4"}], :body ";; Note that the 'when' switches on the truthiness of the sequence, not the\n;; truthiness of the elements within the sequence.\n\nuser=> (when-first [a [nil 2 3]] \n (print (str \"Picked: \" (prn-str a))))\nPicked: nil\nnil", :author {:avatar-url "https://avatars3.githubusercontent.com/u/1634344?v=3", :account-source "github", :login "peterwestmacott"}, :created-at 1490868547686, :updated-at 1542136234692, :_id "58dcd943e4b01f4add58fe80"} {:updated-at 1522689850199, :created-at 1522689850199, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; A concise way to write the basic lazy loop.\n\n(defn dechunk [xs]\n (lazy-seq\n (when-first [x xs]\n (cons x\n (dechunk (rest xs))))))\n\n;; would print 32 dots otherwise:\n(first (map #(do (print \".\") %) (dechunk (range 100))))\n;; .0", :_id "5ac2673ae4b045c27b7fac2e"}], :macro true, :notes nil, :arglists ["bindings & body"], :doc "bindings => x xs\n\n Roughly the same as (when (seq xs) (let [x (first xs)] body)) but xs is evaluated only once", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/when-first"} {:added "1.0", :ns "clojure.core", :name "find-ns", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1284970272000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "create-ns", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bd5"} {:created-at 1284970279000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "remove-ns", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bd6"} {:created-at 1489760484301, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ns-map", :ns "clojure.core"}, :_id "58cbf0e4e4b01f4add58fe76"}], :line 4126, :examples [{:author {:login "teyc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd6e62afb4881ab0f617611b8b65d003?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "(find-ns 'clojure.string)\n;;=> nil\n\n(require 'clojure.string)\n;;=> nil\n\n(find-ns 'clojure.string)\n;;=> #", :created-at 1283925753000, :updated-at 1422932795101, :_id "542692ccc026201cdc326c90"}], :notes nil, :arglists ["sym"], :doc "Returns the namespace named by the symbol or nil if it doesn't exist.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/find-ns"} {:added "1.1", :ns "clojure.core", :name "get-thread-bindings", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1350609423000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bound-fn", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cbb"} {:created-at 1350609426000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bound-fn*", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cbc"}], :line 1939, :examples [{:updated-at 1615494273716, :created-at 1615493864771, :author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :body "(get-thread-bindings) \n;;=> {#'cider.nrepl.middleware.debug/*skip-breaks* #atom[nil 0x6683434], \n;; #'clojure.core/*unchecked-math* false, \n;; # nil, # 1, \n... \n;; #'clojure.test/*test-out* #object[java.io.PrintWriter 0x7aa21648 \n;; \"java.io.PrintWriter@7aa21648\"], # true}\n;; # true}", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4", :account-source "github", :login "Crowbrammer"}], :_id "604a7ae8e4b0b1e3652d7482"}], :notes nil, :arglists [""], :doc "Get a map with the Var/value pairs which is currently in effect for the\n current thread.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/get-thread-bindings"} {:added "1.0", :ns "clojure.core", :name "contains?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1307097029000, :author {:login "stand", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d7f9ed2753f8b3517f1539f6129f0a17?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "some", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d35"} {:created-at 1354058314000, :author {:login "uvtc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/34f159f89cbd1d9beac0276f5a7af552?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "get", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d36"}], :line 1484, :examples [{:author {:login "Brian Marick", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon"}, :editors [{:login "Brian Marick", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"} {:login "alex_ndc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/289cf5fb7dc48bc0d1237a779b8b107?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:avatar-url "https://avatars2.githubusercontent.com/u/20086?v=3", :account-source "github", :login "reborg"} {:login "mdave16", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/15642321?v=4"}], :body ";; `contains?` is straightforward for maps:\n(contains? {:a 1} :a) ;=> true\n(contains? {:a nil} :a) ;=> true\n(contains? {:a 1} :b) ;=> false\n\n;; It's likely to surprise you for other sequences because it's \n;; about *indices* or *keys*, not *contents*:\n\n(contains? [:a :b :c] :b) ;=> false\n(contains? [:a :b :c] 2) ;=> true\n(contains? [\"a\" \"b\"] \"b\") ;=> false\n(contains? \"f\" 0) ;=> true\n(contains? \"f\" 1) ;=> false\n\n;; Although lists are sequences, they are not keyed sequences.\n;; `contains?` should not be used for lists.\n\n(contains? '(1 2 3) 1) \n;; IllegalArgumentException (Clojure >=1.5)\n\n;; It also works on native arrays, HashMaps or HashSets:\n(import '[java.util HashMap HashSet])\n(contains? (doto (HashSet.) (.add 1)) 1) ;=> true\n(contains? (doto (HashMap.) (.put \"a\" 1)) \"a\") ;=> true\n(contains? (int-array [1 2 3]) 0) ;=> true", :created-at 1278821806000, :updated-at 1633737531627, :_id "542692cdc026201cdc326d2a"} {:author {:login "stand", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d7f9ed2753f8b3517f1539f6129f0a17?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; Can be used to test set membership\n(def s #{\"a\" \"b\" \"c\"})\n\n;; The members of a set are the keys of those elements.\n(contains? s \"a\") ;=> true\n(contains? s \"z\") ;=> false", :created-at 1307097549000, :updated-at 1422318705818, :_id "542692cdc026201cdc326d2f"} {:updated-at 1498597995922, :created-at 1498584367639, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/20086?v=3"}, :body ";; When \"key\" is a number, it is expected to be an integer. \n;; Beyond that limit, lossy truncation may result in unexpected results:\n\n(contains? [1 2 3] 4294967296) ;=> true", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/20086?v=3", :account-source "github", :login "reborg"}], :_id "5952952fe4b06e730307db46"}], :notes [{:updated-at 1279546429000, :body "If like me you wanted to find a value in a collection and read this article then you'll need to find an alternative. So instead of:\r\n
    \r\n(contains (1 2 3) 1)\r\n
    \r\nI used:\r\n
    \r\n(some #(= 1 %) (1 2 3))\r\n
    \r\n\r\nHope that helps.", :created-at 1279546429000, :author {:login "robertpostill", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16aae57aa6b16e96fa81089bea6acad8?r=PG&default=identicon"}, :_id "542692ebf6e94c6970521f81"} {:updated-at 1279552212000, :body "For collections I use the `java.util.Collection#contains()` method:\r\n\r\n
    \r\nuser=> (.contains [1 2 3] 1)\r\ntrue\r\nuser=> (.contains [1 2 3] 4)\r\nfalse\r\n
    ", :created-at 1279552212000, :author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :_id "542692ebf6e94c6970521f82"} {:updated-at 1354058595000, :body "As Rich points out on the ML: \r\n\r\n`contains?` tells you whether or not `get` will succeed. It is not a \"rummager\".\r\n\r\n`contains?` and `get` abstract over fast lookup.\r\n", :created-at 1354058595000, :author {:login "uvtc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/34f159f89cbd1d9beac0276f5a7af552?r=PG&default=identicon"}, :_id "542692edf6e94c6970521ff5"} {:updated-at 1388617095000, :body "If you have a vector or list and want to check whether a *value* is contained in it, you will find that `contains?` does not work.\r\n\r\n
    ; does not work as you might expect\r\n(contains? [:a :b :c] :b) ; = false
    \r\n\r\nThere are four things you can try in this case:\r\n\r\n1. Consider whether you really need a vector or list. If you use a set instead, `contains?` will work.\r\n
    (contains? #{:a :b :c} :b) ; = true
    \r\n2. Use [`some`](http://clojuredocs.org/clojure_core/clojure.core/some) instead, wrapping the target in a set, as follows:\r\n
    (some #{:b} [:a :b :c]) ; = :b, which is truthy
    \r\n3. The set-as-function shortcut will not work if you might be searching for a falsy value (`false` or `nil`).\r\n
    ; will not work\r\n(some #{false} [true false true]) ; = nil
    \r\n In that case, you will have to write the predicate function the long way:\r\n
    (some #(= false %) [true false true]) ; = true
    \r\n4. If you will need to do this kind of search a lot, write a function for it:\r\n
    (defn seq-contains? [coll target] (some #(= target %) coll))\r\n(seq-contains? [true false true] false) ; = true
    ", :created-at 1385323398000, :author {:login "roryokane", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5b2b185c814bb25f2f95a1152e58f033?r=PG&default=identicon"}, :_id "542692edf6e94c697052200f"} {:author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :updated-at 1462902144512, :created-at 1462902144512, :body "In order to determine if an element is contained in the collection, it may be easiest to use the `Vector.indexOf()` function from java:\n\n (.indexOf (range 10) 5)\n ;=> 5\n (.indexOf [:a :b :c] :b)\n ;=> 1\n\n[Java API Docs are here](http://docs.oracle.com/javase/7/docs/api/java/util/Vector.html#indexOf%28java.lang.Object%29)", :_id "57321d80e4b012fa59bdb2f1"} {:body "You may wonder why this statement evaluates to true:
    \n\n(contains? [1 1 1 1 1] 4)
    \n;=> true\n
    \n\nLet's do some investigation to find the answer. First we start by finding out the type of [1 1 1 1 1]:\n\n(class [1 1 1 1 1])
    \n;=> clojure.lang.PersistentVector\n
    \n\nSo when the statement (contains? [1 1 1 1 1] 4) is evaluated, the function contains? in
    core.clj is called.\n\nThis function delegates to the static Java function contains(Object coll, Object key) in clojure.lang.RT, which discovers that the incoming vector is an instance of Associative (PersistentVector > APersistentVector > IPersistentVector > Associative) and exits with:
    \n\nreturn ((Associative) coll).containsKey(key)\n\n\nThis means that these two statements are equivalent, based on the current implementation of PersistentVector:
    \n\n(contains? [1 1 1 1 1] 4) ; true
    \n(.containsKey [1 1 1 1 1 1] 4) ; true\n
    \n\nThe method containsKey of APersistentVector is finally called. It checks if the vector has at least four elements (size >= 4) which it has (5) and that's why it returns true. Mystery solved!\n", :created-at 1469650697268, :updated-at 1469653287748, :author {:avatar-url "https://avatars.githubusercontent.com/u/631272?v=3", :account-source "github", :login "tengstrand"}, :_id "57991709e4b0bafd3e2a04c1"} {:author {:login "coutego", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/86327033?v=4"}, :updated-at 1670094879509, :created-at 1670094709380, :body "This `in?` function could be a convenient one line replacement for `contains?` implementing the expected semantics for containers:\n \n
    \n(defn in? [xs el] (some #(= % el) xs))\n
    ", :_id "638b9f75e4b0b1e3652d7693"}], :arglists ["coll key"], :doc "Returns true if key is present in the given collection, otherwise\n returns false. Note that for numerically indexed collections like\n vectors and Java arrays, this tests if the numeric key is within the\n range of indexes. 'contains?' operates constant or logarithmic time;\n it will not perform a linear search for a value. See also 'some'.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/contains_q"} {:added "1.0", :ns "clojure.core", :name "every?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1302013840000, :author {:login "pauldoo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5cb916d3c8abc9f45a093209e72489fb?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "some", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d9e"} {:created-at 1315793054000, :author {:login "wdkrnls", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/6d08a2f792f289b95fe1d982d4133d71?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "not-any?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d9f"} {:created-at 1422932256217, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "not-every?", :library-url "https://github.com/clojure/clojure"}, :_id "54d03920e4b081e022073c43"}], :line 2672, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (every? even? '(2 4 6))\ntrue\nuser=> (every? even? '(1 2 3))\nfalse", :created-at 1279073869000, :updated-at 1332951153000, :_id "542692cfc026201cdc326e56"} {:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "Rich_Morin", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d4d28bd014f9e7324bad99dcc3b0d390?r=PG&default=identicon"}], :body ";; you can use every? with a set as the predicate to return true if \n;; every member of a collection is in the set\nuser=> (every? #{1 2} [1 2 3])\nfalse\nuser=> (every? #{1 2} [1 2])\ntrue\n\n;; or use a hash-map as the predicate with every? to return true \n;; if every member of a collection is a key within the map\nuser=> (every? {1 \"one\" 2 \"two\"} [1 2])\ntrue\nuser=> (every? {1 \"one\" 2 \"two\"} [1 2 3])\nfalse", :created-at 1310851356000, :updated-at 1358775095000, :_id "542692cfc026201cdc326e58"} {:author {:login "dkvasnicka", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/55c9f4624d94a0c87c4f4fcb7f152393?r=PG&default=identicon"}, :editors [{:login "dkvasnicka", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/55c9f4624d94a0c87c4f4fcb7f152393?r=PG&default=identicon"} {:avatar-url "https://avatars3.githubusercontent.com/u/1195619?v=3", :account-source "github", :login "jeffi"} {:login "beoliver", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1413969?v=4"} {:avatar-url "https://avatars2.githubusercontent.com/u/22192927?v=4", :account-source "github", :login "elenacanovi"} {:login "PEZ", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/30010?v=4"}], :body ";; this is kind of weird IMO... but it works that way (the same for vectors)\n;; See: https://en.wikipedia.org/wiki/Vacuous_truth\nuser=> (every? true? '())\ntrue\nuser=> (every? false? '())\ntrue\n\n;; and similarly\nuser=> (every? map? '())\ntrue\nuser=> (every? vector? '())\ntrue\nuser=> (every? string? '())\ntrue\nuser=> (every? number? '())\ntrue\n\n;; and even\nuser=> (every? :foo nil)\ntrue\n\n;; As such a better description of every? would be\n\n;; Returns false if there exists a value x in coll \n;; such that (pred? x) is false, else true.\" \n", :created-at 1356575084000, :updated-at 1670431457567, :_id "542692d3c026201cdc326fa1"} {:updated-at 1512078155897, :created-at 1512078155897, :author {:login "chbrown", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/360279?v=4"}, :body ";; every? can replace clojure.set/subset? if and only if\n;; the sets do not contain false / nil values\n\n(subset? #{1} #{1 2}) ;;=> true\n(every? #{1 2} #{1} ) ;;=> true ✔\n\n(subset? #{1 3} #{1 2}) ;;=> false\n(every? #{1 2} #{1 3}) ;;=> false ✔\n\n;; however, invoking a set with a value returns the matched element,\n;; causing the comparison below to fail\n\n(subset? #{true false} #{true false}) ;;=> true\n(every? #{true false} #{true false}) ;;=> false ✘ 😦\n", :_id "5a207b4be4b0a08026c48cca"}], :notes nil, :tag "java.lang.Boolean", :arglists ["pred coll"], :doc "Returns true if (pred x) is logical true for every x in coll, else\n false.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/every_q"} {:added "1.0", :ns "clojure.core", :name "proxy-mappings", :file "clojure/core_proxy.clj", :type "function", :column 1, :see-alsos nil, :line 323, :examples [{:updated-at 1683032923886, :created-at 1683032784200, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body "(def my-proxy\n (proxy [java.lang.Object] []\n (equals [_] false)\n (toString [] \"I'm an object\")))\n;; => #'user/my-proxy\n\n(proxy-mappings my-proxy)\n;; => {\"equals\" #function[user/fn--43785/fn--43786],\n;; \"toString\" #function[user/fn--43785/fn--43788]}\n\n(let [to-string-fn (-> my-proxy proxy-mappings (get \"toString\"))]\n (to-string-fn :foo))\n;; => \"I'm an object\"\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4", :account-source "github", :login "tomdl89"}], :_id "64510ad0e4b08cf8563f4ba9"}], :notes nil, :arglists ["proxy"], :doc "Takes a proxy instance and returns the proxy's fn map.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/proxy-mappings"} {:added "1.2", :ns "clojure.core", :name "keep-indexed", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1324314274000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "map-indexed", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b55"} {:created-at 1337189104000, :author {:login "SoniaH", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/56a007a4b2c47b141bd39790278f88a7?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "keep", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b56"}], :line 7346, :examples [{:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "SoniaH", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/56a007a4b2c47b141bd39790278f88a7?r=PG&default=identicon"}], :body "user=> (keep-indexed #(if (odd? %1) %2) [:a :b :c :d :e])\n(:b :d)", :created-at 1282318865000, :updated-at 1337189353000, :_id "542692c9c026201cdc326a84"} {:author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :editors [], :body "user=> (keep-indexed #(if (pos? %2) %1) [-9 0 29 -7 45 3 -8])\n(2 4 5)\n;; f takes 2 args: 'index' and 'value' where index is 0-based\n;; when f returns nil the index is not included in final result\nuser=> (keep-indexed (fn [idx v]\n (if (pos? v) idx)) [-9 0 29 -7 45 3 -8])\n(2 4 5)", :created-at 1292177237000, :updated-at 1292177237000, :_id "542692c9c026201cdc326a87"} {:author {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}, :editors [{:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "clojureking", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/92625b8a6be91bb8c688d0d07b4e2a32?r=PG&default=identicon"} {:login "clojureking", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/92625b8a6be91bb8c688d0d07b4e2a32?r=PG&default=identicon"}], :body "(defn position [x coll & {:keys [from-end all] :or {from-end false all false}}]\n (let [all-idxs (keep-indexed (fn [idx val] (when (= val x) idx)) coll)]\n (cond\n (true? from-end) (last all-idxs)\n (true? all) all-idxs\n :else (first all-idxs))))\n\nuser> (position [1 1] [[1 0][1 1][2 3][1 1]])\n1\nuser> (position [1 1] [[1 0][1 1][2 3][1 1]] :from-end true)\n3\nuser> (position [1 1] [[1 0][1 1][2 3][1 1]] :all true)\n(1 3)\n\nuser> (def foo (shuffle (range 10)))\n#'user/foo\nuser> foo\n(5 8 9 1 2 7 0 6 3 4)\nuser> (position 5 foo)\n0\nuser> (position 0 foo)\n6", :created-at 1306319468000, :updated-at 1409547666000, :_id "542692c9c026201cdc326a88"} {:updated-at 1444409466360, :created-at 1444409466360, :author {:login "PetrGlad", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/124476?v=3"}, :body ";; Simpler version of \"position\" above\n;; Get position of first element that satisfies the predicate\n(let [predicate #(= 1 %)\n sequence [3 2 4 1 5 6 7]]\n (first (keep-indexed (fn [i x] (when (predicate x) i)) \n sequence)))\n\n;; The same logic but implemented with map-indexed\n(let [predicate #(= 1 %)\n sequence [3 2 4 1 5 6 7]]\n (some identity \n (map-indexed (fn [i x] (when (predicate x) i)) \n sequence)))", :_id "5617f07ae4b084e61c76ecbf"} {:updated-at 1528067828447, :created-at 1528067828447, :author {:login "statcompute", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/4590938?v=4"}, :body "(require '[clojure.pprint :as p]\n '[clojure.java.jdbc :as j])\n \n(def db\n {:classname \"org.sqlite.JDBC\"\n :subprotocol \"sqlite\"\n :subname \"/home/liuwensui/Downloads/chinook.db\"})\n \n(def orders (j/query db \"select billingcountry as country, count(*) as orders from invoices group by billingcountry;\"))\n \n(def clist '(\"USA\" \"India\" \"Canada\" \"France\")\n\n(def country (map #(get % :country) orders))\n\n(p/print-table \n (map #(nth orders %) \n (flatten (pmap (fn [c] (keep-indexed (fn [i v] (if (= v c) i)) country)) clist))))\n\n;| :country | :orders |\n;|----------+---------|\n;| USA | 91 |\n;| India | 13 |\n;| Canada | 56 |\n;| France | 35 |", :_id "5b1476f4e4b00ac801ed9e0a"} {:updated-at 1545622986549, :created-at 1542944952784, :author {:login "gluer", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/22495106?v=4"}, :body ";; a simple example\n(map-indexed #(when (< % 2) (str % %2)) [:a :b :c])\n;;=> (\"0:a\" \"1:b\" nil)\n\n(keep-indexed #(when (< % 2) (str % %2)) [:a :b :c])\n;;=> (\"0:a\" \"1:b\")", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/22495106?v=4", :account-source "github", :login "gluer"}], :_id "5bf778b8e4b0ca44402ef5c8"} {:editors [{:login "kevinmungai", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/23656776?v=4"}], :body ";; returns a new list by removing the elements at odd positions\n(defn filter-list-by-position\n [lst]\n (into []\n (keep-indexed #(when (odd? %1) %2)) ;; transducer\n lst))\n\n;; 0 1 2 3 4 5 6 8\n(def nums [2 5 3 4 6 7 9 8])\n\n(filter-list-by-position nums)\n;;=> [5 4 7 8]", :author {:avatar-url "https://avatars3.githubusercontent.com/u/23656776?v=4", :account-source "github", :login "kevinmungai"}, :created-at 1594505780319, :updated-at 1594505852298, :_id "5f0a3a34e4b0b1e3652d731f"}], :notes nil, :arglists ["f" "f coll"], :doc "Returns a lazy sequence of the non-nil results of (f index item). Note,\n this means false return values will be included. f must be free of\n side-effects. Returns a stateful transducer when no collection is\n provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/keep-indexed"} {:added "1.5", :ns "clojure.core", :name "cond->>", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1432152383427, :author {:login "x", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/693546?v=3"}, :to-var {:ns "clojure.core", :name "cond->", :library-url "https://github.com/clojure/clojure"}, :_id "555ce93fe4b01ad59b65f4d4"} {:created-at 1432152404184, :author {:login "x", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/693546?v=3"}, :to-var {:ns "clojure.core", :name "as->", :library-url "https://github.com/clojure/clojure"}, :_id "555ce954e4b03e2132e7d165"} {:created-at 1432152431951, :author {:login "x", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/693546?v=3"}, :to-var {:ns "clojure.core", :name "->", :library-url "https://github.com/clojure/clojure"}, :_id "555ce96fe4b01ad59b65f4d6"} {:created-at 1432152437689, :author {:login "x", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/693546?v=3"}, :to-var {:ns "clojure.core", :name "->>", :library-url "https://github.com/clojure/clojure"}, :_id "555ce975e4b03e2132e7d167"} {:created-at 1537310356172, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "cond", :ns "clojure.core"}, :_id "5ba17e94e4b00ac801ed9ea0"} {:created-at 1537310390943, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "case", :ns "clojure.core"}, :_id "5ba17eb6e4b00ac801ed9ea1"}], :line 7555, :examples [{:editors [{:login "x", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/693546?v=3"}], :updated-at 1458757086103, :created-at 1432152126897, :author {:avatar-url "https://avatars.githubusercontent.com/u/693546?v=3", :account-source "github", :login "x"}, :body ";; useful for when you want to control doing a bunch of things to a lazy sequence \n;; based on some conditions or, commonly, keyword arguments to a function.\n\n(defn do-stuff\n [coll {:keys [map-fn max-num-things batch-size]}]\n (cond->> coll\n map-fn (map map-fn)\n max-num-things (take max-num-things)\n batch-size (partition batch-size)))\n\nuser=> (do-stuff [1 2 3 4] {})\n[1 2 3 4]\nuser=> (do-stuff [1 2 3 4] {:map-fn str})\n(\"1\" \"2\" \"3\" \"4\")\nuser=> (do-stuff [1 2 3 4] {:map-fn str :batch-size 2})\n((\"1\" \"2\") (\"3\" \"4\"))\nuser=> (do-stuff [1 2 3 4] {:map-fn str :max-num-things 3})\n(\"1\" \"2\" \"3\")", :_id "555ce83ee4b01ad59b65f4d2"}], :macro true, :notes nil, :arglists ["expr & clauses"], :doc "Takes an expression and a set of test/form pairs. Threads expr (via ->>)\n through each form for which the corresponding test expression\n is true. Note that, unlike cond branching, cond->> threading does not short circuit\n after the first true test expression.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/cond->>"} {:added "1.0", :ns "clojure.core", :name "subs", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1318625011000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "replace", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f3a"} {:created-at 1318625250000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "split", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f3b"} {:created-at 1379039766000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.string", :name "replace-first", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f3c"} {:created-at 1379039915000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "re-find", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f3d"} {:created-at 1379039920000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "re-seq", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f3e"} {:created-at 1379039970000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "re-matches", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f3f"}], :line 4981, :examples [{:author {:login "citizen428", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3881a28fe402dd2d1de44717486cae8?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (subs \"Clojure\" 1) \n\"lojure\"\nuser=> (subs \"Clojure\" 1 3)\n\"lo\"\n\n\n;; String indexes have to be between 0 and (.length s)\n\nuser=> (subs \"Clojure\" 1 20)\njava.lang.StringIndexOutOfBoundsException: String index out of range: 20 (NO_SOURCE_FILE:0)\n", :created-at 1280470619000, :updated-at 1285496389000, :_id "542692ccc026201cdc326cab"} {:updated-at 1513303984796, :created-at 1379039736000, :body ";; Note that subs uses method java.lang.String/substring\n;; http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#substring%28int,%20int%29\n\n;; See this link for more details:\n\n;; https://dzone.com/articles/changes-stringsubstring-java-7\n\n;; This link was the original, but seems to no longer exist as of Nov 2017:\n;; http://www.javaadvent.com/2012/12/changes-to-stringsubstring-in-java-7.html\n\n;; Briefly, before Java version 7u6, Java's substring method was\n;; guaranteed to work in O(1) time, by creating a String that refers\n;; to the original string's characters, rather than copying them.\n\n;; After Java 7u6, substring was changed to copy the string's original\n;; characters, thus taking time linear in the length of the substring,\n;; but it never refers to the original string.\n\n;; The potential disadvantage of the pre-version-7u6 behavior is that\n;; if you read in one or more strings with a large total size, and then\n;; use methods based on substring to keep only a small subset of that,\n;; e.g., because you parsed and found a small collection of substrings of\n;; interest for your computation, the large strings will still have\n;; references to them, and thus cannot be garbage collected, even if you\n;; have no other references to them.\n\n;; You can use the Java constructor (String. s) to guarantee that you\n;; copy a string s. (String. (subs s 5 20)) will copy the substring once\n;; pre-version-7u6, but it will copy the substring twice\n;; post-version-7u6.\n\n;; I believe java.util.regex.Matcher method group, and\n;; java.util.regex.Pattern method split, also have the same\n;; behavior as substring.\n\n;; This affects the behavior of Clojure functions such as:\n\n;; In clojure.core:\n;; subs, re-find, re-matches, re-seq\n;; In clojure.string:\n;; replace replace-first split\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}, :_id "542692d5c026201cdc32709d"} {:updated-at 1517506971847, :created-at 1517506971847, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body ";; Suppose you want to shorten a string of blanks [outdent]\n;; Starting with a string of length 5\n;; [Here I do not use blanks to illustrate what is happening]\n(def s5 \"abcdef\")\n;; and reducing its length by 2\n(subs s5 (min 2 (count s5))) \n;=> \"cdef\"\n(subs s5 (min 10 (count s5))) \n;=> \"\"", :_id "5a73519be4b0c974fee49d19"}], :notes nil, :arglists ["s start" "s start end"], :doc "Returns the substring of s beginning at start inclusive, and ending\n at end (defaults to length of string), exclusive.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/subs"} {:added "1.1", :ns "clojure.core", :name "ref-min-history", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1364770283000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c63"} {:created-at 1364770288000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref-max-history", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c64"} {:created-at 1364770294000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref-history-count", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c65"}], :line 2470, :examples [{:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body "(def r (ref 0))\n(ref-min-history r)\n;; 0\n\n(ref-min-history r 1) ; setter\n;; #object[clojure.lang.Ref 0x1f3f02ee {:status :ready, :val 0}]\n\n(ref-min-history r) ; getter\n;; 1\n", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1550443391880, :updated-at 1553683971669, :_id "5c69e37fe4b0ca44402ef68d"} {:updated-at 1550443972155, :created-at 1550443972155, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Setting the min history > 0 \n;; prevents read faults and related TX restart.\n;; Here T2 changes r after T1 started but haven't deref r yet.\n\n(def r (ref 0)) ; min-history is zero\n\n(future\n (dosync\n (println \"-Tx starting-\")\n (Thread/sleep 10000)\n (println \"T1:\" @r)))\n;; -Tx starting-\n\n(future\n (dosync\n (println \"T2:\" (alter r inc))))\n;; T2: 1\n;; -Tx starting-\n;; T1: 1\n\n;; Here T1 has one ref history value available and\n;; does not restart.\n(def r (ref 0))\n(ref-min-history r 1)\n\n(future\n (dosync\n (println \"-Tx starting-\")\n (Thread/sleep 10000)\n (println \"T1:\" @r)))\n;; -Tx starting-\n\n(future\n (dosync\n (println \"T2:\" (alter r inc))))\n;; T2: 1\n;; T1: 0", :_id "5c69e5c4e4b0ca44402ef68e"}], :notes nil, :arglists ["ref" "ref n"], :doc "Gets the min-history of a ref, or sets it and returns the ref", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ref-min-history"} {:added "1.0", :ns "clojure.core", :name "set", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1289811222000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "hash-set", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f12"} {:created-at 1289811227000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sorted-set", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f13"} {:created-at 1289811237000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "conj", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f14"} {:created-at 1313621942000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "join", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f15"} {:created-at 1313621949000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "select", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f16"} {:created-at 1313621954000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "difference", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f17"} {:created-at 1313621961000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "intersection", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f18"} {:created-at 1313621965000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "union", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f19"} {:created-at 1313621977000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "index", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f1a"} {:created-at 1313621988000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "project", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f1b"} {:created-at 1313621999000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "rename", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f1c"} {:created-at 1313622003000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "rename-keys", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f1d"} {:created-at 1313622018000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "map-invert", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f1e"} {:created-at 1313622048000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "disj", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f1f"} {:created-at 1315819885000, :author {:login "wdkrnls", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/6d08a2f792f289b95fe1d982d4133d71?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "distinct", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f20"}], :line 4105, :examples [{:author {:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"}, :editors [{:login "seancorfield", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9354eec0679e2d3b36b77ff62165f717?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body ";; returns distinct elements\nuser=> (set '(1 1 2 3 2 4 5 5))\n#{1 2 3 4 5}\n\n;; returns distinct elements (different nomenclature)\nuser=> (set [1 1 2 3 2 4 5 5])\n#{1 2 3 4 5}\n\nuser=> (set [1 2 3 4 5]) \n#{1 2 3 4 5}\n\nuser=> (set \"abcd\")\n#{\\a \\b \\c \\d}\n\nuser=> (set '(\"a\" \"b\" \"c\" \"d\"))\n#{\"a\" \"b\" \"c\" \"d\"}\n\nuser=> (set {:one 1 :two 2 :three 3})\n#{[:two 2] [:three 3] [:one 1]}\n\nuser=> (set nil)\n#{}", :created-at 1279417897000, :updated-at 1423275927213, :_id "542692cbc026201cdc326bfb"} {:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [{:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}], :body "(set [1 2 3 2 1 2 3])\n-> #{1 2 3}\n\n#{:a :b :c :d}\n-> #{:d :a :b :c}\n\n(hash-set :a :b :c :d)\n-> #{:d :a :b :c}\n \n(sorted-set :a :b :c :d)\n-> #{:a :b :c :d}\n\n;------------------------------------------------\n\n(def s #{:a :b :c :d})\n(conj s :e)\n-> #{:d :a :b :e :c}\n \n(count s)\n-> 4\n \n(seq s)\n-> (:d :a :b :c)\n \n(= (conj s :e) #{:a :b :c :d :e})\n-> true\n\n(s :b)\n-> :b\n \n(s :k)\n-> nil", :created-at 1289811205000, :updated-at 1289811299000, :_id "542692cbc026201cdc326bff"}], :notes [{:updated-at 1316747546000, :body "The documentation doesn't mention the order, is it undefined?\r\n\r\n#{:a :b :c :d}\r\n-> #{:d :a :b :c}\r\n", :created-at 1316747546000, :author {:login "icefox", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/dc848256f8954abd612cbe7e81859f91?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fce"} {:author {:login "venantius", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1824859?v=3"}, :updated-at 1476386802865, :created-at 1476386802865, :body "Sets are a core data structure that by definition do not store elements in a sorted order. The actual order will ultimately be determined by the specific hashing function underpinning the data structure. ", :_id "57ffdff2e4b001179b66bdcc"} {:author {:login "dhbarnett", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1676252?v=4"}, :updated-at 1568233525282, :created-at 1568233525282, :body "Is the order guaranteed to be consistent if so is it not ordered (just not asc/desc)? ", :_id "5d795835e4b0ca44402ef7b2"} {:author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :updated-at 1573849219982, :created-at 1573849219982, :body "Sets are not ordered, so there’s not guarantee on their “order”.", :_id "5dcf0883e4b0ca44402ef7e0"}], :arglists ["coll"], :doc "Returns a set of the distinct elements of coll.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/set"} {:added "1.1", :ns "clojure.core", :name "take-last", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1306817623000, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "last", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d0d"} {:created-at 1306817710000, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "butlast", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d0e"} {:created-at 1306817740000, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "drop-last", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d0f"} {:created-at 1473271791957, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "subvec", :ns "clojure.core"}, :_id "57d057efe4b0709b524f04ea"}], :line 2941, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user=> (take-last 2 [1 2 3 4])\n(3 4)\n\nuser=> (take-last 2 [4])\n(4)\n\nuser=> (take-last 2 [])\nnil\n\nuser=> (take-last 2 nil)\nnil\n\nuser=> (take-last 0 [1])\nnil\n\nuser=> (take-last -1 [1])\nnil", :created-at 1280323099000, :updated-at 1423278794590, :_id "542692cec026201cdc326de0"}], :notes [{:author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :updated-at 1521555189789, :created-at 1521555189789, :body "Unlike \"drop-last\" (but like \"last\"), \"take-last\" is not lazy:\n\n
    \n(def bomb (take-last 1 (range))) ;; infinite evaluation, never returns\n(def lazy-bomb (drop-last 1 (range))) ;; good, but don't use!\n
    ", :_id "5ab116f5e4b045c27b7fac1a"}], :arglists ["n coll"], :doc "Returns a seq of the last n items in coll. Depending on the type\n of coll may be no better than linear time. For vectors, see also subvec.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/take-last"} {:added "1.0", :ns "clojure.core", :name "bit-set", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1461359248259, :author {:login "fasiha", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/37649?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "bit-test", :ns "clojure.core"}, :_id "571a9290e4b0e6b5e3f27e5c"} {:created-at 1527805055459, :author {:login "NealEhardt", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1338977?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "bit-clear", :ns "clojure.core"}, :_id "5b10747fe4b045c27b7fac8a"}], :line 1337, :examples [{:updated-at 1461359232399, :created-at 1280337241000, :body "user=> (bit-set 2r1011 2) ; index is 0-based\n15 \n;; 15 = 2r1111\n\n;; the same in decimal\nuser=> (bit-set 11 2) \n15", :editors [{:avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon", :account-source "clojuredocs", :login "zmila"} {:avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon", :account-source "clojuredocs", :login "zmila"} {:login "fasiha", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/37649?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon", :account-source "clojuredocs", :login "zmila"}, :_id "542692c7c026201cdc32696f"} {:editors [{:login "fasiha", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/37649?v=3"}], :body ";; Returns a long, like all Clojure bit operations\nuser=> (bit-set 0 63)\n-9223372036854775808\n; A signed 64-bit number with only the sign bit (most significant bit) on.\n; This is the most negative number representable by signed 64 bits: -(2**63).\n; Same as:\nuser=> (bit-shift-left 1 63)\n-9223372036854775808\n\n;; And in case you forget your common powers to two, here's a reference ^^\nuser=> (bit-set 0 32)\n4294967296\nuser=> (bit-set 0 16)\n65536\nuser=> (bit-set 0 8)\n256\nuser=> (bit-set 0 4)\n16", :author {:avatar-url "https://avatars.githubusercontent.com/u/37649?v=3", :account-source "github", :login "fasiha"}, :created-at 1461359743597, :updated-at 1461359793455, :_id "571a947fe4b0e6b5e3f27e5d"}], :notes nil, :arglists ["x n"], :doc "Set bit at index n", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bit-set"} {:added "1.7", :ns "clojure.core", :name "reader-conditional", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495962203638, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reader-conditional?", :ns "clojure.core"}, :_id "592a925be4b093ada4d4d776"} {:created-at 1495962209101, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "read", :ns "clojure.core"}, :_id "592a9261e4b093ada4d4d777"} {:created-at 1495962222485, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "read-string", :ns "clojure.core"}, :_id "592a926ee4b093ada4d4d778"}], :line 7738, :examples [{:updated-at 1495962191755, :created-at 1495962191755, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body ";;;; The data representation for reader conditionals is used by Clojure\n;;;; when reading a string/file into Clojure data structures but choosing \n;;;; to preserve the conditionals themselves (instead of replacing them with\n;;;; the appropriate platform-specific code)\n\n;;;; Create a data representation for a NON-SPLICING reader conditional\n\n(def r-cond (reader-conditional '(:clj (Math/random)) false))\n;;=> #'user/r-cond\nr-cond\n;;=> #?(:clj (Math/random))\n(:form r-cond)\n;;=> (:clj (Math/random))\n(:splicing? r-cond)\n;;=> false\n\n;;;; Data representation is same as the one produced by (read-string)\n;;;; and (read) when provided with the option to preserve data conditionals\n\n(= r-cond (read-string {:read-cond :preserve} \"#?(:clj (Math/random))\"))\n;;=> true\n\n;;;; Create a data representation for a SPLICING reader conditional\n\n(def r-cond (reader-conditional '(:clj [Math/PI Math/E]) true))\n;;=> #'user/r-cond\n(:clj [Math/PI Math/E])\n;;=> #?@(:clj [Math/PI Math/E])\n(:form r-cond)\n;;=> (:clj [Math/PI Math/E])\n(:splicing? r-cond)\n;;=> true\n\n;;;; Data representation is same as the one produced by (read-string)\n;;;; and (read) when provided with the option to preserve data conditionals\n\n(= r-cond (read-string {:read-cond :preserve} \"#?@(:clj [Math/PI Math/E])\"))\n;;=> true", :_id "592a924fe4b093ada4d4d775"}], :notes nil, :arglists ["form splicing?"], :doc "Construct a data representation of a reader conditional.\n If true, splicing? indicates read-cond-splicing.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/reader-conditional"} {:added "1.0", :ns "clojure.core", :name "gen-class", :file "clojure/genclass.clj", :type "macro", :column 1, :see-alsos [{:created-at 1360270663000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "proxy", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bd7"} {:created-at 1360270670000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "gen-interface", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bd8"}], :line 507, :examples [{:author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :editors [{:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"} {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "(gen-class\n\t:name \"some.package.RefMap\"\n\t:implements [java.util.Map]\n\t:state \"state\"\n\t:init \"init\"\n\t:constructors {[] []}\n\t:prefix \"ref-map-\")\n\n(defn ref-map-init []\n\t[[] (ref {})])\n\n(defn ref-map-size [this]\n\t(let [state (.state this)] (.size @state)))\n\t\n(defn ref-map-isEmpty [this]\n\t(let [state (.state this)] (.isEmpty @state)))\n\n(defn ref-map-containsKey [this o]\n\t(let [state (.state this)] (.containsKey @state o)))\n\t\n(defn ref-map-containsValue [this o]\n\t(let [state (.state this)] (.containsValue @state o)))\n\t\n(defn ref-map-get [this o]\n\t(let [state (.state this)] (.get @state o)))\n\t\n(defn ref-map-keySet [this]\n\t(let [state (.state this)] (.keySet @state)))\n\t\n(defn ref-map-values [this]\n\t(let [state (.state this)] (.values @state)))\n\t\n(defn ref-map-entrySet [this]\n\t(let [state (.state this)] (.entrySet @state)))\n\t\n(defn ref-map-equals [this o]\n\t(let [state (.state this)] (.equals @state o)))\n\t\n(defn ref-map-hashCode [this]\n\t(let [state (.state this)] (.hashCode @state)))\n\t\n(defn ref-map-put [this k v]\n\t(let [state (.state this)] \n\t\t(dosync (alter state assoc k v)) v))\n\t\n(defn ref-map-putAll [this m]\n\t(let [state (.state this)]\n\t\t(doseq [[k v] (map identity m)] (.put this k v))))\n\t\t\n(defn ref-map-remove [this o]\n\t(let [state (.state this) v (get @state o)] \n\t\t(dosync (alter state dissoc o)) v))\n\t\n(defn ref-map-clear [this]\n\t(let [state (.state this)] \n\t\t(dosync (ref-set state {}))))\n\t\n(defn ref-map-toString [this]\n\t(let [state (.state this)] (.toString @state)))", :created-at 1279770352000, :updated-at 1332952789000, :_id "542692cec026201cdc326dab"} {:author {:login "daviddurand", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1316941?v=2"}, :editors [], :body ";; I found managing state a bit confusing at first.\n;; here's a dumb little class with a getter and setter for a \"location\" field.\n\n(ns com.example )\n\n(gen-class\n :name com.example.Demo\n :state state\n :init init\n :prefix \"-\"\n :main false\n ;; declare only new methods, not superclass methods\n :methods [[setLocation [String] void]\n [getLocation [] String]])\n\n;; when we are created we can set defaults if we want.\n(defn -init []\n \"store our fields as a hash\"\n [[] (atom {:location \"default\"})])\n\n;; little functions to safely set the fields.\n(defn setfield\n [this key value]\n (swap! (.state this) into {key value}))\n\n(defn getfield\n [this key]\n (@(.state this) key))\n\n;; \"this\" is just a parameter, not a keyword\n(defn -setLocation [this loc]\n (setfield this :location loc))\n\n(defn -getLocation\n [this]\n (getfield this :location))\n\n;; running it -- you must compile and put output on the classpath\n;; create a Demo, check the default value, then set it and check again.\nuser=> (def ex (com.example.Demo.))\n#'user/ex\nuser=> (.getLocation ex)\n\"default\"\nuser=> (.setLocation ex \"time\")\nnil\nuser=> (.getLocation ex)\n\"time\"\n", :created-at 1325884685000, :updated-at 1325884685000, :_id "542692d3c026201cdc326fbb"} {:editors [{:login "mars0i", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1836941?v=4"}], :body ";; This example illustrates the syntax intended by the docstring's remark that \n;; \"Static methods can be specified with ^{:static true} in the signature's \n;; metadata\", and notes a case in which you might not think that you need to use\n;; :methods.\n\n;; The docs say, about :methods, \"Do not repeat superclass/interface\n;; signatures here.\" That applies to non-static methods. If you want to\n;; define a static method to hide a static method in the superclass, you\n;; are not overriding the superclass method (the behavior is different).\n;; You are simply defining a new method with the same name. In this case,\n;; you should add a signature to :methods if you want your function to be\n;; visible to Java, with metadata indicating that it is static placed\n;; before the signature vector:\n\n(ns \n ...\n (:gen-class \n ...\n :methods [[...] ...\n ^{:static true} [name [] java.lang.String]\n [...] ...]\n ...))\n\n(defn -name [] \"My name is Foo\")\n\n;; Also note that you can replace \"^{:static true}\" with \"^:static\".", :author {:avatar-url "https://avatars0.githubusercontent.com/u/1836941?v=4", :account-source "github", :login "mars0i"}, :created-at 1554533983608, :updated-at 1554575687135, :_id "5ca84e5fe4b0ca44402ef6fe"} {:updated-at 1558971581245, :created-at 1558971581245, :author {:login "holyjak", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/624958?v=4"}, :body ";; It is possible to attach Java annotations to the class,\n;; constructors, and methods \n;; Source: https://github.com/clojure/clojure/blob/8af7e9a92570eb28c58b15481ae9c271d891c028/test/clojure/test_clojure/genclass/examples.clj#L34\n(gen-class :name ^{Deprecated {}\n SuppressWarnings [\"Warning1\"] ; discarded\n java.lang.annotation.Target []}\n clojure.test_clojure.genclass.examples.ExampleAnnotationClass\n :prefix \"annot-\"\n :methods [[^{Deprecated {}\n Override {}} ;discarded\n foo [^{java.lang.annotation.Retention java.lang.annotation.RetentionPolicy/SOURCE\n java.lang.annotation.Target [java.lang.annotation.ElementType/TYPE\n java.lang.annotation.ElementType/PARAMETER]}\n String] void]])\n", :_id "5cec04bde4b0ca44402ef72b"} {:updated-at 1625726462164, :created-at 1625726462164, :author {:login "mattiuusitalo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/47240847?v=4"}, :body ";; Defining a custom constructor which calls a superclass constructor:\n(ns my.CustomException\n (:gen-class\n :implements [clojure.lang.IExceptionInfo]\n :extends java.lang.RuntimeException\n :constructors {[String Throwable clojure.lang.IPersistentMap] [String Throwable]} ; mapping of my-constructor -> superclass constuctor\n :init init\n :state state ; name for the var that holds your internal state\n :main false\n :prefix \"my-ex-\"))\n\n(defn my-ex-init [msg t context]\n ;; first element of vector contains parameters for the superclass constructor\n ;; Second element will be your internal state \n [[msg t] context]) \n\n(defn my-ex-getData [this]\n (.state this)) ; accessing the internal state\n", :_id "60e69dfee4b0b1e3652d7513"}], :macro true, :notes [{:updated-at 1280115806000, :body "When implementing interface methods with `gen-class` (when using `:implements`) watch out for primitive return types in interface methods.\r\n\r\nWhen you get weird `NullPointerException`s or `ClassPathException`s then make sure whether the value returned by your functions can be converted by Clojure to the primitive return type defined in the interface for that method.\r\n\r\nExample:\r\n\r\nGiven:\r\n\r\n
    \r\ninterface Test {\r\n   boolean isTest();\r\n}\r\n
    \r\n\r\nClojure implementation:\r\n\r\n
    \r\n(gen-class :name \"MyTest\" :implements [Test])\r\n\r\n; Will throw NPE when executed, \r\n; can't be converted to boolean\r\n(defn -isTest [this] nil) \r\n
    \r\n\r\n
    \r\n(gen-class :name \"MyTest\" :implements [Test])\r\n\r\n; Will throw ClassCastExcpetion when executed, \r\n; can't be converted to boolean\r\n(defn -isTest [this] (Object.)) \r\n
    ", :created-at 1280115806000, :author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f8a"} {:updated-at 1311325790000, :body "When implementing an interface or extending an abstract class that implements an interface, be careful to implement all methods in the implemented interfaces. Note: The abstract class is not required to implement all methods in the interface. The clojure compiler does not throw compiler errors if you do not implement a method. A runtime error will be thrown when someone tries to use the function. The documentation suggests that you will receive UnsupportedOperationException, however in the case of the abstract class a java.lang.AbstractMethodError is thrown. \r\n\r\n**example:**\r\n\r\nLog4j appender - Extending AppenderSkeleton will fail with runtime error\r\n
    (gen-class :name clj.TestAppender :extends  org.apache.log4j.AppenderSkeleton)\r\n\r\n(defn -append [this event]\r\n  (println (.getMessage event)))\r\n
    \r\n\r\n\r\nNeed to implement close and requireLayout. These are not in AppenderSkeleton but are required by the interface Appender.\r\n
    (gen-class :name TstAppender :extends org.apache.log4j.AppenderSkeleton)\r\n\r\n(defn -append [this event]\r\n  (println (.getMessage event)))\r\n\r\n(defn -close [this]) ;nothing to clean up\r\n\r\n(defn -requireLayout [this] false)\r\n\r\n
    \r\n\r\n\r\n", :created-at 1306791528000, :author {:login "ckirkendall", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c29cd3a5f182e6de85cbd172fb9b5ab8?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fbf"} {:body "If your namespace has dashes in it, then the class name will be mangled so the dashes become underscores, unless you have a :name directive. Your naive instantiation will fail with ClassNotFoundException.\n\n (ns my-project.MyClass\n (:gen-class))\n\n (my-project.MyClass.) ;;=> java.lang.ClassNotFoundException\n (my_project.MyClass.) ;;=> #", :created-at 1418209544515, :updated-at 1418209661100, :author {:login "alilee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/16739?v=3"}, :_id "54882908e4b04e93c519ffa1"} {:author {:login "staypufd", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/10730?v=4"}, :updated-at 1518392816391, :created-at 1518392816391, :body "Note: If you are using :extends you must use the fully qualified class name even if the class is in the :import list for the namespace. ", :_id "5a80d5f0e4b0316c0f44f8b8"} {:author {:login "mars0i", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1836941?v=4"}, :updated-at 1554575508996, :created-at 1554575508996, :body "Not strictly speaking a `gen-class` issue, but if you need to override a Java method that's overloaded by specifying different classes for its arguments, this can be done by incorporating the class names into Clojure function names. See:\n\nhttps://groups.google.com/forum/#!topic/clojure/TVRsy4Gnf70\n\nhttps://puredanger.github.io/tech.puredanger.com/2011/08/12/subclassing-in-clojure\n\nhttp://stackoverflow.com/questions/32773861/clojure-gen-class-for-overloaded-and-overridden-methods\n\nhttp://dishevelled.net/Tricky-uses-of-Clojure-gen-class-and-AOT-compilation.html\n", :_id "5ca8f094e4b0ca44402ef705"}], :arglists ["& options"], :doc "When compiling, generates compiled bytecode for a class with the\n given package-qualified :name (which, as all names in these\n parameters, can be a string or symbol), and writes the .class file\n to the *compile-path* directory. When not compiling, does\n nothing. The gen-class construct contains no implementation, as the\n implementation will be dynamically sought by the generated class in\n functions in an implementing Clojure namespace. Given a generated\n class org.mydomain.MyClass with a method named mymethod, gen-class\n will generate an implementation that looks for a function named by \n (str prefix mymethod) (default prefix: \"-\") in a\n Clojure namespace specified by :impl-ns\n (defaults to the current namespace). All inherited methods,\n generated methods, and init and main functions (see :methods, :init,\n and :main below) will be found similarly prefixed. By default, the\n static initializer for the generated class will attempt to load the\n Clojure support code for the class as a resource from the classpath,\n e.g. in the example case, ``org/mydomain/MyClass__init.class``. This\n behavior can be controlled by :load-impl-ns\n\n Note that methods with a maximum of 18 parameters are supported.\n\n In all subsequent sections taking types, the primitive types can be\n referred to by their Java names (int, float etc), and classes in the\n java.lang package can be used without a package qualifier. All other\n classes must be fully qualified.\n\n Options should be a set of key/value pairs, all except for :name are optional:\n\n :name aname\n\n The package-qualified name of the class to be generated\n\n :extends aclass\n\n Specifies the superclass, the non-private methods of which will be\n overridden by the class. If not provided, defaults to Object.\n\n :implements [interface ...]\n\n One or more interfaces, the methods of which will be implemented by the class.\n\n :init name\n\n If supplied, names a function that will be called with the arguments\n to the constructor. Must return [ [superclass-constructor-args] state] \n If not supplied, the constructor args are passed directly to\n the superclass constructor and the state will be nil\n\n :constructors {[param-types] [super-param-types], ...}\n\n By default, constructors are created for the generated class which\n match the signature(s) of the constructors for the superclass. This\n parameter may be used to explicitly specify constructors, each entry\n providing a mapping from a constructor signature to a superclass\n constructor signature. When you supply this, you must supply an :init\n specifier. \n\n :post-init name\n\n If supplied, names a function that will be called with the object as\n the first argument, followed by the arguments to the constructor.\n It will be called every time an object of this class is created,\n immediately after all the inherited constructors have completed.\n Its return value is ignored.\n\n :methods [ [name [param-types] return-type], ...]\n\n The generated class automatically defines all of the non-private\n methods of its superclasses/interfaces. This parameter can be used\n to specify the signatures of additional methods of the generated\n class. Static methods can be specified with ^{:static true} in the\n signature's metadata. Do not repeat superclass/interface signatures\n here.\n\n :main boolean\n\n If supplied and true, a static public main function will be generated. It will\n pass each string of the String[] argument as a separate argument to\n a function called (str prefix main).\n\n :factory name\n\n If supplied, a (set of) public static factory function(s) will be\n created with the given name, and the same signature(s) as the\n constructor(s).\n \n :state name\n\n If supplied, a public final instance field with the given name will be\n created. You must supply an :init function in order to provide a\n value for the state. Note that, though final, the state can be a ref\n or agent, supporting the creation of Java objects with transactional\n or asynchronous mutation semantics.\n\n :exposes {protected-field-name {:get name :set name}, ...}\n\n Since the implementations of the methods of the generated class\n occur in Clojure functions, they have no access to the inherited\n protected fields of the superclass. This parameter can be used to\n generate public getter/setter methods exposing the protected field(s)\n for use in the implementation.\n\n :exposes-methods {super-method-name exposed-name, ...}\n\n It is sometimes necessary to call the superclass' implementation of an\n overridden method. Those methods may be exposed and referred in \n the new method implementation by a local name.\n\n :prefix string\n\n Default: \"-\" Methods called e.g. Foo will be looked up in vars called\n prefixFoo in the implementing ns.\n\n :impl-ns name\n\n Default: the name of the current ns. Implementations of methods will be \n looked up in this namespace.\n\n :load-impl-ns boolean\n\n Default: true. Causes the static initializer for the generated class\n to reference the load code for the implementing namespace. Should be\n true when implementing-ns is the default, false if you intend to\n load the code via some other method.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/gen-class"} {:added "1.9", :ns "clojure.core", :name "qualified-keyword?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495715351421, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "keyword?", :ns "clojure.core"}, :_id "5926ce17e4b093ada4d4d766"} {:created-at 1495715368644, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "simple-keyword?", :ns "clojure.core"}, :_id "5926ce28e4b093ada4d4d767"}], :line 1642, :examples [{:editors [{:login "troglotit", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/10955264?v=4"}], :body "(qualified-keyword? :user/:keyword)\n;;=> true\n(qualified-keyword? ::keyword)\n;;=> true\n\n(qualified-keyword? :keyword)\n;;=> false\n\n(qualified-keyword? \"string\")\n;;=> false\n(qualified-keyword? 42)\n;;=> false\n(qualified-keyword? nil)\n;;=> false", :author {:avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3", :account-source "github", :login "svenschoenung"}, :created-at 1495722029967, :updated-at 1525876162343, :_id "5926e82de4b093ada4d4d768"}], :notes nil, :arglists ["x"], :doc "Return true if x is a keyword with a namespace", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/qualified-keyword_q"} {:added "1.0", :ns "clojure.core", :name "while", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1360216659000, :author {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "loop", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e4c"} {:created-at 1423524433851, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "dotimes", :library-url "https://github.com/clojure/clojure"}, :_id "54d94251e4b081e022073c7c"} {:created-at 1502829799304, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "repeatedly", :ns "clojure.core"}, :_id "59935ce7e4b0d19c2ce9d718"} {:created-at 1608681273224, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "swap!", :ns "clojure.core"}, :_id "5fe28739e4b0b1e3652d741d"} {:created-at 1608681301934, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "atom", :ns "clojure.core"}, :_id "5fe28755e4b0b1e3652d741e"}], :line 6333, :examples [{:updated-at 1608681521678, :created-at 1280547677000, :body ";; a var to be used for its side effects\n(def a (atom 10)) \n;; #'user/a\n\n(while (pos? @a)\n (println @a)\n (swap! a dec))\n;; 10\n;; 9\n;; 8\n;; 7\n;; 6\n;; 5\n;; 4\n;; 3\n;; 2\n;; 1\n;;=> nil", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon", :account-source "clojuredocs", :login "dakrone"}, :_id "542692ccc026201cdc326c69"} {:editors [{:login "slipset", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5894926?v=3"} {:avatar-url "https://avatars2.githubusercontent.com/u/87162?v=4", :account-source "github", :login "rafaelrinaldi"} {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; calculate the MD5 of a file incrementally:\n\n(import\n 'java.io.File\n 'javax.xml.bind.DatatypeConverter\n 'java.security.MessageDigest\n 'java.security.DigestInputStream)\n\n(require '[clojure.java.io :as io])\n\n(defn md5-file [file]\n (let [sha (MessageDigest/getInstance \"MD5\")] \n (with-open [dis (DigestInputStream. (io/input-stream file) sha)] \n (while (> (.read dis) -1))) \n (DatatypeConverter/printHexBinary (.digest sha)))) \n\n(md5-file (File. \"/etc/hosts\"))\n;; \"04F186E74288A10E09DFBF8A88D64A1F33C0E698AAA6B75CDB0AC3ABA87D5644\"", :author {:avatar-url "https://avatars.githubusercontent.com/u/20086?v=3", :account-source "github", :login "reborg"}, :created-at 1469865962017, :updated-at 1518975645400, :_id "579c5feae4b0bafd3e2a04c3"}], :macro true, :notes nil, :arglists ["test & body"], :doc "Repeatedly executes body while test expression is true. Presumes\n some side-effect will cause test to become false/nil. Returns nil", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/while"} {:ns "clojure.core", :name "->Eduction", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 7682, :examples nil, :notes nil, :arglists ["xform coll"], :doc "Positional factory function for class clojure.core.Eduction.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/->Eduction"} {:added "1.0", :ns "clojure.core", :name "butlast", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1289038922000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "first", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c0b"} {:created-at 1289038928000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rest", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c0c"} {:created-at 1289038933000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "last", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c0d"} {:created-at 1289038937000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "next", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c0e"} {:created-at 1322055950000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "drop-last", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c0f"} {:created-at 1360842503000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "take-last", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c10"} {:created-at 1442106939048, :author {:login "miner", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25400?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pop", :ns "clojure.core"}, :_id "55f4ce3be4b06a9ffaad4fbd"}], :line 272, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}], :body "user=> (butlast [1 2 3])\n(1 2)\nuser=> (butlast (butlast [1 2 3]))\n(1)\nuser=> (butlast (butlast (butlast [1 2 3])))\nnil", :created-at 1279073589000, :updated-at 1289038906000, :_id "542692c8c026201cdc326a4c"} {:updated-at 1438337824330, :created-at 1289038828000, :body ";really slow reverse\n;put the last item of the list at the start of a new list, and recur over all but the last item of the list.\n;butlast acts similar to next in that it returns null for a 1-item list.\n\n(defn my-reverse [xs]\n (when xs\n (cons (last xs) (my-reverse (butlast xs)))))", :editors [{:login "danneu", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/529580?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon", :account-source "clojuredocs", :login "boxie"}, :_id "542692c8c026201cdc326a4e"} {:updated-at 1521202617879, :created-at 1521202617879, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; A version of (into) that doesn't require (comp)\n;; for transducers arguments.\n\n(defn into* [to & args]\n (into to\n (apply comp (butlast args))\n (last args)))\n\n(into* [] (range 10))\n;; [0 1 2 3 4 5 6 7 8 9]\n\n(into* [] (map inc) (range 10))\n;; [1 2 3 4 5 6 7 8 9 10]\n\n(into* [] (map inc) (filter odd?) (range 10))\n;; [1 3 5 7 9]", :_id "5aabb5b9e4b0316c0f44f926"} {:updated-at 1615302673505, :created-at 1615235547686, :author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :body ";; `butlast` (linear time) vs. `drop-last` (lazy, efficient, more flexible, \n;; constant time(?)) vs. `pop` (fast but requires a vector).\n\n(def r (range 10000))\n\n(time (butlast r)) ;;=> \"Elapsed time: 6.379 msecs\"\n(time (drop-last r)) ;;=> \"Elapsed time: 0.0475 msecs\"\n(time (drop-last 2 r)) ;;=> \"Elapsed time: 0.0569 msecs\"\n(time (drop-last 0 r)) ;;=> \"Elapsed time: 0.098 msecs\"\n(time (drop-last -1 r)) ;;=> \"Elapsed time: 0.0615 msecs\"\n\n(def r-vec (vec r)) ;; to work like `butlast` pop needs a vector \n(time (pop r-vec)) ;;=> \"Elapsed time: 0.062 msecs\"", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4", :account-source "github", :login "Crowbrammer"}], :_id "604689dbe4b0b1e3652d7477"}], :notes [{:author {:login "miner", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25400?v=3"}, :updated-at 1442107338476, :created-at 1442107338476, :body "When using a vector, `pop` is faster than `butlast`.", :_id "55f4cfcae4b05246bdf20a8c"} {:author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :updated-at 1524422433918, :created-at 1524422433918, :body "`pop` will throw exception if the vector is empty, whereas `butlast` will return `nil`", :_id "5adcd721e4b045c27b7fac4c"} {:author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :updated-at 1615236256681, :created-at 1615235954399, :body "In my example, `but-last` is ~100 x slower than `drop-last`. `butlast` cannot remove multiple elements from the end, but `drop-last` can. `butlast` seems eager, and `drop-last` seems lazy. 'butlast' will return nil when empty, and `drop-last` will return `'()` when empty. ", :_id "60468b72e4b0b1e3652d747b"}], :arglists ["coll"], :doc "Return a seq of all but the last item in coll, in linear time", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/butlast"} {:added "1.2", :ns "clojure.core", :name "satisfies?", :file "clojure/core_deftype.clj", :type "function", :column 1, :see-alsos [{:created-at 1326611358000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "extend", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b64"} {:created-at 1345918796000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defprotocol", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b65"} {:created-at 1432578777116, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "instance?", :library-url "https://github.com/clojure/clojure"}, :_id "55636ad9e4b03e2132e7d16e"} {:created-at 1501651305911, :author {:login "chbrown", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/360279?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "extends?", :ns "clojure.core"}, :_id "59816169e4b0d19c2ce9d706"} {:created-at 1542365684479, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "extenders", :ns "clojure.core"}, :_id "5beea1f4e4b00ac801ed9efe"}], :line 569, :examples [{:author {:login "Jeff Rose", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/567898c496278341be69087507d5ed24?r=PG&default=identicon"}, :editors [], :body "(ns foo)\n\n(defprotocol Foo\n (foo [this]))\n\n(defprotocol Bar\n (bar [this]))\n\n(extend java.lang.Number\n Bar\n {:bar (fn [this] 42)})\n\n(extend java.lang.String\n Foo\n {:foo (fn [this] \"foo\")}\n Bar\n {:bar (fn [this] \"forty two\")})\n\n(satisfies? Foo \"zam\") ; => true\n(satisfies? Bar \"zam\") ; => true\n(satisfies? Foo 123) ; => false\n(satisfies? Bar 123) ; => true", :created-at 1294900425000, :updated-at 1294900425000, :_id "542692cfc026201cdc326e5a"} {:updated-at 1557925978004, :created-at 1557925978004, :author {:login "thenonameguy", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/2217181?v=4"}, :body ";; Note that protocol argument should be the var generated by the \n;; defprotocol call, not the Java interface.\n\n(ns a)\n\n(defprotocol Foo\n (foo [this]))\n\n(ns b\n (:require [a])\n (:import a.Foo))\n\n;; bad\n(satisfies? Foo :test) ; => NPE\n;; good\n(satisfies? a/Foo :test) ; => false", :_id "5cdc105ae4b0ca44402ef725"}], :notes [{:author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :updated-at 1593310454862, :created-at 1593310294294, :body "Unless this issue is resolved, do not use this function in a hot path, for it is extremely slow. See also this post ", :_id "5ef7fc56e4b0b1e3652d7313"}], :arglists ["protocol x"], :doc "Returns true if x satisfies the protocol", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/satisfies_q"} {:added "1.0", :ns "clojure.core", :name "line-seq", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1420222290902, :author {:login "kappa", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/47310?v=3"}, :to-var {:ns "clojure.core", :name "read-line", :library-url "https://github.com/clojure/clojure"}, :_id "54a6df52e4b09260f767ca82"}], :line 3085, :examples [{:author {:login "juergenhoetzel", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2736dfffc803c704dcf25b45ff63cede?r=PG&default=identicon"}, :editors [{:login "juergenhoetzel", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2736dfffc803c704dcf25b45ff63cede?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Count lines of a file (loses head):\nuser=> (with-open [rdr (clojure.java.io/reader \"/etc/passwd\")]\n (count (line-seq rdr)))\n\n", :created-at 1279948343000, :updated-at 1285497370000, :_id "542692cec026201cdc326de3"} {:author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :editors [], :body "(import '(java.io BufferedReader StringReader))\n\n;; line terminators are stripped\nuser=> (line-seq (BufferedReader. (StringReader. \"1\\n2\\n\\n3\")))\n(\"1\" \"2\" \"\" \"3\")\n\n;; empty string gives nil\nuser=> (line-seq (BufferedReader. (StringReader. \"\")))\nnil\n", :created-at 1301874056000, :updated-at 1301874056000, :_id "542692cec026201cdc326de7"} {:body ";; read from standard input\nuser=> (nth (line-seq (java.io.BufferedReader. *in*)) 2)\n #_=> 0\n #_=> 1\n #_=> 2\n\"2\"\n", :author {:login "kappa", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/47310?v=3"}, :created-at 1420222563716, :updated-at 1420222563716, :_id "54a6e063e4b04e93c519ffb0"}], :notes [{:body "Documentation says that `line-seq` returns a lazy sequence, however
    \nthe actual return value is a `Cons` cell of the first line to a `LazySeq` of
    \nthe second line. Calling `realized?` on the `Cons` cell will fail with an exception.\n\n`(cons (.readLine rdr) (lazy-seq (line-seq rdr)))`
    \n\nExample:
    \n`(def rdr (BufferedReader. (StringReader. \" 1\\n 2\\n 3\")))`
    \n`(def x (line-seq rdr))`
    \n`(class x)`
    \n`=> clojure.lang.Cons`\n\n`(realized? x)`
    \n`=> Execution error (ClassCastException) class clojure.lang.Cons cannot be cast to class clojure.lang.IPending`\n\nThe first line was eagerly realized by the initial call to the `line-seq`.
    \n`(.readLine rdr)`
    \n`=> \" 2\"`", :created-at 1620895381108, :updated-at 1620896615263, :author {:avatar-url "https://avatars.githubusercontent.com/u/28925709?v=4", :account-source "github", :login "nxtk"}, :_id "609ce695e4b0b1e3652d74fa"}], :arglists ["rdr"], :doc "Returns the lines of text from rdr as a lazy sequence of strings.\n rdr must implement java.io.BufferedReader.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/line-seq"} {:added "1.0", :ns "clojure.core", :name "unchecked-subtract-int", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1488034774618, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unchecked-add-int", :ns "clojure.core"}, :_id "58b19bd6e4b01f4add58fe65"}], :line 1205, :examples [{:updated-at 1488034725028, :created-at 1488034725028, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :body ";; Subtracting two int-range Longs works\n(unchecked-subtract-int 1 1)\n;;=> 0\n\n;; Subtracting two int-range BigInts works\n(unchecked-subtract-int 1N 1N)\n;;=> 0\n\n;; Doubles are truncated\n(unchecked-subtract-int 1 1.9)\n;;=> 0\n\n;; BigDecimals are truncated\n(unchecked-subtract-int 1 1.9M)\n;;=> 0\n\n;; Uncaught integer overflow\n(unchecked-subtract-int Integer/MAX_VALUE -1)\n;;=> -2147483648\n\n;; Uncaught integer underflow\n(unchecked-subtract-int Integer/MIN_VALUE 1)\n;;=> 2147483647\n\n;; Fails for Longs outside of int range\n(unchecked-subtract-int 2147483648 0)\n;;=> IllegalArgumentException Value out of range for int: 2147483648 clojure.lang.RT.intCast (RT.java:1205)\n\n;; Fails for BigInts outside of int range\n(unchecked-subtract-int 2147483648N 0)\n;;=> IllegalArgumentException Value out of range for int: 2147483648 clojure.lang.RT.intCast (RT.java:1205)\n\n;; Fails for Doubles outside of int range\n(unchecked-subtract-int 2147483648.0 0)\n;;=> IllegalArgumentException Value out of range for int: 2147483648 clojure.lang.RT.intCast (RT.java:1205)\n\n;; Fails for BigDecimals outside of int range\n(unchecked-subtract-int 2147483648.0M 0)\n;;=> IllegalArgumentException Value out of range for int: 2147483648 clojure.lang.RT.intCast (RT.java:1205)", :_id "58b19ba5e4b01f4add58fe64"}], :notes nil, :arglists ["x y"], :doc "Returns the difference of x and y, both int.\n Note - uses a primitive operator subject to overflow.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-subtract-int"} {:added "1.9", :ns "clojure.core", :name "*print-namespace-maps*", :file "clojure/core_print.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 41, :examples [{:updated-at 1540400673371, :created-at 1540400673371, :author {:login "mainej", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/6774?v=4"}, :body ";; In a REPL:\n\n(prn {:num/val 1 :num/name \"one\"})\n;; #:num{:val 1, :name \"one\"}\n;;=> nil\n\n(binding [*print-namespace-maps* false] \n (prn {:num/val 1 :num/name \"one\"}))\n;; {:num/val 1, :num/name \"one\"}\n;;=> nil\n", :_id "5bd0a621e4b00ac801ed9ee9"}], :notes [{:author {:login "katox", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/287639?v=4"}, :updated-at 1588435708523, :created-at 1588435708523, :body "In the Cursive or CIDER REPL the dynamic var is already set (defaults to `true`). Changing the binding would only work within bound expressions but it won't change the behaviour of the REPL itself.\n\nChanging the printing multi-method allows you to \"turn it off\" completely:\n```\n; don't use namespaced maps by default in the REPL\n(defmethod print-method clojure.lang.IPersistentMap [m, ^java.io.Writer w]\n (#'clojure.core/print-meta m w)\n (#'clojure.core/print-map m #'clojure.core/pr-on w))\n```", :_id "5ead9afce4b087629b5a18fc"}], :arglists [], :doc "*print-namespace-maps* controls whether the printer will print\n namespace map literal syntax. It defaults to false, but the REPL binds\n to true.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*print-namespace-maps*"} {:added "1.0", :ns "clojure.core", :name "take-nth", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1421519147165, :author {:login "kappa", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/47310?v=3"}, :to-var {:ns "clojure.core", :name "partition", :library-url "https://github.com/clojure/clojure"}, :_id "54baa92be4b0e2ac61831cbb"} {:created-at 1544035011111, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nth", :ns "clojure.core"}, :_id "5c081ac3e4b0ca44402ef5db"} {:created-at 1544035026986, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "rand-nth", :ns "clojure.core"}, :_id "5c081ad2e4b0ca44402ef5dc"}], :line 4288, :examples [{:updated-at 1285495759000, :created-at 1280776443000, :body "user=> (take-nth 2 (range 10))\n(0 2 4 6 8)\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692cec026201cdc326dd9"} {:body ";; N <= 0 is a special case\n(take 3 (take-nth 0 (range 2)))\n;;=> (0 0 0)\n\n(take 3 (take-nth -10 (range 2)))\n;;=> (0 0 0)", :author {:login "miner", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25400?v=3"}, :created-at 1432222807506, :updated-at 1432222807506, :_id "555dfc57e4b03e2132e7d169"}], :notes [{:body "`(take-nth 0 (range 10))` will loop forever.", :created-at 1423278929350, :updated-at 1423278929350, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :_id "54d58351e4b081e022073c6c"} {:body "(take-nth 0 coll) will return an infinite sequence repeating for first item from coll. A negative N is treated the same as 0.", :created-at 1432222489733, :updated-at 1432222489733, :author {:login "miner", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25400?v=3"}, :_id "555dfb19e4b03e2132e7d168"} {:author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :updated-at 1522313231902, :created-at 1522253561476, :body "
    \n;; In case you are searching for it, drop-nth is not in core.\n\n(defn drop-nth [n coll]\n  (lazy-seq\n    (when-let [s (seq coll)]\n      (concat (take (dec n) (rest s))\n              (drop-nth n (drop n s))))))\n\n(drop-nth 3 (range 10))\n;; (1 2 4 5 7 8)\n\n;; or alternatively: (keep-indexed #(when-not (zero? (rem %1 n)) %2) coll)\n
    ", :_id "5abbbef9e4b045c27b7fac29"}], :arglists ["n" "n coll"], :doc "Returns a lazy seq of every nth item in coll. Returns a stateful\n transducer when no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/take-nth"} {:added "1.0", :ns "clojure.core", :name "first", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1289038142000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rest", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f64"} {:created-at 1289038147000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "next", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f65"} {:created-at 1303125616000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "nth", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f66"} {:created-at 1303125622000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "second", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f67"} {:created-at 1328341708000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "take", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f68"} {:created-at 1348637402000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ffirst", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f69"} {:created-at 1493777583103, :author {:login "Juve-yescas", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/26342224?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "butlast", :ns "clojure.core"}, :_id "59093cafe4b01f4add58fea4"}], :line 49, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(first '(:alpha :bravo :charlie))\n;;=> :alpha", :created-at 1279071245000, :updated-at 1420735684016, :_id "542692ccc026201cdc326c6c"} {:updated-at 1545256959607, :created-at 1303680354000, :body ";; nil is a valid (but empty) collection.\n(first nil)\n;;=> nil\n\n;; if collection is empty, returns nil.\n(first [])\n;;=> nil\n\n;; if first item in collection is nil, returns nil\n(first [nil])\n;;=> nil", :editors [{:avatar-url "https://www.gravatar.com/avatar/69ad2af1f028b1b7e76c14f83bdf26cb?r=PG&default=identicon", :account-source "clojuredocs", :login "jszakmeister"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "vaer-k", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4069456?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon", :account-source "clojuredocs", :login "belun"}, :_id "542692ccc026201cdc326c6e"} {:updated-at 1493775730548, :created-at 1493775730548, :author {:login "Juve-yescas", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/26342224?v=3"}, :body "=> (first [1 2])\n1\n\n=> (first [ [1 2] [3 4] ])\n[1 2]", :_id "59093572e4b01f4add58fea3"} {:updated-at 1661100444310, :created-at 1661100444310, :author {:login "zuzhi", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/11850845?v=4"}, :body "=> (first \"j\")\n\\j\n\n=> (int (first \"j\"))\n106", :_id "6302619ce4b0b1e3652d7647"}], :notes nil, :arglists ["coll"], :doc "Returns the first item in the collection. Calls seq on its\n argument. If coll is nil, returns nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/first"} {:added "1.0", :ns "clojure.core", :name "re-groups", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1282039215000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "re-find", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e6a"} {:created-at 1444479086186, :author {:login "muhuk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/40178?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "re-matcher", :ns "clojure.core"}, :_id "5619006ee4b084e61c76ecc1"}], :line 4858, :examples [{:author {:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"}, :editors [], :body "user=> (def phone-number \"672-345-456-3212\")\n#'user/phone-number\n\nuser=> (def matcher (re-matcher #\"((\\d+)-(\\d+))\" phone-number))\n#'user/matcher\n\nuser=> (re-find matcher)\n[\"672-345\" \"672-345\" \"672\" \"345\"]\n\n;; re-groups gets the most recent find or matches\nuser=> (re-groups matcher)\n[\"672-345\" \"672-345\" \"672\" \"345\"]\nuser=> (re-groups matcher)\n[\"672-345\" \"672-345\" \"672\" \"345\"]\n\n\nuser=> (re-find matcher)\n[\"456-3212\" \"456-3212\" \"456\" \"3212\"]\n\nuser=> (re-groups matcher)\n[\"456-3212\" \"456-3212\" \"456\" \"3212\"]\nuser=> (re-groups matcher)\n[\"456-3212\" \"456-3212\" \"456\" \"3212\"]\n\n\nuser=> (re-find matcher)\nnil\n\nuser=> (re-groups matcher)\nIllegalStateException No match found java.util.regex.Matcher.group (Matcher.java:468)", :created-at 1312374649000, :updated-at 1312374649000, :_id "542692c9c026201cdc326a7f"} {:editors [{:login "jgrodziski", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/408494?v=4"}], :body ";;given a string to match\nuser=> (def flight \"AF-22-CDG-JFK-2017-09-08\")\n#'User/flight\n;; groups and give a name to matches\nuser=> (def flight-regex #\"(?[A-Z0-9]+)-(?[0-9]+[A-Z]?)-(?[A-Z]+)-(?[A-Z]+)-(?[0-9]+)-(?[0-9]+)-(?[0-9]+)\")\n#'user/flight-regex\nuser=> (def matcher (re-matcher flight-regex flight))\n#'user/matcher\n;; it allows good grasp of meaning and understanding of the data extraction from the regex\nuser=> (if (.matches matcher)\n {:airline-code (.group matcher \"airlineCode\") \n :flight-number (.group matcher \"flightNumber\") \n :from (.group matcher \"from\") \n :to (.group matcher \"to\") \n :year (.group matcher \"year\") \n :month (.group matcher \"month\") \n :day (.group matcher \"day\")}\n (throw (ex-info (str \"Can't extract detailed value from flight\"))))\n{:airline-code \"AF\", :flight-number \"22\", :from \"CDG\", :to \"JFK\", :year \"2017\", :month \"09\", :day \"08\"}\nuser=>\n;;Beware that groups are available in Java Regex not in Javascript ones...", :author {:avatar-url "https://avatars3.githubusercontent.com/u/408494?v=4", :account-source "github", :login "jgrodziski"}, :created-at 1504879066415, :updated-at 1504880637927, :_id "59b2a1dae4b09f63b945ac64"} {:editors [{:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=4"}], :body ";\n; Java supports named capture groups\n;\n; Define a phone number pattern with some named groups\n(let [patt (re-pattern \"(?\\\\d{3})-(?\\\\d{3})-(?\\\\d{4})\")]\n ; `re-matches` will find the capturing groups and stick them in a vector\n ; after the full match The capture groups are numbered starting with 1.\n ; The full match is like group zero.\n (is= [\"619-239-5464\" \"619\" \"239\" \"5464\"] (re-matches patt \"619-239-5464\"))\n\n ; Construct a java.util.regex.Matcher. Keep in mind that it is a mutable object!\n (let [matcher (re-matcher patt \"619-239-5464\")]\n ; Execute the Matcher via `re-find`. It returns all 4 groups and caches them\n (is= [\"619-239-5464\" \"619\" \"239\" \"5464\"] (re-find matcher))\n\n ; `re-groups` simply returns the cached result from the Matcher\n (is= [\"619-239-5464\" \"619\" \"239\" \"5464\"] (re-groups matcher))\n\n ; We need the instance function Matcher.group( ) to\n ; extract the named group\n (is= \"619\" (.group matcher \"area\"))\n (is= \"239\" (.group matcher \"prefix\"))\n (is= \"5464\" (.group matcher \"tail\"))))\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/7083783?v=4", :account-source "github", :login "cloojure"}, :created-at 1622895257068, :updated-at 1622895336509, :_id "60bb6a99e4b0b1e3652d7506"}], :notes nil, :arglists ["m"], :doc "Returns the groups from the most recent match/find. If there are no\n nested groups, returns a string of the entire match. If there are\n nested groups, returns a vector of the groups, the first element\n being the entire match.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/re-groups"} {:added "1.0", :ns "clojure.core", :name "seq?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1286870491000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "seq", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bc7"} {:created-at 1304804140000, :author {:login "0x89", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/56bc4acd59315ed4dc1cb99c3be71102?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sequential?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bc8"} {:created-at 1304804146000, :author {:login "0x89", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/56bc4acd59315ed4dc1cb99c3be71102?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vector?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bc9"} {:created-at 1304804161000, :author {:login "0x89", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/56bc4acd59315ed4dc1cb99c3be71102?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "coll?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bca"} {:created-at 1304804189000, :author {:login "0x89", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/56bc4acd59315ed4dc1cb99c3be71102?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "list?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bcb"} {:created-at 1304804202000, :author {:login "0x89", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/56bc4acd59315ed4dc1cb99c3be71102?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "map?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bcc"} {:created-at 1304804206000, :author {:login "0x89", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/56bc4acd59315ed4dc1cb99c3be71102?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "set?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bcd"} {:created-at 1495638773577, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "seqable?", :ns "clojure.core"}, :_id "5925a2f5e4b093ada4d4d728"}], :line 146, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [], :body "user> (seq? 1)\nfalse\nuser> (seq? [1])\nfalse\nuser> (seq? (seq [1]))\ntrue", :created-at 1286870431000, :updated-at 1286870431000, :_id "542692c8c026201cdc326a5e"} {:updated-at 1604526011911, :created-at 1334018590000, :body ";; contrast to example code for sequential?\n;;\nuser> (seq? '(1 2 3))\ntrue\nuser=> (seq? #{1 2 3})\nfalse\nuser> (seq? [1 2 3]) ; for sequential?, returns true\nfalse\nuser> (seq? (range 1 5))\ntrue\nuser> (seq? 1)\nfalse\nuser> (seq? {:a 2 :b 1})\nfalse\nuser> ", :editors [{:login "allentiak", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1922297?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/bad5f5cb177b0968d4288596691ec3cd?r=PG&default=identicon", :account-source "clojuredocs", :login "gregginca"}, :_id "542692d5c026201cdc32707c"} {:updated-at 1485952236986, :created-at 1485952236986, :author {:login "yochannah", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/9271438?v=3"}, :body ";; Don't use seq? when you want to check for a vector.\n;; you may have intended to use seq instead\n\ncljs.user=> (def x [:a :b :c])\n#'cljs.user/x\ncljs.user=> (if (seq x) \"Seq ok\" \"No Seqing here\")\n\"Seq ok\"\ncljs.user=> (if (seq? x) \"Seq ok\" \"No Seqing here\")\n\"No Seqing here\"", :_id "5891d4ece4b01f4add58fe35"}], :notes nil, :arglists ["x"], :doc "Return true if x implements ISeq", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/seq_q"} {:added "1.0", :ns "clojure.core", :name "dec'", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1415177726472, :author {:login "rvlieshout", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/139665?v=2"}, :to-var {:ns "clojure.core", :name "dec", :library-url "https://github.com/clojure/clojure"}, :_id "5459e5fee4b0dc573b892fb9"} {:created-at 1495706257856, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "inc'", :ns "clojure.core"}, :_id "5926aa91e4b093ada4d4d753"}], :line 1135, :examples [{:author {:login "szemek", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/78b14dbb96afe3befc04757dc5e06225?r=PG&default=identicon"}, :editors [], :body "user=> (dec' 0.1)\n-0.9\n\nuser=> (dec' 1)\n0\n\nuser=> (dec' 1.0)\n0.0", :created-at 1335130392000, :updated-at 1335130392000, :_id "542692d2c026201cdc326f77"} {:updated-at 1495706067200, :created-at 1495706067200, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body ";;;; (dec') auto-promotes on integer overflow:\n\n(dec' (Long/MIN_VALUE))\n;;=> -9223372036854775809N\n\n;;;; Unlike (dec) which does not:\n\n(dec (Long/MIN_VALUE))\n;;=> ArithmeticException integer overflow", :_id "5926a9d3e4b093ada4d4d751"}], :notes nil, :arglists ["x"], :doc "Returns a number one less than num. Supports arbitrary precision.\n See also: dec", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/dec'"} {:added "1.0", :ns "clojure.core", :name "ns-unmap", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1288683645000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "remove-ns", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d33"} {:created-at 1341280172000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ns-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d34"} {:created-at 1426949911751, :author {:login "ryoakg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/23413?v=3"}, :to-var {:ns "clojure.core", :name "def", :library-url "https://github.com/clojure/clojure"}, :_id "550d8717e4b056ca16cfecf9"} {:created-at 1484215112470, :author {:login "rauhs", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/11081351?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "intern", :ns "clojure.core"}, :_id "58775348e4b09108c8545a57"} {:created-at 1512578699260, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ns-unalias", :ns "clojure.core"}, :_id "5a281e8be4b0a08026c48cd1"}], :line 4178, :examples [{:author {:login "james", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4b163432c99a124feee4be046a3f9d66?r=PG&default=identicon"}, :editors [{:login "MicahElliott", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/159047?v=3"}], :body "user=> (def foo 1)\n#'user/foo\n\nuser=> foo\n1\n\nuser=> (ns-unmap 'user 'foo) ; explicit\nnil\n\nuser=> (ns-unmap *ns* 'foo) ; convenient\nnil\n\nuser=> foo\n\"Unable to resolve symbol: foo in this context\"\n", :created-at 1290213451000, :updated-at 1335243941000, :_id "542692c7c026201cdc3269a3"}], :notes [{:author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :updated-at 1512036603446, :created-at 1512036603446, :body "Note this function doesn’t work for namespaces aliases; you need to use `ns-unalias` if you want to remove one.", :_id "5a1fd8fbe4b0a08026c48cc8"}], :arglists ["ns sym"], :doc "Removes the mappings for the symbol from the namespace.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ns-unmap"} {:added "1.0", :ns "clojure.core", :name "println-str", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1318573842000, :author {:login "haplo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/890d46f8c0e24dd6fb8546095b1144e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "println", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e07"} {:created-at 1374264235000, :author {:login "lbeschastny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/416170465e4045f810f09a9300dda4dd?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "print-str", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e08"} {:created-at 1592850187673, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "str", :ns "clojure.core"}, :_id "5ef0f70be4b0b1e3652d730d"}], :line 4763, :examples [{:author {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"} {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"} {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"} {:login "matthewg", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b29dd31d183124d9e87d8037bb30e326?r=PG&default=identicon"}], :body ";; Create a newline-terminated string from the items and store it in x.\nuser=> (def x (println-str 1 \"foo\" \\b \\a \\r {:a 2}))\n#'user/x\n\n;; It's a string.\nuser=> (string? x)\ntrue\n\n;; Notice that the items are separated by a space. Also, the newline string is\n;; platform-specific. See clojure.core/newline.\nuser=> x\n\"1 foo b a r {:a 2}\\r\\n\"\n", :created-at 1284257337000, :updated-at 1323234147000, :_id "542692cfc026201cdc326e4c"}], :notes nil, :tag "java.lang.String", :arglists ["& xs"], :doc "println to a string, returning it", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/println-str"} {:added "1.1", :ns "clojure.core", :name "with-bindings*", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1374313837000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-bindings", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bb4"}], :line 1973, :examples [{:updated-at 1335591761000, :created-at 1335591761000, :body "user=> (let [f (fn [] *warn-on-reflection*)]\n (with-bindings* {#'*warn-on-reflection* true} f))\ntrue", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692d6c026201cdc3270b8"}], :notes nil, :arglists ["binding-map f & args"], :doc "Takes a map of Var/value pairs. Installs for the given Vars the associated\n values as thread-local bindings. Then calls f with the supplied arguments.\n Pops the installed bindings after f returned. Returns whatever f returns.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/with-bindings*"} {:added "1.9", :ns "clojure.core", :name "inst-ms", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495635499100, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "inst?", :ns "clojure.core"}, :_id "5925962be4b093ada4d4d721"}], :line 6787, :examples [{:updated-at 1495636375815, :created-at 1495636375815, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body "(inst-ms (java.util.Date.))\n;;=> 1495636054438\n(inst-ms (java.time.Instant/now))\n;;=> 1495636054438\n\n(inst-ms (java.sql.Date. 1495636054438))\n;;=> 1495636054438\n(inst-ms (java.sql.Timestamp. 1495636054438))\n;;=> 1495636054438", :_id "59259997e4b093ada4d4d723"}], :notes nil, :arglists ["inst"], :doc "Return the number of milliseconds since January 1, 1970, 00:00:00 GMT", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/inst-ms"} {:added "1.0", :ns "clojure.core", :name "iterator-seq", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1398980083000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "seq", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e96"}], :line 5721, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Note this is not strictly necessary since keySet is a collection\n;; implementing Iterable but it does show the usage.\n\nuser=> (iterator-seq (.iterator (.keySet (java.lang.System/getProperties))))\n\n(\"java.runtime.name\" \"sun.boot.library.path\" \"java.vm.version\" \"java.vm.vendor\" \"java.vendor.url\" \"path.separator\" \"java.vm.name\" \"file.encoding.pkg\" \"sun.java.launcher\" \"user.country\" \"sun.os.patch.level\" \"java.vm.specification.name\" \"user.dir\" \"java.runtime.version\" \"java.awt.graphicsenv\" \"java.endorsed.dirs\" \"os.arch\" \"javax.accessibility.assistive_technologies\" \"java.io.tmpdir\" \"line.separator\" \"java.vm.specification.vendor\" \"os.name\" \"cljr.home\" \"sun.jnu.encoding\" \"java.library.path\" \"java.specification.name\" \"java.class.version\" \"sun.management.compiler\" \"os.version\" \"user.home\" \"user.timezone\" \"java.awt.printerjob\" \"file.encoding\" \"java.specification.version\" \"include.cljr.repo.jars\" \"java.class.path\" \"user.name\" \"java.vm.specification.version\" \"java.home\" \"sun.arch.data.model\" \"user.language\" \"java.specification.vendor\" \"java.vm.info\" \"java.version\" \"java.ext.dirs\" \"sun.boot.class.path\" \"java.vendor\" \"file.separator\" \"java.vendor.url.bug\" \"clojure.home\" \"sun.io.unicode.encoding\" \"sun.cpu.endian\" \"sun.desktop\" \"sun.cpu.isalist\")\n", :created-at 1284711960000, :updated-at 1287995124000, :_id "542692cdc026201cdc326d15"} {:updated-at 1519828356542, :created-at 1519828356542, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Java 8 streams as sequences\n(->> \"Clojure is the best language\"\n (.splitAsStream #\"\\s+\")\n .iterator\n iterator-seq)\n\n;; (\"Clojure\" \"is\" \"the\" \"best\" \"language\")", :_id "5a96bd84e4b0316c0f44f903"}], :notes [{:updated-at 1287834466000, :body "I've noticed that I needed to use iterator-seq when trying to map over a Java function that returns an AbstractList Iterator. It was not directly seq-able.", :created-at 1287834466000, :author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f9d"}], :arglists ["iter"], :doc "Returns a seq on a java.util.Iterator. Note that most collections\n providing iterators implement Iterable and thus support seq directly.\n Seqs cache values, thus iterator-seq should not be used on any\n iterator that repeatedly returns the same mutable object.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/iterator-seq"} {:added "1.0", :ns "clojure.core", :name "iterate", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1291953286000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "cycle", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b0d"} {:created-at 1335482527000, :author {:login "metajack", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/194d8437f5baed192c90be27369c4922?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "repeatedly", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b0e"} {:created-at 1343152603000, :author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "repeat", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b0f"} {:created-at 1455301227264, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "take", :ns "clojure.core"}, :_id "56be226be4b060004fc217c1"} {:created-at 1455301237712, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nth", :ns "clojure.core"}, :_id "56be2275e4b060004fc217c2"}], :line 3013, :examples [{:author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :editors [{:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"} {:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"} {:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"} {:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/2746668?v=4", :account-source "github", :login "victoraldecoa"} {:login "stoat1", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2543524?v=4"}], :body ";; iterate Ad Infinitum starting at 5 using the inc (increment) function\nuser=> (iterate inc 5)\n(5 6 7 8 9 10 11 12 13 14 15 ... n ...\n\n;; limit results\nuser=> (take 3 (iterate inc 5))\n(5 6 7)\n\nuser=> (take 10 (iterate (partial + 2) 0))\n(0 2 4 6 8 10 12 14 16 18)\n\nuser=> (take 20 (iterate (partial + 2) 0))\n(0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38)\n\n", :created-at 1279048785000, :updated-at 1615738001527, :_id "542692cac026201cdc326b22"} {:author {:login "citizen428", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3881a28fe402dd2d1de44717486cae8?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (def powers-of-two (iterate (partial * 2) 1))\n#'user/powers-of-two\n\nuser=> (nth powers-of-two 10)\n1024\nuser=> (take 10 powers-of-two)\n(1 2 4 8 16 32 64 128 256 512)\n", :created-at 1280707793000, :updated-at 1285496060000, :_id "542692cac026201cdc326b29"} {:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"} {:login "Bobby", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c0541baac8a638e07f5895c7224f8b7e?r=PG&default=identicon"} {:login "Bobby", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c0541baac8a638e07f5895c7224f8b7e?r=PG&default=identicon"} {:login "maacl", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8ff89765136c38707e0f57cf48679a13?r=PG&default=identicon"}], :body ";; demonstrating the power of iterate\n;; to generate the Fibonacci sequence\n;; uses +' to promote to BigInt\nuser=> (def fib (map first (iterate (fn [[a b]] [b (+' a b)]) [0 1])))\n#'user/fib\n\nuser=> (take 10 fib)\n(0 1 1 2 3 5 8 13 21 34)", :created-at 1310850870000, :updated-at 1388690059000, :_id "542692cac026201cdc326b2b"} {:updated-at 1520938144240, :created-at 1520938144240, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; iterate (also range, repeat and cycle) have a reduce\n;; fast path. Use with reduce, transduce, eduction etc.\n\n(defn pi\n \"Approximate Pi to the 1/n decimal with Leibniz formula\"\n [n]\n (transduce\n (comp (map #(/ 4 %)) (take n))\n +\n (iterate #(* ((if (pos? %) + -) % 2) -1) 1.0)))\n\n(time (pi 1e8))\n\"Elapsed time: 9776.924934 msecs\"\n;; 3.141592643589326", :_id "5aa7aca0e4b0316c0f44f923"}], :notes nil, :arglists ["f x"], :doc "Returns a lazy sequence of x, (f x), (f (f x)) etc. f must be free of side-effects", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/iterate"} {:added "1.0", :ns "clojure.core", :name "slurp", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1330170507000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "reader", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521efd"} {:created-at 1314301885000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "spit", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f54"} {:created-at 1529010527201, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "resource", :ns "clojure.java.io"}, :_id "5b22d95fe4b00ac801ed9e16"}], :line 6942, :examples [{:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (spit \"blubber.txt\" \"test\")\nnil\nuser=> (slurp \"blubber.txt\")\n\"test\"", :created-at 1280458838000, :updated-at 1332952657000, :_id "542692cac026201cdc326b32"} {:updated-at 1603841965576, :created-at 1314221982000, :body ";; To access web page. Note the use of https://\n;; prefix\n\nuser=> (slurp \"https://clojuredocs.org\")\n; This will return the html content of clojuredocs.org", :editors [{:login "fhightower", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/3599813?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon", :account-source "clojuredocs", :login "OnesimusUnbound"}, :_id "542692cac026201cdc326b34"} {:author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :editors [], :body ";; Access absolute location on Windows\n\nuser=> (slurp \"C:\\\\tasklists.xml\")\n", :created-at 1314301837000, :updated-at 1314301837000, :_id "542692cac026201cdc326b35"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; On Linux, some JVMs have a bug where they cannot read a file in the /proc\n;; filesystem as a buffered stream or reader. A workaround to this JVM issue\n;; is to open such a file as unbuffered:\n(slurp (java.io.FileReader. \"/proc/cpuinfo\"))", :created-at 1330170476000, :updated-at 1330170476000, :_id "542692d5c026201cdc327086"} {:author {:login "nils.grunwald", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/6c7661b3ea6397abbf5a2048ee07d995?r=PG&default=identicon"}, :editors [{:login "nils.grunwald", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/6c7661b3ea6397abbf5a2048ee07d995?r=PG&default=identicon"} {:login "nils.grunwald", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/6c7661b3ea6397abbf5a2048ee07d995?r=PG&default=identicon"}], :body ";; You can specify what encoding to use by giving a :encoding param, and an encoding string recognized by your JVM\n\nuser=> (slurp \"/path/to/file\" :encoding \"ISO-8859-1\")", :created-at 1342145976000, :updated-at 1342146268000, :_id "542692d5c026201cdc327087"} {:updated-at 1464367678770, :created-at 1464367678770, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :body ";; you can fetch URLs\n\n(slurp \"http://www.example.com\")", :_id "57487a3ee4b0bafd3e2a0467"} {:updated-at 1485689448487, :created-at 1485689448487, :author {:login "mhmdsalem1993", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10787314?v=3"}, :body ";; you can read bytes also\n\n(def arr-bytes (into-array Byte/TYPE (range 128)))\n(slurp arr-bytes)", :_id "588dd268e4b01f4add58fe33"}], :notes [{:updated-at 1309555971000, :body "Use slurp also to read an input stream into a string.", :created-at 1309555971000, :author {:login "mjg123", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2d7180cd610e068c47d3ba7337f1425c?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fc3"} {:updated-at 1387184994000, :body "With link: “See [`clojure.java.io/reader`](http://clojuredocs.org/clojure_core/clojure.java.io/reader) for a complete list of supported arguments.â€�\r\n\r\nAccording to those docs, here are the supported types for `f`, the object to read:\r\n\r\n* [`Reader`](http://docs.oracle.com/javase/7/docs/api/java/io/Reader.html)\r\n* [`BufferedReader`](http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html)\r\n* [`InputStream`](http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html)\r\n* [`File`](http://docs.oracle.com/javase/7/docs/api/java/io/File.html)\r\n* [`URI`](http://docs.oracle.com/javase/7/docs/api/java/net/URI.html)\r\n* [`URL`](http://docs.oracle.com/javase/7/docs/api/java/net/URL.html)\r\n* [`Socket`](http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html)\r\n* byte arrays (`byte[]`)\r\n* character arrays (`char[]`)\r\n* [`String`](http://docs.oracle.com/javase/7/docs/api/java/lang/String.html)\r\n\r\n`slurp` can read objects of any of these types into a string.", :created-at 1387183993000, :author {:login "roryokane", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5b2b185c814bb25f2f95a1152e58f033?r=PG&default=identicon"}, :_id "542692edf6e94c6970522015"} {:body "
    \n(defn slurp-bytes\n  \"Slurp the bytes from a slurpable thing\"\n  [x]\n  (with-open [out (java.io.ByteArrayOutputStream.)]\n    (clojure.java.io/copy (clojure.java.io/input-stream x) out)\n    (.toByteArray out)))\n
    ", :created-at 1522121921297, :updated-at 1522121998843, :author {:avatar-url "https://avatars0.githubusercontent.com/u/13529973?v=4", :account-source "github", :login "nevesjorgelucio"}, :_id "5ab9bcc1e4b045c27b7fac27"} {:author {:login "didibus", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/601540?v=4"}, :updated-at 1585180980301, :created-at 1585180980301, :body "Valid options include:\n\n :encoding string name of encoding to use, e.g. \\\"UTF-8\\\".", :_id "5e7bf134e4b087629b5a18c3"}], :tag "java.lang.String", :arglists ["f & opts"], :doc "Opens a reader on f and reads all its contents, returning a string.\n See clojure.java.io/reader for a complete list of supported arguments.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/slurp"} {:added "1.0", :ns "clojure.core", :name "newline", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 3697, :examples [{:author {:login "jjcomer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ef581bba2f97adb539c67a35465b3e1b?r=PG&default=identicon"}, :editors [{:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"}], :body ";; This is equivalent to System.out.println() in Java\nuser=> (newline)\n\nnil\n; Calling println w/o args is equivalent.\nuser=> (println)\n\nnil\nuser=>", :created-at 1330655016000, :updated-at 1402384428000, :_id "542692d4c026201cdc327012"}], :notes nil, :arglists [""], :doc "Writes a platform-specific newline to *out*", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/newline"} {:added "1.1", :ns "clojure.core", :name "short-array", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "shorts", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917718000, :_id "542692eaf6e94c6970521ad6"}], :line 5309, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}], :body ";; create an array of shorts using short-array\n;; and demonstrate how it can be used with the java Arrays functions\n;; (note the needed coercions)\n\nuser=> (def ss (short-array (map short (range 3 10))))\n#'user/ss\nuser=> (type ss)\n[S\nuser=> (vec ss)\n[3 4 5 6 7 8 9]\nuser=> (java.util.Arrays/binarySearch ss (short 6))\n3\nuser=> (java.util.Arrays/fill ss (short 99))\nnil\nuser=> (vec ss)\n[99 99 99 99 99 99 99]\nuser=>", :created-at 1313908642000, :updated-at 1313962982000, :_id "542692c7c026201cdc326987"}], :notes nil, :arglists ["size-or-seq" "size init-val-or-seq"], :doc "Creates an array of shorts", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/short-array"} {:added "1.0", :ns "clojure.core", :name "fn?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1321052077000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ifn?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b3c"}], :line 6237, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:login "replore", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e7869fe1a48cb1814c657eaca6bea3eb?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (fn? 5)\nfalse\nuser=> (fn? inc)\ntrue\nuser=> (fn? (fn []))\ntrue\nuser=> (fn? #(5))\ntrue", :created-at 1279073964000, :updated-at 1332952252000, :_id "542692c6c026201cdc3268f8"} {:author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Even though maps, sets, vectors and keywords behave as functions:\nuser=> ({:a 1} :a)\n1\n\n;; fn? still returns false for them because they are not created using fn:\nuser=> (fn? {:a 1})\nfalse\n", :created-at 1279155323000, :updated-at 1285500252000, :_id "542692c6c026201cdc3268fc"}], :notes [{:author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :updated-at 1504887813989, :created-at 1504887813989, :body "Note `fn?` only tests if something was created using `fn`, *not* if it’s a function. Use [`ifn?`](https://clojuredocs.org/clojure.core/ifn_q) for that. Some things are functions even though they weren’t created with `fn`, such as maps, vectors and keywords.", :_id "59b2c405e4b09f63b945ac66"}], :arglists ["x"], :doc "Returns true if x implements Fn, i.e. is an object created via fn.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/fn_q"} {:added "1.0", :ns "clojure.core", :name "doall", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1289672752000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "dorun", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a8b"} {:created-at 1289672768000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "doseq", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a8c"} {:created-at 1659463132215, :author {:login "puredanger", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/171129?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "run!", :ns "clojure.core"}, :_id "62e965dce4b0b1e3652d7636"}], :line 3148, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [{:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"} {:login "orivej", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cab90c7de5efde92a29f1eacb603ba9a?r=PG&default=identicon"}], :body ";; Nothing is printed because map returns a lazy-seq\nuser=> (def foo (map println [1 2 3]))\n#'user/foo\n\n;; doall forces the seq to be realized\nuser=> (def foo (doall (map println [1 2 3])))\n1\n2\n3\n#'user/foo\n\n;; where\n(doall (map println [1 2 3]))\n1\n2\n3\n(nil nil nil)", :created-at 1280548280000, :updated-at 1362554691000, :_id "542692cbc026201cdc326ba2"} {:updated-at 1436248770172, :created-at 1436248770172, :author {:login "gdeer81", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1340575?v=3"}, :body ";;map a function which makes database calls to either retrieve or \n;;create and retrieves records from the database over a vector of values. \n;;The function returns a map of fields and values\nuser=> (map #(db/make-n-get-or-get :person {:name %}) [\"Fred\" \"Ethel\" \"Lucy\" \"Ricardo\"])\nJdbcSQLException The object is already closed [90007-170] org.h2.message.DbE\nxception.getJdbcSQLException (DbException.java:329)\n\n;;database connection was closed before we got a chance to do our transactions\n;;lets wrap it in doall\nuser=> (doall (map #(db/make-n-get-or-get :person {:name %}) \n[\"Fred\" \"Ethel\" \"Lucy\" \"Ricardo\"]))\nDEBUG :db insert into person values name = 'Fred'\nDEBUG :db insert into person values name = 'Ethel'\nDEBUG :db insert into person values name = 'Lucy'\nDEBUG :db insert into person values name = 'Ricardo'\n({:name \"Fred\"} {:name \"Ethel\"} {:name \"Lucy\"} {:name \"Ricardo\"})\n\n;;notice that unlike using dorun, this returns a list of maps", :_id "559b6ac2e4b020189d740548"} {:updated-at 1493187295161, :created-at 1493187295161, :author {:login "chbrown", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/360279?v=3"}, :body ";; The (doall n coll) form only forces the first n (or more) items in coll to\n;; be realized, but still returns the entire coll.\n(def pr-123 (lazy-seq (cons (pr 1)\n (lazy-seq (cons (pr 2)\n (lazy-seq (cons (pr 3) nil)))))))\n#'user/pr-123\n\n;; Since doall returns the collection, be careful not to let the REPL realize\n;; the whole thing, as it would if we were to call (doall 1 pr-123) instead.\nuser=> (do (doall 1 pr-123) (println))\n12\nnil\n;; The 1 is triggered when (seq pr-123) is called, then the 2 is triggered\n;; when (next pr-123) is called (both inside dorun, via doall).\n\nuser=> pr-123\n3(nil nil nil)\n;; The 3 is finally triggered when the REPL realizes the entirety of pr-123\n\n;; pr-123 is built of nested lazy-seq's because (map pr coll) isn't very lazy:\n(do (doall 1 (map pr (range 100))) (println))\n012345678910111213141516171819202122232425262728293031\nnil\n;; Due to occult clojure.lang.RT/JVM internals (?), (next coll) on this sort\n;; of coll realizes the items in batches of 32 each.\n", :_id "59003adfe4b01f4add58fe9c"} {:updated-at 1510465598561, :created-at 1510464241601, :author {:login "elect000", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/18697629?v=4"}, :body ";; #'for is create lazy-seq\n(def x (for [i (range 10)]\n i)\n\n(type x) ;;=> clojure.lang.LazySeq\n\n;; doall return evaluated value\n(doall x) ;;=> (0 1 2 3 4 ...)\n\n\n;; Notice!\n;; but it is clojure.lang.LazySeq\n(type (doall x)) ;;=> clojure.lang.LazySeq\n\n;; if you want to get list ...\n(into-array x)\n(type (into-array x)) ;;=> [Ljava.lang.Long;", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/18697629?v=4", :account-source "github", :login "elect000"}], :_id "5a07daf1e4b0a08026c48cb1"}], :notes [{:updated-at 1341951212000, :body "Shouldn't we use seq instead of coll in the function signature since we should really pass a sequence?", :created-at 1341951200000, :author {:login "johnnyluu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ba99f2dc1064733c7badbb16db9254a?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fe5"} {:updated-at 1390120527000, :body "'seq' is a function; using it in the function args as a value would shadow the function (and thereby making the function seq unusable in that scope)", :created-at 1390120527000, :author {:login "zephjc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/47639b1aa7a7ccb90000a3ea12b84d7e?r=PG&default=identicon"}, :_id "542692edf6e94c697052201a"}], :arglists ["coll" "n coll"], :doc "When lazy sequences are produced via functions that have side\n effects, any effects other than those needed to produce the first\n element in the seq do not occur until the seq is consumed. doall can\n be used to force any effects. Walks through the successive nexts of\n the seq, retains the head and returns it, thus causing the entire\n seq to reside in memory at one time.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/doall"} {:added "1.0", :ns "clojure.core", :name "prefers", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1337584993000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "prefer-method", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b6f"} {:created-at 1337585000000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "methods", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b70"} {:created-at 1337585004000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "get-method", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b71"}], :line 1824, :examples [{:updated-at 1475527508775, :created-at 1475527508775, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body "(def m {:os ::osx})\n\n(defmulti ex :os)\n\n(defmethod ex ::unix\n [_]\n \"unix\")\n\n(derive ::osx ::unix)\n\n(defmethod ex ::bsd\n [_]\n \"bsd\")\n\n(derive ::osx ::bsd)\n\n(prefer-method ex ::unix ::bsd)\n\n(prefers ex)\n;;=> {:user/unix #{:user/bsd}}", :_id "57f2c354e4b0709b524f051d"}], :notes nil, :arglists ["multifn"], :doc "Given a multimethod, returns a map of preferred value -> set of other values", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/prefers"} {:added "1.0", :ns "clojure.core", :name "enumeration-seq", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 5731, :examples [{:author {:login "leifp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d2f37720f063404ef83b987d2824353d?r=PG&default=identicon"}, :editors [], :body "user=> (enumeration-seq (java.util.StringTokenizer. \"exciting example\"))\n(\"exciting\" \"example\")\n", :created-at 1342527173000, :updated-at 1342527173000, :_id "542692d2c026201cdc326f9d"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; A parallel distinct, using ConcurrentHashMap as a\n;; set of keys to get rid of duplicates. \n;; Keys at the end can be retrieved as an enumeration, \n;; and from that as a sequence, thanks to enumeration-seq\n\n(import '[java.util.concurrent ConcurrentHashMap])\n(require '[clojure.core.reducers :refer [fold]])\n\n(defn parallel-distinct [v]\n (let [m (ConcurrentHashMap.)\n combinef (fn ([] m) ([_ _]))\n reducef (fn [^ConcurrentHashMap m k] (.put m k 1) m)]\n (fold combinef reducef v)\n (enumeration-seq (.keys m))))\n\n(defn many-repeating-numbers [n]\n (into [] (take n (apply concat (repeat (range 10))))))\n\n(parallel-distinct (many-repeating-numbers 1e6))\n;; (0 1 2 3 4 5 6 7 8 9)", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1519838098877, :updated-at 1519838192224, :_id "5a96e392e4b0316c0f44f904"}], :notes nil, :arglists ["e"], :doc "Returns a seq on a java.util.Enumeration", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/enumeration-seq"} {:added "1.7", :ns "clojure.core", :name "dedupe", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1440188329568, :author {:login "blx", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/887504?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "distinct", :ns "clojure.core"}, :_id "55d787a9e4b072d7f27980ea"}], :line 7655, :examples [{:editors [{:login "blx", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/887504?v=3"}], :body "user=> (dedupe [1 2 3 3 3 1 1 6])\n(1 2 3 1 6)", :author {:avatar-url "https://avatars.githubusercontent.com/u/887504?v=3", :account-source "github", :login "blx"}, :created-at 1440188225498, :updated-at 1440188473719, :_id "55d78741e4b0831e02cddf18"} {:updated-at 1558989991424, :created-at 1558989991424, :author {:login "AMacGregor27", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/46518023?v=4"}, :body ";; This is taken from a problem on 4Clojure (30. Compress a sequence).\nuser=> (dedupe \"Leeeeroy\")\n(\\L \\e \\r \\o \\y)\n\nuser=> (dedupe [[1 2] [1 2] [3 4] [1 2]])\n([1 2] [3 4] [1 2])\n\nuser=> (dedupe [[1 [1 2]] [1 [2 3]] [1 [1 2]] [1 [1 2]]])\n([1 [1 2]] [1 [2 3]] [1 [1 2]])\n\n;; This does not remove all duplicates from a collection, only consecutive ones.\nuser=> (dedupe [1 2 2 1 1 1 2 1 2 2])\n(1 2 1 2 1 2)\n\n;; To remove all duplicates, use distinct.\nuser=> (distinct [1 2 2 1 1 1 2 1 2 2])\n(1 2)", :_id "5cec4ca7e4b0ca44402ef72f"} {:updated-at 1607179810709, :created-at 1607179810709, :author {:login "siddharthjain-in", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/6537820?v=4"}, :body "user=> (dedupe [1/2 2/4])\n(1/2)\n\nuser=>(dedupe [1/2 2/6])\n(1/2 1/3)\n\nuser=>(dedupe [1/2 0.5 2/4])\n(1/2 0.5 1/2)", :_id "5fcb9e22e4b0b1e3652d7416"} {:editors [{:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=4"}], :body ";; parentheses can be omitted in thread macro \nuser> (->> [1 1 2 2] (map inc) dedupe)\n(2 3)\n;; transducer version that does not work, parentheses cannot be omitted\nuser> (sequence (comp (map inc) dedupe) [1 1 2 2])\nExecution error (IllegalArgumentException) at user/eval15380 (form-init7517833771916228311.clj:104).\nDon't know how to create ISeq from: clojure.lang.TransformerIterator$1\n;; transducer that works\nuser> (sequence (comp (map inc) (dedupe)) [1 1 2 2])\n(2 3)", :author {:avatar-url "https://avatars.githubusercontent.com/u/889685?v=4", :account-source "github", :login "huahaiy"}, :created-at 1639422117065, :updated-at 1639422160521, :_id "61b798a5e4b0b1e3652d7589"}], :notes nil, :arglists ["" "coll"], :doc "Returns a lazy sequence removing consecutive duplicates in coll.\n Returns a transducer when no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/dedupe"} {:added "1.0", :ns "clojure.core", :name "dissoc", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1293866784000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "assoc", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c5a"} {:created-at 1351064004000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "disj", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c5c"} {:created-at 1367625873000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "select-keys", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c5d"}], :line 1504, :examples [{:updated-at 1565336715281, :created-at 1280340610000, :body "(dissoc {:a 1 :b 2 :c 3}) ; dissoc nothing \n;;=> {:a 1, :b 2, :c 3} \n\n(dissoc {:a 1 :b 2 :c 3} :b) ; dissoc key :b\n;;=> {:a 1, :c 3} \n\n(dissoc {:a 1 :b 2 :c 3} :d) ; dissoc not existing key\n;;=> {:a 1, :b 2, :c 3} \n\n(dissoc {:a 1 :b 2 :c 3} :c :b) ; several keys at once\n;;=> {:a 1} \n", :editors [{:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/201852?v=3", :account-source "github", :login "michaelcameron"} {:login "dominem", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11671382?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon", :account-source "clojuredocs", :login "zmila"}, :_id "542692cfc026201cdc326e63"} {:updated-at 1442111008755, :created-at 1442111008755, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :body ";; There is no (dissoc-in) analogous to (get-in) or (assoc-in), but \n;; you can achieve a similar effect using (update-in):\n\n(update-in {:a {:b {:x 3} :c 1}} [:a :b] dissoc :x)\n;;=> {:a {:b {}, :c 1}}", :_id "55f4de20e4b05246bdf20a8e"} {:updated-at 1492776031769, :created-at 1492776031769, :author {:login "skuro", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/186085?v=3"}, :body ";; When applied to a record and one of its base fields, \n;; dissoc produces a plain map instead of a record\n\n(defrecord Widget [id])\n(def w (->Widget \"id\"))\n\n(class w)\n;; user.Widget\n\n(class (dissoc w :id))\n;; clojure.lang.PersistentArrayMap", :_id "58f9f45fe4b01f4add58fe99"} {:updated-at 1516223401897, :created-at 1516223370479, :author {:login "RobinNagpal", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/745748?v=4"}, :body ";; Removing multiple from nested map\n(update-in {:a {:b {:x 3 :y 5} :c 1}} [:a :b] \n (fn [nested] (apply dissoc nested [:x :y] )) )\n=> {:a {:b {}, :c 1}} ", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/745748?v=4", :account-source "github", :login "RobinNagpal"}], :_id "5a5fbb8ae4b0a08026c48cfc"} {:updated-at 1608027071533, :created-at 1608027071533, :author {:login "Em-AK", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1518393?v=4"}, :body ";; dissoc keys in a coll\nuser=> (apply (partial dissoc {:a 1 :b 2 :c 3}) #{:b :c})\n{:a 1}", :_id "5fd88bbfe4b0b1e3652d7418"}], :notes [{:author {:login "u473t8", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/17592435?v=4"}, :updated-at 1629458054605, :created-at 1629458054605, :body "`(update {} :a dissoc :b) => {:a nil}`", :_id "611f8e86e4b0b1e3652d7533"}], :arglists ["map" "map key" "map key & ks"], :doc "dissoc[iate]. Returns a new map of the same (hashed/sorted) type,\n that does not contain a mapping for key(s).", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/dissoc"} {:added "1.0", :ns "clojure.core", :name "atom", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1281849237000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "reset!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eeb"} {:created-at 1281849248000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "swap!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eec"} {:created-at 1341623864000, :author {:login "johnnyluu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ba99f2dc1064733c7badbb16db9254a?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "compare-and-set!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eed"} {:created-at 1349392634000, :author {:login "eric", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2b0c9ae6f1da9716451e7c86bc87230b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "add-watch", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eee"} {:created-at 1349392638000, :author {:login "eric", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2b0c9ae6f1da9716451e7c86bc87230b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "remove-watch", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eef"} {:created-at 1364873735000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "set-validator!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ef0"} {:created-at 1527705006799, :author {:login "agarman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/138454?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "swap-vals!", :ns "clojure.core"}, :_id "5b0eedaee4b045c27b7fac7d"} {:created-at 1527705359815, :author {:login "agarman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/138454?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reset-vals!", :ns "clojure.core"}, :_id "5b0eef0fe4b045c27b7fac84"}], :line 2327, :examples [{:author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}], :body "user=> (def my-atom (atom 0))\n#'user/my-atom\n\nuser=> @my-atom\n0\n\nuser=> (swap! my-atom inc)\n1\n\nuser=> @my-atom\n1\n\nuser=> (swap! my-atom (fn [n] (* (+ n n) 2)))\n4\n\nuser=> (reset! my-atom 0)\n0\n\nuser=> @my-atom\n0", :created-at 1281460949000, :updated-at 1476155071423, :_id "542692cec026201cdc326db7"} {:body "user=> (def a (atom #{}))\n#'user/a\n\nuser=>(swap! a conj :tag)\n#{:tag}\n\nuser=> @a\n#{:tag}", :author {:login "mzenzie", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1862891?v=3"}, :created-at 1433438207582, :updated-at 1433438207582, :_id "557087ffe4b01ad59b65f4ee"} {:updated-at 1450892672375, :created-at 1450892672375, :author {:login "bostonaholic", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/362146?v=3"}, :body "user=> (def my-atom (atom 0 :validator even?))\n#'user/my-atom\n\nuser=> @my-atom\n0\n\nuser=> (swap! my-atom inc)\nIllegalStateException Invalid reference state clojure.lang.ARef.validate (ARef.java:33)\n\nuser=> (swap! my-atom (partial + 2))\n2\n\nuser=> @my-atom\n2", :_id "567add80e4b01f598e267e8f"} {:updated-at 1518532012281, :created-at 1518532012281, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body "(def car\n (atom {:make \"Audi\"\n :model \"Q3\"}))\n\n@car\n;;{:make \"Audi\", :model \"Q3\"}\n\n(swap!\n car\n assoc :model \"Q5\")\n;;{:make \"Audi\", :model \"Q5\"}\n\n(reset! car {:make \"\" :model \"\"})\n;;{:make \"\", :model \"\"}", :_id "5a82f5ace4b0316c0f44f8bc"} {:editors [{:login "djblue", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1986211?v=4"}], :body "(defn atom? [v]\n #?(:clj (instance? clojure.lang.Atom v)\n :cljs (satisfies? cljs.core/IAtom v)))\n\n(atom? (atom nil)) ;; => true", :author {:avatar-url "https://avatars.githubusercontent.com/u/1986211?v=4", :account-source "github", :login "djblue"}, :created-at 1661551176193, :updated-at 1661551230443, :_id "63094248e4b0b1e3652d7658"}], :notes nil, :arglists ["x" "x & options"], :doc "Creates and returns an Atom with an initial value of x and zero or\n more options (in any order):\n\n :meta metadata-map\n\n :validator validate-fn\n\n If metadata-map is supplied, it will become the metadata on the\n atom. validate-fn must be nil or a side-effect-free fn of one\n argument, which will be passed the intended new state on any state\n change. If the new state is unacceptable, the validate-fn should\n return false or throw an exception.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/atom"} {:added "1.0", :ns "clojure.core", :name "import", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1291627622000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "require", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ace"} {:created-at 1291628363000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "use", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521acf"} {:created-at 1291628388000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ns", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ad0"}], :line 3425, :examples [{:author {:login "nipra", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/142529?v=3"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "YizhePKU", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/42838469?v=4"}], :body "user=> (import java.util.Date)\njava.util.Date\n\nuser=> (def now (Date.))\n#'user/now\n\nuser=> (str now)\n\"Tue Jul 13 17:53:54 IST 2010\"\n", :created-at 1279049126000, :updated-at 1588421112835, :_id "542692c8c026201cdc326a01"} {:author {:login "dale", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a7a1eca257c6cea943fea41e5cc3e9a3?r=PG&default=identicon"}, :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/169654?v=4", :account-source "github", :login "noisesmith"} {:login "YizhePKU", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/42838469?v=4"}], :body ";; You can import multiple classes at once.\n(import (java.util Date Calendar)\n (java.net URI ServerSocket)\n java.sql.DriverManager)", :created-at 1294019024000, :updated-at 1588421172276, :_id "542692c8c026201cdc326a03"} {:author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :editors [], :body ";; importing multiple classes in a namespace\n(ns foo.bar\n (:import (java.util Date\n Calendar)\n (java.util.logging Logger\n Level)))", :created-at 1320992711000, :updated-at 1320992711000, :_id "542692d3c026201cdc326fce"} {:editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"} {:login "Rooke", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1158538?v=4"} {:avatar-url "https://avatars1.githubusercontent.com/u/42838469?v=4", :account-source "github", :login "YizhePKU"}], :body ";; For cases when 'import' does not do it for you, i.e. \"live-coding\"\n;; You can use the DynamicClassLoader, ClassReader and the Resolver.\n\n(def dcl (clojure.lang.DynamicClassLoader.))\n\n(defn dynamically-load-class! \n [class-loader class-name]\n (let [class-reader (clojure.asm.ClassReader. class-name)]\n (when class-reader\n (let [bytes (.-b class-reader)]\n (.defineClass class-loader \n class-name \n bytes\n \"\")))))\n\n(dynamically-load-class! dcl \"java.lang.Long\")\n(dynamically-load-class! dcl 'org.joda.time.DateTime)\n\n;; From that point the dynamically loaded class can be\n;; used by the Reflector to invoke constructors, methods and to get fields. ", :author {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}, :created-at 1508173740564, :updated-at 1588421462200, :_id "59e4e7ace4b03026fe14ea8d"} {:editors [{:login "ooooak", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1457253?v=4"}], :body "(import [org.apache.commons.codec.digest DigestUtils])\n\n(defn md5-hash [input] \n (DigestUtils/md5Hex input))\n\n(md5-hash \"hello world!\") \n;; fc3ff98e8c6a0d3087d515c0473f8677", :author {:avatar-url "https://avatars1.githubusercontent.com/u/1457253?v=4", :account-source "github", :login "ooooak"}, :created-at 1580227890599, :updated-at 1580227900588, :_id "5e305d32e4b0ca44402ef824"}], :macro true, :notes [{:updated-at 1291628547000, :body "Good description of use/require/import here:\r\n\r\nhttp://blog.8thlight.com/articles/2010/12/6/clojure-libs-and-namespaces-require-use-import-and-ns", :created-at 1291628547000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fa9"} {:updated-at 1403035286000, :body "`import` will also accept vectors instead of lists, but I would discourage folks from doing so:\r\n\r\n* It's undocumented.\r\n* Lists and vectors have different meanings for `require`, so there's precedent for making a distinction.\r\n* Lists have a distinguished first element, and so they indent more meaningfully here. :-P", :created-at 1403035286000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :_id "542692edf6e94c697052202a"} {:author {:login "YizhePKU", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/42838469?v=4"}, :updated-at 1588421551270, :created-at 1588421551270, :body "You don't need to use `import` if you fully qualify the class name, e.g. `(java.util.Date.)`.", :_id "5ead63afe4b087629b5a18fb"}], :arglists ["& import-symbols-or-lists"], :doc "import-list => (package-symbol class-name-symbols*)\n\n For each name in class-name-symbols, adds a mapping from name to the\n class named by package.name to the current namespace. Use :import in the ns\n macro in preference to calling this directly.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/import"} {:added "1.0", :ns "clojure.core", :name "bit-shift-right", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1405719667000, :author {:login "phreed", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a0c739cf289be18be932dc3022e6fd3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bit-shift-left", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aaf"} {:created-at 1405719682000, :author {:login "phreed", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a0c739cf289be18be932dc3022e6fd3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bit-xor", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ab0"} {:created-at 1405719694000, :author {:login "phreed", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a0c739cf289be18be932dc3022e6fd3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bit-or", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ab1"} {:created-at 1405719700000, :author {:login "phreed", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a0c739cf289be18be932dc3022e6fd3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bit-and", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ab2"} {:created-at 1405719706000, :author {:login "phreed", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a0c739cf289be18be932dc3022e6fd3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bit-set", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ab3"} {:created-at 1405719712000, :author {:login "phreed", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a0c739cf289be18be932dc3022e6fd3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bit-test", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ab4"} {:created-at 1405719724000, :author {:login "phreed", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a0c739cf289be18be932dc3022e6fd3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bit-flip", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ab5"} {:created-at 1405719732000, :author {:login "phreed", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a0c739cf289be18be932dc3022e6fd3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bit-and-not", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ab6"} {:created-at 1405719739000, :author {:login "phreed", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a0c739cf289be18be932dc3022e6fd3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bit-clear", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ab7"} {:created-at 1412094678691, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=2"}, :to-var {:ns "clojure.core", :name "unsigned-bit-shift-right", :library-url "https://github.com/clojure/clojure"}, :_id "542adad6e4b0df9bb778a5a4"}], :line 1362, :examples [{:author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; Convert number into list of bits:\n(defn bits [n s]\n (take s\n (map\n (fn [i] (bit-and 0x01 i))\n (iterate\n (fn [i] (bit-shift-right i 1))\n n))))\n;; #'user/bits\n\n(map (fn [n] (bits n 3)) (range 8))\n;;=> ((0 0 0) (1 0 0) (0 1 0) (1 1 0) (0 0 1) (1 0 1) (0 1 1) (1 1 1))\n", :created-at 1280029081000, :updated-at 1421878196402, :_id "542692cec026201cdc326dbb"} {:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "replore", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e7869fe1a48cb1814c657eaca6bea3eb?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(bit-shift-right 2r1101 0) ;;=> 13\n(bit-shift-right 2r1101 1) ;;=> 6\n(bit-shift-right 2r1101 2) ;;=> 3\n(bit-shift-right 2r1101 3) ;;=> 1\n(bit-shift-right 2r1101 4) ;;=> 0", :created-at 1280339098000, :updated-at 1421877723171, :_id "542692cec026201cdc326dbe"} {:editors [{:login "fasiha", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/37649?v=3"}], :body ";; Warning: bit-shift-right upcasts arguments to Long and returns Long\n(format \"0x%x\" (byte -128))\n; => \"0x80\"\n(format \"0x%x\" (bit-shift-right (byte -128) 1)) ; You'd expect 0x40?\n; => \"0xffffffffffffffc0\"\n; You'd expect 0x40, but (byte -128) was converted to (long -128) and then\n; right-shifted, with the negative sign bit of 1 propagated.\n\n; This can't be avoided by using unsigned-bit-shift-right:\n(format \"0x%x\" (unsigned-bit-shift-right (byte -128) 1))\n; => \"0x7fffffffffffffc0\"\n\n; If you want unsigned \"byte\" operations, upcast the byte yourself via bit-and:\n(format \"0x%x\" (bit-shift-right (bit-and 0xff (byte -128)) 1))\n; => \"0x40\"\n\n; This works because the output of bit-and is always Long:\n(type (bit-and 0xff (byte -128)))\n; => java.lang.Long\n; Note that bit-and returns Long even if both arguments are smaller:\n(type (bit-and (short 0xff) (byte -128)))\n; => java.lang.Long", :author {:avatar-url "https://avatars.githubusercontent.com/u/37649?v=3", :account-source "github", :login "fasiha"}, :created-at 1460044794475, :updated-at 1460044978009, :_id "570683fae4b0fc95a97eab30"} {:editors [{:login "Sophia-Gold", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19278114?v=3"}], :body ";; floating point bit-shifting\n;; thanks to Gary Fredericks: https://github.com/gfredericks/doubles\n(defn bit-shift-double [x shifts]\n (let [x-long (Double/doubleToRawLongBits x)]\n (Double/longBitsToDouble\n (bit-or (bit-and 1 x-long)\n (bit-shift-left (- (bit-shift-right x-long 52) shifts) 52)\n (bit-and 0xfffffffffffff x-long)))))", :author {:avatar-url "https://avatars.githubusercontent.com/u/19278114?v=3", :account-source "github", :login "Sophia-Gold"}, :created-at 1483958434391, :updated-at 1484376283481, :_id "587368a2e4b09108c8545a53"}], :notes [{:updated-at 1326789497000, :body "From the IRC channel, a way to get zero-fill bit-shift-right:\r\n\r\n
    06:08 < mikera> (defn >>> [v bits] (bit-shift-right (bit-and 0xFFFFFFFF v) bits))
    \r\n\r\nThere's also an open ticket for a [built-in version](http://dev.clojure.org/jira/browse/CLJ-827).", :created-at 1326786313000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fd7"} {:body "unsigned-bit-shift-right was added in Clojure 1.6.0. Click the link in the See Also section above.", :created-at 1415350996576, :updated-at 1415350996576, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=2"}, :_id "545c8ad4e4b03d20a102429f"}], :arglists ["x n"], :doc "Bitwise shift right", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bit-shift-right"} {:ns "clojure.core", :name "print-method", :file "clojure/core.clj", :type "var", :column 1, :see-alsos [{:created-at 1340861043000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "print-dup", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dda"}], :line 3663, :examples [{:author {:login "pangloss", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1202c95dec14eee416717e8c0add0f0c?r=PG&default=identicon"}, :editors [], :body "(deftype XYZ [])\n\n; without custom print-method defined:\nuser=> (prn (XYZ.))\n# \n\n(defmethod print-method XYZ [v ^java.io.Writer w]\n (.write w \"<<-XYZ->>\"))\n\n; with print-method\nuser=> (prn (XYZ.))\n<<-XYZ->>\n", :created-at 1369992423000, :updated-at 1369992423000, :_id "542692d4c026201cdc327037"} {:updated-at 1618155203105, :created-at 1618155203105, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :body "(import '[java.net URL] [java.io File])\n\n;; Extends pr-str to URL objects with a form suitable for \n;; read-string to read back into an URL with the related\n;; https://clojuredocs.org/clojure.core/*data-readers* binding:\n\n(defmethod print-method URL [url writer]\n (doto writer\n (.write \"#url \")\n (.write \"\\\"\")\n (.write (.toString url))\n (.write \"\\\"\")))\n\n(-> \"/etc/hosts\" File. .toURL pr-str)\n;; \"#url \\\"file:/etc/hosts\\\"\"\n", :_id "607316c3e4b0b1e3652d74c3"}], :notes [{:author {:login "mrzor", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/54230?v=3"}, :updated-at 1471957106762, :created-at 1471957106762, :body "Take care when writing things that look like a reader macro, like `#mything<42 42 42>`.\nIt may break your AOT compilations with a `java.lang.RuntimeException: No reader function for tag mything`.\n\nA quick workaround is not to emit a `#` character.\nThe thorough solution starts by reading https://clojuredocs.org/clojure.core/*data-readers* and is beyond the scope of this note.", :_id "57bc4872e4b0709b524f04d3"}], :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/print-method"} {:added "1.0", :ns "clojure.core", :name "peek", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1400493737000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "first", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ab8"} {:created-at 1400493750000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pop", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ab9"} {:created-at 1400493759000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "conj", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aba"}], :line 1460, :examples [{:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (def large-vec (vec (range 0 10000)))\n#'user/large-vec\n\nuser=> (time (last large-vec))\n\"Elapsed time: 1.279841 msecs\"\n9999\n\nuser=> (time (peek large-vec))\n\"Elapsed time: 0.049238 msecs\"\n9999\n", :created-at 1282321027000, :updated-at 1285494456000, :_id "542692ccc026201cdc326c33"} {:author {:login "TravisHeeter", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fe491d07493e45af083b89b767342c6?r=PG&default=identicon"}, :editors [], :body "user=> (peek '(:a :b :c))\n:a", :created-at 1385176400000, :updated-at 1385176400000, :_id "542692d4c026201cdc32702f"} {:updated-at 1470911342408, :created-at 1470911342408, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body "user=> (peek [1 2 3 4])\n;;=> 4\n\nuser=> (peek [])\n;;=> nil\n\nuser=> (peek '(1 2 3 4))\n;;=> 1\n\nuser=> (peek '())\n;;=> nil\n\nuser=> (peek nil)\n;;=> nil", :_id "57ac536ee4b0bafd3e2a04e2"} {:updated-at 1518706830878, :created-at 1518706830878, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;peek on vector returns the last element\n(peek [1 2 3])\n;; 3\n\n;;peek on list retunrs the first element\n(peek '(1 2 3))\n;; 1", :_id "5a85a08ee4b0316c0f44f8bd"}], :notes [{:updated-at 1349888814000, :body "Small reminder:\r\n\r\n
    \r\nDo not work for arbitrary seq but just for persistent types implementing clojure.lang.IPersistentStack (like clojure.lang.Persistent*).\r\n\r\n
    \r\nExample:\r\n
    user> (peek (cons 1 '()))\r\n; Evaluation aborted.\r\n
    \r\ndo not work because type is clojure.lang.Cons but\r\n\r\n
    user> (peek (conj '() 1))\r\n1\r\n
    \r\nworks because type is clojure.lang.PersistentList.", :created-at 1349884718000, :author {:login "tomby42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/305033855efb82d6041586b874b5bb24?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fea"}], :arglists ["coll"], :doc "For a list or queue, same as first, for a vector, same as, but much\n more efficient than, last. If the collection is empty, returns nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/peek"} {:added "1.0", :ns "clojure.core", :name "aget", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1359687973000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "aclone", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521af2"} {:created-at 1389744326000, :author {:login "jw0", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ca45063da41a9f3aa9028295d8b66d89?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "get", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521af3"} {:created-at 1389744330000, :author {:login "jw0", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ca45063da41a9f3aa9028295d8b66d89?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "nth", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521af4"} {:created-at 1454023320808, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "contains?", :ns "clojure.core"}, :_id "56aaa298e4b060004fc217b3"} {:created-at 1593147984636, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "aset", :ns "clojure.core"}, :_id "5ef58250e4b0b1e3652d7310"}], :line 3912, :examples [{:updated-at 1454082671521, :created-at 1284178036000, :body "\n;; create two arrays\n(def a1 (double-array '(1.0 2.0 3.0 4.0)))\n;;=> #'user/a1\n(def a2 (int-array '(9 8 7 6)))\n;;=> #'user/a2\n\n;; get an item by index\n(aget a1 2)\n;;=> 3.0\n(aget a2 3)\n;;=> 6\n\n;; 2d array and 2 indicies\n(def a3 (make-array Integer/TYPE 100 100))\n;;=> #'user/a3\n(aget a3 23 42)\n;;=> 0", :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/363fd6c774471e207b327fda11b246c7?r=PG&default=identicon", :account-source "clojuredocs", :login "dermatthias"}, :_id "542692cec026201cdc326da0"} {:editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; aget can be used to check the existence of an element\n;; this approach works with documents in ClojureScript where core/contains? does not\n(aget js/document \"getElementById\")\n;;=> #object[getElementById \"function getElementById() { [native code] }\"]\n(contains? js/document \"getElementById\")\n;;=> false", :author {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}, :created-at 1454022947998, :updated-at 1454082875581, :_id "56aaa123e4b0ceed88ce8d19"}], :notes nil, :arglists ["array idx" "array idx & idxs"], :doc "Returns the value at the index/indices. Works on Java arrays of all\n types.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/aget"} {:added "1.0", :ns "clojure.core", :name "pvalues", :file "clojure/core.clj", :static true, :type "macro", :column 1, :see-alsos [{:created-at 1329792245000, :author {:login "cmccoy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cf46d3ffedb153a97fe69cb4719e0fd?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pmap", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e7d"} {:created-at 1336537825000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "future", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e7e"} {:created-at 1423019380983, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "pcalls", :library-url "https://github.com/clojure/clojure"}, :_id "54d18d74e4b0e2ac61831d0a"}], :line 7044, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; expressions are calculated in parallel\n\nuser=> (pvalues (expensive-calc-1) (expensive-calc-2))\n(2330 122)\n", :created-at 1280322280000, :updated-at 1285496725000, :_id "542692cac026201cdc326b59"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; pvalues is implemented using Clojure futures. See examples for 'future'\n;; for discussion of an undesirable 1-minute wait that can occur before\n;; your standalone Clojure program exits if you do not use shutdown-agents.", :created-at 1336537820000, :updated-at 1406853126000, :_id "542692d4c026201cdc327046"}], :macro true, :notes nil, :arglists ["& exprs"], :doc "Returns a lazy sequence of the values of the exprs, which are\n evaluated in parallel", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/pvalues"} {:added "1.1", :ns "clojure.core", :name "bound-fn", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1331766568000, :author {:login "metajack", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/194d8437f5baed192c90be27369c4922?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bound-fn*", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d55"}], :line 2006, :examples [{:author {:login "metajack", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/194d8437f5baed192c90be27369c4922?r=PG&default=identicon"}, :editors [], :body "(def ^:dynamic *some-var* nil)\n\n(defn f [] (println *some-var*))\n\n;; run f without a new binding\nuser=> (f)\nnil\nnil\n\n;; run f with a new binding\nuser=> (binding [*some-var* \"hello\"]\n (f))\nhello\nnil\n\n;; run f in a thread with a new binding\nuser=> (binding [*some-var* \"goodbye\"]\n (.start (Thread. f)))\nnil\nnil\n\n;; run a bound f in a thread with a new binding\nuser=> (binding [*some-var* \"goodbye\"]\n (.start (Thread. (bound-fn [] (f)))))\ngoodbye\nnil\n", :created-at 1331769907000, :updated-at 1331769907000, :_id "542692d2c026201cdc326f5c"}], :macro true, :notes nil, :arglists ["& fntail"], :doc "Returns a function defined by the given fntail, which will install the\n same bindings in effect as in the thread at the time bound-fn was called.\n This may be used to define a helper function which runs on a different\n thread, but needs the same bindings in place.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bound-fn"} {:added "1.7", :ns "clojure.core", :name "vswap!", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1469617377040, :author {:login "kumarshantanu", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109792?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "volatile!", :ns "clojure.core"}, :_id "579894e1e4b0bafd3e2a04bf"} {:created-at 1492398573657, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "vreset!", :ns "clojure.core"}, :_id "58f431ede4b01f4add58fe91"} {:created-at 1492398581193, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "volatile?", :ns "clojure.core"}, :_id "58f431f5e4b01f4add58fe92"} {:created-at 1492398620716, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "swap!", :ns "clojure.core"}, :_id "58f4321ce4b01f4add58fe93"}], :line 2539, :examples [{:updated-at 1492398484318, :created-at 1492398484318, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :body "(let [interrupt (volatile! false)\n f1 (future (Thread/sleep 1000)\n (vswap! interrupt not))\n f2 (future (while (not @interrupt)\n (println \"Another cycle!\")\n (Thread/sleep 100)))]\n @f1\n @f2)", :_id "58f43194e4b01f4add58fe90"}], :macro true, :notes nil, :arglists ["vol f & args"], :doc "Non-atomically swaps the value of the volatile as if:\n (apply f current-value-of-vol args). Returns the value that\n was swapped in.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/vswap!"} {:added "1.0", :ns "clojure.core", :name "last", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1289038378000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "first", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e58"} {:created-at 1289038381000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "next", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e59"} {:created-at 1289038385000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rest", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e5a"} {:created-at 1289038414000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "butlast", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e5b"} {:created-at 1306817792000, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "take-last", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e5c"} {:created-at 1436712121100, :author {:login "sindux", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1397898?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "peek", :ns "clojure.core"}, :_id "55a27cb9e4b020189d740550"}], :line 262, :examples [{:updated-at 1473264230717, :created-at 1279416204000, :body "user=> (last [1 2 3 4 5])\n5\nuser=> (last [\"a\" \"b\" \"c\" \"d\" \"e\"])\n\"e\"\nuser=> (last {:one 1 :two 2 :three 3})\n[:three 3]\nuser=> (last [])\nnil\n\n;; but be careful with what you expect from a map (or set):\nuser=> (last {:a 1 :b 2 :c 3 :d 4 :e 5 :f 6 :g 7 :h 8 :i 9})\n[:a 1]", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"} {:avatar-url "https://www.gravatar.com/avatar/69ad2af1f028b1b7e76c14f83bdf26cb?r=PG&default=identicon", :account-source "clojuredocs", :login "jszakmeister"} {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"} {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=3"}], :author {:login "MrHus", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4"}, :_id "542692c8c026201cdc326a2c"} {:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [], :body ";really slow reverse\n;put the last item of the list at the start of a new list, and recur over all but the last item of the list.\n;butlast acts similar to next in that it returns null for a 1-item list.\n\n(defn my-reverse\n ([a-list]\n (cond (= a-list nil) nil\n :else (cons (last a-list)\n (my-reverse (butlast a-list))))))", :created-at 1289038818000, :updated-at 1289038818000, :_id "542692c8c026201cdc326a2f"} {:updated-at 1499968174976, :created-at 1499966780539, :author {:login "webappzero", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1661060?v=3"}, :body ";; Prefer clojure.core/peek over `last` for potentially large vectors.\n\nuser=> (def v (into [] (take 900900 (range))))\n#'user/v\n\nuser=> (time (last v))\n\"Elapsed time: 24.460958 msecs\"\n900899\n\nuser=> (def v2 (into [] (take 900900 (range))))\n#'user/v2\n\nuser=> (time (peek v2))\n\"Elapsed time: 0.020498 msecs\"\n900899\n\n;; For a deep dive into why Rich Hickey chose not to make `last` performant\n;; for large vectors, please see:\n;; https://gist.github.com/reborg/dc8b0c96c397a56668905e2767fd697f\n\n", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/1661060?v=3", :account-source "github", :login "webappzero"}], :_id "5967ad3ce4b0d19c2ce9d6f9"} {:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; last is also inefficient for sorted-sets and sorted-maps, and\n;; peek doesn't work for these, so we can combine `first` with `rseq`\n;; to efficiently get the last element on large sorted- collections instead\n\n(def sm (into (sorted-map)\n (map vector (range 1e6) (repeatedly #(rand-int 100)))))\n\n(time (last sm))\n\"Elapsed time: 144.298867 msecs\"\n;; => [999999 42]\n\n(time (first (rseq sm)))\n\"Elapsed time: 0.024408 msecs\"\n;; => [999999 42]", :author {:avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4", :account-source "github", :login "tomdl89"}, :created-at 1680193851632, :updated-at 1680196828207, :_id "6425b93be4b08cf8563f4b89"}], :notes nil, :arglists ["coll"], :doc "Return the last item in coll, in linear time", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/last"} {:added "1.0", :ns "clojure.core", :name "pr", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1290689171000, :author {:login "dale", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a7a1eca257c6cea943fea41e5cc3e9a3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "print", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bd2"} {:created-at 1299623874000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "prn", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bd3"} {:created-at 1299623879000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pr-str", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bd4"} {:created-at 1470508478634, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "read", :ns "clojure.edn"}, :_id "57a62dbee4b0bafd3e2a04ca"}], :dynamic true, :line 3677, :examples [{:author {:login "srid", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd3a68d670372cd09876c26270a4299a?r=PG&default=identicon"}, :editors [], :body "user=> (pr \"foo\")\n\"foo\"nil", :created-at 1315392482000, :updated-at 1315392482000, :_id "542692cec026201cdc326da1"} {:author {:login "srid", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd3a68d670372cd09876c26270a4299a?r=PG&default=identicon"}, :editors [], :body "user=> (pr {:foo \"hello\" :bar 34.5})\n{:foo \"hello\", :bar 34.5}nil", :created-at 1315392515000, :updated-at 1315392515000, :_id "542692cec026201cdc326da2"} {:body ";; Difference between pr and print\n\nuser=> (pr ['a :b \"\\n\" \\space \"c\"])\n[a :b \"\\n\" \\space \"c\"]nil\n\nuser=> (print ['a :b \"\\n\" \\space \"c\"])\n[a :b\n c]nil\n", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423019089923, :updated-at 1423019089923, :_id "54d18c51e4b0e2ac61831d09"} {:updated-at 1470507649207, :created-at 1470507649207, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :body ";; WARNING: Clojure's keyword and symbol functions allow you to create\n;; values that cannot be printed then later read and recreate those same\n;; values.\n\n;; For most common symbols and keywords, they round-trip through pr\n;; then read-string, as this example shows.\nuser=> (read-string (with-out-str (pr {:a 1, :b 2})))\n{:a 1, :b 2}\n\n;; But these values do not round-trip through the same steps:\nuser=> (def kw1 (keyword \"foo bar\"))\n#'user/kw1\nuser=> kw1\n:foo bar\nuser=> (def s2 (with-out-str (pr {kw1 1, :b 2})))\n#'user/s2\nuser=> s2\n\"{:foo bar 1, :b 2}\"\nuser=> (read-string s2)\n\nRuntimeException Map literal must contain an even number of forms clojure.lang.Util.runtimeException (Util.java:221)\n\n;; Similarly for a symbol like (symbol \"a;b\")\nuser=> (def sym1 (symbol \"a;b\"))\n#'user/sym1\nuser=> sym1\na;b\nuser=> (def s3 (with-out-str (pr sym1)))\n#'user/s3\nuser=> s3\n\"a;b\"\nuser=> (read-string s3)\na\n\n;; If you wish to transmit data that may contain such values, one suggestion\n;; is to use the transit library: https://github.com/cognitect/transit-format\n\n;; It is much faster and formally specified.", :_id "57a62a81e4b0bafd3e2a04c9"}], :notes [{:author {:login "jcburley", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/430319?v=4"}, :updated-at 1514410889866, :created-at 1514410889866, :body "\"Readable by the reader\" means, for example, that a string is printed with surrounding double quotes and with quotes, backslashes, and nonprinting characters being escaped via a backslash prefix.", :_id "5a441389e4b0a08026c48ce2"}], :arglists ["" "x" "x & more"], :doc "Prints the object(s) to the output stream that is the current value\n of *out*. Prints the object(s), separated by spaces if there is\n more than one. By default, pr and prn print in a way that objects\n can be read by the reader", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/pr"} {:added "1.0", :ns "clojure.core", :name "namespace", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1366844136000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ns", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d8a"} {:created-at 1385200446000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "name", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d8b"} {:created-at 1523484084873, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/10404?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "def", :ns "clojure.core"}, :_id "5ace85b4e4b045c27b7fac3d"}], :line 1597, :examples [{:author {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}], :body "user=> (def x \"Foobar\")\n#'user/x\n\nuser=> (namespace 'user/x)\n\"user\"\n", :created-at 1284256918000, :updated-at 1287791961000, :_id "542692cbc026201cdc326c1d"} {:editors [{:login "dominem", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11671382?v=4"}], :body "(namespace :admin/live-playlist-details)\n;;=> \"admin\"\n\n(namespace :about)\n;;=> nil", :author {:avatar-url "https://avatars3.githubusercontent.com/u/11671382?v=4", :account-source "github", :login "dominem"}, :created-at 1565335391711, :updated-at 1565335408498, :_id "5d4d1f5fe4b0ca44402ef795"}], :notes [{:body "Note this does not try to be \"smart\"\n\n```\nuser=>(namespace 'no-such-name/no-such-var)\n\"no-such-name\"\n\nuser=>(def a-var)\n#'user-a-var\n\nuser=>(namespace 'a-var)\nnil\n```", :created-at 1443303990722, :updated-at 1443304019556, :author {:avatar-url "https://avatars.githubusercontent.com/u/159998?v=3", :account-source "github", :login "merriam"}, :_id "56071236e4b08e404b6c1c89"}], :tag "java.lang.String", :arglists ["x"], :doc "Returns the namespace String of a symbol or keyword, or nil if not present.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/namespace"} {:added "1.1", :ns "clojure.core", :name "push-thread-bindings", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1374313643000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pop-thread-bindings", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d2b"} {:created-at 1374313651000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "binding", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d2c"} {:created-at 1374313699000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-bindings", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d2d"}], :line 1913, :examples nil, :notes nil, :arglists ["bindings"], :doc "WARNING: This is a low-level function. Prefer high-level macros like\n binding where ever possible.\n\n Takes a map of Var/value pairs. Binds each Var to the associated value for\n the current thread. Each call *MUST* be accompanied by a matching call to\n pop-thread-bindings wrapped in a try-finally!\n \n (push-thread-bindings bindings)\n (try\n ...\n (finally\n (pop-thread-bindings)))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/push-thread-bindings"} {:added "1.0", :ns "clojure.core", :name "bases", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1519504605797, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "supers", :ns "clojure.core"}, :_id "5a91ccdde4b0316c0f44f8ee"} {:created-at 1519504691579, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "type", :ns "clojure.core"}, :_id "5a91cd33e4b0316c0f44f8ef"}], :line 5543, :examples [{:author {:login "teyc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd6e62afb4881ab0f617611b8b65d003?r=PG&default=identicon"}, :editors [], :body "
    user=> (import 'java.io.File)\r\n\r\nuser=> (bases java.io.File)\r\n(java.lang.Object java.io.Serializable java.lang.Comparable)
    ", :created-at 1283977099000, :updated-at 1283977099000, :_id "542692c9c026201cdc326ac4"} {:body ";; what is a hash-map?\n(bases (class {}))\n;;=> (clojure.lang.APersistentMap \n;;+> clojure.lang.IObj \n;;+> clojure.lang.IEditableCollection)\n\n;; what is a set?\n(bases (class #{}))\n;;=> (clojure.lang.APersistentSet \n;;+> clojure.lang.IObj \n;;+> clojure.lang.IEditableCollection)\n\n;; what is a vector?\n(bases (class []))\n;;=> (clojure.lang.APersistentVector \n;;+> clojure.lang.IObj \n;;+> clojure.lang.IEditableCollection)\n\n;; what is a list? \n(bases (class ()))\n;;=> (clojure.lang.Obj \n;;+> clojure.lang.IPersistentList \n;;+> java.util.List \n;;+> clojure.lang.ISeq \n;;+> clojure.lang.Counted \n;;+> clojure.lang.IHashEq)", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1414510940403, :updated-at 1414510965758, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :_id "544fb95ce4b03d20a102428b"} {:updated-at 1598220307317, :created-at 1598220307317, :author {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}, :body ";; what is a defrecord\n\nuser=> (defprotocol Fly\n (fly [this]))\n\nuser=> (defrecord Bird [name] Fly\n (fly [this] (str (:name this) \" flies....\")))\n\nuser=> (ancestors Bird)\n;; (java.lang.Object \n;; user.Fly \n;; clojure.lang.IRecord \n;; clojure.lang.IHashEq \n;; clojure.lang.IObj \n;; clojure.lang.ILookup \n;; clojure.lang.IKeywordLookup \n;; clojure.lang.IPersistentMap \n;; java.util.Map \n;; java.io.Serializable)\n", :_id "5f42e813e4b0b1e3652d73a5"}], :notes nil, :arglists ["c"], :doc "Returns the immediate superclass and direct interfaces of c, if any", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bases"} {:added "1.0", :ns "clojure.core", :name "=", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1287469623000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "==", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f25"} {:created-at 1291975060000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "not=", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f26"} {:created-at 1298162787000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "identical?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f27"}], :line 783, :examples [{:updated-at 1474477801279, :created-at 1280470020000, :body "user=> (= 1)\ntrue\nuser=> (= 1 1)\ntrue\nuser=> (= 1 2)\nfalse\nuser=> (= 1 1 1)\ntrue\nuser=> (= 1 1 2)\nfalse\nuser=> (= '(1 2) [1 2])\ntrue\nuser=> (= nil nil)\ntrue\nuser=> (= (sorted-set 2 1) (sorted-set 1 2))\ntrue\n\n;; It should be noted that equality is not defined for Java arrays.\n;; Instead you can convert them into sequences and compare them that way.\n;; (= (seq array1) (seq array2))\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon", :account-source "clojuredocs", :login "gstamp"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/b3881a28fe402dd2d1de44717486cae8?r=PG&default=identicon", :account-source "clojuredocs", :login "citizen428"}, :_id "542692ccc026201cdc326c72"} {:editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=2", :account-source "github", :login "phreed"} {:login "iammegatron", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/406013?v=3"}], :updated-at 1450298371193, :created-at 1412883142742, :author {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=2", :account-source "github", :login "phreed"}, :body ";; There are functional differences between = and == \n;; = may introduce java autoboxing \n\n;; true:\n(= 1)\n(= 1 1) \n(= 1/1, 2/2, 3/3, 4/4) \n(= :foo)\n(= nil anything) ; anything = nil\n\n\n;; false:\n(= 1, 1.0, 1/1) ; differs from ==\n(= 1 2)\n(= 1 \\1) ; differs from ==\n(= 1 \"1\") ; differs from ==\n\n", :_id "5436e2c6e4b06dbffbbb00c7"} {:body ";; If passed a single value (= x) the result is always true.\n(= 1)\n(= nil)\n(= false)\n(= true)\n(= {:a 1 :b2})\n(= 'false)\n;;=> true \n", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1418923922664, :updated-at 1418923922664, :_id "54930f92e4b04e93c519ffa9"} {:updated-at 1543388969936, :created-at 1543388779355, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :body ";; = can be used to compare the equality of nested Clojure data structures\n(= {:a [1 {1 2}] :b 'ok :c \"string\"} \n {:b 'ok :c \"string\" :a '(1 {1 2})})\n;;=> true", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4", :account-source "github", :login "huahaiy"}], :_id "5bfe3e6be4b0ca44402ef5cc"} {:editors [{:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"} {:avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4", :account-source "github", :login "jafingerhut"}], :body ";; See the Clojure Equality guide for more details:\n;; https://clojure.org/guides/equality\n\n;; One perhaps surprising case is comparing regular expressions.\n;; In Clojure, regular expressions only equal one another if they are\n;; the same object in memory, i.e. if (identical? x y) is also true.\n;; Therefore, any data structure containing regular expression will \n;; only be equal to one another if the corresponding regular expressions are\n;; identical.\n;; See https://dev.clojure.org/jira/browse/CLJ-1182\n(= #\"fav*\" #\"fav*\")\n;;=> false\n\n;; Another exception is the special floating point value ##NaN for \"Not a Number\".\n;; In Clojure on Java, this value is never equal to itself, and any collections\n;; containing such \"values\" are never equal to any other collections, either:\n(= ##NaN ##NaN)\n;;=> false\n\n(= [1 2 3 ##NaN] [1 2 3 ##NaN])\n;;=> false\n\n;; There are a few other minor exceptions where clojure.core/= might behave in\n;; ways that surprise you. You can find an article describing the known cases\n;; for Clojure on Java here: https://clojure.org/guides/equality", :author {:avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4", :account-source "github", :login "huahaiy"}, :created-at 1543389091657, :updated-at 1565641554721, :_id "5bfe3fa3e4b0ca44402ef5cf"} {:updated-at 1645209415531, :created-at 1645209415531, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}, :body ";; You can test for a Java infinity, but there are quirks to know about. \n\n;; Note particularly that Double/POSITIVE_INFINITY and Float/POSITIVE_INFINITY\n;; are = and ==, but they are neither identical? nor .equals. However, the\n;; value these Java objects return has the same representation, ##Inf, in\n;; Clojure. Further, the literal ##Inf is parsed as something that is\n;; .equals to Double/POSITIVE_INFINITY but not identical? to it. Similar\n;; points hold for the Java NEGATIVE_INFINITY's and their Clojure\n;; representation, ##-Inf.\n\nuser=> Double/POSITIVE_INFINITY\n;;=> ##Inf\nuser=> Float/POSITIVE_INFINITY\n;;=> ##Inf\nuser=> (= Double/POSITIVE_INFINITY Float/POSITIVE_INFINITY)\n;;=> true\nuser=> (= ##Inf ##Inf)\n;;=> true\nuser=> (== Double/POSITIVE_INFINITY Float/POSITIVE_INFINITY)\n;;=> true\nuser=> (== ##Inf ##Inf)\n;;=> true\nuser=> (identical? Double/POSITIVE_INFINITY Float/POSITIVE_INFINITY)\n;;=> false\nuser=> (identical? ##Inf ##Inf)\n;;=> true\nuser=> (.equals Double/POSITIVE_INFINITY Float/POSITIVE_INFINITY)\n;;=> false\nuser=> (.equals ##Inf ##Inf)\n;;=> true\nuser=> (identical? ##Inf Double/POSITIVE_INFINITY)\n;;=> false\nuser=> (identical? ##Inf Float/POSITIVE_INFINITY)\n;;=> false\nuser=> (.equals ##Inf Double/POSITIVE_INFINITY)\n;;=> true\nuser=> (.equals ##Inf Float/POSITIVE_INFINITY)\n;;=> false\n\n;; (Tested with Clojure 1.10.3.)", :_id "620fe747e4b0b1e3652d75a8"} {:updated-at 1655019041411, :created-at 1655019041411, :author {:login "clojer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/107184681?v=4"}, :body "user=> (= + +)\ntrue\nuser=> (= = =)\ntrue\nuser=> (= inc inc)\ntrue\nuser=> (= #() #())\nfalse", :_id "62a59621e4b0b1e3652d75fd"}], :notes [{:updated-at 1287470783000, :body "There is a difference between \"=\" and \"==\". For primitives you definitely want to use \"==\" as \"=\" will result in a cast to the wrapped types for it's arguments. \r\n\r\nThis may not be the case come Clojure 1.3 (see [1])\r\n\r\n[1] http://github.com/clojure/clojure/commit/df8c65a286e90e93972bb69392bc106128427dde", :created-at 1287470783000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f9b"} {:author {:login "domokato", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2388832?v=4"}, :updated-at 1674772771853, :created-at 1674772771853, :body "`=` compares collections in a type-independent manner but not numbers, despite what the docs say. See examples above.", :_id "63d30123e4b08cf8563f4b6c"}], :arglists ["x" "x y" "x y & more"], :doc "Equality. Returns true if x equals y, false if not. Same as\n Java x.equals(y) except it also works for nil, and compares\n numbers and collections in a type-independent manner. Clojure's immutable data\n structures define equals() (and thus =) as a value, not an identity,\n comparison.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/="} {:added "1.10", :ns "clojure.core", :name "read+string", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 3770, :examples [{:updated-at 1638567988480, :created-at 1638567988480, :author {:login "earthfail", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/21296448?v=4"}, :body ";; read from *in*\n;; notice that whitespace is trimmed\nuser=> (read+string)\n :a\n[:a \":a\"]\nuser=> (read+string)\n 1234 56 7\n[1234 \"1234\"]\nuser=> (read+string)\n[56 \"56\"]\nuser=> (read+string)\n[7 \"7\"]\n\n;; if there is a comment it is included in the string read\nuser=> (read+string)\n;comment\n:value\n[:value \";comment\\n:value\"] ", :_id "61aa9034e4b0b1e3652d757f"}], :notes nil, :arglists ["" "stream" "stream eof-error? eof-value" "stream eof-error? eof-value recursive?" "opts stream"], :doc "Like read, and taking the same args. stream must be a LineNumberingPushbackReader.\n Returns a vector containing the object read and the (whitespace-trimmed) string read.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/read+string"} {:added "1.0", :ns "clojure.core", :name "dosync", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1285922303000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sync", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cdf"} {:created-at 1326521625000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ce0"} {:created-at 1343102755000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "locking", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ce1"}], :line 5076, :examples [{:author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :editors [{:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Keep dosync body free of side-effects:\n(defn my-thread-unsafe-fn [important-ref]\n (let [start-work (ref false)]\n (dosync\n (when (not @important-ref)\n ;\"If a conflict occurs between 2 transactions \n ;trying to modify the same reference, \n ;one of them will be retried.\"\n ;http://clojure.org/concurrent_programming\n (ref-set important-ref true)\n (ref-set start-work true)))\n (when @start-work \n ;launch side-effects here\n )))\n", :created-at 1279380650000, :updated-at 1285500150000, :_id "542692c7c026201cdc32698d"} {:body ";; Create 2 bank accounts\n(def acc1 (ref 100))\n(def acc2 (ref 200))\n\n;; How much money is there?\n(println @acc1 @acc2)\n;; => 100 200\n\n;; Either both accounts will be changed or none\n(defn transfer-money [a1 a2 amount]\n (dosync\n (alter a1 - amount)\n (alter a2 + amount)\n amount)) ; return amount from dosync block and function (just for fun)\n\n;; Now transfer $20\n(transfer-money acc1 acc2 20)\n;; => 20\n\n;; Check account balances again\n(println @acc1 @acc2)\n;; => 80 220\n\n;; => We can see that transfer was successful", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423044726004, :updated-at 1423044726004, :_id "54d1f076e4b081e022073c5b"}], :macro true, :notes nil, :arglists ["& exprs"], :doc "Runs the exprs (in an implicit do) in a transaction that encompasses\n exprs and any nested calls. Starts a transaction if none is already\n running on this thread. Any uncaught exception will abort the\n transaction and flow out of dosync. The exprs may be run more than\n once, but any effects on Refs will be atomic.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/dosync"} {:added "1.0", :ns "clojure.core", :name "remove-ns", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1284970244000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "create-ns", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b5c"} {:created-at 1284970256000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "find-ns", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b5d"}], :line 4140, :examples [{:author {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"}, :editors [{:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "sillitor", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c6e7b175eb48c8e3db32f3ff7c2a205d?r=PG&default=identicon"}], :body ";; Let's create a namespace and then remove it\n\nuser=> (create-ns 'my-new-namespace)\n#\n\n;; removing a namespace will give you the namespace you just deleted, if one existed\nuser=> (remove-ns 'my-new-namespace)\n#\n\n;; removing a namespace that does not exist, will tell you that nothing was removed, \n;; by returning nil, and won't give any errors\nuser=> (remove-ns 'my-new-namespace)\nnil\n", :created-at 1284948400000, :updated-at 1375854900000, :_id "542692c9c026201cdc326a90"} {:updated-at 1546107636355, :created-at 1546107636355, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Unlikely you'll ever want to use \"remove-ns\" unless you know what you're\n;; doing. Prefer libs like tools.namespace whenever possible. For example,\n;; here we are preventing garbage collecting the namespace and getting a\n;; stale read.\n\n(create-ns 'go-away)\n(intern 'go-away 'my-var 0)\n(refer 'go-away :only ['my-var])\n(remove-ns 'go-away)\n\n;; nope, still here:\n(.ns #'my-var)\n;; #object[clojure.lang.Namespace 0x1f658731 \"go-away\"]\n\n;; replace\n(create-ns 'go-away)\n(intern 'go-away 'my-var 1)\n\n;; stale\nmy-var\n;; 0\n\n;; correct\n@#'go-away/my-var\n;; 1", :_id "5c27baf4e4b0ca44402ef607"}], :notes nil, :arglists ["sym"], :doc "Removes the namespace named by the symbol. Use with caution.\n Cannot be used to remove the clojure namespace.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/remove-ns"} {:added "1.0", :ns "clojure.core", :name "take", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1288872407000, :author {:login "jartur", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8eae7b45fd8d383bc1a49e24bee51c9b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "drop", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521db2"} {:created-at 1288872422000, :author {:login "jartur", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8eae7b45fd8d383bc1a49e24bee51c9b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "take-while", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521db3"} {:created-at 1288872427000, :author {:login "jartur", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8eae7b45fd8d383bc1a49e24bee51c9b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "take-last", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521db4"} {:created-at 1288872434000, :author {:login "jartur", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8eae7b45fd8d383bc1a49e24bee51c9b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "take-nth", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521db5"}], :line 2861, :examples [{:author {:login "jandot", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/90df4ddea707147ac2ac11383108d700?r=PG&default=identicon"}, :editors [{:login "jandot", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/90df4ddea707147ac2ac11383108d700?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jszakmeister", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/69ad2af1f028b1b7e76c14f83bdf26cb?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body ";; return a lazy seq of the first 3 items\n(take 3 '(1 2 3 4 5 6))\n;;=> (1 2 3)\n\n(take 3 [1 2 3 4 5 6])\n;;=> (1 2 3)\n\n;; returns all items if there are fewer than n\n(take 3 [1 2])\n;;=> (1 2)\n\n(take 1 [])\n;;=> ()\n\n(take 1 nil)\n;;=> ()\n\n(take 0 [1])\n;;=> ()\n\n(take -1 [1])\n;;=> ()", :created-at 1278905054000, :updated-at 1423278637171, :_id "542692cec026201cdc326de8"} {:author {:login "citizen428", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3881a28fe402dd2d1de44717486cae8?r=PG&default=identicon"}, :editors [{:login "citizen428", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3881a28fe402dd2d1de44717486cae8?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; similar to subvec but lazy and with seqs\n(take 3 (drop 5 (range 1 11)))\n;;=> (6 7 8)", :created-at 1280469743000, :updated-at 1420736101515, :_id "542692cec026201cdc326ded"} {:updated-at 1435879568191, :created-at 1435879568191, :author {:login "bsvingen", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1647562?v=3"}, :body ";; Used without a collection, take will create a transducer:\n(def xf (take 5))\n\n;; We can now apply this transducer to a sequence:\n(transduce xf conj (range 5))\n;; => [0 1 2 3 4]\n", :_id "5595c890e4b00f9508fd66f3"} {:editors [{:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}], :body ";; Note that usually more items are realized than needed.\n;; In the example below we want a lazy sequence of 1 item\n;; (the first item of the range), but actually the first 32 items are calculated.\n;; This can be especially important when this extra realization requires a lot of\n;; resources (CPU, time, memory, etc.) and at the end not needed at all.\n;; Tip: try 32 and 33 instead of 1 in the take below.\n\nuser=> (let [x (map (fn [i]\n (println i)\n (Thread/sleep 100)\n i)\n (range 50))]\n (take 1 x))\n0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n(0)\n\n;; Another interesting case (especially for debugging) when\n;; an exception is thrown during this extra realization.\n\nuser=> (let [x (map (fn [i]\n (when (> i 40)\n (throw (Exception. (str i \" is not accepted!\")))))\n (range 50))]\n (take 33 x))\n\n;; result: Exception 41 is not accepted!\n\n;; When pmap is used instead of map, then not only one, but many exceptions might\n;; be thrown during this extra realization. However, all of them are \"swallowed\"\n;; by pmap: they are thrown inside, but never get out:\n\nuser=> (let [x (pmap (fn [i]\n (when (> i 40)\n (println \"Exception is thrown...\")\n (throw (Exception. (str i \" is not accepted!\")))))\n (range 50))]\n (take 33 x))\n(nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil\nException is thrown...Exception is thrown...\n\nException is thrown...Exception is thrown...\n\nException is thrown...\nException is thrown...\nnil nil nil nil nil nil nil nil nil nil nil nil)\nException is thrown...\nException is thrown...Exception is thrown...\n;; Note: the REPL sees no exception!\n\n;; \"Normal\" exceptions arrive as expected:\nuser=> (let [x (pmap (fn [i]\n (when (> i 40)\n (println \"Exception is thrown...\" i)\n (throw (Exception. (str i \" is not accepted!\")))))\n (range 50))]\n (take 42 x))\n(nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil\nException is thrown... Exception is thrown...Exception is thrown... 42\n44Exception is thrown...Exception is thrown... 46 \nnilException is thrown... Exception is thrown...47 45\nException is thrown... 49\n43\n\n\n 48nil nil \nnil nil nil nil Exception is thrown...nil nil 41nil nil \nnil Exception 41 is not accepted! user/eval9941/fn--9942 (NO_SOURCE_FILE:337)\nnil nil nil nil nil nil\n;; We can see above, that several exceptions are thrown, but only the one for i=41\n;; arrives to the REPL.\n", :author {:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"}, :created-at 1538951205102, :updated-at 1539004143896, :_id "5bba8825e4b00ac801ed9eac"}], :notes nil, :arglists ["n" "n coll"], :doc "Returns a lazy sequence of the first n items in coll, or all items if\n there are fewer than n. Returns a stateful transducer when\n no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/take"} {:added "1.0", :ns "clojure.core", :name "vector?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1414508335557, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "set?", :library-url "https://github.com/clojure/clojure"}, :_id "544faf2fe4b03d20a1024280"} {:created-at 1414508362039, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "vec", :library-url "https://github.com/clojure/clojure"}, :_id "544faf4ae4b03d20a1024281"} {:created-at 1414508375671, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "map?", :library-url "https://github.com/clojure/clojure"}, :_id "544faf57e4b03d20a1024282"} {:created-at 1414508715616, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "list?", :library-url "https://github.com/clojure/clojure"}, :_id "544fb0abe4b03d20a1024285"} {:created-at 1420231002263, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=3"}, :to-var {:ns "clojure.core", :name "sequential?", :library-url "https://github.com/clojure/clojure"}, :_id "54a7015ae4b09260f767ca84"}], :line 174, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body ";; this is the idiomatic vector \n(vector? [1 2 3])\n;;=> true\n\n;; a list is not a vector\n(vector? '(1 2 3))\n;;=> false\n\n;; a list may be converted into a vector\n(vector? (vec '(1 2 3)))\n;;=> true\n\n;; a map is not a vector\n(vector? {:a 1 :b 2 :c 3})\n;;=> false\n\n;; a set is not a vector\n(vector? #{:a :b :c})\n;;=> false\n\n(first {:a 1 :b 2 :c 3})\n;;=> [:c 3]\n(vector? (first {:a 1 :b 2 :c 3}))\n;;=> true", :created-at 1279075424000, :updated-at 1423523910620, :_id "542692c9c026201cdc326af5"} {:updated-at 1518959452052, :created-at 1518959452052, :author {:login "humorless", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/3061798?v=4"}, :body ";; an quoted vector is still a vector\n(vector? '[])\n;;=> true", :_id "5a897b5ce4b0316c0f44f8cb"} {:updated-at 1660931660559, :created-at 1660931660559, :author {:login "KGOH", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/11963737?v=4"}, :body ";; Be careful while traversing data:\n;; map entries are vectors!\n\nuser=> (vector? (first {:a 1}))\ntrue\n\nuser=> (vector? (clojure.lang.MapEntry. :a 1))\ntrue\n\nuser=> (clojure.walk/postwalk\n #(cond-> % (vector? %) set)\n {:a [1 1 2 3]})\n; Unhandled java.lang.ClassCastException\n; class clojure.lang.PersistentHashSet cannot be cast to class\n; java.util.Map$Entry (clojure.lang.PersistentHashSet is in unnamed module of\n; loader 'app'; java.util.Map$Entry is in module java.base of loader\n; 'bootstrap')\n\nuser=> (clojure.walk/postwalk\n #(cond-> %\n (and (vector? %)\n (not (map-entry? %)))\n set)\n {:a [1 1 2 3]})\n{:a #{1 3 2}}", :_id "62ffce4ce4b0b1e3652d7640"}], :notes nil, :arglists ["x"], :doc "Return true if x implements IPersistentVector", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/vector_q"} {:added "1.2", :ns "clojure.core", :name "thread-bound?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1350609443000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bound-fn", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ec5"} {:created-at 1350609447000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bound-fn*", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ec6"}], :line 5520, :examples [{:body "user=> (thread-bound? #'map)\nfalse\n\nuser=> (thread-bound? #'*warn-on-reflection*)\ntrue", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423279051775, :updated-at 1423279051775, :_id "54d583cbe4b081e022073c6d"}], :notes nil, :arglists ["& vars"], :doc "Returns true if all of the vars provided as arguments have thread-local bindings.\n Implies that set!'ing the provided vars will succeed. Returns true if no vars are provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/thread-bound_q"} {:added "1.5", :ns "clojure.core", :name "send-via", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1553627520247, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "send", :ns "clojure.core"}, :_id "5c9a7980e4b0ca44402ef6d1"} {:created-at 1553627525447, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "send-off", :ns "clojure.core"}, :_id "5c9a7985e4b0ca44402ef6d2"}], :line 2101, :examples [{:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; \"send\" (FixedThreadPool) or \"send-off\" (CachedThreadPool) \n;; covers most of the thread pooling strategies.\n;; But in case you want a different one, use \"send-via\" to pass\n;; a different pool, for example ForkJoin.\n\n(import '[java.util.concurrent Executors])\n(def fj-pool (Executors/newWorkStealingPool))\n\n(defn send-fj [^clojure.lang.Agent a f & args]\n (apply send-via fj-pool a f args))\n\n(def a (agent 1))\n(send-fj a inc)\n(await a)\n@a\n;; 2", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1553627490834, :updated-at 1553627508594, :_id "5c9a7962e4b0ca44402ef6cf"}], :notes nil, :arglists ["executor a f & args"], :doc "Dispatch an action to an agent. Returns the agent immediately.\n Subsequently, in a thread supplied by executor, the state of the agent\n will be set to the value of:\n\n (apply action-fn state-of-agent args)", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/send-via"} {:added "1.0", :ns "clojure.core", :name "boolean", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1525123909893, :author {:login "zk", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/7194?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "boolean?", :ns "clojure.core"}, :_id "5ae78b45e4b045c27b7fac5a"}], :line 1605, :examples [{:updated-at 1445064419614, :created-at 1279063882000, :body ";; Everything except `false' and `nil' is true in boolean context.\nuser=> (into {} (map #(vector % (boolean %)) [true false nil [] {} '() #{} \"\"]))\n{true true, false false, nil false, [] true, {} true, #{} true, \"\" true}\n\nuser=> (clojure.pprint/pp)\n{true true,\n false false,\n nil false,\n [] true,\n {} true,\n #{} true,\n \"\" true}\nnil\n\n;; Unrelated to `boolean`, but notice that the `'()` entry is missing. This\n;; due to Clojure treating `[]` and `'()` as equal. When combined into the map \n;; the `'() => true` key-value pair is overwritten by the `[] => true` key-value\n;; pair. See https://github.com/zk/clojuredocs/issues/114#issuecomment-132153637\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692c9c026201cdc326ad4"} {:body ";; Beware that boolean returns true for numbers 0 and 1\nuser=> (boolean 0)\ntrue\nuser=> (boolean 1)\ntrue", :author {:login "nickzam", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/89377?v=3"}, :created-at 1425054691862, :updated-at 1425054691862, :_id "54f09be3e4b0b716de7a652d"} {:editors [{:login "Jarzka", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5528061?v=3"}], :body ";; Simply defined: Everything except false and nil is logically true in Clojure.", :author {:avatar-url "https://avatars.githubusercontent.com/u/5528061?v=3", :account-source "github", :login "Jarzka"}, :created-at 1475227100143, :updated-at 1475227191121, :_id "57ee2ddce4b0709b524f0510"} {:updated-at 1496248789165, :created-at 1496248789165, :author {:login "dottedmag", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/16120?v=3"}, :body ";; Corrected definition:\n;; returns `false' for `false', `nil' and `(Boolean. false)`.\n;; returns `true' for everything else.\n", :_id "592ef1d5e4b06e730307db16"}], :notes nil, :arglists ["x"], :doc "Coerce to boolean", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/boolean"} {:added "1.0", :ns "clojure.core", :name "bit-shift-left", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1405720522000, :author {:login "phreed", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a0c739cf289be18be932dc3022e6fd3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bit-shift-left", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d80"} {:created-at 1412094597343, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=2"}, :to-var {:ns "clojure.core", :name "unsigned-bit-shift-right", :library-url "https://github.com/clojure/clojure"}, :_id "542ada85e4b0df9bb778a5a1"} {:created-at 1412094642694, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=2"}, :to-var {:ns "clojure.core", :name "bit-shift-right", :library-url "https://github.com/clojure/clojure"}, :_id "542adab2e4b0df9bb778a5a2"}], :line 1356, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "tomas", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c0c2f195479ae4a71cb6484679f6f49?r=PG&default=identicon"} {:login "tomas", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c0c2f195479ae4a71cb6484679f6f49?r=PG&default=identicon"}], :body "
    user=> (bit-shift-left 1 10)\n1024\n
    \n\n
    user=> (bit-shift-left 2r1101 2) ; fill rightmost bits with 0s\n52 \n;; 52 = 2r110100\n
    \n", :created-at 1280339401000, :updated-at 1408597384000, :_id "542692ccc026201cdc326cc2"} {:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [{:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}], :body ";;a bogus bit-array implementation\n\n(def ba (atom (long 0)))\n\n(defn set-ba \n\"sets bit n in long atom ba\"\n [n]\n (let [number-set (bit-shift-left 1 n)\n\t_ (println \"number to set: \" number-set)\n\tnew-array (bit-or @ba number-set)]\n (reset! ba new-array)))\n\n(defn get-ba \n\"gets bit n in long atom ba\"\n[n]\n (not (zero? (bit-and (bit-shift-left 1 n) @ba))))\n\n(comment\n (set-ba 0) ;; 0 [....0001]\n (set-ba 3) ;; 2^3 = 8 [....1001]\n (get-ba 0) ;; (bit-and ba 2^0) = 1\n (get-ba 1) ;; (bit-and ba 2^1) = 0\n (get-ba 3) ;; (bit-and ba 2^3) = 1\n ;;but:\n (set-ba 65) ;; [....1011]\n ;;number to set: 2\n ;;modulo because long has only 64 bit\n ;;also note that long always is two-complemented (signed) in java implementation\n )", :created-at 1334315926000, :updated-at 1334316062000, :_id "542692d2c026201cdc326f59"}], :notes nil, :arglists ["x n"], :doc "Bitwise shift left", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bit-shift-left"} {:added "1.9", :ns "clojure.core", :name "any?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1505768957277, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "constantly", :ns "clojure.core"}, :_id "59c035fde4b09f63b945ac78"} {:created-at 1509371215117, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "some?", :ns "clojure.core"}, :_id "59f72d4fe4b0a08026c48c8b"}], :line 538, :examples [{:updated-at 1525874416827, :created-at 1525874416827, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body ";; All known practical uses are in the context of core.spec\n;; Specifically indicates that any type is allowed.\n\n;; https://clojure.org/guides/spec#_macros\n(s/fdef clojure.core/declare\n :args (s/cat :names (s/* simple-symbol?))\n :ret any?)\n", :_id "5af2fef0e4b045c27b7fac5e"} {:updated-at 1598160436994, :created-at 1598160436994, :author {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}, :body ";; any? never returns false\n\nuser=> (any? {})\n;; true\nuser=> (any? [])\n;; true\nuser=> (any? nil)\n;; true\nuser=> (any? true)\n;; true\nuser=> (any? false)\n;; true", :_id "5f41fe34e4b0b1e3652d739b"} {:updated-at 1667213535374, :created-at 1667213535374, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; Combined with `halt-when` to make a \"first\" transducer\n(transduce (comp (filter even?) (halt-when any?)) identity nil [1 3 5 6 7 8 9])\n;; => 6\n", :_id "635fa8dfe4b0b1e3652d767e"}], :notes [{:author {:login "kofrasa", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/941969?v=4"}, :updated-at 1537520319116, :created-at 1537520319116, :body "The current implementation of [any?](https://github.com/clojure/clojure/blob/clojure-1.9.0/src/clj/clojure/core.clj#L538-L542) is incorrect and must be fixed IMO.\nThere was a [PR](https://github.com/clojure/clojure/pull/49) (copied below) submitted in 2014 to add a correct implementation which is consistent with behaviour in other languages. \n\n```\n(def\n ^{:tag Boolean\n :doc \"Returns true if (pred x) is logical true for any x in coll,\n else false.\"\n :arglists '([pred coll])\n :added \"1.7\"}\n any? (comp boolean some))\n```", :_id "5ba4b2bfe4b00ac801ed9ea2"} {:author {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}, :updated-at 1598160591335, :created-at 1598160591335, :body "any? never returns false. Is this a bug?", :_id "5f41fecfe4b0b1e3652d739c"} {:author {:login "KyleErhabor", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/40676441?v=4"}, :updated-at 1635468134571, :created-at 1635468134571, :body "You can think of this function as a non-variadic `(constantly true)`.", :_id "617b4366e4b0b1e3652d7561"} {:body "[Explanation by Alex Miller:](https://ask.clojure.org/index.php/11260/does-the-any-function-have-the-correct-behavior?show=11261#a11261)\n\n> \n`any?` is a predicate that is intended to always return true, so yes it is the correct behavior. `any?` was added as a predicate to use with spec in the case where any value is valid. It is not a complement to `not-any?`, despite that obvious assumption. There are, in the end, only so many words and despite a lot of care in this regard, there are times when these confusions exist.\n\n> ...this is similar to `and` (for N args) but that does have limits as a macro, or `every?` (for a coll), or the higher-order function `every-pred` for creating a composite pred. Depending on your case, one of those probably makes sense.", :created-at 1636499571628, :updated-at 1636499796804, :author {:avatar-url "https://avatars.githubusercontent.com/u/77174844?v=4", :account-source "github", :login "wildwestrom"}, :_id "618b0073e4b0b1e3652d7569"}], :tag "java.lang.Boolean", :arglists ["x"], :doc "Returns true given any argument.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/any_q"} {:added "1.0", :ns "clojure.core", :name "find-var", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 2015, :examples [{:author {:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user=> (find-var 'clojure.core/map)\n#'clojure.core/map\nuser=> (find-var 'clojure.core/qwerty)\nnil\nuser=> (find-var 'map)\nIllegalArgumentException Symbol must be namespace-qualified clojure.lang.Var.find (Var.java:150)\n", :created-at 1353813768000, :updated-at 1422932885283, :_id "542692d3c026201cdc326fa5"}], :notes [{:author {:login "kumarshantanu", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/109792?v=4"}, :updated-at 1520862872705, :created-at 1520862872705, :body "For namespaces other than those in Clojure, you must do `(require 'the-ns)` first, followed by `(find-var 'the-ns/the-name)`. Failing to do this leads to `IllegalArgumentException` thrown complaining about no such namespace.", :_id "5aa68698e4b0316c0f44f921"}], :arglists ["sym"], :doc "Returns the global var named by the namespace-qualified symbol, or\n nil if no var with that name.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/find-var"} {:added "1.0", :ns "clojure.core", :name "rand-int", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1311342554000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rand", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b5a"} {:created-at 1343068893000, :author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "int", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b5b"}], :line 4919, :examples [{:author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"} {:login "green-coder", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4"}], :body "user=> (rand-int 30)\n10\n\nuser=> (rand-int 30)\n7\n\n; is equivalent to\nuser=> (int (rand 30))\n", :created-at 1280776684000, :updated-at 1527060379971, :_id "542692cac026201cdc326b17"} {:body "(require '[clojure.set :as set])\n\n; random generation of unique series of random numbers from 0 to n-1 \n\n(defn unique-random-numbers [n]\n (let [a-set (set (take n (repeatedly #(rand-int n))))]\n (concat a-set (set/difference (set (take n (range)))\n a-set))))\n\nuser=> (unique-random-numbers 20)\n(0 1 3 6 7 8 9 12 14 16 17 19 2 4 5 10 11 13 15 18)\n\n", :author {:login "rsachdeva", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/232903?v=2"}, :created-at 1412614831110, :updated-at 1412617449373, :editors [{:login "rsachdeva", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/232903?v=2"}], :_id "5432caafe4b0edc37b198867"}], :notes nil, :arglists ["n"], :doc "Returns a random integer between 0 (inclusive) and n (exclusive).", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/rand-int"} {:added "1.0", :ns "clojure.core", :name "aclone", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1359687987000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "aget", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d98"} {:created-at 1454082909781, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "int-array", :ns "clojure.core"}, :_id "56ab8b5de4b0ceed88ce8d1d"}], :line 3905, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body ";; create an Java integer array, then clone it\n;; note that when you modify b, a remains the same\n;; showing that b is not just a reference to a\nuser=> (def a (int-array [1 2 3 4]))\n#'user/a\n\nuser=> (def b (aclone a))\n#'user/b\n\nuser=> (aset b 0 23)\n23\n\nuser=> (vec b)\n[23 2 3 4]\n\nuser=> (vec a)\n[1 2 3 4]", :created-at 1313834307000, :updated-at 1422928355436, :_id "542692cec026201cdc326db4"}], :notes nil, :arglists ["array"], :doc "Returns a clone of the Java array. Works on arrays of known\n types.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/aclone"} {:added "1.10", :ns "clojure.core", :name "PrintWriter-on", :file "clojure/core_print.clj", :type "function", :column 1, :see-alsos nil, :line 559, :examples [{:updated-at 1589185851017, :created-at 1589185851017, :author {:login "pwojnowski", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/433664?v=4"}, :body "(with-open [writer (PrintWriter-on\n (fn [s] (printf \"Flushing: '%s'%n\" s))\n (fn [] (printf \"Closing.%n\")))]\n (.write writer \"Hello\")\n (.flush writer)\n (.write writer \"World!\")\n (println \"About to finish...\"))\n;; Flushing: 'Hello'\n;; About to finish...\n;; Flushing: 'World!'\n;; Closing.\n;; nil\n", :_id "5eb90d3be4b087629b5a190a"}], :notes nil, :tag "java.io.PrintWriter", :arglists ["flush-fn close-fn"], :doc "implements java.io.PrintWriter given flush-fn, which will be called\n when .flush() is called, with a string built up since the last call to .flush().\n if not nil, close-fn will be called with no arguments when .close is called", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/PrintWriter-on"} {:added "1.7", :ns "clojure.core", :name "vreset!", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1469617409269, :author {:login "kumarshantanu", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109792?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "volatile!", :ns "clojure.core"}, :_id "57989501e4b0bafd3e2a04c0"}], :line 2532, :examples [{:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; A lightweight (but low level) syncrhonization solution with volatile!\n;; Prefer promise/deliver for this (unless you know what you're doing).\n;; vars/atoms is also possible but they're heavier\n;; (locking and CAS respectively).\n\n(def ready (volatile! false))\n(def result (volatile! nil))\n\n(defn start-consumer []\n (future\n (while (not @ready) ; consumer starts spinning\n (Thread/yield)) ; release control for other threads\n (println \"Consumer getting result:\" @result)))\n\n(defn start-producer []\n (future\n (vreset! result :done) ; change the 1st volatile, no reordering (guaranteed).\n (vreset! ready true))) ; change the ready state. \n\n(start-consumer)\n(start-producer)\n;; Consumer getting result: :done", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1554052433589, :updated-at 1554114281037, :_id "5ca0f551e4b0ca44402ef6f3"}], :notes nil, :arglists ["vol newval"], :doc "Sets the value of volatile to newval without regard for the\n current value. Returns newval.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/vreset!"} {:ns "clojure.core", :name "chunk", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1443935937870, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-buffer", :ns "clojure.core"}, :_id "5610b6c1e4b0686557fcbd48"} {:created-at 1443935945637, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-cons", :ns "clojure.core"}, :_id "5610b6c9e4b08e404b6c1c9a"} {:created-at 1443935949789, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-first", :ns "clojure.core"}, :_id "5610b6cde4b0686557fcbd49"} {:created-at 1443935953838, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-rest", :ns "clojure.core"}, :_id "5610b6d1e4b0686557fcbd4a"} {:created-at 1443935959010, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunked-seq?", :ns "clojure.core"}, :_id "5610b6d7e4b0686557fcbd4b"}], :line 698, :examples [{:updated-at 1443936068915, :created-at 1443936068915, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :body "(chunk-rest\n (chunk-cons (chunk (chunk-buffer 32))\n (seq (range 42))))\n\n;; => (32 33 34 35 36 37 38 39 40 41)\n\n;; Or if you'd prefer to read it threaded:\n(-> (chunk-buffer 32)\n (chunk)\n (chunk-cons (seq (range 42)))\n (chunk-rest))\n\n;; => (32 33 34 35 36 37 38 39 40 41)", :_id "5610b744e4b0686557fcbd4c"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; re-chunk takes a sequence (already chunked or not)\n;; and produces another sequence with different chunking size.\n\n(defn re-chunk [n xs]\n (lazy-seq\n (when-let [s (seq (take n xs))]\n (let [cb (chunk-buffer n)]\n (doseq [x s] (chunk-append cb x))\n (chunk-cons (chunk cb) (re-chunk n (drop n xs)))))))\n\n(def s (pmap f (re-chunk 1000 (range 1000)))) ; a 1000+ concurrent threads pmap\n\n(def s (map #(println %) (re-chunk 3 (range 50)))) ; chunk-size = 3\n\n(first s) ; moves ahead 3 on first access\n;; 0\n;; 1\n;; 2\n\n(second s) ; already cached\nnil\n\n(first (drop 3 s)) ; 3 more\n;; 3\n;; 4\n;; 5\n", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1553787843289, :updated-at 1553805164827, :_id "5c9cebc3e4b0ca44402ef6ec"}], :notes nil, :tag "clojure.lang.IChunk", :arglists ["b"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/chunk"} {:added "1.2", :ns "clojure.core", :name "dec", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1318548547000, :author {:login "arkh", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1c6ed9b963d758914c2744befd4974ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "dec'", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b3e"} {:created-at 1415177846727, :author {:login "rvlieshout", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/139665?v=2"}, :to-var {:ns "clojure.core", :name "inc", :library-url "https://github.com/clojure/clojure"}, :_id "5459e676e4b03d20a102429e"} {:created-at 1423522396091, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "unchecked-dec", :library-url "https://github.com/clojure/clojure"}, :_id "54d93a5ce4b0e2ac61831d30"}], :line 1142, :examples [{:author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (dec 2)\n1\n\nuser=> (dec 2.0)\n1.0\n\nuser=> (dec 1)\n0\n\nuser=> (dec -1)\n-2", :created-at 1279992356000, :updated-at 1411919526590, :_id "542692cec026201cdc326d98"}], :notes nil, :arglists ["x"], :doc "Returns a number one less than num. Does not auto-promote\n longs, will throw on overflow. See also: dec'", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/dec"} {:added "1.1", :ns "clojure.core", :name "future-call", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1300437112000, :author {:login "ninjudd", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7ced25585a7556e9b9b975c1f9e136e3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "future", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f43"}], :line 6963, :examples [{:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; future-call is used to implement 'future'. See examples for 'future'\n;; for discussion of an undesirable 1-minute wait that can occur before\n;; your standalone Clojure program exits if you do not use shutdown-agents.", :created-at 1336538018000, :updated-at 1336538018000, :_id "542692d3c026201cdc326fb2"}], :notes [{:author {:login "guyboltonking", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/98294?v=4"}, :updated-at 1524654131544, :created-at 1524654131544, :body "`future-call` will also preserve the calling thread's dynamic bindings in the thread that executes f.", :_id "5ae06033e4b045c27b7fac52"}], :arglists ["f"], :doc "Takes a function of no args and yields a future object that will\n invoke the function in another thread, and will cache the result and\n return it on all subsequent calls to deref/@. If the computation has\n not yet finished, calls to deref/@ will block, unless the variant\n of deref with timeout is used. See also - realized?.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/future-call"} {:added "1.0", :ns "clojure.core", :name "resultset-seq", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 5702, :examples [{:updated-at 1519728015058, :created-at 1519728015058, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; To run this you need [mysql/mysql-connector-java \"5.1.x\"] dependency \n;; in the classpath and a running MySql instance. The statement is set\n;; to enable streaming and go fully lazy with restultset-seq.\n;; \"f\" is expected to produce the required results *before* exiting \n;; the try-finally block that closes the connection.\n\n(import '[java.sql DriverManager ResultSet])\n\n(defn with-mysql-query [url query f]\n (Class/forName \"com.mysql.jdbc.Driver\")\n (let [db url\n conn (DriverManager/getConnection db)\n stmt (doto\n (.createStatement conn\n ResultSet/TYPE_FORWARD_ONLY\n ResultSet/CONCUR_READ_ONLY)\n (.setFetchSize Integer/MIN_VALUE))\n rs (.executeQuery stmt query)]\n (try\n (f (resultset-seq rs))\n (finally\n (.close stmt)\n (.close conn)))))\n\n(with-mysql-query\n \"jdbc:mysql://localhost/mysql?user=root&password=\"\n \"SELECT * FROM user\"\n (comp count keys first))\n\n;; 45\n", :_id "5a95358fe4b0316c0f44f900"}], :notes nil, :arglists ["rs"], :doc "Creates and returns a lazy sequence of structmaps corresponding to\n the rows in the java.sql.ResultSet rs", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/resultset-seq"} {:added "1.0", :ns "clojure.core", :name "struct", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1293674730000, :author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defstruct", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bb5"} {:created-at 1605645636792, :author {:login "metasoarous", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/88556?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "create-struct", :ns "clojure.core"}, :_id "5fb43544e4b0b1e3652d7407"}], :line 4062, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [], :body "user> (defstruct mystruct :foo :bar)\n#'user/mystruct\n\nuser> (struct mystruct \"eggplant\" \"pizza\")\n{:foo \"eggplant\", :bar \"pizza\"}", :created-at 1293674725000, :updated-at 1293674725000, :_id "542692cec026201cdc326d8b"} {:updated-at 1605645959161, :created-at 1605645773188, :author {:login "metasoarous", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/88556?v=4"}, :body ";; You can use an \"anonymous\" struct like so\n\n(let [structure (create-struct :foo :bar)]\n (struct structure \"pop\" \"fizz\"))\n\n;; This can be useful if you want to dynamically create/use structs, and don't\n;; know the field names at compile time (e.g. when reading CSV files)", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/88556?v=4", :account-source "github", :login "metasoarous"}], :_id "5fb435cde4b0b1e3652d7408"}], :notes [{:body "Structs are becoming obsolete. Use records instead. See `defrecord`.", :created-at 1423277999196, :updated-at 1423277999196, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :_id "54d57fafe4b0e2ac61831d27"} {:body "In _general_, records should be preferred over structs. However, structs aren't _entirely_ obsolete.\n\nThey can still be useful when you need/want to create record-like objects dynamically; That is, when you don't know the field names at compile time. A typical example of this might be loading rows from a CSV (as [semantic-csv](https://github.com/metasoarous/semantic-csv) does). The advantage in this case over using regular maps is significantly improved performance creating and using these objects.", :created-at 1605646073997, :updated-at 1605646085033, :author {:avatar-url "https://avatars3.githubusercontent.com/u/88556?v=4", :account-source "github", :login "metasoarous"}, :_id "5fb436f9e4b0b1e3652d740b"}], :arglists ["s & vals"], :doc "Returns a new structmap instance with the keys of the\n structure-basis. vals must be supplied for basis keys in order -\n where values are not supplied they will default to nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/struct"} {:added "1.0", :ns "clojure.core", :name "map", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1318598944000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "map-indexed", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b92"} {:created-at 1346930884000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pmap", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b93"} {:created-at 1346930913000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "amap", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b94"} {:created-at 1371842453000, :author {:login "adereth", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5ad11b4e208a6cdb3bd45fe01dea59b7?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "mapcat", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b95"} {:created-at 1399907437000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "keep", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b96"} {:created-at 1407836917000, :author {:login "Thomas Stephens", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/40024617164314f70f7584ac09b96c1d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "juxt", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b97"} {:created-at 1413326075136, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "mapv", :library-url "https://github.com/clojure/clojure"}, :_id "543da4fbe4b02688d208b1b9"} {:created-at 1449762409201, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reduce", :ns "clojure.core"}, :_id "56699e69e4b09a2675a0ba73"} {:created-at 1516403401772, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "run!", :ns "clojure.core"}, :_id "5a627ac9e4b0a08026c48d07"} {:created-at 1655305687140, :author {:login "zackteo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7510179?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "filter", :ns "clojure.core"}, :_id "62a9f5d7e4b0b1e3652d7601"}], :line 2727, :examples [{:author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "tomas", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c0c2f195479ae4a71cb6484679f6f49?r=PG&default=identicon"} {:login "tomas", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c0c2f195479ae4a71cb6484679f6f49?r=PG&default=identicon"} {:login "tomas", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c0c2f195479ae4a71cb6484679f6f49?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/35314270?v=4", :account-source "github", :login "ricardodalarme"}], :body "(map inc [1 2 3 4 5])\n;;=> (2 3 4 5 6)\n\n\n;; map can be used with multiple collections. Collections will be consumed\n;; and passed to the mapping function in parallel:\n(map + [1 2 3] [4 5 6])\n;;=> (5 7 9)\n\n\n;; When map is passed more than one collection, the mapping function will\n;; be applied until one of the collections runs out:\n(map + [1 2 3] (iterate inc 1))\n;;=> (2 4 6)\n\n\n\n;; map is often used in conjunction with the # reader macro:\n(map #(str \"Hello \" % \"!\" ) [\"Ford\" \"Arthur\" \"Tricia\"])\n;;=> (\"Hello Ford!\" \"Hello Arthur!\" \"Hello Tricia!\")\n\n;; A useful idiom to pull \"columns\" out of a collection of collections. \n;; Note, it is equivalent to:\n;; user=> (map vector [:a :b :c] [:d :e :f] [:g :h :i])\n\n(apply map vector [[:a :b :c]\n [:d :e :f]\n [:g :h :i]])\n\n;;=> ([:a :d :g] [:b :e :h] [:c :f :i])\n\n;; From http://clojure-examples.appspot.com/clojure.core/map\n", :created-at 1278720977000, :updated-at 1665566175477, :_id "542692cac026201cdc326b01"} {:updated-at 1515774677373, :created-at 1279062371000, :body ";; map sends key-value pairs from a hash-map\n(map #(vector (first %) (* 2 (second %)))\n {:a 1 :b 2 :c 3})\n;;=> ([:a 2] [:b 4] [:c 6])\n\n;; or the same thing using destructuring\n(map (fn [[key value]] [key (* 2 value)])\n {:a 1 :b 2 :c 3})\n;;=> ([:a 2] [:b 4] [:c 6])\n\n(into {} *1)\n;;=> {:a 2, :b 4, :c 6}\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692cac026201cdc326b09"} {:updated-at 1636744366940, :created-at 1310850029000, :body ";; Use a hash-map as a function to translate values in a collection from the \n;; given key to the associated value\n\nuser=> (map {2 \"two\" 3 \"three\"} [5 3 2])\n(nil \"three\" \"two\")\n\n;; then use (filter identity... to remove the nils\nuser=> (filter identity (map {2 \"two\" 3 \"three\"} [5 3 2]))\n(\"three\" \"two\")\n\n;; an alternative to the above map+filter steps is keep.\n(keep {2 \"two\" 3 \"three\"} [5 3 2])\n;;=> (\"three\" \"two\")", :editors [{:login "wdhowe", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4631165?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon", :account-source "clojuredocs", :login "shockbob"}, :_id "542692cac026201cdc326b0b"} {:updated-at 1471132085931, :created-at 1320357817000, :body ";; mapping over a hash-map applies (into) first. \n;; need to use functions that deal with arrays (fn [[key val]] ...)\n(map pprint {:key :val :key1 :val1})\n([:key :val]\n[:key1 :val1]\nnil nil)\n\n;;above, the pprint output appears to be part of the return value but it's not:\n(hash-set (map pprint {:key :val :key1 :val1}))\n[:key :val]\n[:key1 :val1]\n#{(nil nil)}\n\n(map second {:key :val :key1 :val1})\n;;=>(:val :val1)\n\n(map last {:x 1 :y 2 :z 3})\n;;=> (1 2 3)", :editors [{:avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon", :account-source "clojuredocs", :login "boxie"} {:avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon", :account-source "clojuredocs", :login "boxie"} {:avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon", :account-source "clojuredocs", :login "AtKaaZ"} {:avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon", :account-source "clojuredocs", :login "AtKaaZ"} {:login "sleyzerzon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/528932?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon", :account-source "clojuredocs", :login "boxie"}, :_id "542692d4c026201cdc326ffb"} {:author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :editors [{:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"} {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"} {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}], :body "(map fn [a 4 x]\n [b 5 y]\n [c 6]) \n; ^ ^\n; applies fn to a b c as (fn a b c)\n; applies fn to 4 5 6 as (fn 4 5 6)\n; ignores (x y)\n; returns a list of results\n; equivalent to (list (fn a b c) (fn 4 5 6))\n\n;example\n(map list [1 2 3]\n '(a b c)\n '(4 5))\n\nuser=> (map list [1 2 3] '(a b c) '(4 5))\n((1 a 4) (2 b 5))\n;same as\nuser=> (list (list 1 'a 4) (list 2 'b 5))\n((1 a 4) (2 b 5))", :created-at 1345087524000, :updated-at 1345087844000, :_id "542692d4c026201cdc327000"} {:author {:login "octopusgrabbus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :body "; map passed two collection arguments. From 4Clojure Problem #157\n\n(def d1 [:a :b :c])\n(#(map list % (range)) d1)\n;;=> ((:a 0) (:b 1) (:c 2))", :created-at 1371168552000, :updated-at 1413325797212, :_id "542692d4c026201cdc327004"} {:updated-at 1435879364197, :created-at 1435879364197, :author {:login "bsvingen", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1647562?v=3"}, :body ";; Used without a collection, map will create a transducer:\n(def xf (map inc))\n\n;; We can now apply this transducer to a sequence:\n(transduce xf conj (range 5))\n;; => [1 2 3 4 5]\n", :_id "5595c7c4e4b020189d740546"} {:updated-at 1450108764352, :created-at 1450108764352, :author {:login "ha0ck", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3716736?v=3"}, :body ";; Extract keyword from a collection of obj\n(map :a '({:a 1 :b 0} {:a 2 :b 0} {:a 3 :b 1} {:a 3 :b 0}))\n;; =>(1 2 3 3)", :_id "566ee75ce4b09a2675a0ba77"} {:updated-at 1471132864529, :created-at 1471132864529, :author {:login "sleyzerzon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/528932?v=3"}, :body ";;get the keys from a map with entries of certain values\n(let [m {:x 1 :y 2 :z 3}\n vset #{2 3}]\n (map first (filter (comp vset last) m)))\n;;=> (:y :z)\n\n(filter (comp #{2 3} last) {:x 1 :y 2 :z 3})\n;;=> ([:y 2] [:z 3])\n\n", :_id "57afb4c0e4b02d8da95c26ff"} {:updated-at 1515775349661, :created-at 1515775349661, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body ";; deeper destructuring\n(def ds [ {:a 1 :b 2 :c [:foo :bar]}\n {:a 9 :b 8 :c [:baz :zoo]}\n {:a 1 :b 2 :c [:dog :cat]} ])\n\n(->> ds \n (map (fn [{a :a, b :b, [lhs rhs] :c}] \n [(str \"a:\" a \" c2:\" rhs)])))\n;;=> ([\"a:1 c2::bar\"] [\"a:9 c2::zoo\"] [\"a:1 c2::cat\"])", :_id "5a58e575e4b0a08026c48cf2"} {:updated-at 1516657644067, :created-at 1516657644067, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;map taking a collection of functions as an argument\n\n(def sum #(reduce + %))\n\n(def average #(/ (sum %) (count %)))\n\n;;apply a function to a collection\n(defn results [coll]\n (map #(% coll) [sum average count]))\n\n(results [10 20 30 40 50])\n;;[150 30 5]", :_id "5a665bece4b09621d9f53a74"} {:updated-at 1517039150366, :created-at 1517039150366, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body "(def my-coll [\n {:m 1, :val 12}\n {:m 2, :val 3}\n {:m 3, :val 32}])\n\n(map #(:val %) my-coll)\n;;(12 3 32)\n\n;;get total:\n(reduce + (map #(:val %) my-coll))\n;;47", :_id "5a6c2e2ee4b076dac5a728a8"} {:updated-at 1517738681040, :created-at 1517738681040, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;map practical example\n\n(def months [\"jan\" \"feb\" \"mar\"])\n\n(def temps [5 7 12])\n\n(defn unify\n [month temp]\n {:month month\n :temp temp})\n\n(map unify months temps)\n\n;;({:month \"jan\", :temp 5}\n;; {:month \"feb\", :temp 7}\n;; {:month \"mar\", :temp 12})\n", :_id "5a76dab9e4b0e2d9c35f7417"} {:updated-at 1518710042333, :created-at 1518710042333, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;map Function collection1 collection2\n\n(map vector '(1 2 3 4) [:a :b :c :d])\n\n;;([1 :a] [2 :b] [3 :c] [4 :d])", :_id "5a85ad1ae4b0316c0f44f8c0"} {:updated-at 1560011503684, :created-at 1560011503684, :author {:login "sodesu99", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/31072774?v=4"}, :body " ;multiplication of rows and columns\n(def matrix\n [\n [1 2 3 4 5];=>120\n [1 2 3 4 5];=>120\n [1 2 3 4 5];=>120\n [1 2 3 4 5]]);120 \n ;(1 16 81 256 625)\n\n;;columns multiplication\n(apply map * matrix)\n;;(1 16 81 256 625)\n\n;;rows multiplication\n(map #(reduce * %) matrix)\n;;(120 120 120 120)", :_id "5cfbe2efe4b0ca44402ef753"} {:updated-at 1631296227373, :created-at 1631296227373, :author {:login "cloudbuck3t", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/90472507?v=4"}, :body ";; Notice how the args of each collection are processed in parallel by the\n;; function provided to `map` -- in this case, an #(anonymous function) \n;;that takes %1 = the first coll elements and %2 the second coll elements.\n;; map will process the collections in parallel and will terminate when it reaches \n;; the end of the shortest collection. In this case, they are equal length.\n\n (map #(str \"Hello \" %1 %2) [\"Tennessee \" \"James \" \"John \"] [\"Ernie Ford\" \"Bond\" \"Smith\"])\n\noutput> (\"Hello Tennessee Ernie Ford\" \"Hello James Bond\" \"Hello John Smith\")", :_id "613b9ae3e4b0b1e3652d753a"} {:editors [{:login "aQuaYi", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6028869?v=4"}], :body ";; running several functions on the same argument\n\n(map #(% 0) (list inc dec zero?))\n;=> (1 -1 true)\n\n(map #(% 0) [inc dec zero?])\n;=> (1 -1 true)\n\n;; but not\n\n(map #(% 0) `(inc dec zero?))\n;=> (nil nil nil)\n\n(map #(% 0) '(inc dec zero?))\n;=> (nil nil nil)\n\n;; https://stackoverflow.com/questions/69925317/why-map-fn-f-f-0-inc-returns-nil-in-clojure", :author {:avatar-url "https://avatars.githubusercontent.com/u/6028869?v=4", :account-source "github", :login "aQuaYi"}, :created-at 1636796097196, :updated-at 1636954237105, :_id "618f86c1e4b0b1e3652d7574"} {:updated-at 1650196591875, :created-at 1650196591875, :author {:login "holtzermann17", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/179958?v=4"}, :body ";; Be careful with `map`, closures, and anonymous functions\n\n(defn typical-closure []\n (let [names (atom [])]\n (fn [arg] (swap! names conj arg) @names)))\n\n;; This works as expected: one function gets created and mapped\n\n(defmacro list-maker [fun args & body]\n `(defn ~fun ~args\n (map (typical-closure) '~body)))\n\n(list-maker foo [x] 1 2 3 4 5)\n(foo 100) ; ([1] [1 2] [1 2 3] [1 2 3 4] [1 2 3 4 5])\n\n;; This version recomputes the function for each mappand!\n\n(defmacro list-maker-oops [fun args & body]\n `(defn ~fun ~args\n (map #((typical-closure) %) '~body)))\n\n;; facepalm\n(list-maker-oops foo [x] 1 2 3 4 5)\n(foo 100) ; ([1] [2] [3] [4] [5])", :_id "625c006fe4b0b1e3652d75d4"}], :notes [{:updated-at 1361257529000, :body "To create a *hashmap*, use the [`hash-map`](hash-map) function, or the `{...}` sugar:\r\n\r\n (= {:a 1 :b 2 :c 3} (hash-map :a 1 :b 2 :c 3))", :created-at 1361257529000, :author {:login "Howard Abrams", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/eef504f83cde9913a37eefa515de56a8?r=PG&default=identicon"}, :_id "542692edf6e94c6970521ffd"}], :arglists ["f" "f coll" "f c1 c2" "f c1 c2 c3" "f c1 c2 c3 & colls"], :doc "Returns a lazy sequence consisting of the result of applying f to\n the set of first items of each coll, followed by applying f to the\n set of second items in each coll, until any one of the colls is\n exhausted. Any remaining items in other colls are ignored. Function\n f should accept number-of-colls arguments. Returns a transducer when\n no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/map"} {:added "1.1", :ns "clojure.core", :name "juxt", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1297561266000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "partial", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f05"} {:created-at 1297561270000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "comp", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f06"} {:created-at 1647648153954, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "every-pred", :ns "clojure.core"}, :_id "62351d99e4b0b1e3652d75bf"}], :line 2576, :examples [{:author {:login "kotarak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; Extract values from a map, treating keywords as functions.\n((juxt :a :b) {:a 1 :b 2 :c 3 :d 4})\n;;=> [1 2]\n", :created-at 1279213578000, :updated-at 1420743412507, :_id "542692cfc026201cdc326e0a"} {:updated-at 1469518181621, :created-at 1279213673000, :body ";; \"Explode\" a value.\n\n((juxt identity name) :keyword)\n;;=> [:keyword \"keyword\"]\n\n(juxt identity name)\n...is the same as:\n(fn [x] [(identity x) (name x)])\n\n;; eg. to create a map:\n\n(into {} (map (juxt identity name) [:a :b :c :d]))\n;;=> {:a \"a\" :b \"b\" :c \"c\" :d \"d\"}\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon", :account-source "clojuredocs", :login "kotarak"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "tengstrand", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/631272?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon", :account-source "clojuredocs", :login "kotarak"}, :_id "542692cfc026201cdc326e0c"} {:author {:login "adie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/26a4d75105ed437cdba82981ff7c78f6?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; Get the first character and length of string\n\n((juxt first count) \"Clojure Rocks\")\n;;=> [\\C 13]\n", :created-at 1280240324000, :updated-at 1420743526351, :_id "542692cfc026201cdc326e0f"} {:updated-at 1450881233579, :created-at 1342498131000, :body ";; sort list of maps by multiple values\n(sort-by (juxt :a :b) [{:a 1 :b 3} {:a 1 :b 2} {:a 2 :b 1}])\n;;=> [{:a 1 :b 2} {:a 1 :b 3} {:a 2 :b 1}]", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "liango2", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5696817?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/47018db2b156f6c7f606950e19cf6134?r=PG&default=identicon", :account-source "clojuredocs", :login "ordnungswidrig"}, :_id "542692d3c026201cdc326fdd"} {:author {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; Create lookup maps via a specific key\n\n(defn index-by [coll key-fn]\n (into {} (map (juxt key-fn identity) coll)))\n;; #'user/index-by\n\n(index-by [{:id 1 :name \"foo\"} \n {:id 2 :name \"bar\"} \n {:id 3 :name \"baz\"}] :id)\n;;=> {1 {:name \"foo\", :id 1}, \n;; 2 {:name \"bar\", :id 2}, \n;; 3 {:name \"baz\", :id 3}}\n\n(index-by [{:id 1 :name \"foo\"} \n {:id 2 :name \"bar\"} \n {:id 3 :name \"baz\"}] :name)\n;;=> {\"foo\" {:name \"foo\", :id 1}, \n;; \"bar\" {:name \"bar\", :id 2}, \n;; \"baz\" {:name \"baz\", :id 3}}\n", :created-at 1392423622000, :updated-at 1420743620071, :_id "542692cfc026201cdc326e12"} {:body "((juxt + * min max) 3 4 6)\n;;=> [13 72 3 6]", :author {:login "d9k", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7331988?v=3"}, :created-at 1428349759385, :updated-at 1428349759385, :_id "5522e33fe4b033f34014b765"} {:updated-at 1443524546728, :created-at 1443524546728, :author {:login "frolovv", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2934915?v=3"}, :body ";; split a sequence into two parts\n\nuser=> ((juxt take drop) 3 [1 2 3 4 5 6])\n;; => [(1 2 3) (4 5 6)]", :_id "560a6fc2e4b08e404b6c1c8b"} {:updated-at 1463687667792, :created-at 1463687667792, :author {:login "clojurianix", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19415437?v=3"}, :body ";; Segregate even and odd numbers in collection.\n\n((juxt (partial filter even?) (partial filter odd?)) (range 0 9))\n;;=> [(0 2 4 6 8) (1 3 5 7)]", :_id "573e19f3e4b0227798e72da1"} {:updated-at 1465311839158, :created-at 1465311839158, :author {:login "sleyzerzon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/528932?v=3"}, :body ";;keywords serve as getter functions to produce an ordered vector\n\n((juxt :lname :fname) {:fname \"Bill\" :lname \"Gates\"})\n=> [\"Gates\" \"Bill\"]", :_id "5756e25fe4b0bafd3e2a047f"} {:updated-at 1477172912305, :created-at 1477172912305, :author {:login "lmccombes", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2421085?v=3"}, :body ";; sort by two values\n\n(sort-by (juxt :a :b) [{:a 2 :b 4} {:a 1 :b 2} {:a 2 :b 1}])\n=> ({:a 1, :b 2} {:a 2, :b 1} {:a 2, :b 4})", :_id "580bdeb0e4b001179b66bdda"} {:editors [{:login "abyala", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1930104?v=4"}], :body ";; something similar to group-by\n\n(def split-by (juxt filter remove))\n\n(split-by pos? [-1 -2 4 5 3 -9])\n=> [(4 5 3) (-1 -2 -9)]\n", :author {:avatar-url "https://avatars2.githubusercontent.com/u/380618?v=4", :account-source "github", :login "smnplk"}, :created-at 1539468521882, :updated-at 1609110202738, :_id "5bc26ce9e4b00ac801ed9eda"} {:updated-at 1652253340151, :created-at 1652253340151, :author {:login "AbhishekJaiswal123", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10753944?v=4"}, :body ";; Extract nested value from the map\n\n((juxt :a #(get-in % [:c :d])) {:a 1 :b 2 :c {:d 2}})\n=> [1 2]", :_id "627b629ce4b0b1e3652d75ee"}], :notes [{:updated-at 1291541271000, :body "I kinda love this fn =)", :created-at 1291541271000, :author {:login "Nevena", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fa0e495ccb6ed2997e14f687817e9299?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fa8"} {:updated-at 1359899617000, :body "\"reduce1\" -> \"reduce\"\r\n\r\ncore sources from 33 line to 37 line", :created-at 1359899617000, :author {:login "lispro06", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/20c3faad6f66a434dae42b5ed8ad305?r=PG&default=identicon"}, :_id "542692edf6e94c6970521ffc"}], :arglists ["f" "f g" "f g h" "f g h & fs"], :doc "Takes a set of functions and returns a fn that is the juxtaposition\n of those fns. The returned fn takes a variable number of args, and\n returns a vector containing the result of applying each fn to the\n args (left-to-right).\n ((juxt a b c) x) => [(a x) (b x) (c x)]", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/juxt"} {:added "1.0", :ns "clojure.core", :name "ns-publics", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1288055164000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "ns-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d13"} {:created-at 1298556634000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "ns-interns", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d14"} {:created-at 1303419098000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "resolve", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d15"}], :line 4189, :examples [{:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; create the namespace and switch to it\nuser=> (in-ns 'demo.ns)\n#\n\n;; Make sure all of the good stuff in clojure.core is usable here, too.\ndemo.ns=> (clojure.core/use 'clojure.core)\nnil\n\n;; define some public functions\ndemo.ns=> (defn public-fn1 [x y] (+ x y))\n#'demo.ns/public-fn1\ndemo.ns=> (defn public-fn2 [t] (* t t t))\n#'demo.ns/public-fn2\n\n;; define a private function with defn-\ndemo.ns=> (defn- private-fn [s] (/ s 5))\n#'demo.ns/private-fn\n\n;; Switch back to the user namespace\ndemo.ns=> (in-ns 'user)\n#\n\n;; Get a map of all intern mappings for namespace demo.ns\nuser=> (ns-interns 'demo.ns)\n{public-fn1 #'demo.ns/public-fn1, private-fn #'demo.ns/private-fn, public-fn2 #'demo.ns/public-fn2}\n\n;; Now get a map of only the public mappings. No private-fn here.\nuser=> (ns-publics 'demo.ns)\n{public-fn1 #'demo.ns/public-fn1, public-fn2 #'demo.ns/public-fn2}\n", :created-at 1298556164000, :updated-at 1298556944000, :_id "542692c7c026201cdc326989"} {:author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :editors [], :body ";; See also http://clojure.org/namespaces for information on namespaces in Clojure and how to inspect and manipulate them", :created-at 1348479386000, :updated-at 1348479386000, :_id "542692d4c026201cdc32701d"}], :notes nil, :arglists ["ns"], :doc "Returns a map of the public intern mappings for the namespace.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ns-publics"} {:added "1.0", :ns "clojure.core", :name "<", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1291975111000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "=", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ef6"} {:created-at 1291975116000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "not=", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ef7"} {:created-at 1291975125000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name ">", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ef8"} {:created-at 1391516309000, :author {:login "rob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/89cc77a97a299e2e6295b2d7be194b2b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "<=", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ef9"} {:created-at 1391516316000, :author {:login "rob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/89cc77a97a299e2e6295b2d7be194b2b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name ">=", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521efa"}], :line 900, :examples [{:updated-at 1598154611072, :created-at 1280321780000, :body "user=> (< 1 2)\ntrue\nuser=> (< 2 1)\nfalse\nuser=> (< 1.5 2)\ntrue\nuser=> (< 2 3 4 5 6)\ntrue\nuser=> (< 1 1/2)\nfalse", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/ee24aacb65359196b0a1bad050f9a62f?r=PG&default=identicon", :account-source "clojuredocs", :login "mattdw"}, :_id "542692cbc026201cdc326c25"}], :notes [{:updated-at 1391516536000, :body "I think the docstring for < should say \"strictly increasing\" instead of \"monotonically increasing.\" In contrast, I think <= is the function that tests for \"monotonically increasing.\"\r\n\r\nHere's a quote from wikitionary...\r\n\r\nmonotonic increasing: (mathematics, of a function) always increasing or remaining constant, and never decreasing; contrast this with strictly increasing\r\n", :created-at 1391516536000, :author {:login "rob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/89cc77a97a299e2e6295b2d7be194b2b?r=PG&default=identicon"}, :_id "542692edf6e94c697052201b"}], :arglists ["x" "x y" "x y & more"], :doc "Returns non-nil if nums are in monotonically increasing order,\n otherwise false.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/<"} {:ns "clojure.core", :name "*source-path*", :type "var", :see-alsos nil, :examples [{:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}], :body ";; Contains the name (not the full path, for that see \n;; https://clojuredocs.org/clojure.core/*file*) \n;; of the compilation unit that is currently being compiled.\n;; Given a file named \"examples/example.clj\" is available in the \"examples\" \n;; folder starting at \".\":\n\n(ns examples.example)\n(when *compile-files* \n (println \"Compiling:\" *source-path*))\n\n;; If we start a REPL adding \".\" as part of the classpath,\n;; we can see the following:\n\n(binding [*compile-path* \".\"]\n (compile 'examples.example))\n;; Compiling: example.clj\n;; examples.example\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1615736593501, :updated-at 1615737031070, :_id "604e2f11e4b0b1e3652d7491"}], :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*source-path*"} {:ns "clojure.core", :name "with-loading-context", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos nil, :line 5755, :examples nil, :macro true, :notes nil, :arglists ["& body"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/with-loading-context"} {:added "1.0", :ns "clojure.core", :name "test", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1289286348000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "var", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521beb"} {:created-at 1289286374000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "meta", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bec"} {:created-at 1289286382000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "assert", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bed"} {:created-at 1289287269000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.test", :name "with-test", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bee"}], :line 4829, :examples [{:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [{:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}], :body "(defn my-function\n \"this function adds two numbers\"\n {:test #(do\n (assert (= (my-function 2 3) 5))\n (assert (= (my-function 4 4) 8)))}\n ([x y] (+ x y)))\n\n(test #'my-function) ;equal to (test (var my-function))\n=> :ok\n\n-----------------------------------------------------------------------\n\n(defn my-function\n \"this function adds two numbers\"\n {:test #(do\n (assert (= (my-function 2 3) 5))\n (assert (= (my-function 99 4) 8)))}\n ([x y] (+ x y)))\n\n(test #'my-function)\n=> java.lang.AssertionError: Assert failed: (= (my-function 99 4) 8) (NO_SOURCE_FILE:0\n\n---------------------------------------------------------------------------\n\n(defn my-function\n \"this function adds two numbers\"\n ([x y] (+ x y)))\n\n(test #'my-function)\n=> :no-test", :created-at 1289286249000, :updated-at 1289286329000, :_id "542692cac026201cdc326b8a"}], :notes nil, :arglists ["v"], :doc "test [v] finds fn at key :test in var metadata and calls it,\n presuming failure will throw exception", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/test"} {:added "1.0", :ns "clojure.core", :name "rest", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1300352361000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "next", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b01"} {:created-at 1302912314000, :author {:login "hoornet", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5834f829a9def19620d4014c46642172?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "first", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b02"} {:created-at 1328341652000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "drop", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b03"} {:created-at 1399433624000, :author {:login "Yun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f18708f979ad613ab134cb5002558965?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pop", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b04"} {:created-at 1505013526855, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nthrest", :ns "clojure.core"}, :_id "59b4af16e4b09f63b945ac6a"} {:created-at 1505013535788, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nthnext", :ns "clojure.core"}, :_id "59b4af1fe4b09f63b945ac6b"}], :line 66, :examples [{:updated-at 1422037239311, :created-at 1279416340000, :body "(rest [1 2 3 4 5]) ;;=> (2 3 4 5)\n(rest [\"a\" \"b\" \"c\" \"d\" \"e\"]) ;;=> (\"b\" \"c\" \"d\" \"e\")", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/1488134?v=2", :account-source "github", :login "douglarek"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"}, :_id "542692cec026201cdc326d69"} {:author {:login "hoornet", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5834f829a9def19620d4014c46642172?r=PG&default=identicon"}, :editors [{:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; For the most part rest must take a collection as its argument.\n;; It always returns a seq.\n(rest '())\n;;=> ()", :created-at 1302100429000, :updated-at 1422037351252, :_id "542692cec026201cdc326d6a"} {:author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :editors [{:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; There is one case where the input is not required to be a collection.\n;; But, 'rest' still returns a list.\n(rest nil)\n;;=> ()", :created-at 1306983166000, :updated-at 1422037405420, :_id "542692cec026201cdc326d6c"} {:author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :editors [{:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; A simple (re-)implementation of 'map' using 'rest' for recursing over a collection. \n;; Note that (seq coll) is used as the test.\n(defn my-map [func coll]\n (when-let [s (seq coll)]\n (cons (func (first s))\n (my-map func (rest s)))))\n\n(my-map #(* % %) [2 3 5 7 11 13])\n;;=> (4 9 25 49 121 169)", :created-at 1306983565000, :updated-at 1422038005534, :_id "542692cec026201cdc326d6e"} {:author {:login "TravisHeeter", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fe491d07493e45af083b89b767342c6?r=PG&default=identicon"}, :editors [{:login "douglarek", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1488134?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; Any collection can be used\n(rest '(1 2 3 4 5)) ;;=> (2 3 4 5)\n(rest [1 2 3 4 5]) ;;=> (2 3 4 5)\n(rest #{1 2 3 4 5}) ;;=> (2 3 4 5)\n\n(rest {1 nil 2 nil 3 nil 4 nil 5 nil}) ;;=> ([2 nil] [3 nil] [4 nil] [5 nil])", :created-at 1385175807000, :updated-at 1422037689911, :_id "542692d5c026201cdc327075"} {:body ";; Difference between next and rest:\n(rest [:a])\n;; => ()\n(next [:a])\n;; => nil\n\n(rest [])\n;; => ()\n(next [])\n;; => nil\n\n(rest nil)\n;; => ()\n(next nil)\n;; => nil", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423016919214, :updated-at 1423094910932, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :_id "54d183d7e4b0e2ac61831d06"}], :notes [{:updated-at 1306987831000, :body "rest is generally preferred over [next](../clojure.core/next). See the Clojure.org documentation on writing [lazy](http://clojure.org/lazy) functions.\r\n\r\nAlso, the topic is covered on StackOverflow.com: [rest vs. next](http://stackoverflow.com/questions/4288476/clojure-rest-vs-next).\r\n", :created-at 1306985238000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fc1"}], :tag "clojure.lang.ISeq", :arglists ["coll"], :doc "Returns a possibly empty seq of the items after the first. Calls seq on its\n argument.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/rest"} {:added "1.4", :ns "clojure.core", :name "ex-data", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1424029639635, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=3"}, :to-var {:ns "clojure.core", :name "ex-info", :library-url "https://github.com/clojure/clojure"}, :_id "54e0f7c7e4b01ed96c93c87c"} {:created-at 1517506162614, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "try", :ns "clojure.core"}, :_id "5a734e72e4b0c974fee49d18"} {:created-at 1517620509698, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "throw", :ns "clojure.core"}, :_id "5a750d1de4b0e2d9c35f7409"} {:created-at 1517620517637, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "catch", :ns "clojure.core"}, :_id "5a750d25e4b0e2d9c35f740a"} {:created-at 1517620899901, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "finally", :ns "clojure.core"}, :_id "5a750ea3e4b0e2d9c35f740e"} {:created-at 1602605116458, :author {:login "m0smith", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/398808?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ex-message", :ns "clojure.core"}, :_id "5f85d03ce4b0b1e3652d73dd"} {:created-at 1636597659206, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ex-cause", :ns "clojure.core"}, :_id "618c7f9be4b0b1e3652d756b"}], :line 4792, :examples [{:editors [{:login "Luckvery", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1178168?v=3"}], :body "(try\n (let [response (http/post\n \"http://localhost:8080/v1/leads\"\n {:form-params {:foo \"somethingBad\"}})]\n (prn \"This is the response\" response))\n (catch Exception e\n (prn \"This is the error\" (ex-data e))))\n\n-------\n\n> \"This is the error\" {:status 500, :headers {\"Content-Type\" \"application/json; \ncharset=utf-8\", \"Content-Length\" \"73\", \"Server\" \"http-kit\", \"Date\" \"Mon, 10 Oct 2016\n 16:53:12 GMT\"}, :body \"{\\\"type\\\":\\\"unknown-\nexception\\\",\\\"class\\\":\\\"java.lang.IllegalArgumentException\\\"}\", :request-time 7,\n :trace-redirects [\"http://localhost:8080/v1/leads\"], :orig-content-encoding nil}", :author {:avatar-url "https://avatars.githubusercontent.com/u/1178168?v=3", :account-source "github", :login "Luckvery"}, :created-at 1476118193302, :updated-at 1476118224718, :_id "57fbc6b1e4b0709b524f052b"} {:updated-at 1538989157962, :created-at 1538989157962, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :body ";; See also: Throwable->map", :_id "5bbb1c65e4b00ac801ed9eb8"}], :notes nil, :arglists ["ex"], :doc "Returns exception data (a map) if ex is an IExceptionInfo.\n Otherwise returns nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ex-data"} {:added "1.0", :ns "clojure.core", :name "compile", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 6128, :examples [{:author {:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "KyleErhabor", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/40676441?v=4"}], :body "user=> (compile (symbol \"clojure.java.io\"))\nclojure.java.io\n\nuser=> (compile (symbol \"nonexistent.namespace\"))\nFileNotFoundException Could not locate unexistent/namespace__init.class or unexistent/namespace.clj on classpath: clojure.lang.RT.load (RT.java:432)", :created-at 1406012047000, :updated-at 1635093299873, :_id "542692d2c026201cdc326f65"} {:updated-at 1599838419576, :created-at 1599838419576, :author {:login "souenzzo", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/3241703?v=4"}, :body ";; Using compile with deps.edn:\n{,,,\n :aliases {:aot {:main-opts [\"-e\" \"(compile,(symbol,:demo-app.main)\"]}\n :demo-app {:extra-paths [\"classes\"]\n :main-opts [\"-m\" \"demo-app.main\"]}}}\n;; :aot profile use commas and `(symbol :kw)` to avoid spliting\n\n;; Then in your build process (Dockerfile for example):\n;RUN mkdir -p classes && clojure -A:aot\n;CMD [\"clojure\", \"-A:demo-app\"]\n", :_id "5f5b98d3e4b0b1e3652d73bc"}], :notes nil, :arglists ["lib"], :doc "Compiles the namespace named by the symbol lib into a set of\n classfiles. The source for the lib must be in a proper\n classpath-relative directory. The output files will go into the\n directory specified by *compile-path*, and that directory too must\n be in the classpath.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/compile"} {:added "1.0", :ns "clojure.core", :name "isa?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1302036060000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "derive", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e89"} {:created-at 1327820991000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "instance?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e8a"} {:created-at 1341101444000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "underive", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e8b"} {:created-at 1341101451000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ancestors", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e8c"} {:created-at 1341101454000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "parents", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e8d"} {:created-at 1341101462000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "descendants", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e8e"} {:created-at 1341101476000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "make-hierarchy", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e8f"}], :line 5564, :examples [{:author {:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"}, :editors [{:login "Magomimmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/dafac6cd52df3a895b8375ed6b4fe8ee?r=PG&default=identicon"}], :body "user=> (import 'java.util.PriorityQueue)\njava.util.PriorityQueue\n\nuser=> (bases PriorityQueue)\n(java.util.AbstractQueue java.io.Serializable)\n\nuser=> (import 'java.util.AbstractQueue)\njava.util.AbstractQueue\n\nuser=> (isa? PriorityQueue AbstractQueue)\ntrue\n\nuser=> (bases AbstractQueue)\n(java.util.AbstractCollection java.util.Queue)\n\nuser=> (isa? PriorityQueue java.util.AbstractCollection)\ntrue\n\nuser=> (isa? PriorityQueue java.util.Queue)\ntrue\n\nuser=> (isa? java.util.PriorityQueue java.util.TreeMap)\nfalse", :created-at 1312394065000, :updated-at 1342891952000, :_id "542692c9c026201cdc326ae2"} {:author {:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"}, :editors [{:login "Magomimmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/dafac6cd52df3a895b8375ed6b4fe8ee?r=PG&default=identicon"}], :body "user=> (derive ::Feline ::Animal)\nnil\nuser=> (derive ::Cat ::Feline)\nnil\n\nuser=> (derive ::Lion ::Feline)\nnil\n\nuser=> (isa? ::Lion ::Feline)\ntrue\n\nuser=> (isa? ::Lion ::Animal)\ntrue\n\nuser=> (isa? ::Tuna ::Feline)\nfalse", :created-at 1313009767000, :updated-at 1342892300000, :_id "542692c9c026201cdc326ae4"} {:updated-at 1529960051700, :created-at 1529960051700, :author {:login "jbswetnam", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/17225739?v=4"}, :body ";; you can use vectors to test multiple child/parent pairs\n\nuser=> (derive ::child-1 ::parent-1)\nnil\n\nuser=> (derive ::child-2 ::parent-2)\nnil\n\nuser=> (isa? [::child-1 ::child-2] [::parent-1 ::parent-2])\ntrue", :_id "5b315673e4b00ac801ed9e1f"}], :notes nil, :arglists ["child parent" "h child parent"], :doc "Returns true if (= child parent), or child is directly or indirectly derived from\n parent, either via a Java type inheritance relationship or a\n relationship established via derive. h must be a hierarchy obtained\n from make-hierarchy, if not supplied defaults to the global\n hierarchy", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/isa_q"} {:added "1.9", :ns "clojure.core", :name "boolean?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1498919413826, :author {:login "vspinu", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1363467?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "true?", :ns "clojure.core"}, :_id "5957b1f5e4b06e730307db4c"}], :line 519, :examples [{:editors [{:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}], :body "(boolean? true)\n;;=> true\n(boolean? false)\n;;=> true\n(boolean? (new Boolean \"true\"))\n;;=> true\n(boolean? (new Boolean \"false\"))\n;;=> true\n\n(boolean? nil)\n;;=> false", :author {:avatar-url "https://avatars0.githubusercontent.com/u/5004262?v=3", :account-source "github", :login "bowbahdoe"}, :created-at 1491242456017, :updated-at 1496000159055, :_id "58e28dd8e4b01f4add58fe82"}], :notes nil, :arglists ["x"], :doc "Return true if x is a Boolean", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/boolean_q"} {:added "1.0", :ns "clojure.core", :name "..", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1509596350797, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/601540?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "->", :ns "clojure.core"}, :_id "59fa9cbee4b0a08026c48c93"} {:created-at 1528234653568, :author {:login "manawardhana", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1821789?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "doto", :ns "clojure.core"}, :_id "5b17029de4b00ac801ed9e0d"}], :line 1659, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [{:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"}], :body "user> (.. \"fooBAR\" (toLowerCase) (contains \"ooba\"))\ntrue\n\n;; use macroexpand to see how the form above will appear\nuser> (macroexpand '(.. \"fooBAR\" (toLowerCase) (contains \"ooba\")))\n(. (. \"fooBAR\" (toLowerCase)) (contains \"ooba\"))", :created-at 1286507932000, :updated-at 1313788944000, :_id "542692c8c026201cdc326a65"} {:updated-at 1471000821870, :created-at 1471000821870, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body "user=> (.. \"abc\" toUpperCase (equals \"ABC\"))\n;;=> true", :_id "57adb0f5e4b0bafd3e2a04ea"} {:updated-at 1509596480853, :created-at 1509596480853, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/601540?v=4"}, :body ";; With .. you do not need to add a . to your method.\n(.. \"fooBAR\" (toLowerCase) (contains \"ooba\"))\n\n;; Which you do if using -> instead.\n(-> \"fooBAR\" (.toLowerCase) (.contains \"ooba\"))", :_id "59fa9d40e4b0a08026c48c94"}], :macro true, :notes nil, :arglists ["x form" "x form & more"], :doc "form => fieldName-symbol or (instanceMethodName-symbol args*)\n\n Expands into a member access (.) of the first member on the first\n argument, followed by the next member on the result, etc. For\n instance:\n\n (.. System (getProperties) (get \"os.name\"))\n\n expands to:\n\n (. (. System (getProperties)) (get \"os.name\"))\n\n but is easier to write, read, and understand.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/_.."} {:ns "clojure.core", :name "munge", :file "clojure/core_deftype.clj", :type "function", :column 1, :see-alsos [{:created-at 1559571481129, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "demunge", :ns "clojure.repl"}, :_id "5cf52c19e4b0ca44402ef73e"} {:created-at 1683030268272, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "namespace-munge", :ns "clojure.core"}, :_id "645100fce4b08cf8563f4ba6"}], :line 129, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [], :body "user> (defn foo [] (println \"foo\"))\n#'user/foo\n\nuser> foo\n#\n\nuser> (munge foo)\n\"user_DOLLARSIGN_foo_CIRCA_a0dc71\"", :created-at 1293673710000, :updated-at 1293673710000, :_id "542692c8c026201cdc3269ef"} {:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :updated-at 1683030821820, :created-at 1423016370373, :author {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"}, :body "(doseq [c (remove #(Character/isLetterOrDigit ^char %) (map char (range 32 127)))]\n (println c \"->\" (munge c)))\n;; Prints:\n ->\n! -> _BANG_\n\" -> _DOUBLEQUOTE_\n# -> _SHARP_\n$ -> $\n% -> _PERCENT_\n& -> _AMPERSAND_\n' -> _SINGLEQUOTE_\n( -> (\n) -> )\n* -> _STAR_\n+ -> _PLUS_\n, -> ,\n- -> _\n. -> .\n/ -> _SLASH_\n: -> _COLON_\n; -> ;\n< -> _LT_\n= -> _EQ_\n> -> _GT_\n? -> _QMARK_\n@ -> _CIRCA_\n[ -> _LBRACK_\n\\ -> _BSLASH_\n] -> _RBRACK_\n^ -> _CARET_\n_ -> _\n` -> `\n{ -> _LBRACE_\n| -> _BAR_\n} -> _RBRACE_\n~ -> _TILDE_", :_id "54d181b2e4b081e022073c4f"}], :notes nil, :arglists ["s"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/munge"} {:added "1.0", :ns "clojure.core", :name "delay", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1342465174000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "force", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b78"} {:created-at 1350107212000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "realized?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b79"} {:created-at 1358780682000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "memoize", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b7a"} {:created-at 1291441377000, :author {:login "pauldoo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5cb916d3c8abc9f45a093209e72489fb?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "future", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d7e"} {:created-at 1291473063000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "delay?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d7f"}], :line 746, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; In this example you can see that the first time the delay is forced\n;; the println is executed however the second dereference shows just the\n;; precomputed value.\n\nuser=> (def my-delay (delay (println \"did some work\") 100))\n#'user/my-delay\n\nuser=> @my-delay\ndid some work\n100\n\nuser=> @my-delay\n100\n", :created-at 1280737965000, :updated-at 1285495988000, :_id "542692cdc026201cdc326d44"} {:body ";; Note that the implementation of deref for delays makes it impossible for the\n;; body of the delay to be executed more than once, even if the derefs occur\n;; from multiple threads near the same time, because it is a synchronized method\n;; in Java.", :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=2"}, :created-at 1415462290966, :updated-at 1415669412668, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :_id "545e3d92e4b0dc573b892fc0"} {:editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=3"}], :body ";; test example", :author {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=3", :account-source "github", :login "zk"}, :created-at 1470667496739, :updated-at 1470667534222, :_id "57a89ae8e4b0bafd3e2a04ce"} {:updated-at 1606796544954, :created-at 1606796544954, :author {:login "humorless", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/3061798?v=4"}, :body ";; If you are coming from OOP background, think about a OOP pattern - singleton.\n;; delay and singleton can serve the same purpose. ", :_id "5fc5c500e4b0b1e3652d7414"}], :macro true, :notes nil, :arglists ["& body"], :doc "Takes a body of expressions and yields a Delay object that will\n invoke the body only the first time it is forced (with force or deref/@), and\n will cache the result and return it on all subsequent force\n calls. See also - realized?", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/delay"} {:added "1.2", :ns "clojure.core", :name "set-error-mode!", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1553641061009, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "error-handler", :ns "clojure.core"}, :_id "5c9aae65e4b0ca44402ef6de"} {:created-at 1553641085825, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "error-mode", :ns "clojure.core"}, :_id "5c9aae7de4b0ca44402ef6df"}], :line 2212, :examples [{:updated-at 1553641014153, :created-at 1553641014153, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; The agent `:continue` processing even in case of errors. \n;; Errors are ignored and the internal state remains the same.\n;; Use when it's acceptable to miss a few messages.\n\n(def a (agent 2))\n(set-error-mode! a :continue)\n(send-off a #(/ % 0))\n@a\n;; 2\n", :_id "5c9aae36e4b0ca44402ef6dd"}], :notes nil, :arglists ["a mode-keyword"], :doc "Sets the error-mode of agent a to mode-keyword, which must be\n either :fail or :continue. If an action being run by the agent\n throws an exception or doesn't pass the validator fn, an\n error-handler may be called (see set-error-handler!), after which,\n if the mode is :continue, the agent will continue as if neither the\n action that caused the error nor the error itself ever happened.\n \n If the mode is :fail, the agent will become failed and will stop\n accepting new 'send' and 'send-off' actions, and any previously\n queued actions will be held until a 'restart-agent'. Deref will\n still work, returning the state of the agent before the error.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/set-error-mode!"} {:added "1.0", :ns "clojure.core", :name "re-seq", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1289192565000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "re-find", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eb9"} {:created-at 1289192579000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "re-groups", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eba"} {:created-at 1289192595000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "re-pattern", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ebb"} {:created-at 1289192599000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "re-matcher", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ebc"} {:created-at 1289192606000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "re-matches", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ebd"} {:created-at 1309320690000, :author {:login "pauldoo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5cb916d3c8abc9f45a093209e72489fb?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "split", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ebe"} {:created-at 1379040134000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "subs", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ebf"}], :line 4874, :examples [{:updated-at 1285501878000, :created-at 1279050384000, :body "user=> (re-seq #\"\\d\" \"clojure 1.1.0\")\n(\"1\" \"1\" \"0\")\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692cac026201cdc326b6a"} {:updated-at 1285501890000, :created-at 1279060112000, :body ";; Get a sequence of words out of a string.\nuser=> (re-seq #\"\\w+\" \"mary had a little lamb\")\n(\"mary\" \"had\" \"a\" \"little\" \"lamb\")\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/1453?v=4", :account-source "github", :login "ghoseb"}, :_id "542692cac026201cdc326b6c"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; Parenthesized groups in the regex cause each returned match to be a\n;; vector of matched strings. See re-find for more examples.\nuser=> (def line \" RX pkts:18 err:5 drop:48\")\n#'user/line\n\nuser=> (re-seq #\"(\\S+):(\\d+)\" line)\n([\"pkts:18\" \"pkts\" \"18\"] [\"err:5\" \"err\" \"5\"] [\"drop:48\" \"drop\" \"48\"])\n", :created-at 1324028413000, :updated-at 1324028413000, :_id "542692d4c026201cdc327054"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; Note: See clojure.core/subs for discussion of behavior of substrings\n;; holding onto references of the original strings, which can\n;; significantly affect your memory usage in some cases.", :created-at 1379040138000, :updated-at 1379040138000, :_id "542692d4c026201cdc327055"} {:editors [{:login "manishkumarmdb", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/9373950?v=3"}], :body ";; separate with Camel case words and digits and\n;; join with single white-space character\n\nuser=> (clojure.string/join \" \" (re-seq #\"[A-Z][a-z]+|[0-9]+\" \"ManishKumar12332\"))\n\"Manish Kumar 12332\"", :author {:avatar-url "https://avatars.githubusercontent.com/u/9373950?v=3", :account-source "github", :login "manishkumarmdb"}, :created-at 1470894996348, :updated-at 1470895041360, :_id "57ac1394e4b0bafd3e2a04df"} {:updated-at 1519395370457, :created-at 1519395370457, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; re-seq requires the string to be in memory. What if the string is in a file\n;; many GB in size? You can roll a \"line-seq of re-seq each line\" or use:\n\n(defn restream-seq\n[^java.util.regex.Pattern re ^java.io.InputStream is]\n (let [s (java.util.Scanner. is)]\n ((fn step []\n (if-let [token (.findInLine s re)]\n (cons token (lazy-seq (step)))\n (when (.hasNextLine s) (.nextLine s) (step)))))))\n\n;; first 10 digits of Pi out of the book (1M available)\n(let [pi-book \"http://www.gutenberg.org/files/50/50.txt\"]\n (with-open [is (.openStream (java.net.URL. pi-book))]\n (doall\n (sequence\n (comp cat (map str) (take 10))\n (restream-seq #\"\\d{10}\" is)))))\n; (\"1\" \"4\" \"1\" \"5\" \"9\" \"2\" \"6\" \"5\" \"3\" \"5\")", :_id "5a90222ae4b0316c0f44f8ed"}], :notes nil, :arglists ["re s"], :doc "Returns a lazy sequence of successive matches of pattern in string,\n using java.util.regex.Matcher.find(), each such match processed with\n re-groups.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/re-seq"} {:added "1.0", :ns "clojure.core", :name "char?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1321310793000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "char", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b4e"}], :line 153, :examples [{:author {:login "mattdw", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ee24aacb65359196b0a1bad050f9a62f?r=PG&default=identicon"}, :editors [{:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}], :body "user=> (char? \\a)\ntrue\n\nuser=> (char? 22)\nfalse\n\nuser=> (char? \"a\")\nfalse\n\nuser=> (char? (first \"abc\"))\ntrue", :created-at 1280322160000, :updated-at 1317219140000, :_id "542692c9c026201cdc326a8d"}], :notes nil, :arglists ["x"], :doc "Return true if x is a Character", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/char_q"} {:added "1.0", :ns "clojure.core", :name "make-hierarchy", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1324008864000, :author {:login "stand", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d7f9ed2753f8b3517f1539f6129f0a17?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "isa?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b84"} {:created-at 1332885418000, :author {:login "luskwater", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f3b2650c3d4aa47c9e22bf9ba5596a9f?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "derive", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b85"} {:created-at 1341101551000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "underive", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b86"} {:created-at 1341101555000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "parents", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b87"} {:created-at 1341101559000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "descendants", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b88"} {:created-at 1341101563000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ancestors", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b89"}], :line 5528, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; use make-hierarchy to build your own local hierarchy for derive, isa?, etc. \n;; instead of using the global hierarchy\n;; note that the first ancestors call returns a nil since that type does not \n;; exist in the global hierarchy\n\nuser=> (def h (make-hierarchy))\n#'user/h\nuser=> (def h (derive h ::rect ::shape))\n#'user/h\nuser=> (def h (derive h ::square ::rect))\n#'user/h\nuser=> h\n{:parents {:user/square #{:user/rect}, :user/rect #{:user/shape}}, :ancestors {:\nuser/square #{:user/shape :user/rect}, :user/rect #{:user/shape}}, :descendants\n{:user/rect #{:user/square}, :user/shape #{:user/square :user/rect}}}\nuser=> (ancestors ::square)\nnil\nuser=> (ancestors h ::square)\n#{:user/shape :user/rect}\nuser=>", :created-at 1313896274000, :updated-at 1313896274000, :_id "542692c8c026201cdc326a17"} {:editors [{:avatar-url "https://avatars.githubusercontent.com/u/889685?v=3", :account-source "github", :login "huahaiy"} {:avatar-url "https://avatars.githubusercontent.com/u/331939?v=3", :account-source "github", :login "arr-ee"} {:login "cloojure", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/7083783?v=4"}], :updated-at 1604524760718, :created-at 1418345729815, :author {:avatar-url "https://avatars.githubusercontent.com/u/889685?v=3", :account-source "github", :login "huahaiy"}, :body "; the above hierarchy can be built together with a thread macro:\n\n(ns demo.core\n (:require [clojure.pprint :refer [pprint]]))\n\n(defn shapes-hierarchy []\n (-> (make-hierarchy)\n (derive ::rect ::shape)\n (derive ::square ::rect)))\n\n(defn -main [& args]\n (pprint (shapes-hierarchy)))\n\n;-------------------------------------------------------\n; result (Clojure 1.10.2-alpha1 + Java 15)\n\n {:parents #:demo.core{:rect #{:demo.core/shape},\n :square #{:demo.core/rect}},\n :ancestors #:demo.core{:rect #{:demo.core/shape},\n :square #{:demo.core/rect :demo.core/shape}},\n :descendants #:demo.core{:shape #{:demo.core/rect :demo.core/square},\n :rect #{:demo.core/square}}}\n", :_id "548a3d01e4b04e93c519ffa5"} {:updated-at 1516316641016, :created-at 1516315086236, :author {:login "fmnoise", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/4033391?v=4"}, :body ";; hierarchy can be stored in atom for more flexibility\n(def service-types (atom (make-hierarchy)))\n\n(defn add-local! [service-type]\n (swap! service-types derive service-type ::local)\n\n(defn add-remote! [service-type]\n (swap! service-types derive service-type ::remote)\n\n(defmulti connect :service-type :hierarchy service-types)\n(defmethod connect ::remote [service] \"Connecting to remote service\")\n(defmethod connect ::local [service] \"Connecting to local service\")\n \n(add-remote! ::rest)\n(add-local! ::com+)\n\n(connect {:service-type ::rest}) \n;; => \"Connecting to remote service\"\n\n(connect {:service-type ::com+}) \n;; => \"Connecting to local service\"", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/4033391?v=4", :account-source "github", :login "fmnoise"}], :_id "5a6121cee4b0a08026c48d00"}], :notes nil, :arglists [""], :doc "Creates a hierarchy object for use with derive, isa? etc.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/make-hierarchy"} {:added "1.5", :ns "clojure.core", :name "set-agent-send-executor!", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1553631443978, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "set-agent-send-off-executor!", :ns "clojure.core"}, :_id "5c9a88d3e4b0ca44402ef6d6"} {:created-at 1553631454256, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "send-via", :ns "clojure.core"}, :_id "5c9a88dee4b0ca44402ef6d7"} {:created-at 1559240484735, :author {:login "pdbrown", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1607096?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "shutdown-agents", :ns "clojure.core"}, :_id "5cf01f24e4b0ca44402ef739"}], :line 2089, :examples [{:updated-at 1553631431158, :created-at 1553631366167, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; This permanently change the thread pool used\n;; by agents receiving tasks with \"send\"\n(import '[java.util.concurrent Executors])\n(def fj-pool (Executors/newWorkStealingPool 20))\n(set-agent-send-executor! fj-pool)", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5c9a8886e4b0ca44402ef6d3"}], :notes nil, :arglists ["executor"], :doc "Sets the ExecutorService to be used by send", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/set-agent-send-executor!"} {:added "1.9", :ns "clojure.core", :name "swap-vals!", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1527705116275, :author {:login "agarman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/138454?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "swap!", :ns "clojure.core"}, :_id "5b0eee1ce4b045c27b7fac80"} {:created-at 1527705122171, :author {:login "agarman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/138454?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reset!", :ns "clojure.core"}, :_id "5b0eee22e4b045c27b7fac81"} {:created-at 1527705131382, :author {:login "agarman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/138454?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "compare-and-set!", :ns "clojure.core"}, :_id "5b0eee2be4b045c27b7fac82"} {:created-at 1527705150896, :author {:login "agarman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/138454?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "atom", :ns "clojure.core"}, :_id "5b0eee3ee4b045c27b7fac83"}], :line 2357, :examples [{:updated-at 1519158674293, :created-at 1519158674293, :author {:login "dane-johnson", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/10768827?v=4"}, :body ";; You can use `swap-vals` to perform an atomic `deref`\n;; and `swap!` without a race condition.\n\n(def queue (atom '(1 2 3)))\n(let [head (ffirst (swap-vals! queue pop))]\n (println head) ;; 1\n (println @queue)) ;; (2 3)", :_id "5a8c8592e4b0316c0f44f8d7"}], :notes nil, :arglists ["atom f" "atom f x" "atom f x y" "atom f x y & args"], :doc "Atomically swaps the value of atom to be:\n (apply f current-value-of-atom args). Note that f may be called\n multiple times, and thus should be free of side effects.\n Returns [old new], the value of the atom before and after the swap.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/swap-vals!"} {:added "1.2", :ns "clojure.core", :name "keep", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1337189081000, :author {:login "SoniaH", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/56a007a4b2c47b141bd39790278f88a7?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "keep-indexed", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c71"} {:created-at 1399907394000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "map", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c72"} {:created-at 1399907399000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "filter", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c73"} {:created-at 1549573085436, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "remove", :ns "clojure.core"}, :_id "5c5c9bdde4b0ca44402ef663"}], :line 7313, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "miner", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25400?v=3"}], :body "(keep even? (range 1 10))\n;;=> (false true false true false true false true false)\n", :created-at 1279071510000, :updated-at 1419105723874, :_id "542692cfc026201cdc326e7f"} {:updated-at 1473381934632, :created-at 1306319295000, :body ";; comparisons among keep, filter, map and for.\n\n(keep #(if (odd? %) %) (range 10))\n;;=> (1 3 5 7 9)\n\n(map #(if (odd? %) %) (range 10))\n;;=> (nil 1 nil 3 nil 5 nil 7 nil 9)\n\n(for [ x (range 10) :when (odd? x)] x)\n;;=> (1 3 5 7 9)\n\n(filter odd? (range 10))\n;;=> (1 3 5 7 9)", :editors [{:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"} {:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"} {:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"} {:avatar-url "https://avatars.githubusercontent.com/u/25400?v=3", :account-source "github", :login "miner"} {:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"}, :_id "542692cfc026201cdc326e82"} {:author {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}, :editors [{:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "miner", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25400?v=3"}], :body ";; Sieve of Eratosthenes by using 'keep'.\n\n(defn keep-mcdr [f coll]\n (lazy-seq\n (when-let [x (first coll)]\n (cons x (keep-mcdr f (f x (rest coll)))))))\n\n(defn prime-number [n]\n (cons 1\n\t(keep-mcdr\n\t (fn[x xs] (if (not-empty xs)\n\t\t (keep #(if-not (zero? (rem % x)) %)\n\t\t\t xs)))\n\t (range 2 n))))\n\n(prime-number 100)\n;;=> (1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97)\n", :created-at 1306319303000, :updated-at 1419105742633, :_id "542692cfc026201cdc326e86"} {:body "(keep seq [() [] '(1 2 3) [:a :b] nil])\n;;=> ((1 2 3) (:a :b))", :author {:login "miner", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25400?v=3"}, :created-at 1419105688396, :updated-at 1419105688396, :_id "5495d598e4b09260f767ca7b"} {:editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=3"}], :updated-at 1445895401925, :created-at 1428277632781, :author {:avatar-url "https://avatars.githubusercontent.com/u/466333?v=3", :account-source "github", :login "num1"}, :body ";; `keep` is useful with maps:\n\n(keep {:a 1, :b 2, :c 3} [:a :b :d])\n;;=> (1 2)\n", :_id "5521c980e4b0b96203a0d59d"} {:body ";; A set will work as a predicate for another set.\n(keep #{0 1 2 3} #{2 3 4 5})\n;;=> (3 2)", :author {:login "dkinzer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/444215?v=3"}, :created-at 1434506225681, :updated-at 1434506225681, :_id "5580d3f1e4b01ad59b65f4ff"} {:updated-at 1473382005602, :created-at 1473382005602, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=3"}, :body ";; keep returns the results of predicates, \n;; filter returns the original values of collection\n\n(keep (fn [[k _]] (#{:a :b} k)) {:a 1 :b 2 :c 3})\n;;=> (:a :b)\n\n(filter (fn [[k _]] (#{:a :b} k)) {:a 1 :b 2 :c 3})\n;;=> ([:a 1] [:b 2])", :_id "57d20675e4b0709b524f04f0"} {:updated-at 1590766979030, :created-at 1590766721487, :author {:login "blue0513", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/8979468?v=4"}, :body ";; keep rejects nil from results\n\n(keep #(when (number? %) %) [1 \"a\" 2 \"c\"])\n;; => (1 2)\n\n(map #(when (number? %) %) [1 \"a\" 2 \"c\"])\n;; => (1 nil 2 nil)\n\n(remove nil? (map #(when (number? %) %) [1 \"a\" 2 \"c\"]))\n;; => (1 2)", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/8979468?v=4", :account-source "github", :login "blue0513"}], :_id "5ed12c81e4b087629b5a191d"}], :notes [{:body "Note the difference between `filter` and `keep`. `filter` returns the original items in a collection that satisfy the predicate. `keep` returns the non-nil *results* of the given function.", :created-at 1419105930894, :updated-at 1419105930894, :author {:login "miner", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25400?v=3"}, :_id "5495d68ae4b09260f767ca7c"} {:body "`keep` is like a `map` that filters out `nil` values produced by `f` and could be defined as:\n
    \n(def my-keep (comp (partial remove nil?) map))\n
    \nor, perhaps more traditionally:\n
    \n\n(defn my-keep [& args]\n  (remove nil? (apply map args)))\n
    \n", :created-at 1422938659514, :updated-at 1422939155762, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :_id "54d05223e4b0e2ac61831cfa"} {:author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :updated-at 1530020021260, :created-at 1530020021260, :body "Note that, unlike `map`, `keep` doesn’t accept multiple collections:\n\n```clojure\n(filter identity (map get [{:a 1} {:b 2} {:d 3}] [:a :b :c]))\n; => (1 2)\n\n(keep get [{:a 1} {:b 2} {:d 3}] [:a :b :c])\n; => ArityException Wrong number of args (3) passed to: core/keep\n```", :_id "5b3240b5e4b00ac801ed9e20"} {:author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :updated-at 1582729216279, :created-at 1582729216279, :body "It's useful to consider `filter` and `remove` as a pair of complementary/similar functions that both return the original items, whereas `keep` is rather specialized/different.", :_id "5e568800e4b087629b5a18a9"}], :arglists ["f" "f coll"], :doc "Returns a lazy sequence of the non-nil results of (f item). Note,\n this means false return values will be included. f must be free of\n side-effects. Returns a transducer when no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/keep"} {:added "1.1", :ns "clojure.core", :name "char", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1321310785000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "char?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b80"} {:created-at 1333595214000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "int", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b81"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "chars", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917303000, :_id "542692eaf6e94c6970521b82"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "char-array", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917307000, :_id "542692eaf6e94c6970521b83"}], :line 3510, :examples [{:author {:login "mattdw", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ee24aacb65359196b0a1bad050f9a62f?r=PG&default=identicon"}, :editors [{:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}], :body ";; can coerce an int (or similar)\nuser=> (char 97)\n\\a\n\n;; a byte can be coerced to a char\nuser=> (let [bytes-array (.getBytes \"abc\")]\n (char (first bytes-array)))\n\\a\n\n;; char is just a function\nuser=> (map char [65 66 67 68])\n(\\A \\B \\C \\D)", :created-at 1280322589000, :updated-at 1317219055000, :_id "542692cdc026201cdc326d01"} {:updated-at 1444162460695, :created-at 1444162460695, :author {:login "teymuri", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/13352033?v=3"}, :body "(->> [67 108 111 106 117 114 101]\n (map char)\n (apply str))\n\n\"Clojure\"", :_id "56142b9ce4b084e61c76ecbd"} {:updated-at 1562515072023, :created-at 1562515072023, :author {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/24317401?v=4"}, :body ";; backslash\nuser=> (char 92)\n\\\\\n\n;; String madness:\nuser=> (map str [\\n \\newline \\\\])\n[\"n\" \"\\n\" \"\\\\\"]\n\n;; convert back to int:\nuser=> (int \\\\)\n92\n\n;; whoops! this will expect additional input because it char's the bracket\nuser=> (char \\)\n #=> \n\n;; don't you dare this!\nuser=> (char \\ )\n\\space\n\n;; make it readable\nuser=> (char \\space)\n\\space\n\n;; it gets uglier! Mark the text to see the difference\nuser=> \\\n #=>\n\nuser=> \\ \n\\space\n\n;; MaDnEsS!1!\nuser=> \\\\\\\\\\\\\\\\\n\\\\\n\\\\\n\\\\\n\\\\", :_id "5d221680e4b0ca44402ef77e"} {:updated-at 1575989957857, :created-at 1575989957857, :author {:login "vladkotu", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/389119?v=4"}, :body ";; string to code round trip\n;; input string\n(def in-string \"鬼\")\n;; single char from string\n(def in-char (.charAt in-string 0)) ;;=> \\鬼\n;; code from char\n(def code (int in-char)) ;;=> 39740\n;; char from code\n(def out-char (char code)) ;;=> \\鬼\n;; back to input string\n(def out-string (str out-char)) ;;=> \"鬼\"\n", :_id "5defb2c5e4b0ca44402ef7f5"} {:updated-at 1674282378834, :created-at 1674282378834, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}, :body "(defn u-sub-char\n \"If n is a single-digit integer in [0, ..., 9], returns the\n Unicode supscript character for n. Returns nil for other numbers.\"\n [n]\n (if (and (>= n 0) (<= n 9))\n (char (+ 0x2080 n))\n nil))", :_id "63cb858ae4b08cf8563f4b68"}], :notes nil, :arglists ["x"], :doc "Coerce to char", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/char"} {:added "1.0", :ns "clojure.core", :name "mapcat", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1294988622000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cb4"} {:created-at 1294988628000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "concat", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cb5"} {:created-at 1580338264619, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "flatten", :ns "clojure.core"}, :_id "5e320c58e4b0ca44402ef827"}], :line 2783, :examples [{:updated-at 1285501773000, :created-at 1279063141000, :body "user=> (mapcat reverse [[3 2 1 0] [6 5 4] [9 8 7]])\n(0 1 2 3 4 5 6 7 8 9)\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692cac026201cdc326b36"} {:updated-at 1337333286000, :created-at 1337333286000, :body "user=> (mapcat (fn [[k v]] \n (for [[k2 v2] v] \n (concat [k k2] v2)))\n '{:a {:x (1 2) :y (3 4)}\n :b {:x (1 2) :z (5 6)}})\n\n((:a :x 1 2) (:a :y 3 4) (:b :x 1 2) (:b :z 5 6))", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692d4c026201cdc327006"} {:author {:login "uvtc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/34f159f89cbd1d9beac0276f5a7af552?r=PG&default=identicon"}, :editors [{:login "uvtc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/34f159f89cbd1d9beac0276f5a7af552?r=PG&default=identicon"}], :body "user=> (require '[clojure.string :as cs])\nnil\n\n;; Suppose you have a fn in a `map` that itself returns\n;; multiple values.\nuser=> (map #(cs/split % #\"\\d\") [\"aa1bb\" \"cc2dd\" \"ee3ff\"])\n([\"aa\" \"bb\"] [\"cc\" \"dd\"] [\"ee\" \"ff\"])\n\n;; Now, if you want to concat them all together, you *could*\n;; do this:\nuser=> (apply concat (map #(cs/split % #\"\\d\") [\"aa1bb\" \"cc2dd\" \"ee3ff\"]))\n(\"aa\" \"bb\" \"cc\" \"dd\" \"ee\" \"ff\")\n\n;; But `mapcat` can save you a step:\nuser=> (mapcat #(cs/split % #\"\\d\") [\"aa1bb\" \"cc2dd\" \"ee3ff\"])\n(\"aa\" \"bb\" \"cc\" \"dd\" \"ee\" \"ff\")\n", :created-at 1340097786000, :updated-at 1340099694000, :_id "542692d4c026201cdc327007"} {:author {:login "uvtc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/34f159f89cbd1d9beac0276f5a7af552?r=PG&default=identicon"}, :editors [], :body ";; Suppose you've got a function that takes a value\n;; and returns a list of things from it, for example:\n(defn f1\n [n]\n [(- n 1) n (+ n 1)])\n\n(f1 1)\n;=> [0 1 2]\n\n;; Perhaps you'd like to map it onto each item in a collection:\n(map f1 [1 2 3])\n;=> ([0 1 2] [1 2 3] [2 3 4])\n\n;; But suppose you wanted them all concatenated? You could do this:\n(apply concat (map f1 [1 2 3]))\n;=> (0 1 2 1 2 3 2 3 4)\n\n;; Or you could get the same thing with `mapcat`:\n(mapcat f1 [1 2 3])\n;=> (0 1 2 1 2 3 2 3 4)\n", :created-at 1343650918000, :updated-at 1343650918000, :_id "542692d4c026201cdc327009"} {:author {:login "devth", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/70c7535cbb9fea0353250a4edda155be?r=PG&default=identicon"}, :editors [], :body "; Flatten a map, consing keys on to each nested vector \n(mapcat (fn [[k vs]] (map (partial cons k) vs)) {:foo [[1 2] [3 2]] :bar [[3 1]]})\n;=> ((:foo 1 2) (:foo 3 2) (:bar 3 1))\n", :created-at 1357801138000, :updated-at 1357801138000, :_id "542692d4c026201cdc32700a"} {:body ";; A very useful feature of mapcat is that it allows function f to produce no result\n;; by returning nil or an empty collection:\n(mapcat #(remove even? %) [[1 2] [2 2] [2 3]])\n;; => (1 3)\n\n;; note that applying (remove even?) to [2 2] produced () which was \"eaten\"\n;; and ignored by mapcat.", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423014103873, :updated-at 1423014118164, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :_id "54d178d7e4b081e022073c4d"} {:updated-at 1505377247866, :created-at 1505377247866, :author {:login "buzzdan", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/18007791?v=4"}, :body ";; map vs. mapcat -\n;; For duplicating each item in a sequence\n\n;; Using map:\n(map #(repeat 2 %) [1 2])\n;; => ((1 1) (2 2))\n\n;; Using mapcat:\n(mapcat #(repeat 2 %) [1 2])\n;; => (1 1 2 2)\n", :_id "59ba3bdfe4b09f63b945ac75"} {:updated-at 1557893179267, :created-at 1557893179267, :author {:login "humorless", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/3061798?v=4"}, :body ";; I think it is cool to use juxt together with mapcat\n;; mapcat requires element to be collection and the result of juxt will be collection. \n\n(mapcat (juxt inc dec) [1 2 3 4])\n;; => (2 0 3 1 4 2 5 3)", :_id "5cdb903be4b0ca44402ef724"} {:updated-at 1559995255249, :created-at 1559995255249, :author {:login "sodesu99", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/31072774?v=4"}, :body ";;(mapcat f & colls)\n(mapcat list [:a :b :c] [1 2 3])\n;;=> (:a 1 :b 2 :c 3)", :_id "5cfba377e4b0ca44402ef750"}], :notes [{:body "
    \n;; mapcat always evaluates the first 4 arguments.\n(def a (mapcat range (map #(do (print \".\") %) (into () (range 10)))))\n;; ....\n\n;; it can be solved avoiding 'apply' to handle varargs\n(defn mapcat* [f & colls]\n  (letfn [(step [colls]\n            (lazy-seq\n              (when-first [c colls]\n                (concat c (step (rest colls))))))]\n    (step (apply map f colls))))\n\n(def a (mapcat* range (map #(do (print \".\") %) (into () (range 10)))))\n;; nothing prints\n
    ", :created-at 1521801795650, :updated-at 1521801813945, :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :_id "5ab4da43e4b045c27b7fac1f"}], :arglists ["f" "f & colls"], :doc "Returns the result of applying concat to the result of applying map\n to f and colls. Thus function f should return a collection. Returns\n a transducer when no collections are provided", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/mapcat"} {:added "1.3", :ns "clojure.core", :name "unchecked-long", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1496088171964, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "long", :ns "clojure.core"}, :_id "592c7e6be4b093ada4d4d79b"}], :line 3540, :examples [{:updated-at 1496088165852, :created-at 1496088165852, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body "(unchecked-long 1)\n;;=> 1\n(unchecked-long 1N)\n;;=> 1\n(unchecked-long 1.1)\n;;=> 1\n(unchecked-long 1.9)\n;;=> 1\n(unchecked-long 5/3)\n;;=> 1\n\n(unchecked-long -1)\n;;=> -1\n(unchecked-long -1N)\n;;=> -1\n(unchecked-long -1.1)\n;;=> -1\n(unchecked-long -1.9)\n;;=> -1\n(unchecked-long -5/3)\n;;=> -1\n\n;;;; Note that (unchecked-long) does not range check its argument\n;;;; so integer overflow or rounding may occur. \n;;;; Use (long) if you want to throw an exception in such cases.\n\n(unchecked-long 9223372036854775808N)\n;;=> -9223372036854775808\n(unchecked-long -9223372036854775809N)\n;;=> 9223372036854775807\n\n(long 9223372036854775808N)\n;;=> IllegalArgumentException Value out of range for long: 922337203685477580\n(long -9223372036854775809N)\n;;=> IllegalArgumentException Value out of range for long: -9223372036854775809\n\n(unchecked-long 1.0E18)\n;;=> 1000000000000000000\n(unchecked-long 1.0E19)\n;;=> 9223372036854775807\n(unchecked-long 1.0E20)\n;;=> 9223372036854775807\n\n(long 1.0E18)\n;;=> 1000000000000000000\n(long 1.0E19)\n;;=> IllegalArgumentException Value out of range for long: 1.0E19\n(long 1.0E20)\n;;=> IllegalArgumentException Value out of range for long: 1.0E20", :_id "592c7e65e4b093ada4d4d79a"}], :notes nil, :arglists ["x"], :doc "Coerce to long. Subject to rounding or truncation.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-long"} {:added "1.0", :ns "clojure.core", :name "aset-long", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 3951, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; create an array of 10 longs and set one of the values to 31415\n\nuser=> (def ls (long-array 10))\n#'user/ls\nuser=> (vec ls)\n[0 0 0 0 0 0 0 0 0 0]\nuser=> (aset-long ls 3 31415)\n31415\nuser=> (vec ls)\n[0 0 0 31415 0 0 0 0 0 0]\nuser=>", :created-at 1313915173000, :updated-at 1313915173000, :_id "542692cec026201cdc326d8a"}], :notes [{:body "See [aset](http://clojuredocs.org/clojure.core/aset) for illustrations of multi-dimensional syntax.", :created-at 1432829151791, :updated-at 1432829151791, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :_id "55673cdfe4b01ad59b65f4df"}], :arglists ["array idx val" "array idx idx2 & idxv"], :doc "Sets the value at the index/indices. Works on arrays of long. Returns val.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/aset-long"} {:added "1.6", :ns "clojure.core", :name "some?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1431460708707, :author {:login "mmavko", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1064539?v=3"}, :to-var {:ns "clojure.core", :name "nil?", :library-url "https://github.com/clojure/clojure"}, :_id "55525b64e4b03e2132e7d160"} {:created-at 1434787747213, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:ns "clojure.core", :name "some", :library-url "https://github.com/clojure/clojure"}, :_id "55851fa3e4b05f167dcf233f"}], :line 531, :examples [{:editors [{:login "klimenko-serj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2082879?v=3"}], :body "user> (some? nil)\n;; => false\n\nuser> (some? 42)\n;; => true\nuser> (some? false)\n;; => true\nuser> (some? [])\n;; => true\nuser> (some? {})\n;; => true\nuser> (some? '())\n;; => true", :author {:avatar-url "https://avatars.githubusercontent.com/u/2082879?v=3", :account-source "github", :login "klimenko-serj"}, :created-at 1438944110688, :updated-at 1438944205513, :_id "55c48b6ee4b0080a1b79cdb7"} {:updated-at 1514328933133, :created-at 1514328933133, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body ";; equivalent to implementing not-nil?\n(some? :kw)\n;; => true\n(not (nil? :kw))\n;; => true\n\n(some? nil)\n;; => false\n(not (nil? nil))\n;; => false", :_id "5a42d365e4b0a08026c48cda"}], :notes nil, :tag "java.lang.Boolean", :arglists ["x"], :doc "Returns true if x is not nil, false otherwise.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/some_q"} {:added "1.0", :ns "clojure.core", :name "unchecked-negate", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1289217312000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-add", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c21"} {:created-at 1289217314000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-dec", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c22"} {:created-at 1289217316000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-inc", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c23"} {:created-at 1289217318000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-negate", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c24"} {:created-at 1289217321000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-divide", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c25"} {:created-at 1289217324000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-subtract", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c26"} {:created-at 1289217326000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-multiply", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c27"} {:created-at 1289217329000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-remainder", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c28"} {:created-at 1423522476536, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "-", :library-url "https://github.com/clojure/clojure"}, :_id "54d93aace4b0e2ac61831d32"}], :line 1184, :examples [{:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=3"}], :body ";; *Almost* always the same as \"-\"\nuser=> (= (- 2) (unchecked-negate 2))\ntrue\nuser=> (= (- (Long/MAX_VALUE)) (unchecked-negate (Long/MAX_VALUE)))\ntrue\n\n;; Except when it's not, because (- (Long/MIN_VALUE)) overflows:\nuser=> (= (- (Long/MIN_VALUE)) (unchecked-negate (Long/MIN_VALUE)))\nArithmeticException integer overflow clojure.lang.Numbers.throwIntOverflow (Numbers.java:1501)\n\n;; Indeed:\nuser=> (unchecked-negate (Long/MIN_VALUE))\n-9223372036854775808\n\n;; Careful!\nuser=> (= (Long/MIN_VALUE) (unchecked-negate (Long/MIN_VALUE)))\ntrue", :author {:avatar-url "https://avatars.githubusercontent.com/u/20086?v=3", :account-source "github", :login "reborg"}, :created-at 1458063308020, :updated-at 1458063919478, :_id "56e847cce4b0b41f39d96ce4"}], :notes nil, :arglists ["x"], :doc "Returns the negation of x, a long.\n Note - uses a primitive operator subject to overflow.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-negate"} {:added "1.10", :ns "clojure.core", :name "remove-tap", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1590688377580, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "tap>", :ns "clojure.core"}, :_id "5ecffa79e4b087629b5a191a"} {:created-at 1590688383018, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "add-tap", :ns "clojure.core"}, :_id "5ecffa7fe4b087629b5a191b"}], :line 7879, :examples nil, :notes nil, :arglists ["f"], :doc "Remove f from the tap set.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/remove-tap"} {:added "1.0", :ns "clojure.core", :name "gen-interface", :file "clojure/genclass.clj", :type "macro", :column 1, :see-alsos [{:created-at 1360270679000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "proxy", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dbf"} {:created-at 1360270682000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "gen-class", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dc0"}], :line 688, :examples [{:updated-at 1542284408999, :created-at 1542284408999, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; gen-interface defines the class in memory, but does not spit it to disk\n;; (unless AOT-ing). Note: this is different from gen-class (that actually does\n;; nothing unless it's AOT compiling).\n\n(gen-interface :name \"user.IFoo\" :extends [clojure.lang.IPersistentMap])\n;; user.IFoo\n\n(reify user.IFoo (seq [_]) (empty [_]))\n;; {}", :_id "5bed6478e4b00ac801ed9efa"}], :macro true, :notes nil, :arglists ["& options"], :doc "When compiling, generates compiled bytecode for an interface with\n the given package-qualified :name (which, as all names in these\n parameters, can be a string or symbol), and writes the .class file\n to the *compile-path* directory. When not compiling, does nothing.\n \n In all subsequent sections taking types, the primitive types can be\n referred to by their Java names (int, float etc), and classes in the\n java.lang package can be used without a package qualifier. All other\n classes must be fully qualified.\n \n Options should be a set of key/value pairs, all except for :name are\n optional:\n\n :name aname\n\n The package-qualified name of the class to be generated\n\n :extends [interface ...]\n\n One or more interfaces, which will be extended by this interface.\n\n :methods [ [name [param-types] return-type], ...]\n\n This parameter is used to specify the signatures of the methods of\n the generated interface. Do not repeat superinterface signatures\n here.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/gen-interface"} {:added "1.0", :ns "clojure.core", :name "*command-line-args*", :type "var", :see-alsos nil, :examples [{:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; If you save this program as showargs.clj on a Unix-like system, then the\n;; following command will produce the output shown.\n\n;; % java -classpath clojure-1.2.0.jar clojure.main showargs.clj arg1 2 \"whitespace in most command shells if you quote\"\n;; arg='arg1'\n;; arg='2'\n;; arg='whitespace in most command shells if you quote'\n;; \n;; \n;; Second arg is string 2, not number 2.\n\n(ns com.demo.showargs)\n\n(doseq [arg *command-line-args*]\n (printf \"arg='%s'\\n\" arg))\n\n(if (= \"2\" (second *command-line-args*))\n (println \"\\n\\nSecond arg is string 2, not number 2.\"))\n", :created-at 1298557801000, :updated-at 1298557801000, :_id "542692c8c026201cdc326a6a"}], :notes [{:body "To see which JVM command line parameters were used to start Clojure, execute:\n```\n(into [] (.getInputArguments\n (java.lang.management.ManagementFactory/getRuntimeMXBean)))\n```", :created-at 1647721826905, :updated-at 1647721856269, :author {:avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4", :account-source "github", :login "mars0i"}, :_id "62363d62e4b0b1e3652d75c0"}], :arglists [], :doc "A sequence of the supplied command line arguments, or nil if\n none were supplied", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*command-line-args*"} {:added "1.0", :ns "clojure.core", :name "reverse", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1293103264000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rseq", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521de3"}], :line 947, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (reverse '(1 2 3))\n(3 2 1)\n", :created-at 1280321963000, :updated-at 1285496763000, :_id "542692cbc026201cdc326bf7"} {:updated-at 1568496474720, :created-at 1568496474720, :author {:login "rosineygp", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/5224519?v=4"}, :body "(reverse \"clojure\")\n; (\\e \\r \\u \\j \\o \\l \\c)\n\n(apply str (reverse \"clojure\"))\n; \"erujolc\"", :_id "5d7d5b5ae4b0ca44402ef7b4"} {:updated-at 1613699240347, :created-at 1613699240347, :author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :body ";; Comparison between `reverse` and `rseq` for a vector.\n\n(def nums (vec (range 1000000)))\n(time (reverse nums))\n;; \"Elapsed time: 30.1222 msecs\"\n(time (rseq nums))\n;; \"Elapsed time: 0.0664 msecs\"", :_id "602f18a8e4b0b1e3652d745b"}], :notes [{:updated-at 1293103337000, :body "If you've got a vector rseq is a good option instead of reverse.", :created-at 1293103337000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fb0"} {:body "For vectors, `rseq` is to `reverse` what `peek` is to `last`. `rseq` reverses in constant time (!) where `reverse` is in linear time, as it appears to pull everything into a new seq, one at a time instead of ... reversing the keys? I don't know the implementation details, but I do know that `rseq` is magnitudes faster than `reverse` for vectors and sorted maps. ", :created-at 1613699495793, :updated-at 1613699637662, :author {:avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4", :account-source "github", :login "Crowbrammer"}, :_id "602f19a7e4b0b1e3652d745d"}], :arglists ["coll"], :doc "Returns a seq of the items in coll in reverse order. Not lazy.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/reverse"} {:added "1.9", :ns "clojure.core", :name "inst?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495635485203, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "inst-ms", :ns "clojure.core"}, :_id "5925961de4b093ada4d4d720"}], :line 6793, :examples [{:updated-at 1495635467250, :created-at 1495635467250, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body "(inst? (java.util.Date.))\n;;=> true\n(inst? (java.util.Calendar/getInstance))\n;;=> false\n\n(inst? (java.sql.Timestamp. 0))\n;;=> true\n(inst? (java.sql.Date. 0))\n;;=> true\n\n(inst? (java.time.Instant/now))\n;;=> true\n(inst? (java.time.LocalDateTime/now))\n;;=> false", :_id "5925960be4b093ada4d4d71f"}], :notes nil, :arglists ["x"], :doc "Return true if x satisfies Inst", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/inst_q"} {:added "1.0", :ns "clojure.core", :name "range", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1611082428123, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "take", :ns "clojure.core"}, :_id "60072abce4b0b1e3652d743a"} {:created-at 1611082519863, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "iterate", :ns "clojure.core"}, :_id "60072b17e4b0b1e3652d743b"}], :line 3019, :examples [{:author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"} {:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"} {:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"} {:avatar-url "https://avatars1.githubusercontent.com/u/22159831?v=4", :account-source "github", :login "yuxuan813"}], :body ";; default value of 'end' is infinity\nuser=> (range)\n(0 1 2 3 4 5 6 7 8 9 10 ... 12770 12771 12772 12773 ... n)\n\n;; Since clojure 1.2:\nuser=> (take 10 (range))\n(0 1 2 3 4 5 6 7 8 9)\n\nuser=> (range 10)\n(0 1 2 3 4 5 6 7 8 9)\n\nuser=> (range -5 5)\n(-5 -4 -3 -2 -1 0 1 2 3 4)\n\nuser=> (range -100 100 10)\n(-100 -90 -80 -70 -60 -50 -40 -30 -20 -10 0 10 20 30 40 50 60 70 80 90)\n\nuser=> (range 0 4 2)\n(0 2)\n\nuser=> (range 0 5 2)\n(0 2 4)\n\nuser=> (range 0 6 2)\n(0 2 4)\n\nuser=> (range 0 7 2)\n(0 2 4 6)\n\nuser=> (range 100 0 -10)\n(100 90 80 70 60 50 40 30 20 10)\n\nuser=> (range 10 -10 -1)\n(10 9 8 7 6 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 -7 -8 -9)\n \n\n", :created-at 1279160563000, :updated-at 1523435961458, :_id "542692ccc026201cdc326c77"} {:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Since clojure 1.2:\n\nuser=> (take 10 (range))\n(0 1 2 3 4 5 6 7 8 9)\n", :created-at 1282319317000, :updated-at 1285494502000, :_id "542692ccc026201cdc326c80"} {:author {:login "rebcabin", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/880b0bb3a4be9237326dd69565444dee?r=PG&default=identicon"}, :editors [], :body ";; finite range over java Integers\nuser=> (take 5 (range 42 (java.lang.Integer/MAX_VALUE)))\n(42 43 44 45 46)\n\n;; infinite range starting at a certain point\nuser=> (take 5 (drop 42 (range)))\n(42 43 44 45 46)\n", :created-at 1374181746000, :updated-at 1374181746000, :_id "542692d4c026201cdc327048"} {:editors [{:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}], :body ";; Using a double as the value of step can produce an unexpected extra value.\n;; In the second example below, there's an extra final value that's almost = 0.8.\n\n(range 0 0.8 1/10)\n(0 1/10 1/5 3/10 2/5 1/2 3/5 7/10)\n\nuser=> (range 0 0.8 0.1)\n(0 0.1 0.2 0.30000000000000004 0.4 0.5 0.6 0.7 0.7999999999999999)\n\n;; It's difficult to guess when this behavior will occur, unless you know\n;; whether the double representation of step plus what \"should\" be the\n;; last number is in fact less than end. From the second example above, you \n;; can see that the extra value won't be included if you replace 0.8 by a \n;; number in 0.1, ..., 0.7 (e.g. since 0.7 is not less than 0.7) but you \n;; wouldn't necessarily know that you will get the extra value for end = 0.9,\n;; 1.0, 1.1, but not for end = 1.2.\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3", :account-source "github", :login "mars0i"}, :created-at 1438100731938, :updated-at 1438101658841, :_id "55b7acfbe4b0080a1b79cdaf"} {:updated-at 1494572384501, :created-at 1494572384501, :author {:login "st-keller", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/476463?v=3"}, :body "user=> (range 0 0)\n()\n\nuser=> (range 0 1)\n(0)", :_id "59155d60e4b01920063ee059"}], :notes nil, :arglists ["" "end" "start end" "start end step"], :doc "Returns a lazy seq of nums from start (inclusive) to end\n (exclusive), by step, where start defaults to 0, step to 1, and end to\n infinity. When step is equal to 0, returns an infinite sequence of\n start. When start is equal to end, returns empty list.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/range"} {:added "1.0", :ns "clojure.core", :name "sort", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1285265346000, :author {:login "morphling", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/90ffa70a579c3e0c398b7523ecdc6a87?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sort-by", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e7c"} {:created-at 1548624421040, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "compare", :ns "clojure.core"}, :_id "5c4e2225e4b0ca44402ef654"}], :line 3102, :examples [{:updated-at 1624481253798, :created-at 1281550866000, :body "user=> (sort [3 1 2 4])\n(1 2 3 4)\n\nuser=> (sort > (vals {:foo 5, :bar 2, :baz 10}))\n(10 5 2)\n\n;; do not do this, use sort-by instead because it handles calling the fn (e.g last) and compare for you.\nuser=> (sort #(compare (last %1) (last %2)) {:b 1 :c 3 :a 2})\n([:b 1] [:a 2] [:c 3])\n\n;; like this:\nuser=> (sort-by last {:b 1 :c 3 :a 2})\n([:b 1] [:a 2] [:c 3])", :editors [{:avatar-url "https://www.gravatar.com/avatar/90ffa70a579c3e0c398b7523ecdc6a87?r=PG&default=identicon", :account-source "clojuredocs", :login "morphling"} {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "drewverlee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1130688?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon", :account-source "clojuredocs", :login "zmila"}, :_id "542692cfc026201cdc326e5b"} {:updated-at 1602514013062, :created-at 1306322169000, :body ";; make a struct 'goods'. it assumes that every goods has\n;; its id number and price.\n(defstruct goods :id :price)\n\n;; generate data.\n(def data (map #(struct goods %1 %2)\n\t (shuffle (range 0 10)) (shuffle\n\t\t\t\t (into (range 100 500 100)\n\t\t\t\t\t (range 100 500 100)))))\n\n(defn comp-goods-price\n \"a compare function by :price of the struct 'goods.' the sort order \n is superior to the lower price and if the price is same, it is \n superior to the lower id.\"\n [el1 el2]\n (or (< (:price el1) (:price el2))\n (and (= (:price el1) (:price el2))(< (:id el1) (:id el2)))))\n\nuser=> data\n({:id 1, :price 300} {:id 6, :price 100} {:id 3, :price 100} {:id 4, :price 400} {:id 0, :price 300} {:id 2, :price 200} {:id 5, :price 200} {:id 8, :price 400})\nuser=> (sort comp-goods-price data)\n({:id 3, :price 100} {:id 6, :price 100} {:id 2, :price 200} {:id 5, :price 200} {:id 0, :price 300} {:id 1, :price 300} {:id 4, :price 400} {:id 8, :price 400})\nuser=> (sort-by :price < data) ; compare this with the above.\n({:id 6, :price 100} {:id 3, :price 100} {:id 2, :price 200} {:id 5, :price 200} {:id 1, :price 300} {:id 0, :price 300} {:id 4, :price 400} {:id 8, :price 400})\n\n\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"} {:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"} {:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"} {:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"} {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"}, :_id "542692cfc026201cdc326e5e"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; Warning: You can sort a Java array and get back a sorted immutable Clojure\n;; data structure, but it will also change the input Java array, by sorting it.\n;; Copy the array before sorting if you want to avoid this.\n\nuser=> (def x (to-array [32 11]))\n#'user/x\n\nuser=> (seq x)\n(32 11)\n\nuser=> (def y (sort x))\n#'user/y\n\n;; Return sorted sequence\nuser=> y\n(11 32)\n\nuser=> (class y)\nclojure.lang.ArraySeq\n\n;; but also modifies x, because it used the array to do the sorting.\nuser=> (seq x)\n(11 32)\n\n;; One way to avoid this is copying the array before sorting:\nuser=> (def y (sort (aclone x)))\n#'user/y", :created-at 1331771749000, :updated-at 1332833601000, :_id "542692d5c026201cdc32708e"} {:editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}], :body ";; Sorting with > only works for numbers, whereas sort\n;; also works for other types such as vectors.\n;; To sort any data in reverse (descending) order,\n;; use a negated comparator:\n\nuser=> (sort (comp - compare) [[1 0] [0 0] [0 3] [2 1]])\n([2 1] [1 0] [0 3] [0 0])\n\n;; There are subtle cases where negating a comparator can give the wrong sort order.\n;; See this article for details, and a more robust suggestion of reversing the\n;; order of arguments given to the comparator:\n;; https://clojure.org/guides/comparators\n\nuser=> (sort #(compare %2 %1) [[1 0] [0 0] [0 3] [2 1]])\n([2 1] [1 0] [0 3] [0 0])", :author {:avatar-url "https://avatars.githubusercontent.com/u/23474334?v=3", :account-source "github", :login "ferdinand-beyer"}, :created-at 1479202684434, :updated-at 1548624336544, :_id "582ad77ce4b0782b632278c1"} {:updated-at 1483387364837, :created-at 1483387364837, :author {:login "Invertisment", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1641263?v=3"}, :body ";; Reverse the collection\n\nuser=> (sort #(compare %2 %1) '(:a :b :c :d))\n(:d :c :b :a)", :_id "586ab1e4e4b0fd5fb1cc9651"} {:editors [{:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/8271291?v=3"}], :body "(def data [{:v 12, :a 10} {:v 21, :a 113} {:v 1, :a 2} {:v 12, :a 223} {:v 100, :a 23} {:v 1, :a 113}])\n\n(defn multi-comp\n ([fns a b]\n (multi-comp fns < a b))\n ([[f & others :as fns] order a b]\n (if (seq fns)\n (let [result (compare (f a) (f b))\n f-result (if (= order >) (* -1 result) result)]\n (if (= 0 f-result)\n (recur others order a b)\n f-result))\n 0)))\n\n(sort #(multi-comp [:a :v] > %1 %2) data)\n;;=> ({:v 12, :a 223} {:v 21, :a 113} {:v 1, :a 113} {:v 100, :a 23} {:v 12, :a 10} {:v 1, :a 2}) \n\n(sort #(multi-comp [:a :v] < %1 %2) data)\n;;=> ({:v 1, :a 2} {:v 12, :a 10} {:v 100, :a 23} {:v 1, :a 113} {:v 21, :a 113} {:v 12, :a 223})", :author {:avatar-url "https://avatars2.githubusercontent.com/u/8271291?v=3", :account-source "github", :login "ertugrulcetin"}, :created-at 1491607217680, :updated-at 1491607544907, :_id "58e81eb1e4b01f4add58fe88"} {:editors [{:login "malloryerik", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10395849?v=4"}], :body ";; Sort strings into ordered character lists\n\nuser=> (sort \"alphabet!321\") \n(\\! \\1 \\2 \\3 \\a \\a \\b \\e \\h \\l \\p \\t)\n\nuser=> (sort \"안녕하세요\") \n(\\녕 \\세 \\안 \\요 \\하)\n\nuser=> (sort \"花间一壶酒,独酌无相亲。\") \n(\\。 \\一 \\亲 \\壶 \\无 \\独 \\相 \\花 \\酌 \\酒 \\间 \\,)", :author {:avatar-url "https://avatars3.githubusercontent.com/u/10395849?v=4", :account-source "github", :login "malloryerik"}, :created-at 1566135485015, :updated-at 1566176013086, :_id "5d5954bde4b0ca44402ef7a4"}], :notes nil, :arglists ["coll" "comp coll"], :doc "Returns a sorted sequence of the items in coll. If no comparator is\n supplied, uses compare. comparator must implement\n java.util.Comparator. Guaranteed to be stable: equal elements will\n not be reordered. If coll is a Java array, it will be modified. To\n avoid this, sort a copy of the array.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/sort"} {:ns "clojure.core", :name "-cache-protocol-fn", :file "clojure/core_deftype.clj", :type "function", :column 1, :see-alsos nil, :line 575, :examples nil, :notes nil, :arglists ["pf x c interf"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/-cache-protocol-fn"} {:added "1.0", :ns "clojure.core", :name "unchecked-inc-int", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1678034683900, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unchecked-dec-int", :ns "clojure.core"}, :_id "6404c6fbe4b08cf8563f4b79"}], :line 1149, :examples [{:updated-at 1658482040938, :created-at 1658482040938, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body "(unchecked-inc-int 42);; => 43\n(unchecked-inc-int 42.8);; => 43\n(unchecked-inc-int Integer/MAX_VALUE);; => -2147483648", :_id "62da6d78e4b0b1e3652d762d"}], :notes nil, :arglists ["x"], :doc "Returns a number one greater than x, an int.\n Note - uses a primitive operator subject to overflow.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-inc-int"} {:added "1.2", :ns "clojure.core", :name "map-indexed", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1290495691000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e3e"} {:created-at 1324314182000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "keep-indexed", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e3f"}], :line 7283, :examples [{:updated-at 1596522358724, :created-at 1280778877000, :body "user=> (map-indexed (fn [idx itm] [idx itm]) \"foobar\")\n([0 \\f] [1 \\o] [2 \\o] [3 \\b] [4 \\a] [5 \\r])\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/4c1869a83a1bf9c5090b07b0db6fb450?r=PG&default=identicon", :account-source "clojuredocs", :login "kredaxx"} {:avatar-url "https://www.gravatar.com/avatar/4c1869a83a1bf9c5090b07b0db6fb450?r=PG&default=identicon", :account-source "clojuredocs", :login "kredaxx"} {:avatar-url "https://www.gravatar.com/avatar/4c1869a83a1bf9c5090b07b0db6fb450?r=PG&default=identicon", :account-source "clojuredocs", :login "kredaxx"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:login "zackteo", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/7510179?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/4c1869a83a1bf9c5090b07b0db6fb450?r=PG&default=identicon", :account-source "clojuredocs", :login "kredaxx"}, :_id "542692cdc026201cdc326d25"} {:author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :editors [], :body ";; or simply\nuser=> (map-indexed vector \"foobar\")\n([0 \\f] [1 \\o] [2 \\o] [3 \\b] [4 \\a] [5 \\r])", :created-at 1324306400000, :updated-at 1324306400000, :_id "542692d4c026201cdc327005"} {:editors [{:login "zackteo", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/7510179?v=4"}], :body "(map-indexed hash-map \"foobar\")\n;;=> ({0 \\f} {1 \\o} {2 \\o} {3 \\b} {4 \\a} {5 \\r})", :author {:avatar-url "https://avatars2.githubusercontent.com/u/2665931?v=4", :account-source "github", :login "freetonik"}, :created-at 1540845475652, :updated-at 1596521745408, :_id "5bd76fa3e4b00ac801ed9eea"} {:editors [{:login "gluer", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/22495106?v=4"}], :body ";; a simple example\n(map-indexed #(when (< % 2) (str % %2)) [:a :b :c])\n;;=> (\"0:a\" \"1:b\" nil)\n\n(keep-indexed #(when (< % 2) (str % %2)) [:a :b :c])\n;;=> (\"0:a\" \"1:b\")", :author {:avatar-url "https://avatars3.githubusercontent.com/u/22495106?v=4", :account-source "github", :login "gluer"}, :created-at 1542944994140, :updated-at 1545622964814, :_id "5bf778e2e4b0ca44402ef5ca"} {:updated-at 1596521989649, :created-at 1596521989649, :author {:login "zackteo", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/7510179?v=4"}, :body ";; Join the index and elements with list\n(map-indexed list [:a :b :c])\n;;=> ((0 :a) (1 :b) (2 :c))", :_id "5f28fe05e4b0b1e3652d734c"} {:updated-at 1616528771927, :created-at 1616528756028, :author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :body "(= (map-indexed #(when (= 2 %2) [%1 \"Hi\"]) [1 1 2 2]) \n '(nil nil [2 \"Hi\"] [3 \"Hi\"])) ;;=>true", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4", :account-source "github", :login "Crowbrammer"}], :_id "605a4574e4b0b1e3652d74a8"}], :notes nil, :arglists ["f" "f coll"], :doc "Returns a lazy sequence consisting of the result of applying f to 0\n and the first item of coll, followed by applying f to 1 and the second\n item in coll, etc, until coll is exhausted. Thus function f should\n accept 2 arguments, index and item. Returns a stateful transducer when\n no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/map-indexed"} {:added "1.1", :ns "clojure.core", :name "with-bindings", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1365637665000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-bindings*", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ade"} {:created-at 1374310477000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-local-vars", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521adf"} {:created-at 1374313569000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "binding", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ae0"} {:created-at 1375792510000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-redefs", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ae1"}], :line 1986, :examples [{:body "(def ^:dynamic x 1)\n;;=> #'user/x\n\nx\n;;=> 1\n\n(with-bindings {#'x 2}\n x)\n;;=> 2", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423525132511, :updated-at 1423525132511, :_id "54d9450ce4b0e2ac61831d40"}], :macro true, :notes nil, :arglists ["binding-map & body"], :doc "Takes a map of Var/value pairs. Installs for the given Vars the associated\n values as thread-local bindings. Then executes body. Pops the installed\n bindings after body was evaluated. Returns the value of body.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/with-bindings"} {:added "1.2", :ns "clojure.core", :name "rand-nth", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1292321208000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rand", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f63"} {:created-at 1434034859003, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:ns "clojure.core", :name "shuffle", :library-url "https://github.com/clojure/clojure"}, :_id "5579a2abe4b01ad59b65f4f1"} {:created-at 1586185491703, :author {:login "green-coder", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nth", :ns "clojure.core"}, :_id "5e8b4513e4b087629b5a18cc"}], :line 7231, :examples [{:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "XPherior", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/656a48d6bef2a9f034af0e8b2b4d588d?r=PG&default=identicon"}], :body "user=> (def food [:ice-cream :steak :apple])\n#'user/food\n\nuser=> (rand-nth food)\n:apple\nuser=> (rand-nth food)\n:ice-cream\n", :created-at 1282319178000, :updated-at 1352188362000, :_id "542692cec026201cdc326dfe"} {:updated-at 1507688537707, :created-at 1507688537707, :author {:login "parkeristyping", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/9487556?v=4"}, :body "user=> (def food [:ice-cream :steak :apple])\n#'user/food\n\nuser=> (rand-nth food)\n:ice-cream\nuser=> (rand-nth food)\n:ice-cream", :_id "59dd8059e4b03026fe14ea5f"} {:editors [{:login "jnriver", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/2074698?v=4"}], :body "user=> (rand-nth [])\nIndexOutOfBoundsException clojure.lang.PersistentVector.arrayFor (PersistentVector.java:158)\n\nuser=>\n(let [xs []]\n (when (not (empty? xs))\n (rand-nth xs)))\nnil\n", :author {:avatar-url "https://avatars2.githubusercontent.com/u/2074698?v=4", :account-source "github", :login "jnriver"}, :created-at 1527215870505, :updated-at 1527216042499, :_id "5b0776fee4b045c27b7fac79"}], :notes nil, :arglists ["coll"], :doc "Return a random element of the (sequential) collection. Will have\n the same performance characteristics as nth for the given\n collection.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/rand-nth"} {:added "1.0", :ns "clojure.core", :name "comp", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1358904701000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "partial", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ec3"} {:created-at 1358904763000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "juxt", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ec4"} {:created-at 1427713283146, :author {:login "peter-courcoux", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1872022?v=3"}, :to-var {:ns "clojure.core", :name "every-pred", :library-url "https://github.com/clojure/clojure"}, :_id "55192d03e4b056ca16cfecfc"}], :line 2557, :examples [{:author {:login "citizen428", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3881a28fe402dd2d1de44717486cae8?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(def negative-quotient (comp - /))\n;; #'user/negative-quotient\n\n(negative-quotient 8 3) ;;=> -8/3\n\n(def concat-and-reverse (comp (partial apply str) reverse str)) \n;; #'user/concat-and-reverse\n\n(concat-and-reverse \"hello\" \"clojuredocs\")\n;;=> \"scoderujolcolleh\"\n", :created-at 1280554862000, :updated-at 1420648866563, :_id "542692cbc026201cdc326c04"} {:updated-at 1486787503828, :created-at 1292499977000, :body "((comp str +) 8 8 8) \n;;=> \"24\"\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "bsifou", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8908139?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/e8a89e26df41f3dd921ff1de2afa4db7?r=PG&default=identicon", :account-source "clojuredocs", :login "zpinter"}, :_id "542692cbc026201cdc326c06"} {:author {:login "semperos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/edeae8e7534b3d554e4ec2c35ffc68d?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(map\n (comp - (partial + 3) (partial * 2))\n [1 2 3 4])\n;;=> (-5 -7 -9 -11)", :created-at 1296193214000, :updated-at 1420649045506, :_id "542692cbc026201cdc326c07"} {:updated-at 1420649083250, :created-at 1305843170000, :body "(filter (comp not zero?) [0 1 0 2 0 3 0 4])\n;;=> (1 2 3 4)", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"}, :_id "542692cbc026201cdc326c08"} {:author {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}, :editors [{:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; make a struct 'goods'. it assumes that every goods has\n;; its id number and price.\n(defstruct goods :id :price)\n\n;; generate data.\n(def data (map #(struct goods %1 %2)\n\t (shuffle (range 0 10)) \n (shuffle\n\t (into (range 100 500 100)\n\t\t\t(range 100 500 100)))))\n\n(defn comp-goods-price\n \"a compare function by :price of the struct 'goods.' the sort order \n is that the lower price is superior to the higher one and if the \n price is same, the lower id is superior to the higher one.\"\n [el1 el2]\n (if (or (< (:price el1) (:price el2))\n (and (= (:price el1) (:price el2)) (< (:id el1) (:id el2))))\n true\n false))\n\n;; The shuffle will cause your results to differ.\ndata \n;;=> ({:id 1, :price 300} {:id 6, :price 100} \n;; {:id 3, :price 100} {:id 4, :price 400}\n;; {:id 0, :price 300} {:id 2, :price 200} \n;; {:id 5, :price 200} {:id 8, :price 400})\n\n(sort (comp comp-goods-price) data)\n;;=> ({:id 3, :price 100} {:id 6, :price 100} \n;; {:id 2, :price 200} {:id 5, :price 200} \n;; {:id 0, :price 300} {:id 1, :price 300}\n;; {:id 4, :price 400} {:id 8, :price 400})\n\n(sort-by :price < data) ; compare this with the above.\n;;=> ({:id 6, :price 100} {:id 3, :price 100} \n;; {:id 2, :price 200} {:id 5, :price 200} \n;; {:id 1, :price 300} {:id 0, :price 300} \n;; {:id 4, :price 400} {:id 8, :price 400})\n\n;; Yet another example of 'comp' by PriorityBlockingQueue.\n\n(import [java.util.concurrent PriorityBlockingQueue])\n;; java.util.concurrent.PriorityBlockingQueue\n\n(def pqdata (new PriorityBlockingQueue 8\n\t\t (comp comp-goods-price)))\n;; #'user/pqdata\n\n(doseq [x data] (.add pqdata x))\n;;=> nil\n\n(dotimes [_ 8] (println (.poll pqdata)))\n;; {:id 3, :price 100}\n;; {:id 6, :price 100}\n;; {:id 2, :price 200}\n;; {:id 5, :price 200}\n;; {:id 0, :price 300}\n;; {:id 1, :price 300}\n;; {:id 4, :price 400}\n;; {:id 8, :price 400}\n;;=> nil\n", :created-at 1306322829000, :updated-at 1420650298514, :_id "542692cbc026201cdc326c09"} {:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(def countif (comp count filter))\n#'user/countif\n\n(countif even? [2 3 1 5 4])\n;;=> 2", :created-at 1313975540000, :updated-at 1420649227225, :_id "542692cbc026201cdc326c0f"} {:author {:login "Will", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a449004e52cfddd142e63a1d317b191d?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "; Get 2nd to last element from a list\n( (comp second reverse) '(\"a\" 2 7 \"b\")) \n;;=> 7", :created-at 1344506218000, :updated-at 1420649237526, :_id "542692d2c026201cdc326f64"} {:updated-at 1449761968315, :created-at 1449761968315, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :body "; We need an example that composes more than just two functions.\n; The following example is an overly complicated reimplementation of 'nth'\n; but it does show the composition of an arbitrary number of functions (rest).\n( #((apply comp first (repeat %2 rest)) %1) [1 2 3 4 5 6] 3 ) \n;;=> 4", :_id "56699cb0e4b09a2675a0ba72"} {:updated-at 1536867551060, :created-at 1486454398076, :author {:login "purukaushik", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5105099?v=3"}, :body "; `comp`-ing maps, filters with a little help from our friend `partial`\n; the following function filters numbers in a `coll` if it is divisible by 3\n; then on that filtered `coll`, multiplies all by 2\n\n; a little helper to find if a number is div by 3 \n; also comp-ed\n\n(def mod3nz? (comp not zero? #(mod % 3)))\n\n; now for that elusive function that muls by 2 after filter those not div by 3\n(def mul-2-nd-3\n \"Takes a seq of numbers, filters those not divisible by 3 and muls them by 2\"\n (comp (partial map #(* % 2))\n (partial filter mod3nz?)))\n\n(mul-2-nd-3 [16 15 30 43]) ;; => (32 86)\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/5105099?v=3", :account-source "github", :login "purukaushik"} {:login "Jjunior130", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/7597818?v=4"}], :_id "58997e7ee4b01f4add58fe3d"} {:updated-at 1486787324018, :created-at 1486787324018, :author {:login "bsifou", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8908139?v=3"}, :body "; Split a number into sequence of it's digits\n((comp (partial map (comp read-string str)) str) 33)\n;;=> (3 3)", :_id "589e92fce4b01f4add58fe46"} {:updated-at 1497863678341, :created-at 1497863678341, :author {:login "merliecat", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/27359194?v=3"}, :body ";; Keywords are used as functions to access data in maps.\n\n(:foo {:foo \"bar\"})\n;;=> \"bar\"\n\n;; With a nested data structure, it is common to use\n;; several keywords in sequence to navigate the hierarchy.\n\n(def my-data {:this {:that {:the-other \"val\"}}})\n;;=> #'user/my-data\n\n(-> my-data :this :that :the-other)\n;;=> \"val\"\n\n;; Since keywords are functions,\n;; they can be 'comp'ed just like any other function.\n\n(def those (comp :the-other :that :this)) ; Note: reverse order\n;;=> #'user/those\n\n(those my-data)\n;;=> \"val\"\n\n;; The composed keyword-sequence can be used with other keywords: -\n\n(def my-data-2\n {:this {:that {:the-other {:a \"apple\" :b \"banana\"}}}})\n;;=> #'user/my-data-2\n\n(let [a (-> my-data-2 those :a)\n b (-> my-data-2 those :b)]\n (str \"These: \" a \", \" b))\n;;=> \"These: apple, banana\"", :_id "594795fee4b06e730307db3a"} {:updated-at 1508821937862, :created-at 1508821937862, :author {:login "elect000", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/18697629?v=4"}, :body ";; ((comp func1 func2) data) mean ...\n;; (-> data func2 func1)\n;; so,\n((comp (partial * 3) inc) 1)\n;; means\n(* 3 (inc 1))\n\n;; advanced ...\n\n((comp seq re-seq) #\"(\\w+)=(\\S+)\" \"foo=bar\")\n;; ([\"foo=bar\" \"foo\" \"bar\"])\n(seq (re-seq #\"(\\w+)=(\\S+)\" \"foo=bar\"))\n\n;; * \"#(\\w+)...\" and \"foo=...\" are arguments for #re-seq", :_id "59eecbb1e4b0a08026c48c73"} {:updated-at 1510097526774, :created-at 1510097526774, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body ";; comp is the transducer equivalent to thrush \n\n;; An example of using the \"thread-last\" macro to get\n;; the sum of the first 10 even squares.\n(->> (range)\n (map #(* % %))\n (filter even?)\n (take 10)\n (reduce +))\n;;=> 1140\n\n;; Many the seq functions now produce transducers.\n;; `reduce` does not but has been replaced with `transduce`.\n(transduce \n (comp\n (map #(* % %))\n (filter even?)\n (take 10))\n + 0 (range) )\n;;=> 1140", :_id "5a024276e4b0a08026c48c9b"} {:updated-at 1517927616519, :created-at 1517927616519, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;trim will remove the white spaces and return a new string which will be passed ;;to the second function capitalize which will return a new string\n\n((comp clojure.string/capitalize clojure.string/trim) \" london \")\n;;\"London\"\n", :_id "5a79bcc0e4b0e2d9c35f7419"} {:updated-at 1517928532967, :created-at 1517928532967, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body "(def my-car\n {:name \"audi\"\n :data {:cc 2990\n :bhp 350}})\n\n((comp :bhp :data) my-car)\n;;350\n\n;;which is the equivalent of\n\n(:bhp (:data my-car))\n;;350", :_id "5a79c054e4b0e2d9c35f741a"} {:editors [{:login "Jjunior130", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/7597818?v=4"}], :body "(require '[reagent.core :as r])\n\n(def float-parsable? (comp not js/isNaN js/parseFloat))\n(def find-parsable-or-nil \n (comp first \n (partial re-find \n #\"(\\-?\\d+\\.)?\\d+([eE][-+]?\\d+)?\")))\n\n(defn number-input\n \"HTML input element for number only input\"\n [value]\n [:input\n {:value @value\n :type \"text\"\n :on-change (comp\n #(when-let [new-value %]\n (reset! value new-value))\n (fn [new-value]\n (cond\n (empty? new-value) \"\"\n (float-parsable? new-value) new-value\n :otherwise (find-parsable-or-nil new-value)))\n (fn [target]\n (.-value target))\n (fn [event]\n (.-target event)))}])\n\n(def value (r/atom \"\"))\n\n(defn demo []\n [:div\n ; Displays NaN when value is \"\", displays a number otherwise.\n (-> @value js/parseFloat str) [:br]\n [number-input value]])", :author {:avatar-url "https://avatars1.githubusercontent.com/u/7597818?v=4", :account-source "github", :login "Jjunior130"}, :created-at 1536856092993, :updated-at 1536879826363, :_id "5b9a901ce4b00ac801ed9e9c"} {:editors [{:login "luontola", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/42678?v=4"}], :body "; Demonstrating the order of parameters vs. normal function application.\n\n(def x {:bar {:foo 42}})\n\n(:foo (:bar x))\n;;=> 42\n\n((comp :foo :bar) x)\n;;=> 42", :author {:avatar-url "https://avatars0.githubusercontent.com/u/42678?v=4", :account-source "github", :login "luontola"}, :created-at 1552650253291, :updated-at 1552650469262, :_id "5c8b900de4b0ca44402ef6b6"} {:updated-at 1615715410336, :created-at 1615715410336, :author {:login "nbardiuk", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/381992?v=4"}, :body "; Without arguments returns identity function\n\n(identical? (comp) identity)\n;;=> true\n\n((comp) :arg)\n;;=> :arg", :_id "604ddc52e4b0b1e3652d748f"}], :notes nil, :arglists ["" "f" "f g" "f g & fs"], :doc "Takes a set of functions and returns a fn that is the composition\n of those fns. The returned fn takes a variable number of args,\n applies the rightmost of fns to the args, the next\n fn (right-to-left) to the result, etc.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/comp"} {:added "1.0", :ns "clojure.core", :name "await", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1298860359000, :author {:login "ninjudd", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7ced25585a7556e9b9b975c1f9e136e3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "await-for", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a8a"}], :line 3274, :examples [{:updated-at 1435096085344, :created-at 1283693589000, :body ";; construct a simple agent\n(def *agnt* (agent {}))\n\n(send-off *agnt* (fn [state] \n (Thread/sleep 10000)\n (assoc state :done true)))\n;;=> \n\n;; blocks till the agent action is finished\n(await *agnt*) \n;;=> nil", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/1453?v=4", :account-source "github", :login "ghoseb"}, :_id "542692cdc026201cdc326cdb"} {:body "(import '(java.io BufferedWriter FileWriter))\n\n;; Generally the agent can be sent messages asynchronously, send and forget.\n;; In some cases a rendezvous is needed, e.g. in the case of an output file.\n\n(def write-out \n (agent {:handle (clojure.java.io/writer \"results.txt\" )\n :last-msg [\"init\"]}\n :validator (fn [state] \n (and (contains? state :handle) (contains? state :last-msg))) \n :error-handler (fn [result] \n (println \"invalid result\") )))\n\n(defn write-a-line [state msg nap] \n (.write (:handle state) (str msg \" line \" \"\\n\")) \n (let [new-state (update-in state [:last-msg] into [msg])]\n (println \"message : \" msg \" : \" new-state)\n (Thread/sleep nap)\n new-state))\n\n\n\n;; these all have the same return value\n(send-off write-out write-a-line \"first\" 2000)\n(send-off write-out write-a-line \"second\" 1000)\n(send-off write-out write-a-line \"third\" 5000)\n(send-off write-out write-a-line \"fourth\" 1000)\n@write-out\n;;=> {:handle #, :last-msg [\"init\"]}\n\n(time (await write-out))\n;; 9000.307 msecs\n\n;; here we can see that the await causes the thread to block\n;; until the agent's queue is empty.\n@write-out\n;;=> {:handle #, \n;; :last-msg [\"init\" \"first\" \"second\" \"third\" \"fourth\"]}\n\n;; But wait the \"result.txt\" file is empty!\n;; We need to close the file handle.\n;; And now that we know the agent's queue is empty we\n;; are free to close it.\n;; This could do this in the current thread with the dereferenced\n;; agents :handle '(.close (:handle @write-out))' \n;; but it is probably better to be formal and let the agent do it.\n(defn close-the-agent [state] \n (.close (:handle state)) \n state)\n\n(send-off write-out close-the-agent)\n\n;; And the contents of \"result.txt\" are: (less the leading '; ')\n; first line\n; second line\n; third line\n; fourth line", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1435098875036, :updated-at 1435102514521, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :_id "5589defbe4b05f167dcf2341"}], :notes [{:author {:login "andrewni420", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/77020120?v=4"}, :updated-at 1690255271897, :created-at 1690255271897, :body " ;;It is not actually allowed to await on an action dispatched from an agent to an agent\n\n (def m (agent 0))\n (def n (agent 0))\n\n (defn step \n [agent1 agent2]\n (try (await (send agent2 inc))\n (catch Exception e (println e)))\n agent1)\n\n ;;Evaluating this throws an error saying \"Can't await in agent action\"\n (send m #(step % n))\n ", :_id "64bf3fa7e4b08cf8563f4bd6"}], :arglists ["& agents"], :doc "Blocks the current thread (indefinitely!) until all actions\n dispatched thus far, from this thread or agent, to the agent(s) have\n occurred. Will block on failed agents. Will never return if\n a failed agent is restarted with :clear-actions true or shutdown-agents was called.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/await"} {:added "1.2", :ns "clojure.core", :name "spit", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1330170569000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "slurp", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e97"} {:created-at 1330170573000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "writer", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e98"} {:created-at 1350073135000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "load-file", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e99"} {:created-at 1515622120441, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "make-parents", :ns "clojure.java.io"}, :_id "5a568ee8e4b0a08026c48cec"}], :line 6954, :examples [{:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}], :body "user=> (spit \"flubber.txt\" \"test\")\nnil\nuser=> (slurp \"flubber.txt\")\n\"test\"", :created-at 1280458792000, :updated-at 1366325983000, :_id "542692c7c026201cdc326972"} {:author {:login "megapatch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9a9b25017146e62801acc97861d74c4e?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (spit \"event.log\" \"test 1\\n\" :append true)\nnil\n\nuser=> (spit \"event.log\" \"test 2\\n\" :append true)\nnil\n\nuser=> (println (slurp \"event.log\"))\ntest 1\ntest 2\n\nnil\n", :created-at 1283972766000, :updated-at 1285487376000, :_id "542692c7c026201cdc326975"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "Juxtaspiral", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1b0546af898df8046160d0ed80e13165?r=PG&default=identicon"}], :body "(defn append-to-file\n \"Uses spit to append to a file specified with its name as a string, or\n anything else that writer can take as an argument. s is the string to\n append.\" \n [file-name s]\n (spit file-name s :append true))", :created-at 1334796093000, :updated-at 1348351258000, :_id "542692d5c026201cdc32709b"} {:updated-at 1510413046445, :created-at 1510413046445, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;Create a record and save a log message to a log file\n;;Constructor with side effects\n\n;;define a Person record\n(defrecord Person [fname lname])\n\n;;define a function to save a log message into the log.txt using spit and :append\n(defn log-entry [msg] (spit \"log.txt\" (apply str msg \"\\n\") :append true))\n\n;;build the constructor which: 1) log the message; 2)create a Person\n(defn make-person [fname lname]\n (log-entry (apply str \"[log] New Person created : \" lname \",\" fname))\n (->Person fname lname))\n\n;;create a person\n(def person (make-person \"John\" \"Smith\"))\n\n;;print the content of the log.txt to the console\n(println (slurp \"log.txt\"))", :_id "5a0712f6e4b0a08026c48cb0"} {:updated-at 1543709529631, :created-at 1543709529631, :author {:login "messinm", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1719572?v=4"}, :body "; ClojureCLR doesn't use :append, use this instead\n(spit \"hi.txt\" \"Test 1\\n\" :file-mode System.IO.FileMode/Append)\n", :_id "5c032359e4b0ca44402ef5d5"}], :notes [{:author {:login "flyboarder", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147004?v=3"}, :updated-at 1469398101037, :created-at 1469398101037, :body "The only valid options for `spit` are `:append` and `:encoding`.", :_id "57953c55e4b0bafd3e2a04b6"} {:author {:login "didibus", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/601540?v=4"}, :updated-at 1585180895729, :created-at 1585180895729, :body "Valid options include:\n\n :append true to open stream in append mode\n :encoding string name of encoding to use, e.g. \\\"UTF-8\\\".", :_id "5e7bf0dfe4b087629b5a18c2"}], :arglists ["f content & options"], :doc "Opposite of slurp. Opens f with writer, writes content, then\n closes f. Options passed to clojure.java.io/writer.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/spit"} {:added "1.1", :ns "clojure.core", :name "future-done?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1297120552000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "future", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521df0"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "future-cancel", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1339251476000, :_id "542692ebf6e94c6970521df1"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "future?", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1339252213000, :_id "542692ebf6e94c6970521df2"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "future-cancelled?", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1339252225000, :_id "542692ebf6e94c6970521df3"}], :line 6536, :examples [{:updated-at 1339251719000, :created-at 1339251719000, :body "user=> (def f (future (Thread/sleep 5000) (inc 0)))\n\nuser=> (future-done? f) \nfalse\n\nuser=> (Thread/sleep 5000)\nnil\n\nuser=> (future-done? f)\ntrue\n\n", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :_id "542692d3c026201cdc326fb7"} {:updated-at 1339252193000, :created-at 1339252193000, :body ";; beware of cancellation !!!\n\nuser=> (def f (future (Thread/sleep 5000) (inc 0)))\n#'user/f\n\nuser=> (future-cancel f) \ntrue\n\nuser=> (future-cancelled? f) \ntrue\n\nuser=> (future-done? f) \ntrue\n\nuser=> @f \njava.util.concurrent.CancellationException (NO_SOURCE_FILE:0)", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :_id "542692d3c026201cdc326fb8"} {:updated-at 1669054840067, :created-at 1668769697257, :author {:login "sundaramss", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1131710?v=4"}, :body ";; removed unhelpful example", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/1131710?v=4", :account-source "github", :login "sundaramss"} {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :_id "637767a1e4b0b1e3652d7686"}], :notes [{:updated-at 1300164452000, :body "Future \"done\" returns true even for abnormal termination like being cancelled or throwing an exception.\r\n\r\nhttp://download.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html#isDone()", :created-at 1300164452000, :author {:login "pauldoo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5cb916d3c8abc9f45a093209e72489fb?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fb8"}], :arglists ["f"], :doc "Returns true if future f is done", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/future-done_q"} {:added "1.0", :ns "clojure.core", :name "*read-eval*", :type "var", :see-alsos [{:created-at 1352963695000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "read", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d50"} {:created-at 1352963701000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "read-string", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d51"} {:created-at 1352963704000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "load", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d52"}], :examples [{:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [{:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}], :body ";;just from the doc\n\n(binding [*read-eval* false] (read-string \"#=(eval (def x 3))\"))\n=> EvalReader not allowed when *read-eval* is false.\n [Thrown class java.lang.RuntimeException]\n\n;;remove the anonymous function:\n\n(binding [*read-eval* false] (read-string \"(def x 3)\"))\n=> (def x 3)\n\n;;which is evaluable\n\n(eval (binding [*read-eval* false] (read-string \"(def x 3)\")))\n=> #'user/x\n\nx\n=>3", :created-at 1327090750000, :updated-at 1327090760000, :_id "542692d1c026201cdc326f3a"}], :notes [{:body "This dynamic Var defines if `read` and `read-string` will be allowed to evaluate code using the eval reader `#=`. That said, the way that the eval reader will evaluate things within the context of reading is very strange, here are the rules (credit to p-himik from Slack):\n\nEvaluation done by `read` and `read-string` using the eval reader is very limited and supports only the following cases:\n\n1. The form is a symbol naming a Java class, `(read-string \"#=java.lang.String\")`\n2. The form is a list and the first symbol is a symbol\n 2. that is var and the next one is a fully qualified symbol, `(def x) (read-string \"#=(var user/x)\")`\n 2. that denotes a constructor calling, `(read-string \"#=(java.lang.String. \\\"x\\\")\")`\n 2. that denotes a static member calling, `(read-string \"#=(java.lang.Integer/parseInt \\\"1\\\")\")`\n 2. that names something in the current NS, and the rest are quoted entities, `(read-string \"#=(inc 1)\")`\n\nAs you can see, everything after the first symbol is left untouched. This makes the eval reader extremely limited by itself in comparison to normal eval, but you can use eval there to circumvent that: `(def x 1) (read-string \"#=(eval x)\")`\n\nTo be more clear, in the given example:\n\n```\n(read-string \"#=(+ 1 (+ 2 3))\")\n```\n\nEverything after the first `+` are read as if quoted, so the above is equivalent to:\n\n```\n(+ '1 '(+ 2 3))\n```\n\nWhich will throw an exception:\n\n> PersistentList cannot be cast to class java.lang.Number\n\nThat's why the trick if you want to use the eval reader to evaluate arbitrary code is to use `eval` inside it like so:\n\n```\n(read-string \"#=(eval (+ 1 (+ 2 3)))\")\n```\n\nWhich will even let you reference a value in the current context:\n\n```\n(def x 1)\n#=(eval (+ 1 x))\n;;=> 2\n```", :created-at 1627197824169, :updated-at 1627198605717, :author {:avatar-url "https://avatars.githubusercontent.com/u/601540?v=4", :account-source "github", :login "didibus"}, :_id "60fd1180e4b0b1e3652d751d"}], :arglists [], :doc "Defaults to true (or value specified by system property, see below)\n ***This setting implies that the full power of the reader is in play,\n including syntax that can cause code to execute. It should never be\n used with untrusted sources. See also: clojure.edn/read.***\n\n When set to logical false in the thread-local binding,\n the eval reader (#=) and record/type literal syntax are disabled in read/load.\n Example (will fail): (binding [*read-eval* false] (read-string \"#=(* 2 21)\"))\n\n The default binding can be controlled by the system property\n 'clojure.read.eval' System properties can be set on the command line\n like this:\n\n java -Dclojure.read.eval=false ...\n\n The system property can also be set to 'unknown' via\n -Dclojure.read.eval=unknown, in which case the default binding\n is :unknown and all reads will fail in contexts where *read-eval*\n has not been explicitly bound to either true or false. This setting\n can be a useful diagnostic tool to ensure that all of your reads\n occur in considered contexts. You can also accomplish this in a\n particular scope by binding *read-eval* to :unknown\n ", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*read-eval*"} {:added "1.0", :ns "clojure.core", :name "dorun", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1296708499000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "doall", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d8c"} {:created-at 1520117044268, :author {:login "finalfantasia", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/2316604?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "doseq", :ns "clojure.core"}, :_id "5a9b2534e4b0316c0f44f908"} {:created-at 1520117066852, :author {:login "finalfantasia", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/2316604?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "run!", :ns "clojure.core"}, :_id "5a9b254ae4b0316c0f44f909"}], :line 3133, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "fyquah95", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6006469?v=3"}], :body "user=> (dorun 5 (repeatedly #(println \"hi\")))\nhi\nhi\nhi\nhi\nhi\nhi\nnil", :created-at 1281092803000, :updated-at 1434450783133, :_id "542692c6c026201cdc326907"} {:updated-at 1335431834000, :created-at 1335431834000, :body "user=> (let [x (atom 0)]\n (dorun (take 10 (repeatedly #(swap! x inc))))\n @x)\n10", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692d2c026201cdc326f8e"} {:author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :editors [{:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"} {:login "orivej", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cab90c7de5efde92a29f1eacb603ba9a?r=PG&default=identicon"} {:login "orivej", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cab90c7de5efde92a29f1eacb603ba9a?r=PG&default=identicon"}], :body "user=> (dorun (map #(println \"hi\" %) [\"mum\" \"dad\" \"sister\"]))\nhi mum\nhi dad\nhi sister\nnil", :created-at 1343166324000, :updated-at 1362554649000, :_id "542692d2c026201cdc326f8f"} {:updated-at 1436247797064, :created-at 1436247797064, :author {:login "gdeer81", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1340575?v=3"}, :body ";;map a function which makes database calls over a vector of values \nuser=> (map #(db/insert :person {:name %}) [\"Fred\" \"Ethel\" \"Lucy\" \"Ricardo\"])\nJdbcSQLException The object is already closed [90007-170] org.h2.message.DbE\nxception.getJdbcSQLException (DbException.java:329)\n\n;;database connection was closed before we got a chance to do our transactions\n;;lets wrap it in dorun\nuser=> (dorun (map #(db/insert :person {:name %}) [\"Fred\" \"Ethel\" \"Lucy\" \"Ricardo\"]))\nDEBUG :db insert into person values name = 'Fred'\nDEBUG :db insert into person values name = 'Ethel'\nDEBUG :db insert into person values name = 'Lucy'\nDEBUG :db insert into person values name = 'Ricardo'\nnil", :_id "559b66f5e4b00f9508fd66f6"}], :notes [{:author {:login "finalfantasia", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/2316604?v=4"}, :updated-at 1520197531487, :created-at 1520115866563, :body "`clojure.core/run!` can take the place of `(dorun (map ...))`.", :_id "5a9b209ae4b0316c0f44f907"}], :arglists ["coll" "n coll"], :doc "When lazy sequences are produced via functions that have side\n effects, any effects other than those needed to produce the first\n element in the seq do not occur until the seq is consumed. dorun can\n be used to force any effects. Walks through the successive nexts of\n the seq, does not retain the head and returns nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/dorun"} {:added "1.9", :ns "clojure.core", :name "simple-symbol?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495715090890, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "symbol?", :ns "clojure.core"}, :_id "5926cd12e4b093ada4d4d75d"} {:created-at 1495715101981, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "qualified-symbol?", :ns "clojure.core"}, :_id "5926cd1de4b093ada4d4d75e"}], :line 1627, :examples [{:updated-at 1495723255240, :created-at 1495723255240, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body "(simple-symbol? 'symbol)\n;;=> true\n\n(simple-symbol? 'clojure.core/symbol)\n;;=> false\n\n(simple-symbol? \"string\")\n;;=> false\n(simple-symbol? 42)\n;;=> false\n(simple-symbol? nil)\n;;=> false", :_id "5926ecf7e4b093ada4d4d76a"}], :notes nil, :arglists ["x"], :doc "Return true if x is a symbol without a namespace", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/simple-symbol_q"} {:added "1.0", :ns "clojure.core", :name "disj", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1351063996000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "dissoc", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e31"} {:created-at 1351064021000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "disj!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e32"} {:created-at 1405367718000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "difference", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e33"} {:created-at 1561679596230, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "conj", :ns "clojure.core"}, :_id "5d1556ece4b0ca44402ef777"}], :line 1518, :examples [{:updated-at 1462050216483, :created-at 1280340321000, :body "user=> (disj #{1 2 3}) ; disjoin nothing \n#{1 2 3} \n\nuser=> (disj #{1 2 3} 2) ; disjoin 2\n#{1 3} \n\nuser=> (disj #{1 2 3} 4) ; disjoin non-existent item\n#{1 2 3} \n\nuser=> (disj #{1 2 3} 1 3) ; disjoin several items at once\n#{2}", :editors [{:avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon", :account-source "clojuredocs", :login "zmila"} {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "bkovitz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon", :account-source "clojuredocs", :login "zmila"}, :_id "542692cec026201cdc326dc6"} {:editors [{:login "Hamido-san", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/27916344?v=4"}], :body "user=> (apply disj #{1 2 3} [1 3]) ; disjoin keys in a coll\n#{2}", :author {:avatar-url "https://avatars2.githubusercontent.com/u/5283430?v=4", :account-source "github", :login "randomizedthinking"}, :created-at 1602141980639, :updated-at 1620639101734, :_id "5f7ebf1ce4b0b1e3652d73ce"}], :notes nil, :arglists ["set" "set key" "set key & ks"], :doc "disj[oin]. Returns a new set of the same (hashed/sorted) type, that\n does not contain key(s).", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/disj"} {:added "1.0", :ns "clojure.core", :name "*2", :file "clojure/core.clj", :type "var", :column 1, :see-alsos [{:created-at 1303109714000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "*1", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ad4"} {:created-at 1303109726000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "*3", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ad5"}], :dynamic true, :line 6284, :examples [{:updated-at 1285502123000, :created-at 1279048024000, :body "user=> \"Hello!\"\n\"Hello!\"\n\nuser=> \"Hello World!\"\n\"Hello World!\"\n\nuser=> [*1 *2]\n[\"Hello World!\" \"Hello!\"]\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692c7c026201cdc326960"}], :notes nil, :arglists [], :doc "bound in a repl thread to the second most recent value printed", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*2"} {:added "1.0", :ns "clojure.core", :name "eval", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1318930260000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "read-string", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ea3"}], :line 3210, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (def *foo* \"(println [1 2 3])\")\n#'user/*foo*\n\nuser=> *foo*\n\"(println [1 2 3])\"\n\nuser=> (eval *foo*) ; Notice eval'ing a string does not work.\n\"(println [1 2 3])\"\n\nuser=> (eval (read-string *foo*))\n[1 2 3]\nnil", :created-at 1280547525000, :updated-at 1332949962000, :_id "542692cec026201cdc326daf"} {:author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :editors [], :body "user=> (eval '(let [a 10] (+ 3 4 a)))\n17\n", :created-at 1308973342000, :updated-at 1308973342000, :_id "542692cec026201cdc326db1"} {:updated-at 1458054160560, :created-at 1458054160560, :author {:login "APOS80", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6387252?v=3"}, :body "(def x '(+ 2 3))\n(println x) \n=> (+ 2 3)\n(println (eval x))\n=> 5", :_id "56e82410e4b0507458dcf5a7"}], :notes [{:updated-at 1308973573000, :body "In normal code, `eval` is rarely used.", :created-at 1308973573000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fc2"} {:author {:login "eengebruiker", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/31795546?v=4"}, :updated-at 1521045003085, :created-at 1521045003085, :body "Once you get used to eval you will use it more often. You can make nifty things with it.", :_id "5aa94e0be4b0316c0f44f924"}], :arglists ["form"], :doc "Evaluates the form data structure (not text!) and returns the result.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/eval"} {:added "1.0", :ns "clojure.core", :name "cons", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1297212928000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "conj", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d54"} {:created-at 1617817312569, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "seq", :ns "clojure.core"}, :_id "606deee0e4b0b1e3652d74b4"}], :line 22, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"} {:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; prepend 1 to a list\n(cons 1 '(2 3 4 5 6))\n;;=> (1 2 3 4 5 6)\n\n;; notice that the first item is not expanded\n(cons [1 2] [4 5 6])\n;;=> ([1 2] 4 5 6)", :created-at 1279071078000, :updated-at 1420651535055, :_id "542692ccc026201cdc326c5b"} {:body ";; may return results of different types but always a seq\n(map (juxt identity type seq? list?)\n [(cons 1 nil)\n (cons 1 '())])\n;; => ([(1) clojure.lang.PersistentList true true] \n;; [(1) clojure.lang.Cons true false])\n", :author {:login "phalphalak", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/438136?v=3"}, :created-at 1425547438764, :updated-at 1425547666700, :editors [{:login "phalphalak", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/438136?v=3"}], :_id "54f820aee4b0b716de7a6530"} {:editors [{:login "TheCodingGent", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1191123?v=3"}], :body ";; Cons new-element into nested structures \"cons-in\"\n\n(def db {:users [{:name \"Eduardo\"}]})\n(def new-element {:name \"Eva\"})\n\n(assoc db :users (cons new-element (:users db)))\n;; => {:users ({:name \"Eva\"} {:name \"Eduardo\"})}", :author {:avatar-url "https://avatars.githubusercontent.com/u/782909?v=3", :account-source "github", :login "edcaceres"}, :created-at 1479822182560, :updated-at 1483975426262, :_id "58344b66e4b0782b632278c4"} {:updated-at 1486154226776, :created-at 1486154226776, :author {:login "belun", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/282287?v=3"}, :body "(defn zeros [] \n (lazy-seq (cons 0 (zeros))))\n;; \"cons\" does not realize second parameter, \n;; opening the world for recursive functions that create lazy sequences\n\n(first (zeroes))\n0\n\n(first (rest (zeroes)))\n0\n\n(first (rest (rest (zeroes))))\n0\n\n;; example stolen from youtuber : \n;; https://youtu.be/iaph8m63HQw?list=PLAC43CFB134E85266", :_id "5894e9f2e4b01f4add58fe3b"} {:editors [{:login "earthfail", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/21296448?v=4"}], :body ";; this example might not work\n;; conj behave differently with \"set\" like structures.\n\n(def a-set #{1 2 3})\n\n(conj a-set 3) ;; will add 3 to the set\n;; => #{1 3 2}\n\n(conj a-set 4)\n;; => #{1 4 3 2}\n\n(first (conj a-set 4))\n;; => 1", :author {:avatar-url "https://avatars2.githubusercontent.com/u/3019924?v=4", :account-source "github", :login "didiercrunch"}, :created-at 1527347046020, :updated-at 1621162590490, :_id "5b097766e4b045c27b7fac7b"}], :notes [{:body "useful for creating lazy sequences, because it does not need to realize the param \"seq\" (it just appends the whole thing to param \"x\"\n\nhttp://stackoverflow.com/questions/12389303/clojure-cons-vs-conj-with-lazy-seq", :created-at 1486153640658, :updated-at 1486153936827, :author {:avatar-url "https://avatars.githubusercontent.com/u/282287?v=3", :account-source "github", :login "belun"}, :_id "5894e7a8e4b01f4add58fe3a"}], :arglists ["x seq"], :doc "Returns a new seq where x is the first element and seq is\n the rest.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/cons"} {:added "1.0", :ns "clojure.core", :name "refer", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1327515389000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "refer-clojure", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f2c"} {:created-at 1351990184000, :author {:login "Mark Addleman", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/768de71b6c873394290733acf422b4d5?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ns", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f2d"}], :line 4217, :examples [{:author {:login "teyc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd6e62afb4881ab0f617611b8b65d003?r=PG&default=identicon"}, :editors [{:login "teyc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd6e62afb4881ab0f617611b8b65d003?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}], :body "user=> (refer 'clojure.string :only '[capitalize trim])\nnil\n\nuser=> (capitalize (trim \" hOnduRAS \"))\n\"Honduras\"", :created-at 1283925242000, :updated-at 1321967031000, :_id "542692cdc026201cdc326d0b"} {:author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :editors [{:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}], :body "user=> (refer 'clojure.string\n :rename '{capitalize cap, trim trm})\nWARNING: replace already refers to: #'clojure.core/replace in namespace: user, being replaced by: #'clojure.string/replace\nWARNING: reverse already refers to: #'clojure.core/reverse in namespace: user, being replaced by: #'clojure.string/reverse\nnil\n\nuser=> (cap (trm \" hOnduRAS \"))\n\"Honduras\"\n\nuser=> (join \\, [1 2 3])\n\"1,2,3\"", :created-at 1399370253000, :updated-at 1399636313000, :_id "542692d5c026201cdc32706a"} {:author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :editors [{:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"} {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}], :body ";;; `:only' accepts only original names.\n;; wrong\nuser=> (refer 'clojure.string\n :rename '{capitalize cap, trim trm}\n :only '[cap trm])\nIllegalAccessError cap does not exist clojure.core/refer (core.clj:3849)\n\n;; right\nuser=> (refer 'clojure.string\n :rename '{capitalize cap, trim trm}\n :only '[capitalize trim])\nnil\n\n;; work well\nuser=> (cap (trm \" hOnduRAS \"))\n\"Honduras\"\n\n;; and also, cannot use either of them.\nuser=> (join \\, [1 2 3])\nCompilerException java.lang.RuntimeException: Unable to resolve symbol: join in this context, compiling:(NO_SOURCE_PATH:1:1)", :created-at 1399370354000, :updated-at 1399662756000, :_id "542692d5c026201cdc32706c"}], :notes [{:author {:login "KingMob", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/946421?v=4"}, :updated-at 1671686270847, :created-at 1671686270847, :body "Warning: the referral of a var isn't transitive. \n\n`refer` only works with a var's original namespace.\n\nIf you refer `A/foo` from `B`, you can't then refer `B/foo` from `C`.\n\n`foo` it will appear in `B`'s `ns-map`, but not `ns-publics` or `ns-interns`, unintuitively.", :_id "63a3e87ee4b08cf8563f4b54"}], :arglists ["ns-sym & filters"], :doc "refers to all public vars of ns, subject to filters.\n filters can include at most one each of:\n\n :exclude list-of-symbols\n :only list-of-symbols\n :rename map-of-fromsymbol-tosymbol\n\n For each public interned var in the namespace named by the symbol,\n adds a mapping from the name of the var to the var to the current\n namespace. Throws an exception if name is already mapped to\n something else in the current namespace. Filters can be used to\n select a subset, via inclusion or exclusion, or to provide a mapping\n to a symbol different from the var's name, in order to prevent\n clashes. Use :use in the ns macro in preference to calling this directly.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/refer"} {:ns "clojure.core", :name "print-dup", :file "clojure/core.clj", :type "var", :column 1, :see-alsos [{:created-at 1300959285000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "print-ctor", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e2a"} {:created-at 1332539534000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "print-method", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e2b"}], :line 3666, :examples [{:author {:login "cdorrat", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5dedcb7069d39421760f6d255def10c3?r=PG&default=identicon"}, :editors [{:login "cdorrat", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5dedcb7069d39421760f6d255def10c3?r=PG&default=identicon"}], :body ";; print-dup can be used for basic serialization\n;; the following methods write/read clojure forms to/from a file\n\n(defn to-file\n \"Save a clojure form to a file\"\n [#^java.io.File file form]\n (with-open [w (java.io.FileWriter. file)]\n (print-dup form w)))\n \n(defn from-file\n \"Load a clojure form from file.\"\n [#^java.io.File file]\n (with-open [r (java.io.PushbackReader. (java.io.FileReader. file))]\n (read r)))", :created-at 1300104716000, :updated-at 1300104999000, :_id "542692cac026201cdc326b8c"} {:author {:login "cdorrat", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5dedcb7069d39421760f6d255def10c3?r=PG&default=identicon"}, :editors [], :body ";; print-dup is a multimethod, you can extend it to support new types.\n;; The following statement adds print-dup support to \n;; the java.util.Date class\n(defmethod print-dup java.util.Date [o w]\n (print-ctor o (fn [o w] (print-dup (.getTime o) w)) w)) ", :created-at 1300104973000, :updated-at 1300104973000, :_id "542692cac026201cdc326b8e"}], :notes [{:updated-at 1300480179000, :body "This is a multimethod that can be implemented to define the printing of various values when \\*print-dup\\* is bound to true.", :created-at 1299414938000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fb7"}], :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/print-dup"} {:ns "clojure.core", :name "-reset-methods", :file "clojure/core_deftype.clj", :type "function", :column 1, :see-alsos nil, :line 628, :examples nil, :notes nil, :arglists ["protocol"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/-reset-methods"} {:added "1.0", :ns "clojure.core", :name "floats", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1658139428172, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "float-array", :ns "clojure.core"}, :_id "62d53324e4b0b1e3652d7624"}], :line 5368, :examples [{:updated-at 1658139411698, :created-at 1658139411698, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; float-array will convert where possible\n(float-array [1 2 3]);; => [1.0, 2.0, 3.0]\n\n;; floats will not\n(try (floats [1 2 3])\n (catch ClassCastException e (ex-message e)))\n;; => \"clojure.lang.PersistentVector cannot be cast to [F\"", :_id "62d53313e4b0b1e3652d7623"} {:updated-at 1682271661910, :created-at 1682271661910, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; Casting avoids expensive reflection, so to see the benefit, enable warning:\n(set! *warn-on-reflection* true)\n\n;; We'll def a float-array but won't type-hint the var:\n(def my-array (float-array [10.0 20.0 30.0 40.0 50.0 60.0]))\n\n;; and try to amap over it without using `floats` or type hinting:\n(amap my-array i _ (unchecked-float (unchecked-inc (aget my-array i))))\n;; Reflection warning… call to static method alength on clojure.lang.RT can't be resolved (argument types: unknown).\n;; Reflection warning… call to static method aclone on clojure.lang.RT can't be resolved (argument types: unknown).\n;; Reflection warning… call to static method aget on clojure.lang.RT can't be resolved (argument types: unknown, int).\n;; Reflection warning… call to static method aset on clojure.lang.RT can't be resolved (argument types: unknown, int, float).\n;; => [11.0, 21.0, 31.0, 41.0, 51.0, 61.0]\n\n;; We can use `floats` to avoid reflection:\n(amap (floats my-array) i _ (unchecked-float (unchecked-inc (aget (floats my-array) i))))\n;; => [11.0, 21.0, 31.0, 41.0, 51.0, 61.0]\n\n;; Just as we can type hint in place:\n(amap ^floats my-array i _ (unchecked-float (unchecked-inc (aget ^floats my-array i))))\n;; => [11.0, 21.0, 31.0, 41.0, 51.0, 61.0]\n\n;; Or type hint the var:\n(def ^\"[F\" my-array (float-array [10 20 30 40 50 60]))\n(amap my-array i _ (unchecked-float (unchecked-inc (aget my-array i))))\n;; => [11.0, 21.0, 31.0, 41.0, 51.0, 61.0]\n", :_id "64456dade4b08cf8563f4b93"}], :notes nil, :arglists ["xs"], :doc "Casts to float[]", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/floats"} {:added "1.0", :ns "clojure.core", :name "pos?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1345518606000, :author {:login "cbare", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b394e97f24f3576861239e2b839703a4?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "neg?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e09"} {:created-at 1400618875000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "zero?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e0a"} {:created-at 1587669222475, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nat-int?", :ns "clojure.core"}, :_id "5ea1e8e6e4b087629b5a18e1"} {:created-at 1609194007084, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pos-int?", :ns "clojure.core"}, :_id "5fea5a17e4b0b1e3652d7424"}], :line 1247, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/7412474?v=3", :account-source "github", :login "Lacty"}], :body "user=> (pos? 1)\ntrue\nuser=> (pos? 0)\nfalse\nuser=> (pos? -1)\nfalse", :created-at 1279074734000, :updated-at 1471000907146, :_id "542692cdc026201cdc326cff"} {:updated-at 1471000959608, :created-at 1471000959608, :author {:login "Lacty", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7412474?v=3"}, :body "user=> (pos? 0.1)\ntrue\nuser=> (pos? -0.1)\nfalse", :_id "57adb17fe4b0bafd3e2a04ec"} {:updated-at 1598394302046, :created-at 1598394302046, :author {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}, :body "user=> (pos? 1/2)\n;; true\n\nuser=> (pos? -1/2)\n;; false\n\nuser=> (pos? {})\n;; Execution error (ClassCastException) at user/eval3795 (REPL:1).\n;; clojure.lang.PersistentArrayMap cannot be cast to java.lang.Number", :_id "5f458fbee4b0b1e3652d73ab"}], :notes nil, :arglists ["num"], :doc "Returns true if num is greater than zero, else false", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/pos_q"} {:added "1.2", :ns "clojure.core", :name "fnil", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1548717313952, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "partial", :ns "clojure.core"}, :_id "5c4f8d01e4b0ca44402ef656"} {:created-at 1548717329309, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "comp", :ns "clojure.core"}, :_id "5c4f8d11e4b0ca44402ef657"} {:created-at 1548717337353, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "juxt", :ns "clojure.core"}, :_id "5c4f8d19e4b0ca44402ef658"} {:created-at 1608656139520, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "or", :ns "clojure.core"}, :_id "5fe2250be4b0b1e3652d741a"} {:created-at 1609357960896, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "some-fn", :ns "clojure.core"}, :_id "5fecda88e4b0b1e3652d7426"}], :line 6556, :examples [{:author {:login "looselytyped", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9bfc2e772db334c8b8516c86b9da7a0c?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :body ";; a function that expects a non-nil value\n(defn say-hello [name] (str \"Hello \" name))\n;;=> #'user/say-hello\n\n;; fnil lets you create another function with a default\n;; arg in case it is passed a nil\n(def say-hello-with-defaults (fnil say-hello \"World\"))\n;;=> #'user/say-hello-with-defaults\n\n;; the happy path works as you would expect\n(say-hello-with-defaults \"Sir\")\n;;=> \"Hello Sir\"\n\n;; but in the case that the function is passed a nil it will use the \n;; default supplied to fnil\n(say-hello-with-defaults nil)\n;;=> \"Hello World\"\n\n;; this works with different arities too\n(defn say-hello [first other] (str \"Hello \" first \" and \" other))\n;;=> #'user/say-hello\n\n;; lets create it with defaults\n(def say-hello-with-defaults (fnil say-hello \"World\" \"People\"))\n;;=> #'user/say-hello-with-defaults\n\n;; call the function with all nil args - notice it uses the defaults\n;; supplied to fnil\n(say-hello-with-defaults nil nil)\n;;=> \"Hello World and People\"\n\n;; any of the args can be nil - the function will supply \n;; the default supplied with fnil\n(say-hello-with-defaults \"Sir\" nil)\n;;=> \"Hello Sir and People\"\n\n;; and again - notice that \"World\" is the default here\n(say-hello-with-defaults nil \"Ma'am\")\n;;=> \"Hello World and Ma'am\"\n\n;; or pass all args \n(say-hello-with-defaults \"Sir\" \"Ma'am\")\n;;=> \"Hello Sir and Ma'am\"\n", :created-at 1284845008000, :updated-at 1412880276286, :_id "542692cdc026201cdc326ce4"} {:body ";; Treat nil as 0 for the purposes of incrementing\n((fnil inc 0) nil)\n;;=> 1\n;; While the following would not work:\n(inc nil)\n;;=> NullPointerException clojure.lang.Numbers.ops (Numbers.java:961)\n\n;; fnil is very useful for specifying default values when updating maps\n;; For a map containing counters of keys:\n(update-in {:a 1} [:a] inc)\n;;=> {:a 2}\n\n;; Oops, our map does not have a key :b and update-in passes nil to inc\n(update-in {:a 1} [:b] inc)\n;;=> NullPointerException clojure.lang.Numbers.ops (Numbers.java:961)\n\n;; But if we use fnil it works:\n(update-in {:a 1} [:b] (fnil inc 0))\n;;=> {:b 1, :a 1}\n\n;; Another example is when map values are collections and we don't want\n;; default behavior of conj with nil that produces a list\n(conj nil 1)\n;;=> (1)\n;; I.e.\n(update-in {} [:a] conj 1)\n;;=> {:a (1)}\n\n;; But say we want map values to be vectors instead:\n(update-in {} [:a] (fnil conj []) 1)\n;;=> {:a [1]}", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1422935102507, :updated-at 1422935102507, :_id "54d0443ee4b0e2ac61831cf7"} {:editors [{:login "KyleErhabor", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/40676441?v=4"}], :body ";;; Note that `fnil` still requires the appropriate number of arguments for an\n;;; arity (i.e. no \"implicit\" default)\n\n(def tempids {-1 1\n -2 2\n -3 3})\n\n(def id (fnil get nil -1))\n\n;; You may expect `fnil` to implicitly add -1 as the last argument, but that's\n;; not true.\n(id tempids)\n;;=> ArityException: Wrong number of args (1) passed to: clojure.core/fnil/fn--...\n\n;; But it will here, since the argument is there (as `nil`).\n(id tempids nil)\n;;=> 1\n\n;; Of course, you can supply it explicitly.\n(id tempids -1)\n;;=> 1", :author {:avatar-url "https://avatars.githubusercontent.com/u/40676441?v=4", :account-source "github", :login "KyleErhabor"}, :created-at 1642980269186, :updated-at 1642980293301, :_id "61ede3ade4b0b1e3652d75a1"}], :notes nil, :arglists ["f x" "f x y" "f x y z"], :doc "Takes a function f, and returns a function that calls f, replacing\n a nil first argument to f with the supplied value x. Higher arity\n versions can replace arguments in the second and third\n positions (y, z). Note that the function f can take any number of\n arguments, not just the one(s) being nil-patched.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/fnil"} {:added "1.0", :ns "clojure.core", :name "merge-with", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1294676734000, :author {:login "Nebulus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/61aa4140c24b0cded6b20d88200e7f16?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "merge", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e16"}], :line 3051, :examples [{:author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :editors [{:login "nipra", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/142529?v=3"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/39192?v=3", :account-source "github", :login "mlanza"}], :body "(merge-with into\n\t {\"Lisp\" [\"Common Lisp\" \"Clojure\"]\n\t \"ML\" [\"Caml\" \"Objective Caml\"]}\n\t {\"Lisp\" [\"Scheme\"]\n\t \"ML\" [\"Standard ML\"]})\n;;=> {\"Lisp\" [\"Common Lisp\" \"Clojure\" \"Scheme\"], \"ML\" [\"Caml\" \"Objective Caml\" \"Standard ML\"]}", :created-at 1279052705000, :updated-at 1495768299408, :_id "542692cec026201cdc326dce"} {:author {:login "fogus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5aa24eee4238e1e964210ed447e8dc91?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; merge two maps using the addition function\n\n(merge-with + \n {:a 1 :b 2}\n {:a 9 :b 98 :c 0}) \n;;=> {:c 0, :a 10, :b 100}", :created-at 1279058935000, :updated-at 1422375185880, :_id "542692cec026201cdc326dd1"} {:updated-at 1422375228363, :created-at 1279059124000, :body ";; 'merge-with' works with an arbitrary number of maps:\n\n(merge-with + \n {:a 1 :b 2}\n {:a 9 :b 98 :c 0}\n {:a 10 :b 100 :c 10}\n {:a 5}\n {:c 5 :d 42})\n \n;;=> {:d 42, :c 15, :a 25, :b 200}", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"} {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"} {:avatar-url "https://www.gravatar.com/avatar/5aa24eee4238e1e964210ed447e8dc91?r=PG&default=identicon", :account-source "clojuredocs", :login "fogus"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :author {:avatar-url "https://www.gravatar.com/avatar/5aa24eee4238e1e964210ed447e8dc91?r=PG&default=identicon", :account-source "clojuredocs", :login "fogus"}, :_id "542692cec026201cdc326dd3"} {:author {:login "jaley", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d8dc27aff613e5972bb6af8521a07891?r=PG&default=identicon"}, :editors [{:login "Iceland_jack", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c889e0a95a3bb07f90ab28ad442f1127?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; Use union to merge sets of elements\n(use 'clojure.set)\n(merge-with union\n {:a #{1 2 3}, :b #{4 5 6}}\n {:a #{2 3 7 8}, :c #{1 2 3}})\n\n;;=> {:c #{1 2 3}, :a #{1 2 3 7 8}, :b #{4 5 6}}", :created-at 1325882151000, :updated-at 1422375252797, :_id "542692d4c026201cdc32700f"} {:body ";; Demonstrating difference between merge and merge-with\n\n;; For merge the value from the right-most map wins:\n(merge {:a 1} {:a 2} {:a 3})\n;;=> {:a 3}\n\n;; while for merge-with values are merged (with function + in this example):\n(merge-with + {:a 1} {:a 2} {:a 3})\n;;=> {:a 6}", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1422935798019, :updated-at 1423014440333, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :_id "54d046f6e4b0e2ac61831cf8"} {:body ";; Use merge-with and merge to merge values that are one level deep maps.\n\n(merge-with merge {:x {:y 1}} {:x {:z 2}})\n;;=> {:x {:z 2, :y 1}}\n\n;; Deeper maps are not merged:\n(merge-with merge {:x {:y {:a 1}}} {:x {:y {:b 2}}})\n;;=>{:x {:y {:b 2}}}", :author {:login "dmos62", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2715476?v=3"}, :created-at 1427644396920, :updated-at 1427644529515, :editors [{:login "dmos62", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2715476?v=3"}], :_id "55181fece4b08eb9aa0a8d3c"} {:updated-at 1448314167339, :created-at 1448313757814, :author {:login "mlanza", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/39192?v=3"}, :body ";;Use into to avoid losing the shape (i.e. a vector) of the original data:\n(merge-with into\n\t {\"Lisp\" [\"Common Lisp\" \"Clojure\"]\n\t \"ML\" [\"Caml\" \"Objective Caml\"]}\n\t {\"Lisp\" [\"Scheme\"]\n\t \"ML\" [\"Standard ML\"]})\n;;=> {\"Lisp\" [\"Common Lisp\" \"Clojure\" \"Scheme\"], \"ML\" [\"Caml\" \"Objective Caml\" \"Standard ML\"]}\n\n;;No need to use type-specific verbs such as union:\n(merge-with into\n {:a #{1 2 3}, :b #{4 5 6}}\n {:a #{2 3 7 8}, :c #{1 2 3}})\n;;=> {:c #{1 2 3}, :a #{1 2 3 7 8}, :b #{4 5 6}}", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/39192?v=3", :account-source "github", :login "mlanza"}], :_id "5653839de4b0be225c0c4799"} {:editors [{:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}], :body ";; Note that merge-with is fundamentally additive, which can have unintuitive\n;; consequences if you are using a subtractive operation.\n(require '[clojure.set :as set])\n\n;; Subtract members of one set from another with the same keys:\n\n(merge-with set/difference {:a #{1 2 3}} {:a #{1}})\n;;=> {:a #{3 2}}\n\n(merge-with set/difference {:a #{1 2 3} :b #{2}} {:a #{1} :b #{4}})\n;;=> {:a #{3 2}, :b #{2}}\n\n;; If a key in the second map doesn't occur in the first, (merge-with) will \n;; simply copy it as in (merge), and the passed-in function will not be called:\n\n(merge-with set/difference {:a #{1 2 3}} {:a #{1} :z #{4}})\n;;=> {:a #{3 2}, :z #{4}}\n\n;; The solution in this case is to ensure that both maps have the same keys:\n\n(merge-with set/difference {:a #{1 2 3} :z #{}} {:a #{1} :z #{4}})\n;;=> {:a #{3 2}, :z #{}}", :author {:avatar-url "https://avatars.githubusercontent.com/u/94482?v=3", :account-source "github", :login "timgilbert"}, :created-at 1488321014610, :updated-at 1488321184789, :_id "58b5f9f6e4b01f4add58fe67"} {:updated-at 1535151143457, :created-at 1535149114035, :author {:login "dijonkitchen", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4"}, :body "(defn deep-merge-with\n \"Like merge-with, but merges maps recursively, applying the given fn\n only when there's a non-map at a particular level.\n (deep-merge-with + {:a {:b {:c 1 :d {:x 1 :y 2}} :e 3} :f 4}\n {:a {:b {:c 2 :d {:z 9} :z 3} :e 100}})\n -> {:a {:b {:z 3, :c 3, :d {:z 9, :x 1, :y 2}}, :e 103}, :f 4}\"\n [f & maps]\n (apply\n (fn m [& maps]\n (if (every? map? maps)\n (apply merge-with m maps)\n (apply f maps)))\nmaps))\n\n(deep-merge-with + {:a {:b {:c 1 :d {:x 1 :y 2}} :e 3} :f 4}\n {:a {:b {:c 2 :d {:z 9} :z 3} :e 100}})\n;; {:a {:b {:z 3, :c 3, :d {:z 9, :x 1, :y 2}}, :e 103}, :f 4}\n\n(deep-merge-with + {:foo {:bar {:baz 1}}}\n {:foo {:bar {:baz 6 :qux 42}}})\n;; {:foo {:bar {:baz 7, :qux 42}}}\n\n;; Source: https://clojure.github.io/clojure-contrib/map-utils-api.html#clojure.contrib.map-utils/deep-merge-with", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4", :account-source "github", :login "dijonkitchen"}], :_id "5b80843ae4b00ac801ed9e74"} {:updated-at 1590172835865, :created-at 1590172728020, :author {:login "themustafabasit", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/24441401?v=4"}, :body "\n;; I will be explaining it From java perspective\n\n;; merge-with is like conflict resolver function that \n;; we have in java - map.merge(key, val, (v1, v2)-> ...... )\n\n;; resolve conflict by discarding second value\n(defn conflict-resolver\n [v1 v2]\n (println \"conflict is between these values: \" v1 v2 ) \n v1)\n\n(merge-with conflict-resolver\n {:a 2 :b 4 :c 5}\n {:a 1}\n {:a 9 :b 3 :c 10 :d 3})\n;; => conflict is between these values: 2 1 - a,a\n;; conflict is between these values: 2 9 - new a, a\n;; conflict is between these values: 4 3 - b,b\n;; conflict is between these values: 5 10 - c,c\n;; {:a 2, :b 4, :c 5, :d 3}\n\n\n;; example - 2\n\n;; resolve conflict by adding both values\n(defn conflict-resolver\n [v1 v2]\n (println \"conflict is between these values: \" v1 v2)\n (+ v1 v2))\n\n(merge-with conflict-resolver\n {:a 2 :b 4 :c 5}\n {:a 1}\n {:a 9 :b 3 :c 10 :d 3})\n;; => conflict is between these values: 2 1 - a,a\n;; conflict is between these values: 3 9 - new a, a\n;; conflict is between these values: 4 3 - b,b\n;; conflict is between these values: 5 10 - c,c\n;; {:a 12, :b 7, :c 15, :d 3}\n\n", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/24441401?v=4", :account-source "github", :login "themustafabasit"}], :_id "5ec81c38e4b087629b5a1912"} {:updated-at 1637867197307, :created-at 1637867197307, :author {:login "joshuamzm", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10285345?v=4"}, :body ";; deep-merge version of clojure.core/merge\n\n(defn deep-merge [& maps]\n (letfn [(reconcile-keys [val-in-result val-in-latter]\n (if (and (map? val-in-result)\n (map? val-in-latter))\n (merge-with reconcile-keys val-in-result val-in-latter)\n val-in-latter))\n (reconcile-maps [result latter]\n (merge-with reconcile-keys result latter))]\n (reduce reconcile-maps maps)))\n\n(deep-merge\n {:a 1 :b {:c {:g 99} :d 3}}\n {:a 10 :b {:c {:g 98} :e 4}}\n {:a 100 :b {:c {:g 97} :e 40 :f 5}})\n\n;; => {:a 100, :b {:c {:g 97}, :d 3, :e 40, :f 5}}\n\n;; Take into account processing latter maps with non-maps values \"override\"\n;; previously seen map values.\n\n(deep-merge\n {:deep {:deeep {:a 1}}}\n {:deep {:deeep {:b 2}}}\n {:a 34 :deep 8 :v 3})\n\n;; => {:deep 8, :a 34, :v 3}\n\n;; We decided to define reconcile-maps, which is the then-branch expression\n;; of the if within reconcile-keys. This way, using reduce will throw errors\n;; as when using merge-with with non-map arguments.\n\n(deep-merge 1 {:a 1})\n\n;; IllegalArgumentException contains? not supported on type: java.lang.Long ...\n\n(deep-merge {:a 1} 2)\n\n;; IllegalArgumentException Don't know how to create ISeq from: java.lang.Long ...\n\n\n\n;; Reviewed and help received from github.com/datz", :_id "619fdebde4b0b1e3652d757a"}], :notes nil, :arglists ["f & maps"], :doc "Returns a map that consists of the rest of the maps conj-ed onto\n the first. If a key occurs in more than one map, the mapping(s)\n from the latter (left-to-right) will be combined with the mapping in\n the result by calling (f val-in-result val-in-latter).", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/merge-with"} {:added "1.3", :ns "clojure.core", :name "nthrest", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1356088808000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "drop", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ddb"} {:created-at 1356088885000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "nthnext", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ddc"} {:created-at 1356088888000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "nth", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ddd"} {:created-at 1505013505146, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "rest", :ns "clojure.core"}, :_id "59b4af01e4b09f63b945ac68"} {:created-at 1505013511258, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "next", :ns "clojure.core"}, :_id "59b4af07e4b09f63b945ac69"}], :line 3174, :examples [{:author {:login "jmglov", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/67e9a6f766dc4b30bd5e9ff3e77c1777?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(nthrest (range 10) 5)\n;;=> (5 6 7 8 9)\n\n;; in many cases gives the same result as nthnext\n(nthnext (range 10) 5)\n;;=> (5 6 7 8 9)\n\n;; here is a case where the results differ\n(nthrest [] 3) ;;=> []\n(nthnext [] 3) ;;=> nil\n\n(nthrest [1 2 3 4 5 6 7] 4)\n;;=> (5 6 7)", :created-at 1338817014000, :updated-at 1420737060810, :_id "542692d4c026201cdc327021"} {:body ";; drop is also similar, but lazy \n(nthrest (range 10) 5) ;;=> (5 6 7 8 9)\n(drop 5 (range 10)) ;;=> (5 6 7 8 9)\n\n;; here is a case where the results differ\n(nthrest [] 3) ;;=> []\n(drop 3 []) ;;=> () ; returning a lazy sequence", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1420737465554, :updated-at 1420737465554, :_id "54aebbb9e4b0e2ac61831c98"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; nthrest eagerly evaluates the dropped items:\n\n(def a (nthrest (map #(do (print \".\") %) (iterate inc 0)) 10))\n;; ..........#'user/a (note: processing already started)\n\n(def b (drop 10 (map #(do (print \".\") %) (iterate inc 0))))\n;; #'user/b (note: no evaluation)\n\n;; Possible use: always produce side effects (if any) independently \n;; from evaluation of kept items.", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1521467358474, :updated-at 1521467381232, :_id "5aafbfdee4b0316c0f44f92d"} {:updated-at 1661527937101, :created-at 1661527937101, :author {:login "jimka2001", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6414129?v=4"}, :body ";; nthrest returns a suffix of the given sequence", :_id "6308e781e4b0b1e3652d7652"}], :notes [{:updated-at 1356088840000, :body "This differs from clojure.core/drop in that it immediately drops the head of the seq, instead of doing so on the first call to first or seq.", :created-at 1356088381000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :_id "542692edf6e94c6970521ff9"}], :arglists ["coll n"], :doc "Returns the nth rest of coll, coll when n is 0.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/nthrest"} {:added "1.0", :ns "clojure.core", :name "load", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1286271399000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "load-file", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c29"} {:created-at 1352963712000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "*read-eval*", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c2a"} {:created-at 1519290672082, :author {:login "witek", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/209520?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "load-string", :ns "clojure.core"}, :_id "5a8e8930e4b0316c0f44f8ea"}], :line 6109, :examples [{:updated-at 1546453955894, :created-at 1307936370000, :body ";; file located at src/address_book/core.clj and current namespace\n;; located at root of the classpath, such as \"user\".\n\n(load \"address_book/core\")", :editors [{:avatar-url "https://www.gravatar.com/avatar/1c0c20072f52de3a6335cae183b865f6?r=PG&default=identicon", :account-source "clojuredocs", :login "lambder"} {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/1c0c20072f52de3a6335cae183b865f6?r=PG&default=identicon", :account-source "clojuredocs", :login "lambder"}, :_id "542692cbc026201cdc326c1b"} {:updated-at 1546454215490, :created-at 1546454215490, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Loading from root of the classpath, such as user namespace\n\n(ns user)\n(load \"/clojure/set\")\n;; nil\n\n;; Loading \"clojure/xml.clj\" from a relative location in the classpath \n;; does not want the \"/\"\n\n(ns clojure.set)\n(load \"xml\")\n;; nil", :_id "5c2d04c7e4b0ca44402ef60b"}], :notes nil, :arglists ["& paths"], :doc "Loads Clojure code from resources in classpath. A path is interpreted as\n classpath-relative if it begins with a slash or relative to the root\n directory for the current namespace otherwise.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/load"} {:added "1.0", :ns "clojure.core", :name "if-not", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1334293416000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "if", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e44"} {:created-at 1374149749000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "when-not", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e45"}], :line 767, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (defn has-neg [coll] \n (if-not (empty? coll) ;; = (if (not (empty? coll)) ...\n (or (neg? (first coll)) (recur (rest coll)))))\n#'user/has-neg\n\nuser=> (has-neg [])\nnil \n\nuser=> (has-neg [1 2 -3 4])\ntrue", :created-at 1280505406000, :updated-at 1332951095000, :_id "542692c6c026201cdc32692d"} {:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (if-not (zero? 0) :then :else)\n:else", :created-at 1280506136000, :updated-at 1332951114000, :_id "542692c6c026201cdc32692f"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; See examples for \"if\" explaining Clojure's idea of logical true\n;; and logical false.", :created-at 1334293411000, :updated-at 1334293411000, :_id "542692d3c026201cdc326fcd"}], :macro true, :notes nil, :arglists ["test then" "test then else"], :doc "Evaluates test. If logical false, evaluates and returns then expr, \n otherwise else expr, if supplied, else nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/if-not"} {:ns "clojure.core", :name "*verbose-defrecords*", :file "clojure/core_print.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 39, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*verbose-defrecords*"} {:added "1.0", :ns "clojure.core", :name "sequential?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1304804232000, :author {:login "0x89", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/56bc4acd59315ed4dc1cb99c3be71102?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "seq?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d22"} {:created-at 1304804263000, :author {:login "0x89", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/56bc4acd59315ed4dc1cb99c3be71102?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "coll?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d23"} {:created-at 1521067928760, :author {:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "seqable?", :ns "clojure.core"}, :_id "5aa9a798e4b0316c0f44f925"}], :line 6250, :examples [{:updated-at 1437503203443, :created-at 1284875508000, :body "user=> (sequential? '(1 2 3))\ntrue\n\nuser=> (sequential? [1 2 3])\ntrue\n\nuser=> (sequential? (range 1 5))\ntrue\n\nuser=> (sequential? '())\ntrue\n\nuser=> (sequential? [])\ntrue\n\nuser=> (sequential? nil)\nfalse\n\nuser=> (sequential? 1)\nfalse\n\nuser=> (sequential? \"abc\")\nfalse\n\nuser=> (sequential? {:a 2 :b 1})\nfalse\n\nuser=> (sequential? #{1 2 3})\nfalse", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"} {:avatar-url "https://www.gravatar.com/avatar/65f765955a0a25d112d33528ae6f811b?r=PG&default=identicon", :account-source "clojuredocs", :login "pmbauer"} {:login "lijunle", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1296500?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/e2051c4ebaaa8c22fa9c0bb2f32f64fd?r=PG&default=identicon", :account-source "clojuredocs", :login "rustem.suniev"}, :_id "542692c6c026201cdc3268f4"} {:updated-at 1660931114232, :created-at 1660931114232, :author {:login "KGOH", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/11963737?v=4"}, :body ";; Be careful while traversing data:\n;; map entries are vectors and thus sequential!\n\nuser=> (sequential? (first {:a 1}))\ntrue\n\nuser=> (sequential? (clojure.lang.MapEntry. :a 1))\ntrue\n\nuser=> (vector? (first {:a 1}))\ntrue\n\nuser=> (vector? (clojure.lang.MapEntry. :a 1))\ntrue\n\nuser=> (clojure.walk/postwalk\n #(cond-> % (sequential? %) set)\n {:a [1 1 2 3]})\n; Unhandled java.lang.ClassCastException\n; class clojure.lang.PersistentHashSet cannot be cast to class\n; java.util.Map$Entry (clojure.lang.PersistentHashSet is in unnamed module of\n; loader 'app'; java.util.Map$Entry is in module java.base of loader\n; 'bootstrap')\n\nuser=> (clojure.walk/postwalk\n #(cond-> %\n (and (sequential? %)\n (not (map-entry? %)))\n set)\n {:a [1 1 2 3]})\n{:a #{1 3 2}}\n", :_id "62ffcc2ae4b0b1e3652d763f"}], :notes [{:author {:login "zackteo", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/7510179?v=4"}, :updated-at 1603928204513, :created-at 1603927987239, :body "Of the four key collection types, vectors and lists are ordered (aka sequential). Sets and maps are not.", :_id "5f99ffb3e4b0b1e3652d73f9"}], :arglists ["coll"], :doc "Returns true if coll implements Sequential", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/sequential_q"} {:added "1.0", :ns "clojure.core", :name "*print-level*", :file "clojure/core_print.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 27, :examples [{:body "user=> *print-level*\nnil\nuser=> [1 [2 [3]]]\n[1 [2 [3]]]\n\nuser=> (set! *print-level* 2)\n2\nuser=> [1 [2 [3]]]\n[1 [2 #]]", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423526085099, :updated-at 1423526085099, :_id "54d948c5e4b081e022073c7f"}], :notes nil, :arglists [], :doc "*print-level* controls how many levels deep the printer will\n print nested objects. If it is bound to logical false, there is no\n limit. Otherwise, it must be bound to an integer indicating the maximum\n level to print. Each argument to print is at level 0; if an argument is a\n collection, its items are at level 1; and so on. If an object is a\n collection and is at a level greater than or equal to the value bound to\n *print-level*, the printer prints '#' to represent it. The root binding\n is nil indicating no limit.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*print-level*"} {:added "1.2", :ns "clojure.core", :name "shuffle", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1434034887985, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:ns "clojure.core", :name "rand-nth", :library-url "https://github.com/clojure/clojure"}, :_id "5579a2c7e4b03e2132e7d18b"} {:created-at 1554235245442, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "random-sample", :ns "clojure.core"}, :_id "5ca3bf6de4b0ca44402ef6fa"}], :line 7274, :examples [{:updated-at 1578337855496, :created-at 1282319846000, :body ";; Make five permutations of the [1 2 3] vector.\n;; Always returns a vector.\n(repeatedly 5 (partial shuffle [1 2 3]))\n;;=> ([2 3 1] [2 1 3] [2 3 1] [3 2 1] [3 1 2])\n\n(shuffle (list 1 2 3))\n;;=> [2 1 3]", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"} {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon", :account-source "clojuredocs", :login "pkolloch"}, :_id "542692cac026201cdc326b48"}], :notes nil, :arglists ["coll"], :doc "Return a random permutation of coll", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/shuffle"} {:added "1.1", :ns "clojure.core", :name "boolean-array", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 5285, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}], :body ";; create an array of Java boolean's using boolean-array\n;; and demonstrate that it can be used for input into the standard\n;; Java Arrays.fill function\n\nuser=> (def bs (boolean-array (map even? (range 3 10))))\n#'user/bs\nuser=> (type bs)\n[Z\nuser=> (vec bs)\n[false true false true false true false]\nuser=> (java.util.Arrays/fill bs 3 7 false)\nnil\nuser=> (vec bs)\n[false true false false false false false]\nuser=>", :created-at 1313908154000, :updated-at 1313963403000, :_id "542692c7c026201cdc326947"}], :notes nil, :arglists ["size-or-seq" "size init-val-or-seq"], :doc "Creates an array of booleans", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/boolean-array"} {:added "1.0", :ns "clojure.core", :name "find", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1360286923000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "get", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e77"} {:created-at 1360286926000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "get-in", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e78"} {:created-at 1527108492940, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "contains?", :ns "clojure.core"}, :_id "5b05d38ce4b045c27b7fac76"} {:created-at 1548452405616, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "select-keys", :ns "clojure.core"}, :_id "5c4b8235e4b0ca44402ef62d"}], :line 1534, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "alexander-yakushev", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/468477?v=2"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"}], :body "(find {:a 1 :b 2 :c 3} :a)\n;;=> [:a 1]\n\n(find {:a nil} :a)\n;;=> [:a nil]\n\n(find {:a 1 :b 2 :c 3} :d)\n;;=> nil \n", :created-at 1280345792000, :updated-at 1548452497936, :_id "542692cfc026201cdc326e3e"} {:author {:login "Nevena", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fa0e495ccb6ed2997e14f687817e9299?r=PG&default=identicon"}, :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"} {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :body ";; Note for these examples: as the authoritative documentation speaks only about\n;; map (as first parameter), passing anything else (e.g. a vector, like below)\n;; uses an undocumented behavior, which can change anytime and so is unreliable and\n;; should be avoided.\n\nuser=> (find [:a :b :c :d] 2)\n[2 :c]\n\nuser=> (find [:a :b :c :d] 5)\nnil\n\nuser=> (find [1 2 3] 4294967296)\n[4294967296 1]", :created-at 1305594606000, :updated-at 1582483198869, :_id "542692cfc026201cdc326e3f"}], :notes nil, :arglists ["map key"], :doc "Returns the map entry for key, or nil if key not present.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/find"} {:added "1.0", :ns "clojure.core", :name "alength", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1512468544768, :author {:login "tentamen", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/58513?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "into-array", :ns "clojure.core"}, :_id "5a267040e4b0a08026c48ccc"}], :line 3898, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [], :body "user=> (def my-array (into-array Integer/TYPE [1 2 3]))\n#'user/my-array\n\nuser=> (alength my-array)\n3", :created-at 1286508271000, :updated-at 1286508271000, :_id "542692cfc026201cdc326e13"} {:editors [{:login "zezhenyan", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8064559?v=3"}], :body "2D simple array example\nuser=> (def a (to-array-2d [[1 2] [3 4 5] [1]]))\n#'user/a\nuser=> (alength a)\n3\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/8064559?v=3", :account-source "github", :login "zezhenyan"}, :created-at 1486712507911, :updated-at 1486712552508, :_id "589d6ebbe4b01f4add58fe42"}], :notes nil, :arglists ["array"], :doc "Returns the length of the Java array. Works on arrays of all\n types.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/alength"} {:added "1.0", :ns "clojure.core", :name "bit-xor", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1414514653495, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "bit-and", :library-url "https://github.com/clojure/clojure"}, :_id "544fc7dde4b03d20a1024293"} {:created-at 1414514668964, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "bit-or", :library-url "https://github.com/clojure/clojure"}, :_id "544fc7ece4b03d20a1024294"}], :line 1311, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; set bits to 1 where bits of the arguments are different\nuser=> (bit-xor 2r1100 2r1001) \n5 \n;; 5 = 2r0101\n\n", :created-at 1280338778000, :updated-at 1285496577000, :_id "542692c7c026201cdc3269b3"} {:body ";; here is the truth table for XOR \n(Integer/toBinaryString (bit-xor 2r1100 2r1010) )\n;;=> \"110\"\n;; or 2r0110", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1414514637281, :updated-at 1414514637281, :_id "544fc7cde4b03d20a1024292"}], :notes nil, :arglists ["x y" "x y & more"], :doc "Bitwise exclusive or", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bit-xor"} {:added "1.1", :ns "clojure.core", :name "deliver", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1324962689000, :author {:login "neotyk", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/366ff985977b3aab09510bc335cd44a4?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "promise", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bba"}], :line 7127, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (def x (promise))\n#'user/x\n;; Trying to deref at this point will make your repl wait forever\n\n\nuser=> (deliver x 100)\n#<core$promise$reify__5534@4369a50b: 100>\n\n;; the promise has been delivered, deref x will return immediately\nuser=> @x\n100\n", :created-at 1280748782000, :updated-at 1285495947000, :_id "542692c8c026201cdc326a04"} {:author {:login "neotyk", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/366ff985977b3aab09510bc335cd44a4?r=PG&default=identicon"}, :editors [], :body ";; Create a promise\nuser> (def p (promise))\n#'user/p ; p is our promise\n\n;; Check if was delivered/realized\nuser> (realized? p)\nfalse ; No yet\n\n;; Delivering the promise\nuser> (deliver p 42)\n#\n\n;; Check again if it was delivered\nuser> (realized? p)\ntrue ; Yes!\n\n;; Deref to see what has been delivered\nuser> @p\n42\n\n;; Note that @ is shorthand for deref\nuser> (deref p)\n42", :created-at 1324962699000, :updated-at 1324962699000, :_id "542692d2c026201cdc326f8c"} {:editors [{:login "JoshAaronJones", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19951591?v=3"}], :body ";; Illustrates how threads can work together via promises\n;; First, an example to show a future that delivers\n\nuser=> (def p (promise))\n#'user/p\n\n;; future that will deliver the promise from another thread after 10 sec delay\nuser=> (future\n (Thread/sleep 10000)\n (deliver p 123))\n#future[{:status :pending, :val nil} 0x9a51df1]\n\n;; within 10 seconds dereference p, and wait for delivery of the value\nuser=> @p\n123\n\n\n;; Now, an example to show a future that blocks while waiting for a promise\n;; to be delivered -- this is used to achieve callback-style functionality\n\n;; redefine p\nuser=> (def p (promise))\n#'user/p\n\n;; create a new 'callback' thread that will wait for a promise to be delivered\nuser=> (future\n (println \"About to block while waiting for 'p'\")\n (println \"Now I can do some work with the value \" @p))\nAbout to block while waiting for 'p'\n#future[{:status :pending, :val nil} 0x1737df29]\n\n;; deliver the promise, triggering the blocking callback thread\nuser=> (deliver p 123)\nNow I can do some work with the value 123\n#promise[{:status :ready, :val 123} 0x674a4c4a]", :author {:avatar-url "https://avatars.githubusercontent.com/u/19951591?v=3", :account-source "github", :login "JoshAaronJones"}, :created-at 1474382307145, :updated-at 1474387055629, :_id "57e149e3e4b0709b524f0503"} {:updated-at 1618026011033, :created-at 1618026011033, :author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :body ";; `deliver` returns the promise and can be dereffed directly.\n\n(def my-prom (promise)) \nmy-prom ;;=> #promise[{:status :pending, :val nil} 0x2570a72d]\n@(deliver my-prom \"Huzzah!\") ;;=> \"Huzzah!\"\nmy-prom ;;=> #promise[{:status :ready, :val nil} 0x2570a72d]\n@my-prom ;;=> \"Huzzah!\"", :_id "60711e1be4b0b1e3652d74bf"}], :notes [{:updated-at 1385511406000, :body "As of Clojure 1.3 `deliver` does not throw an exception when it is called multiple times on the same promise. See [CLJ-1038](http://dev.clojure.org/jira/browse/CLJ-1038).", :created-at 1385511406000, :author {:login "gyim", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/14df9ffd78d1e7062ac317d8bcfcde9f?r=PG&default=identicon"}, :_id "542692edf6e94c6970522012"}], :arglists ["promise val"], :doc "Delivers the supplied value to the promise, releasing any pending\n derefs. A subsequent call to deliver on a promise will have no effect.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/deliver"} {:added "1.0", :ns "clojure.core", :name "doseq", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1296708559000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "doall", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d9a"} {:created-at 1296708565000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "dorun", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d9b"} {:created-at 1318959035000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "for", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d9c"} {:created-at 1340037689000, :author {:login "Parijat Mishra", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e3aba44539a78ea92373418456f090e3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "dotimes", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d9d"} {:created-at 1502125400318, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "run!", :ns "clojure.core"}, :_id "59889d58e4b0d19c2ce9d70c"}], :line 3216, :examples [{:updated-at 1639218963535, :created-at 1279807621000, :body ";; Multiplies every x by every y.\n\n(doseq [x [-1 0 1]\n y [1 2 3]] \n (prn (* x y)))\n-1 ; x -1 y 1\n-2 ; x -1 y 2\n-3 ; x -1 y 3\n0 ; x 0 y 1\n0 ; x 0 y 2\n0 ; x 0 y 3\n1 ; x 1 y 1\n2 ; x 1 y 2\n3 ; x 1 y 3\nnil\n\n;; Notice that y is iterated over for every x. x could be seen as the 'outer' loop", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/164033?v=3", :account-source "github", :login "justgage"} {:login "bkovitz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3"} {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon", :account-source "clojuredocs", :login "devijvers"}, :_id "542692c6c026201cdc326919"} {:author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :editors [{:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (doseq [[x y] (map list [1 2 3] [1 2 3])] \n (prn (* x y)))\n1\n4\n9\nnil\n\n;; where\nuser=> (map list [1 2 3] [1 2 3])\n((1 1) (2 2) (3 3))", :created-at 1279807704000, :updated-at 1285651402000, :_id "542692c6c026201cdc32691b"} {:author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :editors [{:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "edbond", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/671af8c4a2d223c7d2e2ede3a0154975?r=PG&default=identicon"} {:login "edbond", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/671af8c4a2d223c7d2e2ede3a0154975?r=PG&default=identicon"} {:login "JavierJF", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2714593?v=3"}], :body "user=> (doseq [[[a b] [c d]] (map list (sorted-map :1 1 :2 2) (sorted-map :3 3 :4 4))]\n (prn (* b d)))\n3\n8\nnil\n\n;; where\nuser=> (map list (sorted-map :1 1 :2 2) (sorted-map :3 3 :4 4))\n(([:1 1] [:3 3]) ([:2 2] [:4 4]))", :created-at 1279808561000, :updated-at 1427017735128, :_id "542692c6c026201cdc32691e"} {:author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :editors [{:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Parijat Mishra", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e3aba44539a78ea92373418456f090e3?r=PG&default=identicon"}], :body "user=> (doseq [[k v] (map identity {:1 1 :2 2 :3 3})] \n (prn k v))\n:1 1\n:2 2\n:3 3\nnil\n\n;; where\nuser=> (map identity {:1 1 :2 2 :3 3})\n([:1 1] [:2 2] [:3 3])\n\n;; or simply\nuser=> (doseq [[k v] {:1 1 :2 2 :3 3}]\n (prn k v))\n:1 1\n:3 3\n:2 2\nnil", :created-at 1279817912000, :updated-at 1340037554000, :_id "542692c6c026201cdc326924"} {:author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :editors [{:login "justgage", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/164033?v=3"}], :body ";; Multiple sequences results in a Cartesian cross of their values.\nuser=> (doseq [a [1 2]\n b [3 4]]\n (println a b))\n1 3\n1 4\n2 3\n2 4\nnil", :created-at 1297827822000, :updated-at 1430494032223, :_id "542692c6c026201cdc326928"} {:author {:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"}, :editors [{:login "justgage", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/164033?v=3"}], :body ";; Keywords :let, :when, and :while are supported, the same as \"for\"\nuser=> (doseq [x (range 6)\n :when (odd? x)\n :let [y (* x x)] ]\n (println [x y]) )\n[1 1]\n[3 9]\n[5 25]\nnil\n\nuser=> (doseq [x (range 99)\n :let [y (* x x)] \n :while (< y 30)\n ]\n (println [x y]) )\n[0 0]\n[1 1]\n[2 4]\n[3 9]\n[4 16]\n[5 25]\nnil\nuser=> \n", :created-at 1403073333000, :updated-at 1430494049365, :_id "542692d2c026201cdc326f93"} {:editors [{:avatar-url "https://avatars.githubusercontent.com/u/164033?v=3", :account-source "github", :login "justgage"} {:login "bkovitz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3"}], :updated-at 1463546941294, :created-at 1427932426392, :author {:avatar-url "https://avatars.githubusercontent.com/u/11763041?v=3", :account-source "github", :login "rezomegrelidze"}, :body ";; ClojureCLR example\n;; Prints names of running processes\n\nuser=> (doseq [x (System.Diagnostics.Process/GetProcesses)] \n (println (.get_ProcessName x)))\navgnt\nSearchIndexer\nsvchost\nchrome\naudiodg\nsvchost\nmbamscheduler\nspoolsv\nnvxdsync\navwebg7\nGoogleCrashHandler64\nsvchost\nCCleaner64\nViakaraokeSrv\n...", :_id "551c850ae4b08eb9aa0a8d3d"} {:body ";; simplest use\n\nuser=> (doseq [x [1 2 3 4 5]] (prn x))\n1\n2\n3\n4\n5\nnil", :author {:login "justgage", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/164033?v=3"}, :created-at 1430431275365, :updated-at 1430494090363, :editors [{:login "justgage", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/164033?v=3"}], :_id "5542a62be4b01bb732af0a8e"} {:updated-at 1510587865249, :created-at 1510587865249, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;looping over a collection \n\n;;define CarMaker record\n(defrecord CarMaker [cm-name])\n\n;;define CarModel record\n(defrecord CarModel [model-name cmaker doors color])\n\n;;create a car-makes\n(def car-maker {\"cm1\" (->CarMaker \"Renault\")})\n\n;;createa models and add an CarMaker identifier to which model\n(def models {\n \"m1\" (->CarModel \"Megane\" \"cm1\" 3 \"Black\")\n \"m2\" (->CarModel \"Zoe\" \"cm1\" 5 \"White\")\n })\n;;println all model-name in the collection\n(doseq [[k v] models] (println (:model-name (get models k))))", :_id "5a09bdd9e4b0a08026c48cb6"} {:editors [{:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}], :body ";;doseq on vector\n(def my-vector [1 2 3 \"a\" \"b\" \"c\" :a :b :c])\n(doseq [v my-vector] (println v))\n\n;;doseq on hash-map\n(def my-map {:a \"A\" :b \"B\" :c \"C\" :d 1 :e 2 :f 3})\n(doseq [[k v] my-map] (println k \"->\" v))", :author {:avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4", :account-source "github", :login "ibercode"}, :created-at 1510917150459, :updated-at 1511258586059, :_id "5a0ec41ee4b0a08026c48cbc"} {:editors [{:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=4"}], :body "user=> (doseq [y (range 10)] \n (dotimes [z y] (print (inc z)))\n (newline))\n\n1\n12\n123\n1234\n12345\n123456\n1234567\n12345678\n123456789\nnil", :author {:avatar-url "https://avatars3.githubusercontent.com/u/46395055?v=4", :account-source "github", :login "akhuramazda"}, :created-at 1546681885708, :updated-at 1613255160130, :_id "5c307e1de4b0ca44402ef613"}], :macro true, :notes nil, :arglists ["seq-exprs & body"], :doc "Repeatedly executes body (presumably for side-effects) with\n bindings and filtering as provided by \"for\". Does not retain\n the head of the sequence. Returns nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/doseq"} {:added "1.6", :ns "clojure.core", :name "unsigned-bit-shift-right", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1412094407161, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=2"}, :to-var {:ns "clojure.core", :name "bit-shift-right", :library-url "https://github.com/clojure/clojure"}, :_id "542ad9c7e4b0df9bb778a59f"}], :line 1368, :examples [{:body "user=> (format \"%016x\" -1)\n\"ffffffffffffffff\"\n\n;; bit-shift-right sign extends most significant bit while right shifting.\nuser=> (format \"%016x\" (bit-shift-right -1 10))\n\"ffffffffffffffff\"\n\n;; unsigned-bit-shift-right fills most significant bits of result with 0.\n;; No sign extension.\nuser=> (format \"%016x\" (unsigned-bit-shift-right -1 10))\n\"003fffffffffffff\"\n", :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=2"}, :created-at 1412094902885, :updated-at 1412094902885, :_id "542adbb6e4b0df9bb778a5a5"} {:updated-at 1460044954951, :created-at 1460044954951, :author {:login "fasiha", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/37649?v=3"}, :body ";; Warning: unsigned-bit-shift-right, like bit-shift-right, treats inputs as\n;; type Long. Smaller types like byte, short, and int will not behave as such.\n(format \"0x%x\" (byte -128))\n; => \"0x80\"\n(format \"0x%x\" (unsigned-bit-shift-right (byte -128) 1))\n; => \"0x7fffffffffffffc0\"\n(format \"0x%x\" (bit-shift-right (byte -128) 1))\n; => \"0xffffffffffffffc0\"\n\n; If you expected 0x40, you need to upcast your byte yourself, via bit-and,\n; and only then shift:\n(format \"0x%x\" (bit-shift-right (bit-and 0xff (byte -128)) 1))\n; => \"0x40\"", :_id "5706849ae4b0fc95a97eab31"} {:editors [{:login "Sophia-Gold", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19278114?v=3"}], :body ";; Stein's Algorithm (Binary GCD)\n;; https://en.wikipedia.org/wiki/Binary_GCD_algorithm\n\n\n(defn gcd [a b]\n (cond\n (zero? a) b\n (zero? b) a\n (neg? a) (- a)\n (neg? b) (- b)\n (and (even? a) (even? b)) (* 2\n (gcd (unsigned-bit-shift-right a 1)\n (unsigned-bit-shift-right b 1)))\n (and (even? a) (odd? b)) (recur (unsigned-bit-shift-right a 1) b)\n (and (odd? a) (even? b)) (recur a (unsigned-bit-shift-right b 1))\n (and (odd? a) (odd? b)) (recur (unsigned-bit-shift-right\n (Math/abs (long (- a b))) ;; coerce to avoid reflection\n 1) (min a b))))\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/19278114?v=3", :account-source "github", :login "Sophia-Gold"}, :created-at 1482925072354, :updated-at 1505598794504, :_id "5863a410e4b0fd5fb1cc9646"}], :notes nil, :arglists ["x n"], :doc "Bitwise shift right, without sign-extension.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unsigned-bit-shift-right"} {:added "1.0", :ns "clojure.core", :name "neg?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1345518618000, :author {:login "cbare", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b394e97f24f3576861239e2b839703a4?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pos?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dd6"} {:created-at 1400618884000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "zero?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dd7"}], :line 1254, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "replore", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e7869fe1a48cb1814c657eaca6bea3eb?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/7412474?v=3", :account-source "github", :login "Lacty"}], :body "user=> (neg? -1)\ntrue\nuser=> (neg? 0)\nfalse\nuser=> (neg? 1)\nfalse", :created-at 1279074335000, :updated-at 1471000975948, :_id "542692c9c026201cdc326add"} {:updated-at 1471001005614, :created-at 1471001005614, :author {:login "Lacty", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7412474?v=3"}, :body "user=> (neg? -0.1)\ntrue\nuser=> (neg? 0.1)\nfalse", :_id "57adb1ade4b0bafd3e2a04ee"} {:updated-at 1598394369395, :created-at 1598394369395, :author {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}, :body "user=> (neg? 1/2)\n;; false\n\nuser=> (neg? -1/2)\n;; true\n\nuser=> (neg? {})\n;; Execution error (ClassCastException) at user/eval3801 (REPL:1).\n;; clojure.lang.PersistentArrayMap cannot be cast to java.lang.Number", :_id "5f459001e4b0b1e3652d73ac"}], :notes nil, :arglists ["num"], :doc "Returns true if num is less than zero, else false", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/neg_q"} {:added "1.0", :ns "clojure.core", :name "var-set", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1331249164000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "with-local-vars", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521df8"} {:created-at 1550004038668, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "var-get", :ns "clojure.core"}, :_id "5c632f46e4b0ca44402ef67d"}], :line 4333, :examples [{:editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=4"}], :updated-at 1638151161315, :created-at 1423523544753, :author {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"}, :body "(with-local-vars [x 1]\n (println @x)\n (var-set x 2)\n (println @x))\n;;=> 1\n;;=> 2\n", :_id "54d93ed8e4b0e2ac61831d3b"}], :notes nil, :arglists ["x val"], :doc "Sets the value in the var object to val. The var must be\n thread-locally bound.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/var-set"} {:added "1.3", :ns "clojure.core", :name "unchecked-float", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1496072900762, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "float", :ns "clojure.core"}, :_id "592c42c4e4b093ada4d4d793"}], :line 3546, :examples [{:editors [{:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}], :body "(unchecked-float 1)\n;;=> 1.0\n(unchecked-float 1.11)\n;;=> 1.11\n(unchecked-float 1.111111111111111111111111111M)\n;;=> 1.1111112\n\n;;;; Note that (unchecked-float) doesn't range check its argument.\n;;;; Use (float) instead if you want an exception to be thrown in such a case.\n\n(unchecked-float Double/MAX_VALUE)\n;;=> Infinity\n(float Double/MAX_VALUE)\n;;=> IllegalArgumentException Value out of range for float: 1.7976931348623157E308", :author {:avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3", :account-source "github", :login "svenschoenung"}, :created-at 1496072892226, :updated-at 1496073090370, :_id "592c42bce4b093ada4d4d792"}], :notes nil, :arglists ["x"], :doc "Coerce to float. Subject to rounding.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-float"} {:added "1.0", :ns "clojure.core", :name "pmap", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1281948332000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e0d"} {:created-at 1336536733000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "future", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e0e"} {:created-at 1518042635832, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pcalls", :ns "clojure.core"}, :_id "5a7b7e0be4b0316c0f44f8a8"} {:created-at 1518042700360, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pvalues", :ns "clojure.core"}, :_id "5a7b7e4ce4b0316c0f44f8a9"} {:created-at 1518042942025, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "partition", :ns "clojure.core"}, :_id "5a7b7f3ee4b0316c0f44f8af"}], :line 7012, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; This function operates just like map. See\n;; clojure.core/map for more details.\nuser=> (pmap inc [1 2 3 4 5])\n(2 3 4 5 6)", :created-at 1281948454000, :updated-at 1332952345000, :_id "542692cdc026201cdc326cf2"} {:updated-at 1462726187473, :created-at 1313254319000, :body ";; A function that simulates a long-running process by calling Thread/sleep:\n(defn long-running-job [n]\n (Thread/sleep 3000) ; wait for 3 seconds\n (+ n 10))\n\n;; Use `doall` to eagerly evaluate `map`, which evaluates lazily by default.\n\n;; With `map`, the total elapsed time is just under 4 * 3 seconds:\nuser=> (time (doall (map long-running-job (range 4))))\n\"Elapsed time: 11999.235098 msecs\"\n(10 11 12 13)\n\n;; With `pmap`, the total elapsed time is just over 3 seconds:\nuser=> (time (doall (pmap long-running-job (range 4))))\n\"Elapsed time: 3200.001117 msecs\"\n(10 11 12 13)", :editors [{:login "bkovitz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon", :account-source "clojuredocs", :login "OnesimusUnbound"}, :_id "542692cdc026201cdc326cf4"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; pmap is implemented using Clojure futures. See examples for 'future'\n;; for discussion of an undesirable 1-minute wait that can occur before\n;; your standalone Clojure program exits if you do not use shutdown-agents.", :created-at 1336536727000, :updated-at 1336536842000, :_id "542692d4c026201cdc327030"} {:updated-at 1539009726653, :created-at 1538954059979, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :body ";; Parallel application (of 'f') does NOT mean that the result collection would\n;; be sorted according to calculation time. The result collection is sorted\n;; in the same way as for map, i.e. it \"preserves\" the items' order in the 'coll'\n;; (or 'colls') parameter(s) of pmap. In other words: calculation is done parallel,\n;; but the result is delivered in the order the input came (in 'coll'/'colls').\n\n;; So, e.g. if the first item of 'coll' takes 1 hour to be processed (by 'f'), and\n;; the rest requires 1 sec, nothing is delivered by pmap during the 1st hour:\n;; the 1st item \"blocks\" the appearence of the others in the result of pmap,\n;; even if the others are already calculated. E.g. (take 5 (pmap ...) will not \n;; return in 5 secs (but in 1 hour), even if we calculated 5 items in 5 secs\n;; -- we wait for the calculations of the first five in 'coll'.\n\n;; In contrast, side effects of 'f' (if any) are coming in \"random\" order (due to\n;; parallelism): in the example above, we might see the side effects (e.g. swap!-s)\n;; of many appliactions of 'f' to different elements of 'coll', long before we \n;; get the result of (take 1 (pmap ...)).\n\n;; To illustrate the statements above, run this:\n(defn proc\n [i]\n (println \"processing: \" i \"(\" (System/currentTimeMillis) \")\")\n (Thread/sleep\n (if (= i 0)\n 5000\n 10)))\n\n(take 1 (pmap proc (range 5)))\n;; output:\n(processing: processing: processing: processing: processing: 3 42 ( ((1 \n 1539007947561( 1539007947561 ) )1539007947561 0 )\n\n1539007947561( ) 1539007947561 )\n\nnil)\n;; We can see that 5 threads are started at the same time, immediately, in parallel.\n;; 4 of them must be finished in 10 msecs, but we get back the REPL prompt\n;; only after 5 secs, because we wait for the result of the i=0 item.", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"}], :_id "5bba934be4b00ac801ed9eb3"} {:updated-at 1539007541878, :created-at 1539007541878, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :body ";; pmap is implemented using Clojure futures. Futures run in threads. \n;; These threads of a pmap's evaluation run independently from each other.\n;; This means that even if one of these threads already determined the result\n;; of the whole pmap*, all the other, already started threads keep running\n;; until they finish their own calculations. (Although these calcualtions might\n;; already be absolutely unnecessary.)\n;; This can be especially important, when these threads have side effects:\n;; these side effects (e.g. swap!-s) might happen later, when they are not\n;; expected anymore.\n;; Moreover, these \"cowboy\" threads keep occuping the resources (CPU, memory...)\n;; they need.\n;; *: this is the case e.g. when one of the threads throws an exception.", :_id "5bbb6435e4b00ac801ed9ec9"}], :notes [{:updated-at 1288191025000, :body "for insight into how pmap does stuff see this presentation: \"From Concurrency to Parallelism\", by David Edgar Liebke @ http://incanter.org/downloads/fjclj.pdf", :created-at 1288191025000, :author {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f9f"} {:author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :updated-at 1553851026351, :created-at 1553789805408, :body "The following can be used to understand how many threads `pmap` runs at once (assuming tasks are roughly the same computational cost). The min level correspond to the situation where the consumer is slower than the producer, while the max level is when the consumer is faster than the producer:\n\n* When the sequence is not chunked (for example subvec) the min parallelism is 1 and the max parallelism is `(+ 2 N-cores)`. Example: with 12 cores, `(doall (pmap #(Thread/sleep %) (subvec (into [] (range 1000)) 0 999)))` keeps 12+2 threads busy.\n* In case of chunked sequences (vast majority are size 32), the min parallelism is `(min chunk-size (+ 2 n-cores))`, while the max amount is equal to `(+ chunk-size 2 N-cores)`. Example: with 12 cores, `(doall (pmap #(Thread/sleep %) (range 1000)))` keeps 12+2+32 threads busy.", :_id "5c9cf36de4b0ca44402ef6ed"}], :arglists ["f coll" "f coll & colls"], :doc "Like map, except f is applied in parallel. Semi-lazy in that the\n parallel computation stays ahead of the consumption, but doesn't\n realize the entire result unless required. Only useful for\n computationally intensive functions where the time of f dominates\n the coordination overhead.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/pmap"} {:added "1.2", :ns "clojure.core", :name "error-mode", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1658139699593, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "set-error-mode!", :ns "clojure.core"}, :_id "62d53433e4b0b1e3652d7625"}], :line 2229, :examples [{:updated-at 1658139926101, :created-at 1658139926101, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body "(def a (agent 42))\n(error-mode a);; => :fail\n\n(set-error-mode! a :continue)\n(error-mode a);; => :continue", :_id "62d53516e4b0b1e3652d7626"}], :notes nil, :arglists ["a"], :doc "Returns the error-mode of agent a. See set-error-mode!", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/error-mode"} {:added "1.0", :ns "clojure.core", :name "num", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "number?", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917500000, :_id "542692ebf6e94c6970521da3"}], :line 3473, :examples [{:author {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}], :body "user=> (num 2048)\n2048\n\n\n;; Calling a Number http://download.oracle.com/javase/6/docs/api/ method:\n\nuser=> (def x (num 2048))\n#'user/x\n\nuser=> (.floatValue x)\n2048.0\n", :created-at 1283819688000, :updated-at 1287791370000, :_id "542692cec026201cdc326dc3"}], :notes [{:author {:login "didibus", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/601540?v=4"}, :updated-at 1560228092431, :created-at 1560228092431, :body "`num` is used to coerce a primitive Java number type such as int, float, long, double, etc., into its boxed version such as Float, Long, Double, etc. If given an existing boxed Number type, as opposed to a primitive number type, it will just return it as is.", :_id "5cff30fce4b0ca44402ef754"} {:body "If you are trying to parse a String into a Number, this is not the function you are looking for. `num` only coerces from other primitive or boxed number types. For coercing from a String, you want to use Java interop such as:\n\n```\n(Long/parseLong \"333\")\n(Float/parseFloat \"333.33\")\n(Double/parseDouble \"333.3333333333332\")\n(Integer/parseInt \"-333\")\n(Integer/parseUnsignedInt \"333\")\n(BigInteger. \"3333333333333333333333333332\")\n(BigDecimal. \"3.3333333333333333333333333332\")\n(Short/parseShort \"400\")\n(Byte/parseByte \"120\")\n```\n\nYou can also alternatively, if you want to parse the String into a Number the same way that the Clojure reader does so, use the edn reader.\n\n```\n(require '[clojure.edn :as edn])\n(edn/read-string \"333\")\n```", :created-at 1560228951511, :updated-at 1560229176287, :author {:avatar-url "https://avatars3.githubusercontent.com/u/601540?v=4", :account-source "github", :login "didibus"}, :_id "5cff3457e4b0ca44402ef756"}], :tag "java.lang.Number", :arglists ["x"], :doc "Coerce to Number", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/num"} {:added "1.5", :ns "clojure.core", :name "reduced?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1416151592590, :author {:login "ljos", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/585174?v=2"}, :to-var {:ns "clojure.core", :name "reduced", :library-url "https://github.com/clojure/clojure"}, :_id "5468c228e4b0dc573b892fd5"} {:created-at 1416151598149, :author {:login "ljos", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/585174?v=2"}, :to-var {:ns "clojure.core", :name "reduce", :library-url "https://github.com/clojure/clojure"}, :_id "5468c22ee4b0dc573b892fd6"} {:created-at 1456683959806, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unreduced", :ns "clojure.core"}, :_id "56d33bb7e4b02a6769b5a4bb"} {:created-at 1464286428199, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ensure-reduced", :ns "clojure.core"}, :_id "57473cdce4b0af2c9436d1f2"}], :line 2842, :examples [{:updated-at 1456683476601, :created-at 1456683476601, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :body "(reduced? :foo)\n;;=> false\n\n(reduced? (reduced :foo))\n;;=> true\n\n(reduced? (clojure.lang.Reduced. :foo))\n;;=> true", :_id "56d339d4e4b0b41f39d96cd7"}], :notes nil, :arglists ["x"], :doc "Returns true if x is the result of a call to reduced", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/reduced_q"} {:added "1.1", :ns "clojure.core", :name "disj!", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1329970249000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "assoc!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e49"} {:created-at 1329970254000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "dissoc!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e4a"} {:created-at 1533850473558, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "disj", :ns "clojure.core"}, :_id "5b6cb369e4b00ac801ed9e4f"} {:created-at 1577916225137, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "conj!", :ns "clojure.core"}, :_id "5e0d1741e4b0ca44402ef80c"}], :line 3400, :examples [{:updated-at 1577916108217, :created-at 1307739693000, :body ";; Note how we always use the return value of disj! and conj! in these examples\n;; for all future modifications, rather than (incorrectly) ignoring the return\n;; value and continuing to modify the original transient set. See examples for\n;; assoc! and dissoc! for more discussion and examples of this.\n;; Also see one example for conj! that contains a detailed example\n;; of a wrong result that can occur if you do not use its return value.\n\nuser=> (def foo (transient #{'pore-pore 'slow 'yukkuri}))\n#'user/foo\nuser=> (count foo)\n3\nuser=> (def foo (disj! foo 'yukkuri))\n#'user/foo\nuser=> foo\n#\nuser=> (count foo)\n2\nuser=> (def foo (conj! foo 'yukkuri))\n#'user/foo\nuser=> foo\n#\nuser=> (count foo)\n3\nuser=> (def foo (persistent! foo))\n#'user/foo\nuser=> foo\n#{yukkuri slow pore-pore}\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}], :author {:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"}, :_id "542692cfc026201cdc326e8c"} {:updated-at 1533850455152, :created-at 1533850455152, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; A faster implementation of disj for a large number of keys to disjoin:\n\n(defn disj* [s & ks]\n (persistent!\n (reduce disj! (transient s) ks)))\n\n(let [s (set (range 1000))\n xs (range 400 600)]\n (count (apply disj* s xs)))\n;; 800", :_id "5b6cb357e4b00ac801ed9e4e"}], :notes nil, :arglists ["set" "set key" "set key & ks"], :doc "disj[oin]. Returns a transient set of the same (hashed/sorted) type, that\n does not contain key(s).", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/disj!"} {:added "1.0", :ns "clojure.core", :name "float?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1496006168817, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "double?", :ns "clojure.core"}, :_id "592b3e18e4b093ada4d4d78e"} {:created-at 1496006177347, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "bigdec?", :ns "clojure.core"}, :_id "592b3e21e4b093ada4d4d78f"} {:created-at 1496006182111, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "decimal?", :ns "clojure.core"}, :_id "592b3e26e4b093ada4d4d790"}], :line 3604, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (float? 0)\nfalse\nuser=> (float? 0.0)\ntrue", :created-at 1279073915000, :updated-at 1332951058000, :_id "542692cbc026201cdc326bc6"} {:updated-at 1462076465809, :created-at 1454839923274, :author {:login "guruma", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/534540?v=3"}, :body ";; float? returns true for both float and double.\nuser=> (map (juxt type float?) [(float 1) (double 1)])\n([java.lang.Float true] [java.lang.Double true])\n\n;; Call instance? to check if the value is specifically float or double.\nuser=> (map (juxt type #(instance? Float %)) [(float 1) (double 1)])\n([java.lang.Float true] [java.lang.Double false])", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/534540?v=3", :account-source "github", :login "guruma"} {:login "bkovitz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3"}], :_id "56b71873e4b0e8f8f33875d4"} {:updated-at 1592827825230, :created-at 1592827825230, :author {:login "zoren", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/84688?v=4"}, :body ";; BigDecimal is not float\nuser=> (float? 0.0M)\nfalse", :_id "5ef09fb1e4b0b1e3652d730a"}], :notes nil, :arglists ["n"], :doc "Returns true if n is a floating point number", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/float_q"} {:added "1.0", :ns "clojure.core", :name "aset-float", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1627064336075, :author {:login "rosejn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/36590?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "aget", :ns "clojure.core"}, :_id "60fb0810e4b0b1e3652d751c"}], :line 3961, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; create an array of 10 floats and set one of the values to 3.1415\n\nuser=> (def fs (float-array 10))\n#'user/fs\nuser=> (vec fs)\n[0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0]\nuser=> (aset-float fs 3 3.1415)\n3.1415\nuser=> (vec fs)\n[0.0 0.0 0.0 3.1415 0.0 0.0 0.0 0.0 0.0 0.0]\nuser=>", :created-at 1313914809000, :updated-at 1313914809000, :_id "542692c7c026201cdc3269d2"}], :notes [{:body "See [aset](http://clojuredocs.org/clojure.core/aset) for illustrations of multi-dimensional syntax.", :created-at 1432829158905, :updated-at 1432829158905, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :_id "55673ce6e4b01ad59b65f4e0"}], :arglists ["array idx val" "array idx idx2 & idxv"], :doc "Sets the value at the index/indices. Works on arrays of float. Returns val.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/aset-float"} {:added "1.2", :ns "clojure.core", :name "deftype", :file "clojure/core_deftype.clj", :type "macro", :column 1, :see-alsos [{:created-at 1361948459000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "definterface", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e0b"} {:created-at 1361948592000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defprotocol", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e0c"} {:created-at 1446587002611, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defrecord", :ns "clojure.core"}, :_id "56392a7ae4b04b157a6648e2"}], :line 422, :examples [{:author {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"}, :editors [{:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (import (java.awt.datatransfer Transferable DataFlavor)\n javax.swing.ImageIcon)\n\n;; create a Transferable Image from an array of bytes\nuser=> (deftype ImageSelection [data]\n Transferable\n (getTransferDataFlavors\n [this]\n (into-array DataFlavor [DataFlavor/imageFlavor]))\n \n (isDataFlavorSupported\n [this flavor]\n (= DataFlavor/imageFlavor flavor))\n\n (getTransferData\n [this flavor]\n (when (= DataFlavor/imageFlavor flavor)\n (.getImage (ImageIcon. data)))))\n\n;; create a new image selection:\nuser=> (def *selection* (ImageSelection. somedata))", :created-at 1285784862000, :updated-at 1285841395000, :_id "542692ccc026201cdc326cc9"} {:updated-at 1613242656022, :created-at 1462490574656, :author {:login "elsaturnino", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/571496?v=3"}, :body ";; define a couple of shape types\n(deftype Circle [radius])\n(deftype Square [length width])\n\n;; multimethod to calculate the area of a shape\n(defmulti area class)\n(defmethod area Circle [c]\n (* Math/PI (.radius c) (.radius c)))\n(defmethod area Square [s]\n (* (.length s) (.width s)))\n\n;; create a couple shapes and get their area\n(def myCircle (Circle. 10))\n(def mySquare (Square. 5 11))\n\n(area myCircle)\n(area mySquare)", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/5796449?v=3", :account-source "github", :login "freezhan"} {:login "stoat1", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2543524?v=4"}], :_id "572bd5cee4b050526f331422"} {:updated-at 1462539789757, :created-at 1462539789757, :author {:login "jzwolak", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/285725?v=3"}, :body "(deftype Person [first-name last-name])\n\n;; use the factory function instead of the constructor, \"Person.\",\n;; to create a Person\n(->Person \"John\" \"Smith\")", :_id "572c960de4b050526f331423"} {:updated-at 1539060553178, :created-at 1539060553178, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; How :load-ns works.\n;; deftype can be used for AOT generation of classes (with gen-class that would be\n;; the only option). For example:\n\n(spit \"foo.clj\"\n \"(ns foo)\n (defn bar [] :bar)\n (defprotocol P (foo [p]))\n (deftype Foo [] :load-ns true P\n (foo [this] (bar)))\")\n\n(binding [*compile-path* \".\"] (compile 'foo))\n\n;; Now close and re-open the REPL to import the newly created class. Note that the\n;; call to (.foo p) doesn't throw exception here because we used \":load-ns true\"\n;; option in deftype. This makes sure that the namespace 'foo is also loaded \n;; forcing the evaluation of the \"bar\" function. This makes especially sense\n;; if Foo is used from a Java application:\n\n(import 'foo.Foo)\n(def p (Foo.))\n(.foo p)\n;; \"bar\"", :_id "5bbc3349e4b00ac801ed9ecb"} {:updated-at 1552943737414, :created-at 1552943737414, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :body ";; To refer to a deftype in another namespace, the deftype needs to be imported \n;; because deftype generate a class.\n;; Using the Foo type defined above:\n(ns bar \n (:import [foo Foo]))\n\n(defn foo? [x]\n (instance? Foo x))", :_id "5c900a79e4b0ca44402ef6b8"} {:editors [{:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=4"}], :body ";; deftype allow mutable fields, and their values can be changed with set!.\n;; This works:\n(deftype Test [^:unsynchronized-mutable x]\n ITestProtocol\n (act [this o] (set! x o)))\n\n;; Note that these mutable fields are private, so they are not accessible outside,\n;; and they are not even accessible inside nested functions within the type.\n;; This does not compile, throws error about assigning to non-mutable field x:\n(deftype Test [^:unsynchronized-mutable x]\n ITestProtocol\n (act [this] (fn [o] (set! x o))))\n\n;; Need to define a set function in a protocol and implement it in the type \n(defprotocol ISetX (set-x [this o]))\n\n(deftype Test [^:unsynchronized-mutable x]\n ISetX\n (set-x [this o] (set! x o))\n \n ITestProtocol\n (act [this] (fn [o] (set-x o))))\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/889685?v=4", :account-source "github", :login "huahaiy"}, :created-at 1611856836020, :updated-at 1611856923228, :_id "6012fbc4e4b0b1e3652d743f"} {:updated-at 1658251111297, :created-at 1658251111297, :author {:login "quoll", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/358875?v=4"}, :body ";; unlike defrecord, deftype does not include extra method definitions\n;; the following will not compile:\n(defrecord Nr [n]\n Object\n (toString [_] (str \"#\" n)) ;; This does work\n (hashCode [_] (+ 10 n))) ;; defrecord already generates this function\n\n;; Syntax error (ClassFormatError) compiling deftype* at (REPL:1:1).\n;; Duplicate method name \"hashCode\" with signature \"()I\" in class file user/Nr\n\n\n;; deftype does not implement methods like hashCode, so it can be overridden\n(deftype Nr [n]\n Object\n (toString [_] (str \"#\" n))\n (hashCode [_] (+ 10 n)))\n\n(def v (->Nr 5))\n\n(str \"The number is: \" v)\n;; \"The number is #5\"\n\n(hash v)\n;; 15", :_id "62d6e767e4b0b1e3652d7629"}], :macro true, :notes [{:updated-at 1330691996000, :body "There's also some undocumented support for annotations:\r\n\r\n", :created-at 1330691996000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fda"} {:author {:login "eoliphan", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1065736?v=4"}, :updated-at 1665156668525, :created-at 1665156668525, :body "Annotation docs now available in the reference: https://clojure.org/reference/datatypes#_java_annotation_support", :_id "6340463ce4b0b1e3652d7671"}], :arglists ["name [& fields] & opts+specs"], :doc "(deftype name [fields*] options* specs*)\n\n Options are expressed as sequential keywords and arguments (in any order).\n\n Supported options:\n :load-ns - if true, importing the type class will cause the\n namespace in which the type was defined to be loaded.\n Defaults to false.\n\n Each spec consists of a protocol or interface name followed by zero\n or more method bodies:\n\n protocol-or-interface-or-Object\n (methodName [args*] body)*\n\n Dynamically generates compiled bytecode for class with the given\n name, in a package with the same name as the current namespace, the\n given fields, and, optionally, methods for protocols and/or\n interfaces. \n\n The class will have the (by default, immutable) fields named by\n fields, which can have type hints. Protocols/interfaces and methods\n are optional. The only methods that can be supplied are those\n declared in the protocols/interfaces. Note that method bodies are\n not closures, the local environment includes only the named fields,\n and those fields can be accessed directly. Fields can be qualified\n with the metadata :volatile-mutable true or :unsynchronized-mutable\n true, at which point (set! afield aval) will be supported in method\n bodies. Note well that mutable fields are extremely difficult to use\n correctly, and are present only to facilitate the building of higher\n level constructs, such as Clojure's reference types, in Clojure\n itself. They are for experts only - if the semantics and\n implications of :volatile-mutable or :unsynchronized-mutable are not\n immediately apparent to you, you should not be using them.\n\n Method definitions take the form:\n\n (methodname [args*] body)\n\n The argument and return types can be hinted on the arg and\n methodname symbols. If not supplied, they will be inferred, so type\n hints should be reserved for disambiguation.\n\n Methods should be supplied for all methods of the desired\n protocol(s) and interface(s). You can also define overrides for\n methods of Object. Note that a parameter must be supplied to\n correspond to the target object ('this' in Java parlance). Thus\n methods for interfaces will take one more argument than do the\n interface declarations. Note also that recur calls to the method\n head should *not* pass the target object, it will be supplied\n automatically and can not be substituted.\n\n In the method bodies, the (unqualified) name can be used to name the\n class (for calls to new, instance? etc).\n\n When AOT compiling, generates compiled bytecode for a class with the\n given name (a symbol), prepends the current ns as the package, and\n writes the .class file to the *compile-path* directory.\n\n One constructor will be defined, taking the designated fields. Note\n that the field names __meta, __extmap, __hash and __hasheq are currently\n reserved and should not be used when defining your own types.\n\n Given (deftype TypeName ...), a factory function called ->TypeName\n will be defined, taking positional parameters for the fields", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/deftype"} {:added "1.0", :ns "clojure.core", :name "bean", :file "clojure/core_proxy.clj", :type "function", :column 1, :see-alsos nil, :line 398, :examples [{:author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:avatar-url "https://avatars.githubusercontent.com/u/227520?v=3", :account-source "github", :login "ode79"}], :body "user=> (import java.util.Date)\njava.util.Date\n\nuser=> (def ^:dynamic *now* (Date.))\n#'user/*now*\n\nuser=> (bean *now*)\n{:seconds 57, :date 13, :class java.util.Date, :minutes 55, :hours 17, :year 110, :timezoneOffset -330, :month 6, :day 2, :time 1279023957492}\n", :created-at 1279049231000, :updated-at 1437867852483, :_id "542692ccc026201cdc326c70"} {:updated-at 1477395581762, :created-at 1348995044000, :body ";; although not reference-able in Clojuredocs, \n;; org.clojure/java.data provides a useful, alternative 'from-java' function \n;; that works similarly to bean, but more customizable.\n;; See https://github.com/clojure/java.data for more info.", :editors [{:login "G1enY0ung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/15034155?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon", :account-source "clojuredocs", :login "klauern"}, :_id "542692d2c026201cdc326f4e"}], :notes nil, :arglists ["x"], :doc "Takes a Java object and returns a read-only implementation of the\n map abstraction based upon its JavaBean properties.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bean"} {:added "1.1", :ns "clojure.core", :name "booleans", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "boolean-array", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1358052913000, :_id "542692eaf6e94c6970521c0a"}], :line 5348, :examples [{:author {:login "leifp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d2f37720f063404ef83b987d2824353d?r=PG&default=identicon"}, :editors [], :body ";; for fast interop\nuser=> (set! *warn-on-reflection* true)\ntrue\nuser=> (defn get-a-bool [bs] (aget bs 1))\nReflection warning, NO_SOURCE_PATH:1 - call to aget can't be resolved.\n#'user/get-a-bool\nuser=> (defn get-a-bool [bs] (let [bs (booleans bs)] (aget bs 1)))\n#'user/get-a-bool\n", :created-at 1342528439000, :updated-at 1342528439000, :_id "542692d2c026201cdc326f5b"} {:body ";; can also be used as type hint to avoid reflection:\nuser=> (set! *warn-on-reflection* true)\ntrue\nuser=> (defn get-a-bool [^booleans bs] (aget bs 1))\n#'user/get-a-bool", :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :created-at 1432832819657, :updated-at 1432832851114, :editors [{:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}], :_id "55674b33e4b01ad59b65f4e2"}], :notes nil, :arglists ["xs"], :doc "Casts to boolean[]", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/booleans"} {:added "1.0", :ns "clojure.core", :name "ns-unalias", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1390616196000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "alias", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ea7"} {:created-at 1390616206000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "ns-aliases", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ea8"} {:created-at 1512578712943, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ns-unmap", :ns "clojure.core"}, :_id "5a281e98e4b0a08026c48cd2"}], :line 4281, :examples [{:author {:login "daviddurand", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1316941?v=2"}, :editors [], :body ";; You are having a problem loading a redefined namespace:\nuser=> (load \"src/clj/com/tizra/layout_expander.clj\")\n#\n\n;; ns-unalias to the rescue!\nuser=> (ns-unalias (find-ns 'com.tizra.layout-expander) 'xml)\nnil\n\nuser=> (load \"src/clj/com/tizra/layout_expander.clj\")\n#'com.tizra.layout-expander/junk\n", :created-at 1326025800000, :updated-at 1326025800000, :_id "542692d4c026201cdc327020"} {:body "user=> (ns-aliases *ns*)\n{}\nuser=> (alias 'string 'clojure.string)\nnil\nuser=> (ns-aliases *ns*)\n{string #}\nuser=> (ns-unalias *ns* 'string)\nnil\nuser=> (ns-aliases *ns*)\n{}", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423017698483, :updated-at 1423017698483, :_id "54d186e2e4b081e022073c52"} {:updated-at 1512578611261, :created-at 1512471675948, :author {:login "ivarref", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/74075?v=4"}, :body ";; To wipe aliases of current namespace:\n*my-ns*=> (map (partial ns-unalias *ns*) (keys (ns-aliases *ns*)))", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/74075?v=4", :account-source "github", :login "ivarref"} {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}], :_id "5a267c7be4b0a08026c48ccd"}], :notes nil, :arglists ["ns sym"], :doc "Removes the alias for the symbol from the namespace.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ns-unalias"} {:added "1.0", :ns "clojure.core", :name "when-let", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1293436133000, :author {:login "0x89", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/56bc4acd59315ed4dc1cb99c3be71102?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "if-let", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e2c"} {:created-at 1315004448000, :author {:login "srid", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd3a68d670372cd09876c26270a4299a?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "when", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e2d"} {:created-at 1323280128000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "when-not", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e2e"} {:created-at 1334293387000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "if", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e2f"} {:created-at 1405367841000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "when-first", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e30"} {:created-at 1440455896228, :author {:login "brunchboy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2228869?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "when-some", :ns "clojure.core"}, :_id "55db9cd8e4b072d7f27980f1"} {:created-at 1602614484757, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "let", :ns "clojure.core"}, :_id "5f85f4d4e4b0b1e3652d73df"}], :line 1861, :examples [{:author {:login "kotarak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Confusion", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ca054e9c7aecbfac1d99af1fd0a6d72c?r=PG&default=identicon"}], :body ";; Very useful when working with sequences. Capturing the return value \n;; of `seq` brings a performance gain in subsequent `first`/`rest`/`next`\n;; calls. Also the block is guarded by `nil` punning.\n\n(defn drop-one\n [coll]\n (when-let [s (seq coll)]\n (rest s)))\n\nuser=> (drop-one [1 2 3])\n(2 3)\nuser=> (drop-one [])\nnil\n", :created-at 1281553976000, :updated-at 1342493536000, :_id "542692cbc026201cdc326c01"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; See examples for \"if\" explaining Clojure's idea of logical true\n;; and logical false.", :created-at 1334293395000, :updated-at 1334293395000, :_id "542692d6c026201cdc3270b6"} {:editors [{:login "mkorvas", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2321069?v=3"}], :updated-at 1438294296617, :created-at 1428550770303, :author {:avatar-url "https://avatars.githubusercontent.com/u/367789?v=3", :account-source "github", :login "mattvvhat"}, :body ";; Works well with collections\n\n(def x {:whatever 1})\n\n(when-let [value (:whatever x)]\n (println \"x+1 = \" (inc value)))\n\n;; Prints: \"x+1 = 2\"", :_id "5525f472e4b01bb732af0a7b"} {:updated-at 1469577527836, :created-at 1469577480181, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body ";; when-let multiple bindings version\n\n(defmacro when-let*\n ([bindings & body]\n (if (seq bindings)\n `(when-let [~(first bindings) ~(second bindings)]\n (when-let* ~(drop 2 bindings) ~@body))\n `(do ~@body))))\n\n(when-let* [a 1 \n b 2 \n c (+ a b)]\n (println \"yeah!\")\n c)\n;;=>yeah!\n;;=>3\n\n(when-let* [a 1 \n b nil \n c 3]\n (println \"damn! b is nil\")\n a)\n;;=>nil\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3", :account-source "github", :login "ertugrulcetin"}], :_id "5797f908e4b0bafd3e2a04bb"} {:updated-at 1505500848933, :created-at 1505500848933, :author {:login "bfabry", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/29587?v=4"}, :body ";; test is evaluated before values are bound to binding, so destructuring works\n(when-let [[a] nil] [a])\n=> nil\n(when-let [[a] [:a]] [a])\n=> [:a]\n(when-let [[a] []] [a])\n=> [nil]", :_id "59bc1eb0e4b09f63b945ac76"} {:updated-at 1629082196288, :created-at 1536030316104, :author {:login "arlicle", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/153773?v=4"}, :body ";; when-let multiple bindings version\n;; all bindings are evaluated before checking for falsyness\n\n(defmacro when-let*\n [bindings & body]\n `(let ~bindings\n (if (and ~@(take-nth 2 bindings))\n (do ~@body)\n )))\n\n(when-let* [a 1 \n b 2 \n c (+ a b)]\n (println \"yeah!\")\n c)\n;;yeah!\n;;=> 3\n\n(when-let* [a 1 \n b nil \n c 3]\n (println \"damn! b is nil\")\n a)\n;;=> nil", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/8340498?v=4", :account-source "github", :login "justintaft"}], :_id "5b8df66ce4b00ac801ed9e85"} {:editors [{:login "Jjunior130", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/7597818?v=4"}], :body "(require '[reagent.core :as r])\n\n(def float-parsable? (comp not js/isNaN js/parseFloat))\n(def find-parsable-or-nil \n (comp first \n (partial re-find \n #\"(\\-?\\d+\\.)?\\d+([eE][-+]?\\d+)?\")))\n\n(defn number-input\n \"HTML input element for number only input\"\n [value]\n [:input\n {:value @value\n :type \"text\"\n :on-change (comp\n #(when-let [new-value %]\n (reset! value new-value))\n (fn [value]\n (cond\n (empty? value) \"\"\n (float-parsable? value) value\n :otherwise (find-parsable-or-nil value)))\n (fn [target]\n (.-value target))\n (fn [event]\n (.-target event)))}])\n\n(def value (r/atom \"\"))\n\n(defn demo []\n [:div\n ; Displays NaN when value is \"\", displays a number otherwise.\n (-> @value js/parseFloat str) [:br]\n [number-input value]])", :author {:avatar-url "https://avatars1.githubusercontent.com/u/7597818?v=4", :account-source "github", :login "Jjunior130"}, :created-at 1536532957930, :updated-at 1536815925378, :_id "5b95a1dde4b00ac801ed9e93"}], :macro true, :notes [{:updated-at 1299054268000, :body "The difference between when-let and if-let is that when-let doesn't have an else clause and and also accepts multiple forms so you don't need to use a (do...).", :created-at 1299054268000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fb4"} {:updated-at 1393879475000, :body "The word \"bindings\" seems not to be correct here. In fact `when-let` only accepts **one** binding and not multiple ones.\r\nSo \"bindings\" might be confusing, at least it was for me.", :created-at 1393879360000, :author {:login "n2o", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/73a59429cbc559fd77e9ec50fd99006b?r=PG&default=identicon"}, :_id "542692edf6e94c697052201f"} {:updated-at 1405477326000, :body "Agreed. It ought to be \"binding\" for clarity.", :created-at 1405477326000, :author {:login "Dave Y.", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10d4977e847588cb4b461de4eb9d1646?r=PG&default=identicon"}, :_id "542692edf6e94c697052202c"} {:author {:login "HomoEfficio", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/17228983?v=3"}, :updated-at 1486864109909, :created-at 1486864109909, :body "```clojure\n(when-let [name test]\n (do-something-with-name))\n```\n\nIn the example above, `test` does not have to be a predicate.\n`test` can be any value which is like `(seq coll)` or `3`, `[1 2]`, or so.\n\nIf `test` is neither `false` nor `nil`, `test` is bound to `name`.\n", :_id "589fbeede4b01f4add58fe4c"}], :arglists ["bindings & body"], :doc "bindings => binding-form test\n\n When test is true, evaluates body with binding-form bound to the value of test", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/when-let"} {:added "1.0", :ns "clojure.core", :name "int-array", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "ints", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917413000, :_id "542692ebf6e94c6970521d57"} {:created-at 1349125778000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "aget", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d58"} {:created-at 1349125782000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "aset", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d59"} {:created-at 1349125888000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "aset-int", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d5a"}], :line 5332, :examples [{:updated-at 1454083049116, :created-at 1284747822000, :body ";; if you have a sequence, perhaps lazy, int-array will figure out the size\n(aget (int-array [1 2 3]) 0)\n;;=> 1\n(int-array [1 2 3])\n;;=> \n\n;; if you need a certain size, with a constant initial value\n(aget (int-array 5 1) 4)\n;;=> 1\n(alength (int-array 5))\n;;=> 5\n\n;; finally, you can specify a size + a sequence, which will initialize the array \n;; by taking size from the sequence\n(alength (int-array 5 (range 10)))\n;;=> 5\n;; which is equivalent to\n(alength (int-array (take 5 (range 10)))\n;;=> 5\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/d543a7491b7b47ec7c3e8f259a75d2dd?r=PG&default=identicon", :account-source "clojuredocs", :login "apgwoz"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/d543a7491b7b47ec7c3e8f259a75d2dd?r=PG&default=identicon", :account-source "clojuredocs", :login "apgwoz"}, :_id "542692c9c026201cdc326afa"}], :notes nil, :arglists ["size-or-seq" "size init-val-or-seq"], :doc "Creates an array of ints", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/int-array"} {:added "1.0", :ns "clojure.core", :name "set?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1293674593000, :author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "set", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d8f"} {:created-at 1414508276593, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "map?", :library-url "https://github.com/clojure/clojure"}, :_id "544faef4e4b0dc573b892faa"} {:created-at 1414508317723, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "vector?", :library-url "https://github.com/clojure/clojure"}, :_id "544faf1de4b03d20a102427f"}], :line 4099, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user> (set? #{1 2 3})\ntrue\n\nuser> (set? (hash-set 1 2 3))\ntrue\n\nuser> (set? (sorted-set 1 2 3))\ntrue\n\nuser> (set? [1 2 3])\nfalse\n\nuser> (set? {:a 1 :b 2})\nfalse", :created-at 1293674587000, :updated-at 1423276284407, :_id "542692cec026201cdc326dfa"}], :notes nil, :arglists ["x"], :doc "Returns true if x implements IPersistentSet", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/set_q"} {:added "1.0", :ns "clojure.core", :name "inc'", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1444304838174, :author {:login "andreloureiro", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2106717?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "inc", :ns "clojure.core"}, :_id "561657c6e4b0b41dac04c955"} {:created-at 1495706268555, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "dec'", :ns "clojure.core"}, :_id "5926aa9ce4b093ada4d4d754"}], :line 915, :examples [{:updated-at 1444305445453, :created-at 1444305445453, :author {:login "andreloureiro", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2106717?v=3"}, :body "> (inc' 1)\n2\n\n> (inc' 3.14)\n4.140000000000001\n\n> (inc' 4/5)\n9/5\n\n> (inc' -1)\n0\n\n> (inc' -3/2)\n-1/2\n\n> (inc' -0.2)\n0.8", :_id "56165a25e4b0b41dac04c956"} {:updated-at 1495706130653, :created-at 1495706130653, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body ";;;; (inc') auto-promotes on integer overflow:\n\n(inc' (Long/MAX_VALUE))\n;;=> 9223372036854775808N\n\n;;;; Unlike (inc) which does not:\n\n(inc (Long/MAX_VALUE))\n;;=> ArithmeticException integer overflow", :_id "5926aa12e4b093ada4d4d752"}], :notes nil, :arglists ["x"], :doc "Returns a number one greater than num. Supports arbitrary precision.\n See also: inc", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/inc'"} {:added "1.7", :ns "clojure.core", :name "cat", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1462880190642, :author {:login "achesnais", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6626105?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "cat", :ns "clojure.core.reducers"}, :_id "5731c7bee4b012fa59bdb2ef"} {:created-at 1462880208677, :author {:login "achesnais", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6626105?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "foldcat", :ns "clojure.core.reducers"}, :_id "5731c7d0e4b012fa59bdb2f0"} {:created-at 1679512700855, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "into", :ns "clojure.core"}, :_id "641b547ce4b08cf8563f4b84"} {:created-at 1685378198294, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "concat", :ns "clojure.core"}, :_id "6474d496e4b08cf8563f4bc1"}], :line 7619, :examples [{:updated-at 1462880149225, :created-at 1462880149225, :author {:login "achesnais", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6626105?v=3"}, :body ";; cat is handy for untangling nested collections when using transducers\n\n(into [] (comp cat cat (map inc)) [[[1] [2]] [[3] [4]]])\n;; => [2 3 4 5]", :_id "5731c795e4b012fa59bdb2ee"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; Remove the need of (mapcat identity coll) idiom:\n(def rota (sequence cat (repeat [\"tom\" \"nick\" \"jane\"])))\n(nth rota 7) ; who's up next week?\n;; nick", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1510050037744, :updated-at 1510051755220, :_id "5a0188f5e4b0a08026c48c95"} {:editors [{:login "stanislas", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/240862?v=4"}], :body ";; combining map-indexed with cat for a \"mapcat-indexed\"\n(into []\n (comp\n (map-indexed (fn [index val]\n (repeat index val)))\n cat)\n (range 5))\n;; => [1 2 2 3 3 3 4 4 4 4]", :author {:avatar-url "https://avatars.githubusercontent.com/u/240862?v=4", :account-source "github", :login "stanislas"}, :created-at 1629989634908, :updated-at 1629989697016, :_id "6127ab02e4b0b1e3652d7535"} {:updated-at 1659698277633, :created-at 1659698047207, :author {:login "ghoseb", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1453?v=4"}, :body ";;; a concise and performant way to concat into a vector\n\n(into [] cat [[1 2 3] [4] [5 6 7]])\n;; => [1 2 3 4 5 6 7]\n\n(defn concatv\n \"Concatenate `xs` and return the result as a vector.\"\n [& xs]\n (into [] cat xs))\n\n(concatv '(1 2) [3] [4 5])\n;; => [1 2 3 4 5]\n\n;;; this xducer form is equivalent to the `(vec (concat...` pattern\n(let [x [1 2 3]\n y 4\n z [5 6 7]]\n (= \n (into [] cat [x [y] z])\n (vec (concat x [y] z))))\n\n;; => true", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/1453?v=4", :account-source "github", :login "ghoseb"}], :_id "62ecfb7fe4b0b1e3652d7638"}], :notes nil, :arglists ["rf"], :doc "A transducer which concatenates the contents of each input, which must be a\n collection, into the reduction.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/cat"} {:added "1.9", :ns "clojure.core", :name "StackTraceElement->vec", :file "clojure/core_print.clj", :type "function", :column 1, :see-alsos nil, :line 465, :examples [{:editors [{:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}], :body ";;;; StackTraceElements look like vectors when printed, but they\n;;;; are actually a completely different type. \n;;;; (StackTraceElement->vec) turns them into normal Clojure vectors.\n\n(try \n (/ 1 0)\n (catch Exception e \n (let [cause (->> e .getStackTrace seq first)]\n (pprint cause)\n (class cause))))\n;;=> [clojure.lang.Numbers divide \"Numbers.java\" 158]\n;;=> java.lang.StackTraceElement\n\n(try \n (/ 1 0)\n (catch Exception e \n (let [cause (->> e .getStackTrace seq first StackTraceElement->vec)]\n (pprint cause)\n (class cause))))\n;;=> [clojure.lang.Numbers divide \"Numbers.java\" 158]\n;;=> clojure.lang.PersistentVector\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3", :account-source "github", :login "svenschoenung"}, :created-at 1495970721085, :updated-at 1495970798753, :_id "592ab3a1e4b093ada4d4d77e"}], :notes nil, :arglists ["o"], :doc "Constructs a data representation for a StackTraceElement: [class method file line]", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/StackTraceElement->vec"} {:ns "clojure.core", :name "*suppress-read*", :type "var", :see-alsos nil, :examples nil, :notes [{:body "Not meant for public consumption, implementation detail of reader-conditional feature to skip unreadable forms. See https://clojure.atlassian.net/browse/CLJ-1424", :created-at 1618077877511, :updated-at 1618078788123, :author {:avatar-url "https://avatars.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :_id "6071e8b5e4b0b1e3652d74c0"}], :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*suppress-read*"} {:added "1.0", :ns "clojure.core", :name "flush", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 3705, :examples [{:updated-at 1556307726395, :created-at 1556307726395, :author {:login "pauloaug", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/804447?v=4"}, :body ";; iteratively prints the value of x (after a pause of 100ms) \n(doseq [x (range 20)]\n (Thread/sleep 100)\n (pr x)\n (flush))\n\n;; without a `flush` at each iteration,\n;; we'll get all the output stream at once flushed and printed only at the end \n;; of `doseq` evaluation. \n(doseq [x (range 20)]\n (Thread/sleep 100)\n (pr x))", :_id "5cc35f0ee4b0ca44402ef711"}], :notes nil, :arglists [""], :doc "Flushes the output stream that is the current value of\n *out*", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/flush"} {:added "1.0", :ns "clojure.core", :name "take-while", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1301365974000, :author {:login "pauldoo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5cb916d3c8abc9f45a093209e72489fb?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "drop-while", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c3f"} {:created-at 1347077874000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "split-with", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c40"} {:created-at 1473454417291, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "some", :ns "clojure.core"}, :_id "57d32151e4b0709b524f04f2"} {:created-at 1538951674784, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "take", :ns "clojure.core"}, :_id "5bba89fae4b00ac801ed9ead"}], :line 2888, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"} {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Airwoz", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/47391748e84575258520e85e3725d144?r=PG&default=identicon"}], :body ";; Calculate the sum of all numbers under 1000:\nuser=> (reduce + (take-while (partial > 1000) (iterate inc 0)))\n499500", :created-at 1279591693000, :updated-at 1385275768000, :_id "542692cdc026201cdc326d03"} {:author {:login "patazj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d790f5851d80da498e475ece4487e92?r=PG&default=identicon"}, :editors [{:login "patazj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d790f5851d80da498e475ece4487e92?r=PG&default=identicon"} {:login "patazj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d790f5851d80da498e475ece4487e92?r=PG&default=identicon"} {:login "Matt", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/af7cad0e010feb68f651cb61c54424b4?r=PG&default=identicon"} {:login "Kejia", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1039073?v=3"}], :body "user=> (take-while neg? [-2 -1 0 1 2 3])\n(-2 -1)\n\nuser=> (take-while neg? [-2 -1 0 -1 -2 3]) ; note: `take-while' stops traversing the collection when the predicate is false, as is different from `filter'.\n(-2 -1)\n\nuser=> (take-while neg? [ 0 1 2 3])\n()\n\nuser=> (take-while neg? [])\n()\n\nuser=> (take-while neg? nil)\n()", :created-at 1321607184000, :updated-at 1434723642888, :_id "542692d5c026201cdc3270a2"} {:editors [{:login "henghuang", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5959826?v=3"}], :body ";;take the item while it's included in the set \nuser=> (take-while #{[1 2][3 4]} #{[1 2]})\n([1 2])\nuser=> (take-while #{[1 2][3 4]} #{[3 4]})\n([3 4])\nuser=> (take-while #{[1 2][3 4]} #{[4 5]})\n()\nuser=>(take-while #{[1 2][3 4]} #{[5 6] [1 2]}); return nil while any item is not included in the set\n()", :author {:avatar-url "https://avatars.githubusercontent.com/u/5959826?v=3", :account-source "github", :login "henghuang"}, :created-at 1458044677653, :updated-at 1458044982206, :_id "56e7ff05e4b0507458dcf5a6"} {:updated-at 1517038741181, :created-at 1517038741181, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;take-while practical example\n\n(def entries [{:month 1 :val 12}\n {:month 2 :val 3}\n {:month 3 :val 32}\n {:month 4 :val 18}\n {:month 5 :val 32}\n {:month 6 :val 62}\n {:month 7 :val 12}\n {:month 8 :val 142}\n {:month 9 :val 52}\n {:month 10 :val 18}\n {:month 11 :val 23}\n {:month 12 :val 56}])\n\n(defn get-result\n [coll m]\n (take-while\n #(<= (:month %) m) coll))\n\n(get-result entries 3)\n;;({:m 1, :val 12} {:m 2, :val 3} {:m 3, :val 32})\n", :_id "5a6c2c95e4b076dac5a728a7"} {:editors [{:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}], :body ";; Note that usually more items are realized than needed.\n;; In the example below the first 32 items are calculated,\n;; though the first 2 would be enough.\n;; This can be especially important when this extra realization\n;; leads to an exception (see example at 'take') or requires a lot of\n;; resources (CPU, time, memory, etc.) and at the end not needed at all.\n\nuser=> (let [x (map (fn [i]\n (println i)\n (Thread/sleep 100)\n i)\n (range 50))]\n (take-while #(< % 1) x))\n0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n(0)", :author {:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"}, :created-at 1538951863286, :updated-at 1538953447395, :_id "5bba8ab7e4b00ac801ed9eae"}], :notes nil, :arglists ["pred" "pred coll"], :doc "Returns a lazy sequence of successive items from coll while\n (pred item) returns logical true. pred must be free of side-effects.\n Returns a transducer when no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/take-while"} {:added "1.0", :ns "clojure.core", :name "vary-meta", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1301486152000, :author {:login "ninjudd", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7ced25585a7556e9b9b975c1f9e136e3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-meta", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d19"} {:created-at 1375213046000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "alter-meta!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d1a"}], :line 675, :examples [{:updated-at 1285495771000, :created-at 1280776393000, :body "user=> (meta (vary-meta 'foo assoc :a 1))\n{:a 1}\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692c8c026201cdc326a68"} {:author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :editors [], :body ";; continuing from the previous with-meta example\nuser=> (def wm (with-meta [1 2 3] {:my \"meta\"}))\n#'user/wm\n\nuser=> wm\n[1 2 3]\n\nuser=> (meta wm)\n{:my \"meta\"}\n\nuser=> (def new-wm (vary-meta wm assoc :your \"new meta\"))\n#'user/new-wm\n\nuser=> new-wm\n[1 2 3]\n\nuser=> (meta new-wm)\n{:my \"meta\", :your \"new meta\"}\n\n", :created-at 1359718168000, :updated-at 1359718168000, :_id "542692d5c026201cdc3270b3"}], :notes nil, :arglists ["obj f & args"], :doc "Returns an object of the same type and value as obj, with\n (apply f (meta obj) args) as its metadata.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/vary-meta"} {:added "1.0", :ns "clojure.core", :name "<=", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1451249730987, :author {:login "justCxx", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6506296?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name ">=", :ns "clojure.core"}, :_id "56805042e4b0e0706e05bd90"} {:created-at 1588958577321, :author {:login "alexandreaquiles", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/258331?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "<", :ns "clojure.core"}, :_id "5eb59571e4b087629b5a1907"} {:created-at 1588958583491, :author {:login "alexandreaquiles", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/258331?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "=", :ns "clojure.core"}, :_id "5eb59577e4b087629b5a1908"}], :line 1055, :examples [{:author {:login "mattdw", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ee24aacb65359196b0a1bad050f9a62f?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (<= 1 2)\ntrue\nuser=> (<= 2 2)\ntrue\nuser=> (<= 3 2)\nfalse\nuser=> (<= 2 3 4 5 6)\ntrue", :created-at 1280321906000, :updated-at 1332950755000, :_id "542692cdc026201cdc326cd9"} {:editors [{:login "dijonkitchen", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4"}], :body "user=> (<= 1 2 3 2)\nfalse\n\nuser=> (<= 1 2 3 3)\ntrue", :author {:avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4", :account-source "github", :login "dijonkitchen"}, :created-at 1534460808910, :updated-at 1534460833681, :_id "5b760388e4b00ac801ed9e62"} {:editors [{:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}], :body "user=> (<= 1/4 1/3 1/2)\ntrue\n\nuser=> (<= 1/2 1/3 1/4)\nfalse\n\nuser=> (>= 1/2 0.5)\ntrue", :author {:avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4", :account-source "github", :login "berczeck"}, :created-at 1598154740865, :updated-at 1598156861827, :_id "5f41e7f4e4b0b1e3652d738c"}], :notes nil, :arglists ["x" "x y" "x y & more"], :doc "Returns non-nil if nums are in monotonically non-decreasing order,\n otherwise false.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/<="} {:added "1.0", :ns "clojure.core", :name "alter", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1326053288000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cb7"} {:created-at 1350716275000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "commute", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cb8"} {:created-at 1460613552329, :author {:login "fasiha", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/37649?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ref-set", :ns "clojure.core"}, :_id "570f31b0e4b075f5b2c864e8"}], :line 2443, :examples [{:author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; alter is a way to change the value of a reference.\n\n;; Here we're defining a ref named 'names' and setting its value to\n;; an empty vector.\n(def names (ref []))\n;;=> #'user/names\n\n;; A function to add a name to the vector (notice the meat's wrapped\n;; in a dosync\n(defn add-name [name]\n (dosync\n (alter names conj name)))\n;;=> #'user/add-name\n\n(add-name \"zack\")\n;;=> [\"zack\"]\n\n(add-name \"shelley\")\n;;=> [\"zack\" \"shelley\"]\n\n;; Notice that the var 'names' points to the reference that we created\n(println names)\n;; #\n\n;; To get the actual value of the ref, you use the '@' symbol, or deref\n(println @names)\n;; [zack shelley]\n\n(println (deref names))\n;; [zack shelley]", :created-at 1279456650000, :updated-at 1420669157673, :_id "542692c8c026201cdc326a3c"}], :notes [{:updated-at 1325053153000, :body "I was fooling around with how exactly ref works with maps. Since the example here uses a vector, I thought maybe some of you might want to see a short example using a map.\r\n\r\nIn an aggregator I'm working on, I want to keep a record of how many sources and how many articles I've aggregated. Instead of using an atom for each, I'll reference a map called \"counts.\" Here's a simple little function that increments and returns the new value of the counter stored in the map:\r\n\r\n
     (def counts (ref {:articles 0 :sources 0}))\r\n(defn inc-ref [ref type]\r\n\"increment a map value with key type stored in ref\"\r\n\t(dosync\r\n\t (alter ref assoc type (inc (type @ref)))\r\n\t (type @ref)))\r\nuser> (inc-ref counts :sources)\r\n=>1\r\nuser> counts\r\n=>{:articles 0, :sources 1}\r\n
    \r\n\r\nand if you wanted to be able to add counters dynamically (one of the advantages of using a map in this context) you could redefine the function employ an optional argument, which if present instructs the function to create a new key-value pair using the name and initial value provided:\r\n\r\n
    (defn inc-ref [ref type & [init-value]]\r\n  (if init-value\r\n    (dosync\r\n     (alter ref assoc type init-value)\r\n     (type @ref))\r\n    (dosync\r\n     (alter ref assoc type (inc (name @ref)))\r\n     (type @ref))))\r\n\r\nuser> (inc-ref counts :articles)\r\n=>1\r\nuser> (inc-ref counts :magazines 1)\r\n=>1\r\nuser> (:magazines @counts)\r\n=>1
    ", :created-at 1325048179000, :author {:login "borg", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/91d340132e883c02020ccd56946b2b91?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fd4"} {:updated-at 1349979324000, :body "In the previous example at row 07 has a reference to 'name @ref':\r\n
    (alter ref assoc type (inc (name @ref)))
    \r\nmaybe is incorrect and the correct mode is: \r\n
     (alter ref assoc type (inc (type @ref)))
    ", :created-at 1349979324000, :author {:login "grayzone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/261286ad984a83e1b0c5e0d7695d58fc?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fec"}], :arglists ["ref fun & args"], :doc "Must be called in a transaction. Sets the in-transaction-value of\n ref to:\n\n (apply fun in-transaction-value-of-ref args)\n\n and returns the in-transaction-value of ref.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/alter"} {:added "1.0", :ns "clojure.core", :name "-'", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1412882360420, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "-", :library-url "https://github.com/clojure/clojure"}, :_id "5436dfb8e4b0ae7956031578"} {:created-at 1423527625657, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "unchecked-subtract", :library-url "https://github.com/clojure/clojure"}, :_id "54d94ec9e4b081e022073c86"} {:created-at 1423527647730, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "unchecked-negate", :library-url "https://github.com/clojure/clojure"}, :_id "54d94edfe4b081e022073c87"}], :line 1031, :examples [{:body ";; unlike the * and + functions there is no 0 arity form\n(-')\n;; ArityException: wrong number of args (0)\n\n(-' 1)\n;;=> -1 \n\n(-' 6 3) \n;;=> 3\n\n(-' 10 3 2) \n;;=> 5\n\n(- 0 9000000000000000000 1000000000000000000)\n;; ArithmeticException: integer overflow\n\n(-' 0 9000000000000000000 1000000000000000000)\n;;=> 10000000000000000000N ", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1412882316521, :updated-at 1412882316521, :_id "5436df8ce4b06dbffbbb00c3"}], :notes nil, :arglists ["x" "x y" "x y & more"], :doc "If no ys are supplied, returns the negation of x, else subtracts\n the ys from x and returns the result. Supports arbitrary precision.\n See also: -", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/-'"} {:added "1.6", :ns "clojure.core", :name "if-some", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1417641557196, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:ns "clojure.core", :name "when-some", :library-url "https://github.com/clojure/clojure"}, :_id "547f7e55e4b03d20a10242bd"} {:created-at 1440455816295, :author {:login "brunchboy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2228869?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "if-let", :ns "clojure.core"}, :_id "55db9c88e4b072d7f27980ef"} {:created-at 1528840542254, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "some", :ns "clojure.core"}, :_id "5b20415ee4b00ac801ed9e12"}], :line 1876, :examples [{:body "(if-some [a 10] :true :false) ; => :true\n(if-some [a true] :true :false) ; => :true\n(if-some [a false] :true :false) ; => :true\n(if-some [a nil] :true :false) ; => :false\n\n;; for comparison\n(if-let [a 10] :true :false) ; => :true\n(if-let [a true] :true :false) ; => :true \n(if-let [a false] :true :false) ; => :false\n(if-let [a nil] :true :false) ; => :false\n", :author {:login "philoskim", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5637280?v=3"}, :created-at 1420603516061, :updated-at 1420603516061, :_id "54acb07ce4b09260f767ca8e"}], :macro true, :notes [{:body "See [this Jira ticket](http://dev.clojure.org/jira/browse/CLJ-1343) for some background on this.\n\n (if-some [var test] then else)\n\nis essentially equivalent to:\n\n (if-let [var (not (nil? test))] then else)\n", :created-at 1417641857996, :updated-at 1417641857996, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :_id "547f7f81e4b03d20a10242be"} {:author {:login "titogarcia", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/699549?v=4"}, :updated-at 1634126821797, :created-at 1634126821797, :body "> `(if-some [var test] then else)`\n>\n> is essentially equivalent to:\n>\n> `(if-let [var (not (nil? test))] then else)`\n\nThis is incorrect. Notice that `nil?` will return a boolean. This equivalency would only be true if `test` is a boolean value.", :_id "6166cbe5e4b0b1e3652d7559"}], :arglists ["bindings then" "bindings then else & oldform"], :doc "bindings => binding-form test\n\n If test is not nil, evaluates then with binding-form bound to the\n value of test, if not, yields else", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/if-some"} {:added "1.1", :ns "clojure.core", :name "conj!", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1286870227000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "transient", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d6f"} {:created-at 1329969779000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "assoc!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d70"} {:created-at 1329969851000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "dissoc!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d71"} {:created-at 1473091049902, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "conj", :ns "clojure.core"}, :_id "57cd95e9e4b0709b524f04e3"}], :line 3358, :examples [{:updated-at 1577915992503, :created-at 1286870264000, :body ";; As seen on http://clojure.org/transients\n;; array is initially made transient, modified then\n;; finally made persistent.\n\n;; Note: This example correctly always uses the return value of conj! for\n;; future modifications, not the original value of v. See assoc! examples,\n;; and another example for conj!, for some discussion of why this is important.\n\n(defn vrange2 [n]\n (loop [i 0 v (transient [])]\n (if (< i n)\n (recur (inc i) (conj! v i))\n (persistent! v))))\n\nuser=> (vrange2 10)\n[0 1 2 3 4 5 6 7 8 9]", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}], :author {:avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon", :account-source "clojuredocs", :login "gstamp"}, :_id "542692cac026201cdc326b43"} {:updated-at 1577915639084, :created-at 1577915639084, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :body ";; The next function below uses conj! incorrectly, ignoring its return\n;; value.\n\nuser=> (defn into-bad-example-bash-in-place [to-coll from-coll]\n (let [t (transient to-coll)]\n (loop [f (seq from-coll)]\n (if-let [s (seq f)]\n (do\n (conj! t (first s))\n (recur (next s)))\n (persistent! t)))))\n\n;; The first example call below returns the desired value.\n\nuser=> (into-bad-example-bash-in-place {:a 1, :b 2, :c 3} {:d 4, :e 5})\n{:a 1, :b 2, :c 3, :d 4, :e 5}\n\n;; However, it is by accident that it is correct. This effect can be\n;; subtle and surprising to many, because many experiments will return\n;; the desired values, as the example above does.\n\n;; The return value is correct for these inputs because all of these\n;; calls to conj! not only return the mutated object that we should be\n;; using, but they also happen to mutate the object in place that it\n;; is passed. Thus ignoring the return value happens not to lead to\n;; incorrect behavior here.\n\n;; However, conj! _can_ in some cases return a different object than\n;; the one it was passed, and _not_ mutate the object it is passed.\n;; Look at this return value.\n\nuser=> (into-bad-example-bash-in-place\n {:a 1, :b 2, :c 3, :d 4, :e 5, :f 6, :g 7, :h 8}\n {:i 9})\n{:a 1, :b 2, :c 3, :d 4, :e 5, :f 6, :g 7, :h 8}\n\n;; This result is not what we want, because key :i is not present in\n;; the result anywhere. conj! returned a different object than the\n;; one it was given, but the function above does not use the return\n;; value, instead discarding it.\n\n;; The function below uses conj! as it should be, always using its\n;; return value in future calls on the transient collection.\n\nuser=> (defn into-better-use-return-value [to-coll from-coll]\n (loop [t (transient to-coll)\n f (seq from-coll)]\n (if-let [s (seq f)]\n (recur (conj! t (first s))\n (next s))\n (persistent! t))))\n\nuser=> (into-better-use-return-value {:a 1, :b 2, :c 3} {:d 4, :e 5})\n{:a 1, :b 2, :c 3, :d 4, :e 5}\n\nuser=> (into-better-use-return-value\n {:a 1, :b 2, :c 3, :d 4, :e 5, :f 6, :g 7, :h 8}\n {:i 9})\n{:e 5, :g 7, :c 3, :h 8, :b 2, :d 4, :f 6, :i 9, :a 1}\n\n;; The keys are not in the same order, but recall that regular Clojure\n;; maps are not sorted in any predictable way, as opposed to\n;; sorted-map's. However, all 9 of the keys that we expect to be\n;; there, are there.", :_id "5e0d14f7e4b0ca44402ef804"}], :notes nil, :arglists ["" "coll" "coll x"], :doc "Adds x to the transient collection, and return coll. The 'addition'\n may happen at different 'places' depending on the concrete type.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/conj!"} {:added "1.0", :ns "clojure.core", :name "repeatedly", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1286264111000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "repeat", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c8e"} {:created-at 1289359620000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "iterate", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c8f"} {:created-at 1289359625000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "lazy-seq", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c90"} {:created-at 1295239829000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "dotimes", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c91"} {:created-at 1295239907000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "doall", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c92"} {:created-at 1343151093000, :author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rand-int", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c93"} {:created-at 1345605379000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "constantly", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c94"} {:created-at 1502829747775, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "while", :ns "clojure.core"}, :_id "59935cb3e4b0d19c2ce9d717"}], :line 5143, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "citizen428", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3881a28fe402dd2d1de44717486cae8?r=PG&default=identicon"} {:login "citizen428", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3881a28fe402dd2d1de44717486cae8?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"} {:login "nyashh", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2254461eab79d5d84a021414e8e36dba?r=PG&default=identicon"} {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"} {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"} {:login "tomas", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c0c2f195479ae4a71cb6484679f6f49?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; these two functions are equivalent \n\n(take 5 (repeatedly #(rand-int 11)))\n;;=> (6 6 3 9 8)\n\n;; this version only returns the first five elements\n(repeatedly 5 #(rand-int 11))\n;;=> (1 8 6 9 6)\n\n;; compare with repeat, which\n;; only calls the 'rand-int' function once,\n;; repeating the value five times.\n(repeat 5 (rand-int 100))\n(94 94 94 94 94)", :created-at 1279093287000, :updated-at 1421872565837, :_id "542692cfc026201cdc326e2f"} {:author {:login "Jeff Rose", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/567898c496278341be69087507d5ed24?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(defn counter [] \n (let [tick (atom 0)]\n #(swap! tick inc)))\n\n(def tick (counter))\n\n(take 10 (repeatedly tick))\n;;=> (1 2 3 4 5 6 7 8 9 10)\n\n;; or equivalently\n(repeatedly 10 (counter))\n;;=> (1 2 3 4 5 6 7 8 9 10)", :created-at 1283550417000, :updated-at 1421872865341, :_id "542692cfc026201cdc326e38"} {:editors [{:login "Jjunior130", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7597818?v=3"}], :body ";;;; If you want random values for each element in repeatedly\n;; don't call rand as an argument in partial\n(= true\n (every? true?\n [(apply = (flatten\n (repeatedly 2 (partial vector (rand)))))\n (apply = (flatten\n (repeatedly 2 (partial (partial vector (rand))))))]))\n\n;; but do call it within a #(...) or (fn [] ...)\n(= true\n (every? false?\n [(apply = (repeatedly 2 rand)) \n (apply = (repeatedly 2 #(rand))) \n (apply = (repeatedly 2 (partial rand))) ; passing the rand function works\n (apply = (flatten\n (repeatedly 2 (fn [] (vector (rand))))))\n (apply = (flatten\n (repeatedly 2 #((partial vector (rand))))))\n (apply = (flatten\n (repeatedly 2 #(vector (rand)))))]))", :author {:avatar-url "https://avatars.githubusercontent.com/u/7597818?v=3", :account-source "github", :login "Jjunior130"}, :created-at 1483821463432, :updated-at 1483821506915, :_id "58715197e4b09108c8545a50"} {:updated-at 1520597247645, :created-at 1520595747920, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; \"repeatedly\" used to build a infinite sequence of side-effecting futures.\n;; Futures are taken in batch of \"parallel\" concurrent threads. The queue\n;; can be fed while the loop is running. \"done?\" determines the exit condition.\n\n(import '[java.util.concurrent ConcurrentLinkedQueue])\n(def q (ConcurrentLinkedQueue. (range 100)))\n\n(let [parallel 5\n done? #(> (reduce + (remove nil? %)) 30)\n task #(do (println \"start\" %) (Thread/sleep 1000) (inc %))]\n (loop [workers (repeatedly\n #(let [out *out*]\n (future\n (binding [*out* out]\n (when-let [item (.poll q)]\n (task item))))))]\n (println \"-> starting\" parallel \"new workers\")\n (let [futures (doall (take parallel workers))\n results (mapv deref futures)]\n (cond\n (done? results) results\n (.isEmpty q) (println \"Empty.\")\n :else (recur (drop parallel workers))))))\n\n;; -> starting 5 new workers\n;; startstart 03\n;;\n;; startstart 1\n;; 2start 4\n;;\n;; -> starting 5 new workers\n;; start 5start\n;; start start7start\n;; 6\n;; 8\n;; 9\n[6 7 8 9 10]\n", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5aa27323e4b0316c0f44f914"} {:updated-at 1576431818434, :created-at 1576431818434, :author {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/24317401?v=4"}, :body ";; CLI app to return the type of a line\n\n(doseq [val (repeatedly read-line)]\n (prn\n (type\n (clojure.edn/read-string val))))\n\n;; $\nHello\nclojure.lang.Symbol\n15\njava.lang.Long\n:keyword\nclojure.lang.Keyword\n{}\nclojure.lang.PersistentArrayMap", :_id "5df670cae4b0ca44402ef7fb"}], :notes [{:updated-at 1289359893000, :body "if the function you want to repeat doesn't have side effects and has an argument, 'iterate' may be what you are looking for.", :created-at 1289359893000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fa1"}], :arglists ["f" "n f"], :doc "Takes a function of no args, presumably with side effects, and\n returns an infinite (or length n if supplied) lazy sequence of calls\n to it", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/repeatedly"} {:added "1.0", :ns "clojure.core", :name "zipmap", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1325197673000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "interleave", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e62"} {:created-at 1652060861458, :author {:login "KyleErhabor", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/40676441?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "into", :ns "clojure.core"}, :_id "627872bde4b0b1e3652d75ec"}], :line 3071, :examples [{:author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:avatar-url "https://avatars.githubusercontent.com/u/5696817?v=3", :account-source "github", :login "liango2"}], :body "user=> (zipmap [:a :b :c :d :e] [1 2 3 4 5])\n{:a 1, :b 2, :c 3, :d 4, :e 5}\n", :created-at 1279388151000, :updated-at 1451234587672, :_id "542692c7c026201cdc3269a8"} {:author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:login "liango2", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5696817?v=3"}], :body ";; 4 is not included in the result\nuser=> (zipmap [:a :b :c] [1 2 3 4])\n{:a 1, :b 2, :c 3}\n\n;; :c is not included in the result\nuser=> (zipmap [:a :b :c] [1 2])\n{:a 1, :b 2}", :created-at 1335331821000, :updated-at 1451234612952, :_id "542692d6c026201cdc3270cb"} {:editors [{:login "ys-achinta", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/10450478?v=4"}], :body "user=> (pprint \n (zipmap [:html :body :div] (repeat {:margin 0 :padding 0})))\n{:html {:margin 0, :padding 0},\n :body {:margin 0, :padding 0},\n :div {:margin 0, :padding 0}}", :author {:avatar-url "https://avatars.githubusercontent.com/u/4471727?v=3", :account-source "github", :login "edbedbe"}, :created-at 1439315700433, :updated-at 1566311402870, :_id "55ca36f4e4b0080a1b79cdb9"} {:editors [{:login "tecigo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/13831422?v=3"}], :body ";; transform a CSV file to an array of maps using the header line as keys\nuser=> (defn csv-map\n \"ZipMaps header as keys and values from lines.\"\n [head & lines]\n (map #(zipmap (map keyword head) %1) lines))\n\nuser=> (apply csv-map [[\"FirstName\", \"LastName\"], [\"John\", \"Doe\"], [\"Jill\", \"Doh\"]])\n({:FirstName \"John\", :LastName \"Doe\"}, {:FirstName \"Jill\", :LastName \"Doh\"})", :author {:avatar-url "https://avatars.githubusercontent.com/u/13831422?v=3", :account-source "github", :login "tecigo"}, :created-at 1459353469570, :updated-at 1459354350134, :_id "56fbf77de4b069b77203b858"} {:updated-at 1472949315282, :created-at 1472949315282, :author {:login "d-lord", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6218499?v=3"}, :body ";; initialize with 0 for all values\nuser=> (zipmap [:a :b :c] (repeat 0))\n{:a 0, :b 0, :c 0}", :_id "57cb6c43e4b0709b524f04e1"} {:updated-at 1488306683395, :created-at 1488306683395, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :body ";; Note that if the keys are not unique, you can potentially lose data:\nuser=> (zipmap [:a :b :c :a] [1 2 3 4])\n{:a 4, :b 2, :c 3}\n", :_id "58b5c1fbe4b01f4add58fe66"} {:editors [{:login "zyxmn-rvu", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/53867608?v=4"}], :body ";; Note the generated map is meant to be un-ordered and can be noticed only for sizes greater than 8\n\n;; Ordered as key coll argument\nuser=> (zipmap [:key1 :key2 :key3 :key4 :key5 :key6 :key7 :key8] [1 2 3 4 5 6 7 8])\n{:key1 1, :key2 2, :key3 3, :key4 4, :key5 5, :key6 6, :key7 7, :key8 8}\n\n;; Un-ordered\nuser=> (zipmap [:key1 :key2 :key3 :key4 :key5 :key6 :key7 :key8 :key9] [1 2 3 4 5 6 7 8 9])\n{:key3 3, :key2 2, :key8 8, :key6 6, :key9 9, :key7 7, :key4 4, :key1 1, :key5 5}\n", :author {:avatar-url "https://avatars1.githubusercontent.com/u/53867608?v=4", :account-source "github", :login "zyxmn-rvu"}, :created-at 1574963248718, :updated-at 1574963310117, :_id "5de00830e4b0ca44402ef7ed"} {:updated-at 1649862774454, :created-at 1649862774454, :author {:login "stindrago", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69054881?v=4"}, :body ";; Alternative logic for `cond` scenarios\n\n;; `zipmap` returns a map paring each value in the range (1-4) to a percentage (50%)\n(def rates\n (conj {0 0/100}\n (zipmap (range 1 5) (repeat 50/100))\n {5 90/100}))\n;; => {0 0, 1 1/2, 2 1/2, 3 1/2, 4 1/2, 5 9/10}\n\n(* 2.0 (rates 3))\n;; => 1.0", :_id "6256e876e4b0b1e3652d75d3"}], :notes [{:author {:login "seeeturtle", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/22187719?v=4"}, :updated-at 1553308608008, :created-at 1553308608008, :body "`zipmap` always leave last key & val if keys are duplicated\nlike the last example code.\n\nYou can know them from source code which `assoc` key & val to result map in left-to-right order.", :_id "5c959bc0e4b0ca44402ef6c0"}], :arglists ["keys vals"], :doc "Returns a map with the keys mapped to the corresponding vals.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/zipmap"} {:added "1.9", :ns "clojure.core", :name "reset-vals!", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 2383, :examples [{:updated-at 1539313237640, :created-at 1539312224752, :author {:login "WinfieldHill", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4356515?v=4"}, :body ";; An atom is defined\n(def open-sockets (atom []))\n;;=> #'user/open-sockets\n\n;; Conjoin a value or two onto the atom\n(swap! open-sockets conj socket)\n;;=> [<< stream: 1 >> << stream: 2 >>]\n\n;; Knock the first socket out of open-sockets\n(reset-vals! open-sockets (subvec @open-sockets 1))\n;;=> [[<< stream: 1 >> << stream: 2 >>][<< stream: 2 >>]]\n\n;; Knock the last socket out of open-sockets\n(reset-vals! open-sockets (pop @open-sockets))\n;;=> [[<< stream: 2 >>] []]", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/4356515?v=4", :account-source "github", :login "WinfieldHill"}], :_id "5bc00a60e4b00ac801ed9ed2"}], :notes nil, :arglists ["atom newval"], :doc "Sets the value of atom to newval. Returns [old new], the value of the\n atom before and after the reset.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/reset-vals!"} {:added "1.0", :ns "clojure.core", :name "alter-var-root", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1322088086000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-redefs", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f28"} {:created-at 1322088098000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-redefs-fn", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f29"} {:created-at 1360641932000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "intern", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f2a"} {:created-at 1374167327000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "var", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f2b"} {:created-at 1501312693026, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "set!", :ns "clojure.core"}, :_id "597c36b5e4b0d19c2ce9d702"}], :line 5505, :examples [{:updated-at 1607409758219, :created-at 1283913245000, :body "(defn sqr [n] \n \"Squares a number\"\n (* n n))\n\nuser=> (sqr 5)\n25\n\nuser=> (alter-var-root \n (var sqr) ; var to alter\n (fn [f] ; fn to apply to the var's value\n (fn [n] ; returns a new fn wrapping old fn\n (println \"Squaring\" n)\n (f n))))\n\nuser=> (sqr 5)\nSquaring 5\n25\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:login "liuchong", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/236058?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/5aa24eee4238e1e964210ed447e8dc91?r=PG&default=identicon", :account-source "clojuredocs", :login "fogus"}, :_id "542692cfc026201cdc326e70"} {:updated-at 1472301721034, :created-at 1472301721034, :author {:login "manishkumarmdb", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/9373950?v=3"}, :body ";;change the value of a var, instead of (def varName value)\nuser=> (def string \"abcd\")\n#'user/string\n\nuser=> string\n\"abcd\"\n\nuser=> (alter-var-root #'string (constantly \"wxyz\"))\n\"wxyz\"\n\nuser=> string\n\"wxyz\"", :_id "57c18a99e4b0709b524f04d6"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; alter-var-root does not play well with inlined vars\n\n(definline timespi [x] `(* ~x 3.14))\n(alter-var-root #'timespi (fn [_] (constantly 1)))\n(timespi 10)\n;; 31.400000000000002\n\n;; Remove the inlining to pass through the var indirection (credits @bronsa)\n(alter-meta! #'timespi dissoc :inline-arities :inline)\n(timespi 10)\n;; 1", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1546020626144, :updated-at 1546020907201, :_id "5c266712e4b0ca44402ef601"} {:updated-at 1648587095817, :created-at 1648587095817, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/159047?v=4"}, :body "(defn instrument-ns\n \"Add some basic instrumentation to each var in a given namespace `sut`.\n A poor man's profiler, this simply prints out the name of each\n fn (var) when run.\"\n [sut]\n (let [fs (vals (ns-interns sut))]\n (println \"Instrumenting fns to be printed as run for NS:\" sut)\n (doseq [curf fs]\n (when (some? (:arglists (meta curf))) ; ensure a fn\n (alter-var-root\n curf\n (fn [f]\n (fn [& args]\n ;; Just print out the name of the function evaluated\n (println (:name (meta curf)))\n ;; (System/currentTimeMillis) ; could add timing info before/after\n (apply f args))))))))\n", :_id "62437157e4b0b1e3652d75c4"} {:editors [{:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}], :body ";; `alter-var-root` uses the same signature as `swap!` and `update`. \n;; It has uncomfortable, persistent effects if you're not careful. \n\nuser=> (def x \"Hi\")\n#'user/x\nuser=> (alter-var-root #'x #(str % \", world!\"))\n\"Hi, world!\"\nuser=> (alter-var-root #'x #(str % \", world!\"))\n\"Hi, world!, world!\"\nuser=> (alter-var-root #'x #(str % \", world!\"))\n\"Hi, world!, world!, world!\"\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4", :account-source "github", :login "Crowbrammer"}, :created-at 1653498578027, :updated-at 1653498619629, :_id "628e62d2e4b0b1e3652d75f1"}], :notes nil, :arglists ["v f & args"], :doc "Atomically alters the root binding of var v by applying f to its\n current value plus any args", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/alter-var-root"} {:added "1.0", :ns "clojure.core", :name "biginteger", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1509577866305, :author {:login "chrm", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/448995?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "bigint", :ns "clojure.core"}, :_id "59fa548ae4b0a08026c48c92"}], :line 3633, :examples [{:author {:login "linxiangyu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2c7492645426ece4ae86fde83d61bd03?r=PG&default=identicon"}, :editors [], :body "user=> (def x (biginteger 19931029))\n#'user/x\nuser=> (class x)\njava.math.BigInteger\n\n\n\n", :created-at 1370558225000, :updated-at 1370558225000, :_id "542692d2c026201cdc326f53"} {:updated-at 1509577857859, :created-at 1509577857859, :author {:login "chrm", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/448995?v=4"}, :body ";; There is a difference between `BigInt` and `BigInteger`. The first is from\n;; Clojure and should be better for performace, because less unboxing is\n;; necessary. The second is from Java and has more functionality.\n;; https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html\n\n(type 123N)\n;; => clojure.lang.BigInt\n\n(type (bigint 123))\n;; => clojure.lang.BigInt\n\n(type (biginteger 123))\n;; => java.math.BigInteger\n\n(.modInverse (bigint 123) (bigint 4))\n;; IllegalArgumentException No matching method found: modInverse for class\n;; clojure.lang.BigInt\n\n(.modInverse (biginteger 123) (biginteger 4))\n;; => 3", :_id "59fa5481e4b0a08026c48c91"} {:editors [{:login "cloojure", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/7083783?v=4"}], :body "; It also works for strings\n(biginteger \"12345\") => 12345 ; java.math.BigInteger\n", :author {:avatar-url "https://avatars0.githubusercontent.com/u/7083783?v=4", :account-source "github", :login "cloojure"}, :created-at 1535909938405, :updated-at 1535910003220, :_id "5b8c2032e4b00ac801ed9e7f"} {:updated-at 1598221345110, :created-at 1598221345110, :author {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}, :body ";; Take care with ratios the decimal part is removed not rounded\nuser=> (biginteger 5/4) ; 1.25\n;; 1\n\nuser=> (biginteger 5/2) ; 2.5\n;; 2", :_id "5f42ec21e4b0b1e3652d73a8"}], :notes nil, :tag "java.math.BigInteger", :arglists ["x"], :doc "Coerce to BigInteger", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/biginteger"} {:added "1.0", :ns "clojure.core", :name "remove", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1282310768000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "filter", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cee"} {:created-at 1487135935513, :author {:login "chrismurrph", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10278575?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "group-by", :ns "clojure.core"}, :_id "58a3e4bfe4b01f4add58fe55"} {:created-at 1501184742340, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "keep", :ns "clojure.core"}, :_id "597a42e6e4b0d19c2ce9d701"}], :line 2826, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "sir-pinecone", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/40753?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(remove pos? [1 -2 2 -1 3 7 0])\n;;=> (-2 -1 0)\n\n(remove nil? [1 nil 2 nil 3 nil])\n;;=> (1 2 3)\n\n;; remove items that are evenly divisible by 3\n(remove #(zero? (mod % 3)) (range 1 21))\n;;=> (1 2 4 5 7 8 10 11 13 14 16 17 19 20)", :created-at 1281548721000, :updated-at 1420744145542, :_id "542692cfc026201cdc326e3c"} {:body ";; compare to filter\n\n(remove even? (range 10))\n;;=> (1 3 5 7 9)\n\n(remove (fn [x]\n (= (count x) 1))\n [\"a\" \"aa\" \"b\" \"n\" \"f\" \"lisp\" \"clojure\" \"q\" \"\"])\n;;=> (\"aa\" \"lisp\" \"clojure\" \"\")\n\n; When coll is a map, pred is called with key/value pairs.\n(remove #(> (second %) 100)\n {:a 1\n :b 2\n :c 101\n :d 102\n :e -1})\n;;=> ([:a 1] [:b 2] [:e -1])\n", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1420744060322, :updated-at 1420744060322, :_id "54aed57ce4b0e2ac61831ca0"} {:updated-at 1453292141320, :created-at 1453292141320, :author {:login "esumitra", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/98965?v=3"}, :body ";; remove items from a set/list\n\n(remove #{:a} #{:b :c :d :a :e})\n;;=> (:e :c :b :d)\n\n(remove #{:a} [:b :c :d :a :e :a :f])\n;;=> (:b :c :d :e :f)\n", :_id "569f7a6de4b060004fc217af"} {:updated-at 1516533045589, :created-at 1516533045589, :author {:login "vastus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/199064?v=4"}, :body ";; use map as a pred\n\n(remove {:a 42 :b 69} #{:a :b :c})\n;;=> (:c)", :_id "5a647535e4b0637c3b2baf4c"} {:updated-at 1594561061837, :created-at 1594561061837, :author {:login "kevinmungai", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/23656776?v=4"}, :body ";; remove all the hyphens in an ISBN Number\n\n(into [] (remove #{\\-}) \"3-598-21508-8\")\n;;=> [\\3 \\5 \\9 \\8 \\2 \\1 \\5 \\0 \\8 \\8]\n\n;; remove is used in the capacity of a transducer", :_id "5f0b1225e4b0b1e3652d7321"} {:updated-at 1601477483307, :created-at 1601477483307, :author {:login "E-A-Griffin", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/53583563?v=4"}, :body ";; remove unique elements from collection\n\n(def nums (concat (range 10) (range 5 15)))\n\n(keys (remove (fn [[k v]] (= v 1))\n (frequencies nums)))\n;;=> (7 6 9 5 8)\n\n;; remove unique elements from collection, preserving order\n(defn keep-duplicates [coll]\n (sort-by #((into {} (map-indexed vector coll)) %) \n (keys (remove (fn [[k v]] (= v 1))\n (frequencies coll)))))\n\n(keep-duplicates nums)\n;; => (5 6 7 8 9)\n\n(def rev-nums (reverse nums))\n\n(keep-duplicates rev-nums)\n;;=> (9 8 7 6 5)", :_id "5f749b6be4b0b1e3652d73c6"}], :notes nil, :arglists ["pred" "pred coll"], :doc "Returns a lazy sequence of the items in coll for which\n (pred item) returns logical false. pred must be free of side-effects.\n Returns a transducer when no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/remove"} {:added "1.2", :ns "clojure.core", :name "*", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1323065497000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "*'", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ca8"} {:created-at 1423527840855, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "unchecked-multiply", :library-url "https://github.com/clojure/clojure"}, :_id "54d94fa0e4b081e022073c88"}], :line 1008, :examples [{:author {:login "samaaron", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ee3512261f38df2541b9adca77f025cb?r=PG&default=identicon"}, :editors [{:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jmglov", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/67e9a6f766dc4b30bd5e9ff3e77c1777?r=PG&default=identicon"} {:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"} {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}], :body ";; there is an implicit 1\n(*)\n;;=> 1 \n\n;; the implicit 1 comes into play\n(* 6)\n;;=> 6\n\n(* 2 3)\n;;=> 6\n\n(* 2 3 4)\n;;=> 24\n\n(* 0.5 200)\n;;=> 100.0\n\n(* 8 1/2)\n;;=> 4N\n\n(* 1234567890 9876543210)\n;; ArithmeticException integer overflow", :created-at 1278738436000, :updated-at 1598154236190, :_id "542692c8c026201cdc326a45"}], :notes nil, :arglists ["" "x" "x y" "x y & more"], :doc "Returns the product of nums. (*) returns 1. Does not auto-promote\n longs, will throw on overflow. See also: *'", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*"} {:added "1.0", :ns "clojure.core", :name "re-pattern", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1289146513000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "re-find", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b2f"} {:created-at 1324450178000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.string", :name "replace", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b30"} {:created-at 1324450182000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.string", :name "replace-first", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b31"}], :line 4839, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "NielsK", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/11ab6518d419df03c4883af80b5697ee?r=PG&default=identicon"}], :body "user=> (re-pattern \"\\\\d+\")\n#\"\\d+\"\n\nuser=> (re-find (re-pattern \"\\\\d+\") \"abc123def\") \n\"123\"\n\n;; If you want to construct a regex pattern dynamically at run time,\n;; then you need to use re-pattern to convert a string to a pattern\n;; that can be used for matching. But if your pattern is one you\n;; write into the source code, it is more convenient to use the\n;; #\"pattern\" syntax. The previous example can be written as follows.\nuser=> (re-find #\"\\d+\" \"abc123def\") \n\"123\"\n\n;; Below are two examples that are equivalent in the patterns they\n;; use, but the #\"pattern\" syntax helps significantly, because it lets\n;; us avoid the requirement to escape every \\ character with another \\\n;; character. See the example with embedded comments below for more\n;; detail on what the pattern matches.\nuser=> (re-find #\"\\\\\\d+\\s+\\S+\" \"\\\\ it sh0uld match in \\\\5 here somewhere.\")\n\"\\\\5 here\"\n\nuser=> (re-find (re-pattern \"\\\\\\\\\\\\d+\\\\s+\\\\S+\")\n \"\\\\ it sh0uld match in \\\\5 here somewhere.\")\n\"\\\\5 here\"\n\n;; If you want to embed (ignored) whitespace and comments from #\n;; characters until end-of-line in your regex patterns, start the\n;; pattern with (?x)\nuser=> (re-find #\"(?x) # allow embedded whitespace and comments\n \\\\ # backslash\n \\d+ # one or more digits\n \\s+ # whitespace\n \\S+ # non-whitespace\"\n \"\\\\ it sh0uld match in \\\\5 here somewhere.\")\n\"\\\\5 here\"\n\n;; Other pattern flags like Java's DOTALL, MULTILINE and UNICODE_CASE\n;; pattern matching modes, can be set by combining these embedded flags\n\n;; (?d) Unix lines (only match \\newline)\n;; (?i) Case-insensitive\n;; (?u) Unicode-aware Case\n;; (?m) Multiline\n;; (?s) Dot matches all (including newline)\n;; (?x) Ignore Whitespace and comments\n\nuser=> (re-seq #\"(?ix) test #Case insensitive and comments allowed\"\n \"Testing,\\n testing,\\n 1 2 3\")\n(\"Test\" \"test\")\n", :created-at 1280547138000, :updated-at 1365007458000, :_id "542692c6c026201cdc3268c7"}], :notes [{:author {:login "nuggets510", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/5713182?v=4"}, :updated-at 1567898080855, :created-at 1567898080855, :body "You can access documentation for the regex pattern \"language\" using (javadoc java.util.regex.Pattern) at the repl prompt. it should take you here: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/regex/Pattern.html", :_id "5d7439e0e4b0ca44402ef7ae"}], :tag "java.util.regex.Pattern", :arglists ["s"], :doc "Returns an instance of java.util.regex.Pattern, for use, e.g. in\n re-matcher.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/re-pattern"} {:added "1.0", :ns "clojure.core", :name "min", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1371841114000, :author {:login "adereth", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5ad11b4e208a6cdb3bd45fe01dea59b7?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "max", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f10"} {:created-at 1371841126000, :author {:login "adereth", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5ad11b4e208a6cdb3bd45fe01dea59b7?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "min-key", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f11"}], :line 1125, :examples [{:updated-at 1332951489000, :created-at 1279417619000, :body "user=> (min 1 2 3 4 5) \n1\nuser=> (min 5 4 3 2 1)\n1\nuser=> (min 100)\n100", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}], :author {:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"}, :_id "542692cfc026201cdc326e7a"} {:author {:login "jmglov", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/67e9a6f766dc4b30bd5e9ff3e77c1777?r=PG&default=identicon"}, :editors [], :body ";; If elements are already in a sequence, use apply\nuser=> (apply min [1 2 3 4 3])\n1\nuser=> (apply min '(4 3 5 6 2))\n2", :created-at 1392661837000, :updated-at 1392661837000, :_id "542692d4c026201cdc327011"}], :notes nil, :arglists ["x" "x y" "x y & more"], :doc "Returns the least of the nums.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/min"} {:added "1.1", :ns "clojure.core", :name "pop!", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1329970267000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "assoc!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dcf"} {:created-at 1329970271000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "dissoc!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dd0"} {:created-at 1577916147025, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "conj!", :ns "clojure.core"}, :_id "5e0d16f3e4b0ca44402ef80a"}], :line 3392, :examples [{:updated-at 1577916129615, :created-at 1307739212000, :body ";; Note how we always use the return value of pop! in these examples\n;; for all future modifications, rather than (incorrectly) ignoring the return\n;; value and continuing to modify the original transient set. See examples for\n;; assoc! and dissoc! for more discussion and examples of this.\n;; Also see one example for conj! that contains a detailed example\n;; of a wrong result that can occur if you do not use its return value.\n\nuser=> (def foo (transient [1 2 3]))\n#'user/foo\nuser=> (count foo)\n3\nuser=> (def foo (pop! foo))\n#'user/foo\nuser=> foo\n#\nuser=> (count foo)\n2\nuser=> (def foo (pop! foo))\n#'user/foo\nuser=> (count foo)\n1\nuser=> (def foo (persistent! foo))\n#'user/foo\nuser=> (count foo)\n1\nuser=> foo\n[1]\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}], :author {:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"}, :_id "542692c7c026201cdc3269ce"}], :notes nil, :arglists ["coll"], :doc "Removes the last item from a transient vector. If\n the collection is empty, throws an exception. Returns coll", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/pop!"} {:ns "clojure.core", :name "chunk-append", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1443937484077, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-buffer", :ns "clojure.core"}, :_id "5610bccce4b0686557fcbd51"} {:created-at 1443937492439, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk", :ns "clojure.core"}, :_id "5610bcd4e4b08e404b6c1ca4"}], :line 695, :examples [{:updated-at 1443937472462, :created-at 1443937472462, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :body "(let [buf (chunk-buffer 16)]\n ;; Mutably append elements to the ChunkedBuffer\n (dotimes [n 10]\n (chunk-append buf n))\n\n ;; Demonstrate pulling elements out.\n ;; Note that the `capacity` we set above (16) for `buf`.\n (let [ch (chunk buf)]\n (for [n (range 0 17)]\n (try (.nth ch n)\n (catch ArrayIndexOutOfBoundsException e\n \"too far!\")))))\n\n;; => (0 1 2 3 4 5 6 7 8 9 nil nil nil nil nil nil \"too far!\")", :_id "5610bcc0e4b08e404b6c1ca3"}], :notes nil, :arglists ["b x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/chunk-append"} {:added "1.0", :ns "clojure.core", :name "prn-str", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1315392416000, :author {:login "srid", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd3a68d670372cd09876c26270a4299a?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "prn", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aca"} {:created-at 1412284928324, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.edn", :name "read-string", :library-url "https://github.com/clojure/clojure"}, :_id "542dc200e4b05f4d257a299a"}], :line 4745, :examples [{:updated-at 1495025858123, :created-at 1284257994000, :body "user=> (def x \"Hello!\\nMy name is George.\\n\")\n#'user/x\n\nuser=> (prn-str x)\n=> \"\\\"Hello!\\\\nMy name is George.\\\\n\\\"\\n\"\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/7c45f63f61e478233f0c2ad3006b178c?r=PG&default=identicon", :account-source "clojuredocs", :login "mdemare"} {:avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon", :account-source "clojuredocs", :login "Miles"} {:avatar-url "https://www.gravatar.com/avatar/890d46f8c0e24dd6fb8546095b1144e?r=PG&default=identicon", :account-source "clojuredocs", :login "haplo"} {:login "flyjwayur", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11784820?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon", :account-source "clojuredocs", :login "Miles"}, :_id "542692cac026201cdc326b1d"} {:updated-at 1522767399827, :created-at 1522767399827, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :body ";; Be aware that prn-str and friends are influenced by a couple global variables\n;; such as *print-length*:\n\n(set! *print-length* 10)\n(prn-str (range 15))\n;=> \"(0 1 2 3 4 5 6 7 8 9 ...)\\n\"\n\n(set! *print-length* -1)\n(prn-str (range 15))\n;=> \"(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14)\\n\"", :_id "5ac39627e4b045c27b7fac33"} {:updated-at 1664293623051, :created-at 1664293623051, :author {:login "jzwolak", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/285725?v=4"}, :body ";; Also, set! cannot change the root binding for *print-length*.\n;; Try the following instead.\n\n(def v [1 2 3 4 5 6 7 8 9 10])\n\n(binding [*print-length* 5] (prn-str v))\n;;=> \"[1 2 3 4 5 ...]\\n\"\n\n(binding [*print-length* -1] (prn-str v))\n;;=> \"[1 2 3 4 5 6 7 8 9 10]\\n\"", :_id "63331af7e4b0b1e3652d766a"}], :notes nil, :tag "java.lang.String", :arglists ["& xs"], :doc "prn to a string, returning it", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/prn-str"} {:added "1.0", :ns "clojure.core", :name "with-precision", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1635281422222, :author {:login "Chouser", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/36110?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "*math-context*", :ns "clojure.core"}, :_id "61786a0ee4b0b1e3652d755b"}], :line 5086, :examples [{:author {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"} {:login "wdkrnls", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/6d08a2f792f289b95fe1d982d4133d71?r=PG&default=identicon"}], :body ";; The \"M\" suffix denotes a BigDecimal instance\n;; http://download.oracle.com/javase/6/docs/api/java/math/BigDecimal.html\n\nuser=> (with-precision 10 (/ 1M 6))\n0.1666666667M\n\nuser=> (.floatValue 0.1666666667M)\n0.16666667\n", :created-at 1283812216000, :updated-at 1310865949000, :_id "542692cbc026201cdc326bb1"} {:editors [{:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}], :body ";; This may come in handy for example when you use JDBC to grab data\n;; from a database, and numbers comes in as BigDecimal. Notice the\n;; following ArithmeticException, and solution:\n\n(/ 2M 3M) ; => ArithmeticException\n(with-precision 2 (/ 2M 3M)) ; => 0.67M\n\n;; To make this error more searchable, here's what it is, exactly:\n;;\n;; Non-terminating decimal expansion; no exact representable decimal result. \n;; java.lang.ArithmeticException: Non-terminating decimal expansion; no exact\n;; representable decimal result.\n", :author {:avatar-url "https://avatars1.githubusercontent.com/u/8399149?v=3", :account-source "github", :login "freckletonj"}, :created-at 1490739966308, :updated-at 1524219715125, :_id "58dae2fee4b01f4add58fe7e"}], :macro true, :notes nil, :arglists ["precision & exprs"], :doc "Sets the precision and rounding mode to be used for BigDecimal operations.\n\n Usage: (with-precision 10 (/ 1M 3))\n or: (with-precision 10 :rounding HALF_DOWN (/ 1M 3))\n\n The rounding mode is one of CEILING, FLOOR, HALF_UP, HALF_DOWN,\n HALF_EVEN, UP, DOWN and UNNECESSARY; it defaults to HALF_UP.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/with-precision"} {:added "1.0", :ns "clojure.core", :name "format", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1330170781000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "printf", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dbc"} {:created-at 1330170789000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.pprint", :name "cl-format", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dbd"} {:created-at 1330170796000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.pprint", :name "print-table", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dbe"}], :line 5738, :examples [{:author {:login "Jacolyte", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon"}, :editors [{:login "Jacolyte", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}], :body ";; See http://download.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html\n;; for formatting options.\nuser=> (format \"Hello there, %s\" \"bob\")\n\"Hello there, bob\"\n", :created-at 1279854390000, :updated-at 1317218923000, :_id "542692c6c026201cdc3268ef"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "thethomaseffect", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b4330b8e3ed048b2aa3b50183c42e600?r=PG&default=identicon"}], :body "user=> (format \"%5d\" 3)\n\" 3\"\n\nuser=> (format \"Pad with leading zeros %07d\" 5432)\n\"Pad with leading zeros 0005432\"\n\nuser=> (format \"Left justified :%-7d:\" 5432)\n\"Left justified :5432 :\"\n\nuser=> (format \"Locale-specific group separators %,12d\" 1234567)\n\"Locale-specific group separators 1,234,567\"\n\nuser=> (format \"decimal %d octal %o hex %x upper-case hex %X\" 63 63 63 63)\n\"decimal 63 octal 77 hex 3f upper-case hex 3F\"\n\nuser=> (format \"%2$d %1$s\" \"Positional arguments\" 23)\n\"23 Positional arguments\"\n\n;; ====== Clojure format/printf and large integers =====\n\n;; This big number doesn't fit in a Long. It is a\n;; clojure.lang.BigInt, which format cannot handle directly.\nuser=> (format \"%5d\" 12345678901234567890)\nIllegalFormatConversionException d != clojure.lang.BigInt java.util.Formatter$FormatSpecifier.failConversion (Formatter.java:3999)\n\n;; You can convert it to a java.math.BigInteger, which format does handle.\nuser=> (format \"%5d\" (biginteger 12345678901234567890))\n\"12345678901234567890\"\n\n;; If you do this very often, you might want to use something like\n;; format-plus to avoid sprinkling your code with calls to biginteger.\n(defn coerce-unformattable-types [args]\n (map (fn [x]\n (cond (instance? clojure.lang.BigInt x) (biginteger x)\n (instance? clojure.lang.Ratio x) (double x)\n :else x))\n args))\n\n(defn format-plus [fmt & args]\n (apply format fmt (coerce-unformattable-types args)))\n\n;; Now this works:\nuser=> (format-plus \"%5d\" 12345678901234567890)\n\"12345678901234567890\"", :created-at 1331440228000, :updated-at 1389568458000, :_id "542692d3c026201cdc326fab"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; ==== Clojure format/printf and floating-point formats ====\nuser=> (format \"%.3f\" 2.0)\n\"2.000\"\n\n;; format doesn't handle integers or ratios with %e, %f, %g, or %a\nuser=> (format \"%.3f\" 2)\nIllegalFormatConversionException f != java.lang.Long java.util.Formatter$FormatSpecifier.failConversion (Formatter.java:3999)\n\n;; In general, if you want to use floating-point formats %e, %f, %g,\n;; or %a with format or printf, and you don't know whether the values\n;; you want to format are floats or doubles, you should convert them:\nuser=> (format \"%.3f\" (double 2))\n\"2.000\"\n\nuser=> (format \"%.3f\" (double (/ 5 2)))\n\"2.500\"\n\n;; One could make a function that parses the format string to look for\n;; %f and other floating-point formats and automatically coerces the\n;; corresponding arguments to doubles, but such a function probably\n;; wouldn't fit into a short example. You could also consider using\n;; cl-format which does handle these kinds of things for you. The main\n;; disadvantage to doing so is that you have to learn a different syntax\n;; for format specifiers.", :created-at 1331440712000, :updated-at 1332477536000, :_id "542692d3c026201cdc326fb0"} {:editors [{:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}], :body ";; format doesn't know what nil should look like:\nuser=> (format \"%s\" nil)\n\"null\"\n;; You can use cl-format in this situation:\nuser=> (clojure.pprint/cl-format nil \"~s\" nil)\n\"nil\"\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3", :account-source "github", :login "mars0i"}, :created-at 1437887089127, :updated-at 1437887151600, :_id "55b46a71e4b06a85937088b4"} {:updated-at 1647195081731, :created-at 1647195081731, :author {:login "andreasguther", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/9425214?v=4"}, :body ";; To use the percent sign % you need to escape it with %: %%\nuser=> (format \"%.2f %%\" 2.5)\n\"2.50 %\"", :_id "622e33c9e4b0b1e3652d75ba"} {:updated-at 1663142162249, :created-at 1663142162249, :author {:login "Kynde", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1169360?v=4"}, :body ";; Do notice that it uses the host locale for formatting.\n;; E.g. With Finnish locale it uses comma for separator.\nuser=> (format \"%.2f\" 1.23)\n\"1,23\"\n\n;; You can use the java.lang.String/format to force it.\nuser=> (java.lang.String/format java.util.Locale/US \"%.2f\" (to-array [1.23]))\n\"1.23\"\n\n;; You can override the default, but this affects other things, too.\nuser=> (java.util.Locale/setDefault java.util.Locale/US)\nnil\n\nuser=> (format \"%.2f\" 1.23)\n\"1.23\"\n\n\n", :_id "63218912e4b0b1e3652d7662"}], :notes [{:body "Note that `(format)` is [not currently supported](http://dev.clojure.org/jira/browse/CLJS-324) in ClojureScript, only in Clojure.", :created-at 1438119290177, :updated-at 1438119315501, :author {:avatar-url "https://avatars.githubusercontent.com/u/94482?v=3", :account-source "github", :login "timgilbert"}, :_id "55b7f57ae4b0080a1b79cdb4"} {:author {:login "PEZ", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/30010?v=4"}, :updated-at 1663758017937, :created-at 1663758017937, :body "For ClojureScript there is https://github.com/quoll/clormat. As of this writing it is new and because of that maybe not always fully compliant. Afaiu the goal is to make it fully compliant.", :_id "632aeec1e4b0b1e3652d7664"} {:author {:login "grav", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/119222?v=4"}, :updated-at 1691054508569, :created-at 1691054508569, :body "There's also [Google Closure's format](https://google.github.io/closure-library/api/goog.string.format.html) for ClojureScript. [Example usage](https://tech.toryanderson.com/2020/10/22/zero-padding-and-truncating-with-string-formats-in-clojurescript/).", :_id "64cb71ace4b08cf8563f4bd8"}], :arglists ["fmt & args"], :doc "Formats a string using java.lang.String.format, see java.util.Formatter for format\n string syntax", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/format"} {:added "1.0", :ns "clojure.core", :name "reversible?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 6268, :examples [{:author {:login "replore", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e7869fe1a48cb1814c657eaca6bea3eb?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user=> (reversible? [])\ntrue\nuser=> (reversible? (sorted-map))\ntrue\nuser=> (reversible? (sorted-set))\ntrue\nuser=> (reversible? '())\nfalse\nuser=> (reversible? {})\nfalse\nuser=> (reversible? #{})\nfalse", :created-at 1321359686000, :updated-at 1423095216846, :_id "542692d5c026201cdc327076"}], :notes nil, :arglists ["coll"], :doc "Returns true if coll implements Reversible", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/reversible_q"} {:added "1.0", :ns "clojure.core", :name "shutdown-agents", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1285923562000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "send", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ae5"} {:created-at 1285923568000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "send-off", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ae6"} {:created-at 1285923576000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "agent", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ae7"} {:created-at 1285923589000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "agent-error", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ae8"} {:created-at 1559240451680, :author {:login "pdbrown", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1607096?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "set-agent-send-executor!", :ns "clojure.core"}, :_id "5cf01f03e4b0ca44402ef737"} {:created-at 1559240460246, :author {:login "pdbrown", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1607096?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "set-agent-send-off-executor!", :ns "clojure.core"}, :_id "5cf01f0ce4b0ca44402ef738"}], :line 2254, :examples [{:author {:login "taylor.sando", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c127297f5548f7275ded1428aa5518bb?r=PG&default=identicon"}, :editors [], :body ";; Creating an agent\nuser> (def a (agent 1))\n#'user/a\n\n;; Create a function that can handle an agent\n\nuser> (defn agent-action [a]\n\t33)\n#'user/agent-action\n\n;; The agent will become 33\nuser> (send-off a agent-action)\n#\n\nuser> @a\n33\n;; Create another agent before shutdown\nuser> (def c (agent 3))\n#'user/c\n\n;; Shutdown agents is called\nuser> (shutdown-agents)\nnil\n\n;; Attempt to turn c into 33\nuser> (send c agent-action)\n#\n\n;; The result is that it is still the same value it was initialized with\nuser> @c\n3\n\n;; Agent created after shutdown\nuser> (def d (agent 4))\n#'user/d\n\n;; Try sending it\nuser> (send d agent-action)\n#\n\n;; Same thing, there are no threads to process the agents\nuser> @d\n4", :created-at 1349607696000, :updated-at 1349607696000, :_id "542692d5c026201cdc327084"} {:author {:login "taylor.sando", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c127297f5548f7275ded1428aa5518bb?r=PG&default=identicon"}, :editors [], :body ";; Create the agent that we will be using\nuser=> (def a (agent 0))\n#'user/a\n\n;; Dereference the agent to show the value is 0\nuser=> @a\n0\n\n;; Create a function that can increment the agent\n;; This will continually update the value of the agent\nuser=> (defn agent-inc [a]\n (send-off *agent* agent-inc)\n (inc a))\n#'user/agent-inc\n\n;; Send the agent to the agent-inc function\n;; The value is 188 because by the time the repl has sent off the\n;; agent to the function, the function has already been called recursively\nuser=> (send a agent-inc)\n#\n\n;; Dereference of the value a second or so later\nuser=> @a\n716889\n\n;; Another dereference in another couple of seconds\nuser=> @a\n1455264\n\n;; Shutdown the threads for the agents\nuser=> (shutdown-agents)\nnil\n\n;; Dereference the agent to see what value it is\nuser=> @a\n3522353\n\n;; Dereference the agent again in a few seconds\n;; It's the same value, because the agent pool of threads are no longer\n;; active\nuser=> @a\n3522353\n", :created-at 1349608162000, :updated-at 1349608162000, :_id "542692d5c026201cdc327085"}], :notes nil, :arglists [""], :doc "Initiates a shutdown of the thread pools that back the agent\n system. Running actions will complete, but no new actions will be\n accepted", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/shutdown-agents"} {:added "1.0", :ns "clojure.core", :name "conj", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1297212938000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "cons", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d76"} {:created-at 1398537407000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "into", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d77"} {:created-at 1400493822000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "peek", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d78"} {:created-at 1400493828000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pop", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d79"} {:created-at 1430745236745, :author {:login "jw-00000", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2936?v=3"}, :to-var {:ns "clojure.core", :name "concat", :library-url "https://github.com/clojure/clojure"}, :_id "55477094e4b01bb732af0a91"} {:created-at 1528231331314, :author {:login "miner", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/25400?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "conj!", :ns "clojure.core"}, :_id "5b16f5a3e4b00ac801ed9e0c"} {:created-at 1544351725441, :author {:login "l3nz", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1101849?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "assoc", :ns "clojure.core"}, :_id "5c0cefede4b0ca44402ef5e8"} {:created-at 1561679674033, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "disj", :ns "clojure.core"}, :_id "5d15573ae4b0ca44402ef778"}], :line 75, :examples [{:author {:login "MrHus", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Steve", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/454ce0be068cbbf25ee685af20dc7cd6?r=PG&default=identicon"} {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"} {:login "Wilfred", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1f86c0bc40235a9edf351a16b859aabd?r=PG&default=identicon"} {:login "ElieLabeca", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/724e1112a2be4d5af767c0cf152d087e?r=PG&default=identicon"} {:login "ElieLabeca", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/724e1112a2be4d5af767c0cf152d087e?r=PG&default=identicon"} {:login "s_prakash_joy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7704115a8be45640094d5d9fc6f4e22a?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:login "alidcastano", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/11031952?v=4"}], :body ";; notice that conjoining to a vector is done at the end\n(conj [1 2 3] 4)\n;;=> [1 2 3 4]\n\n;; notice conjoining to a list is done at the beginning\n(conj '(1 2 3) 4)\n;;=> (4 1 2 3)\n\n(conj [\"a\" \"b\" \"c\"] \"d\")\n;;=> [\"a\" \"b\" \"c\" \"d\"]\n\n;; conjoining multiple items is done in order\n(conj [1 2] 3 4) \n;;=> [1 2 3 4]\n\n(conj '(1 2) 3 4) \n;;=> (4 3 1 2)\n\n(conj [[1 2] [3 4]] [5 6]) \n;;=> [[1 2] [3 4] [5 6]]\n\n;; conjoining to maps only take items as vectors of length exactly 2\n(conj {1 2, 3 4} [5 6])\n;;=> {5 6, 1 2, 3 4}\n\n(conj {:firstname \"John\" :lastname \"Doe\"} {:age 25 :nationality \"Chinese\"})\n;;=> {:firstname \"John\", :lastname \"Doe\", :age 25, :nationality \"Chinese\"}\n\n;; conj on a set\n(conj #{1 3 4} 2)\n;;=> #{1 2 3 4}\n\n", :created-at 1279417029000, :updated-at 1582210748471, :_id "542692c9c026201cdc326abc"} {:author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :editors [{:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"} {:login "Thumbnail", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/db68e51797a2382e185b42ce6534b7a4?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; conjoin shows similar behaviour to cons\n;; The main difference being that conj works on collections\n;; but cons works with seqs. \n(conj [\"a\" \"b\" \"c\"] [\"a\" \"b\" \"c\"] )\n;;=> [\"a\" \"b\" \"c\" [\"a\" \"b\" \"c\"]]", :created-at 1342724544000, :updated-at 1420652159670, :_id "542692d2c026201cdc326f6d"} {:author {:login "jamesqiu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc1268deaa7f2e78fe2b5ea76e6481d8?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; conjoin nil with x or xs\n(conj nil 3)\n;;=> (3)\n\n(conj nil 3 4)\n;;=> (4 3)", :created-at 1349714643000, :updated-at 1420652257330, :_id "542692d2c026201cdc326f70"} {:author {:login "Alan Thompson", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5b677647e3c6fb2bc89fa2f481461b11?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; maps and sets are treated differently\n(conj {1 2} {3 4})\n;;=> {3 4, 1 2} ; the contents of {3 4} are added to {1 2}\n\n(conj #{1 2} #{3})\n;;=> #{1 2 #{3}} ; the whole set #{3} is added to #{1 2}\n\n(clojure.set/union #{1 2} #{3})\n;;=> #{1 2 3} ; must use (clojure.set/union) to merge sets, not conj\n", :created-at 1392346414000, :updated-at 1420652309845, :_id "542692d2c026201cdc326f71"} {:body ";; When conjoining into a map, vector pairs may be provided:\n(conj {:a 1} [:b 2] [:c 3])\n;;=> {:c 3, :b 2, :a 1}\n\n;; Or maps may be provided, with multiple pairings:\n(conj {:a 1} {:b 2 :c 3} {:d 4 :e 5 :f 6})\n;;=> {:f 6, :d 4, :e 5, :b 2, :c 3, :a 1}\n\n;; But multiple pairings cannot appear in vectors:\n(conj {:a 1} [:b 2 :c 3])\n;;=> IllegalArgumentException Vector arg to map conj must be a pair...\n\n;; And pairs may not be provided in lists:\n(conj {:a 1} '(:b 2))\n;;=> ClassCastException ...Keyword cannot be cast to ...Map$Entry...\n", :author {:login "fordsfords", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7671908?v=3"}, :created-at 1417527012413, :updated-at 1417527012413, :_id "547dbee4e4b03d20a10242bb"} {:updated-at 1453750686379, :created-at 1453750686379, :author {:login "bsima", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/200617?v=3"}, :body ";; Useful snippet: \"merge\" two or more vectors with `(comp vec flatten conj)`\n(let [a [{:a \"hi\"} {:b \"hey\"}]\n b [{:c \"yo\"} {:d \"hiya\"}]\n c [{:e \"bonjour\"}]]\n ((comp vec flatten conj) a b c))\n;;=> [{:a \"hi\"} {:b \"hey\"} {:c \"yo\"} {:d \"hiya\"} {:e \"bonjour\"}]", :_id "56a6799ee4b060004fc217b0"} {:updated-at 1456128447651, :created-at 1456128447651, :author {:login "yinwuzhe", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5061317?v=3"}, :body "(conj nil 1)\n;=>(1)\n(conj nil [1 2])\n;=>([1 2])\n", :_id "56cac1bfe4b060004fc217cb"} {:editors [{:login "edcaceres", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/782909?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/1191123?v=3", :account-source "github", :login "TheCodingGent"}], :body ";; Conj new-element into nested structures \"conj-in\"\n\n(def db {:users [{:name \"Eduardo\"}]})\n(def new-element {:name \"Eva\"})\n\n(assoc db :users (conj (:users db) new-element))\n;; => {:users [{:name \"Eduardo\"} {:name \"Eva\"}]}", :author {:avatar-url "https://avatars.githubusercontent.com/u/782909?v=3", :account-source "github", :login "edcaceres"}, :created-at 1479821999279, :updated-at 1483975466743, :_id "58344aafe4b0782b632278c2"} {:editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :body ";; implement stack semantics with conj, peek and pop.\n\n;; we start with a list\n(def stack '(2 1 0))\n\n(peek stack)\n;; => 2\n(pop stack)\n;; => (1 0)\n(type (pop stack))\n;; => cljs.core/List\n;; push = conj\n(conj stack 3)\n;; => (3 2 1 0)\n(type (conj stack 3))\n;; => cljs.core/List\n\n;; now let us try a vector\n(def stack [0 1 2])\n\n(peek stack)\n;; => 2\n(pop stack)\n;; => [0 1]\n(type (pop stack))\n;; => clojure.lang.PersistentVector\n;; push = conj\n(conj stack 3)\n;; => [0 1 2 3]\n(type (conj stack 3))\n;; => clojure.lang.PersistentVector\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}, :created-at 1510596733632, :updated-at 1510597245457, :_id "5a09e07de4b0a08026c48cb7"} {:editors [{:login "asifm", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3958387?v=4"}], :body ";; Based on examples from the great book CLOJURE for the BRAVE and TRUE\n;; https://www.braveclojure.com/core-functions-in-depth/\n\n(defn add-first-vec\n\t[target addition]\n\t(apply conj (if (vector? addition) addition [addition]) target))\n\n(add-first-vec [3 4 5 6] 1)\n;; [1 3 4 5 6]\n\n(add-first-vec [3 4 5 6] [1 2])\n;; [1 2 3 4 5 6]", :author {:avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4", :account-source "github", :login "berczeck"}, :created-at 1598229602892, :updated-at 1665916664510, :_id "5f430c62e4b0b1e3652d73aa"} {:updated-at 1678381486402, :created-at 1678381486402, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; conj also has other, undocumented arities:\n\n(conj)\n;; => []\n\n(conj [1 2 3])\n;; => [1 2 3]\n\n;; Which are particularly useful when transducing, as the nullary form can be\n;; used to produce init, and the unary form for completion", :_id "640a11aee4b08cf8563f4b7b"}], :notes [{:author {:login "me7", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10399270?v=3"}, :updated-at 1456199923502, :created-at 1456199923502, :body "list prepend\nvector append", :_id "56cbd8f3e4b02a6769b5a4b1"}], :arglists ["coll x" "coll x & xs"], :doc "conj[oin]. Returns a new collection with the xs\n 'added'. (conj nil item) returns (item). The 'addition' may\n happen at different 'places' depending on the concrete type.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/conj"} {:added "1.2", :ns "clojure.core", :name "bound?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1328397785000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "thread-bound?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521af8"}], :line 5512, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}], :body "user=> (def foobar)\n#'user/foobar\nuser=> (bound? #'foobar)\nfalse\nuser=> (def boing 10)\n#'user/boing\nuser=> (bound? #'boing)\ntrue\nuser=> (defn plus3 [n] (+ 3 n))\n#'user/plus3\nuser=> (bound? #'plus3)\ntrue\n", :created-at 1279073551000, :updated-at 1318467872000, :_id "542692cdc026201cdc326ce1"}], :notes nil, :arglists ["& vars"], :doc "Returns true if all of the vars provided as arguments have any bound value, root or thread-local.\n Implies that deref'ing the provided vars will succeed. Returns true if no vars are provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bound_q"} {:added "1.7", :ns "clojure.core", :name "transduce", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1459164080889, :author {:login "optevo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1281179?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "completing", :ns "clojure.core"}, :_id "56f913b0e4b09295d75dbf41"}], :line 6870, :examples [{:editors [{:login "bsvingen", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1647562?v=3"}], :body ";; First, define a transducer for producing the first ten odd numbers:\n(def xf (comp (filter odd?) (take 10)))\n\n;; We can then apply this transducer in different ways using transduce.\n\n;; Get the numbers as a sequence:\n\n(transduce xf conj (range))\n;;=> [1 3 5 7 9 11 13 15 17 19]\n\n;; Or sum them:\n\n(transduce xf + (range))\n;; => 100\n\n;; ... with an initializer:\n\n(transduce xf + 17 (range))\n;; => 117\n\n;; Or concatenate them to a string:\n\n(transduce xf str (range))\n;; => \"135791113151719\"\n\n;; .. with an initializer:\n\n(transduce xf str \"...\" (range))\n;; => \"...135791113151719\"\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/1647562?v=3", :account-source "github", :login "bsvingen"}, :created-at 1435874975857, :updated-at 1435878735757, :_id "5595b69fe4b00f9508fd66f1"} {:updated-at 1473877511741, :created-at 1473871425560, :author {:login "upgradingdave", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/939229?v=3"}, :body ";; When studying Korean, I had notes with mixture of Korean and\n;; English and I wanted to filter out any English. \n\n(def example (str \"I will write an autobiography(자서전) later\\n\"\n \"(저는) 나중에 자서전을 쓸 거에요\"))\n\n;; Here's a transducer to filter out english characters\n\n(defn filter-out-english \n \"filter out english characters in a string\"\n []\n (filter (fn [c] \n (let [i (int c)] \n (not (or (and (>= i 65) (<= i 90)) \n (and (>= i 97) (<= i 122))))))))\n\n;; Here's a transducer to help deal with extra spaces and newlines.\n;; Notice the mapcat ensures that the output will always be the same\n;; shape as the input\n\n(defn trim-chars [c n]\n \"Ensure exactly n characters c in a row. For example, squash\n multiple spaces into single space or expand newlines into 2\n newlines\"\n (comp (partition-by #{c})\n (mapcat #(if (= c (first %)) (repeat n c) %))))\n\n\n;; put it all together, we filter out english characters, replace\n;; multiple spaces with single space, and ensure each line is double\n;; spaced (two line breaks between each line)\n(def xf (comp (filter-out-english) \n (trim-chars \\space 1)\n (trim-chars \\newline 2)))\n\n(apply str (transduce xf conj example))\n;; => \" (자서전) \\n\\n(저는) 나중에 자서전을 쓸 거에요\"\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/939229?v=3", :account-source "github", :login "upgradingdave"}], :_id "57d97e41e4b0709b524f04f7"} {:updated-at 1483049703082, :created-at 1483049703082, :author {:login "jvanderhyde", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6516608?v=3"}, :body ";; transduce with the identity transform is equivalent to reduce,\n;; in the following way:\n(transduce identity f sample)\n(f (reduce f (f) sample))\n\n;; For example, we can define a reducing function and then use it:\n(defn conj-second\n ([]\n [])\n ([result]\n result)\n ([result [x y]]\n (conj result y)))\n\n(def sample [[1 :a] [2 :b] [3 :c]])\n\n(transduce identity conj-second sample)\n;;=>[:a :b :c]\n(conj-second (reduce conj-second (conj-second) sample))\n;;=>[:a :b :c]\n\n;; Let's prove the point with printing:\n(defn conj-second\n ([]\n (println \"0\") [])\n ([result]\n (println \"1\") result)\n ([result [x y]]\n (println \"2\") (conj result y)))\n\n;; Then the following both print 0 2 2 2 1\n(transduce identity conj-second sample)\n(conj-second (reduce conj-second (conj-second) sample))\n", :_id "58658ae7e4b0fd5fb1cc964d"} {:editors [{:login "vspinu", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1363467?v=3"}], :body ";;; BUILD A STATEFULL TRANSDUCER\n\n;; Make a transducer that accumulates a sequence when pred is truthy and\n;; returns individual values when pred is falsy.\n;;\n;; For example when pred is odd?, partition\n;;\n;; [1 1 1 2 2 3 3 3]\n;; \n;; into\n;; \n;; [[1 1 1] [2] [2] [3 3 3]]\n;;\n\n(defn accumulate-when [pred]\n ;; A transducer takes a reducer function and returns a reducer function.\n (fn [rf]\n ;; State (an accumulator) which is closed over by the reducer function.\n (let [acc (java.util.ArrayList.)]\n (fn\n ;; Arity 0 (state initializer). In this step we can initialize `acc`\n ;; based on the returned valued of (rf), but here, as it is usually the\n ;; case, this is not needed.\n ([] (rf))\n \n ;; Arity 1 (completer). Called after the reducing process has ended (if\n ;; ever). In this step local state must be cleaned and residual reducing\n ;; step may be performed. `result` is an unreduced value (see reduced\n ;; and unreduced).\n ([result]\n (let [result (if (.isEmpty acc)\n ;; No residual state. Simply return the result.\n result\n ;; Need to clear the residual state and perform one last\n ;; reducing step on the so far accumulated values.\n (let [v (vec (.toArray acc))]\n (.clear acc)\n ;; This step might return a completed value (i.g. on\n ;; which reduced? gives true). We need to deref it\n ;; with `unreduced` in order to supply it to rf.\n (unreduced (rf result v))))]\n ;; Nested rf call. Must happen once!\n (rf result)))\n \n ;; Arity 2 (reducer). This is where the main work happens.\n ([result input]\n (if (pred input)\n ;; When pred is truthy, accumulate and don't call the nested reducer.\n (do\n (.add acc input)\n result)\n ;; When pred is falsy, call nested reducer (possibly twice).\n (if (.isEmpty acc)\n ;; When accumulator is empty, reduce with a singleton.\n (rf result [input])\n (let [v (vec (.toArray acc))]\n (.clear acc)\n ;; First reduce on the accumulated sequence.\n (let [ret (rf result v)]\n (if (reduced? ret)\n ;; If sequence is completed, no more reductions\n ret\n ;; else, reduce once more with the current (falsy) input.\n (rf ret [input])))))))))))\n\n(def x [1 1 1 2 2 3 3 3])\n\n;; Step through with the debugger in order to gain a better understanding of the\n;; involved steps.\n\n(transduce (accumulate-when odd?) conj x)\n;; user> [[1 1 1] [2] [2] [3 3 3]]\n\n(transduce (comp (take 4) (accumulate-when odd?)) conj x)\n;; user> [[1 1 1] [2]]\n\n(transduce (comp (accumulate-when odd?) (take 3)) conj x)\n;; user> [[1 1 1] [2] [2]]\n\n(transduce (comp (accumulate-when odd?) (take 4)) conj x)\n;; user> [[1 1 1] [2] [2] [3 3 3]]\n\n;; Clojure core statefull transducers are partition-by, partition-all, take,\n;; drop, drop-while, take-nth, distinct, interpose, map-indexed and\n;; keep-indexed.\n", :author {:avatar-url "https://avatars0.githubusercontent.com/u/1363467?v=3", :account-source "github", :login "vspinu"}, :created-at 1498561912432, :updated-at 1498561969340, :_id "59523d78e4b06e730307db43"} {:updated-at 1586130966542, :created-at 1586130966542, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/601540?v=4"}, :body "(transduce\n (partition-by identity)\n (fn\n ;; init - returns initial value for accumulator, called when no init is given to transduce\n ([] [])\n ;; completion - returns the final result, take the final accumulated value, called once there are no more elements to process\n ([acc] acc)\n ;; step - do whatever you want on each element, returns accumulated state and takes accumulated state from before and new element\n ([acc e] (conj acc e)))\n '()\n [1 1 1 2 2 3 3 4 4 5 6 7 7])\n\n;; => ([7 7] [6] [5] [4 4] [3 3] [2 2] [1 1 1])", :_id "5e8a7016e4b087629b5a18cb"} {:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; These two forms are equivalent:\n\n(reduce ((map inc) conj) [] '(1 2 3 4 5))\n;; => [2 3 4 5 6]\n\n(transduce (map inc) conj [] '(1 2 3 4 5))\n;; => [2 3 4 5 6]\n\n;; Which shows how transduce works: it applies the transducer to the reducing\n;; function, and reduces the collection with that\n\n;; But n.b. this example masks the fact that transduce does call f an extra\n;; time for \"completion\", because arity-1 conj = identity.", :author {:avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4", :account-source "github", :login "tomdl89"}, :created-at 1678020807238, :updated-at 1678381890546, :_id "640490c7e4b08cf8563f4b78"}], :notes [{:author {:login "jvanderhyde", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6516608?v=3"}, :updated-at 1483050000710, :created-at 1483050000710, :body "Usually you use existing functions to create the transformation, using map, filter, paritition-all, etc. But you can also define your own transformations. A transformation (or transducer) is a function that takes a reducing function and returns a reducing function. See the source for [take](https://github.com/clojure/clojure/blob/clojure-1.8.0/src/clj/clojure/core.clj#L2752) and [filter](https://github.com/clojure/clojure/blob/clojure-1.8.0/src/clj/clojure/core.clj#L2684) for examples.", :_id "58658c10e4b0fd5fb1cc964e"}], :arglists ["xform f coll" "xform f init coll"], :doc "reduce with a transformation of f (xf). If init is not\n supplied, (f) will be called to produce it. f should be a reducing\n step function that accepts both 1 and 2 arguments, if it accepts\n only 2 you can add the arity-1 with 'completing'. Returns the result\n of applying (the transformed) xf to init and the first item in coll,\n then applying xf to that result and the 2nd item, etc. If coll\n contains no items, returns init and f is not called. Note that\n certain transforms may inject or skip items.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/transduce"} {:added "1.0", :ns "clojure.core", :name "lazy-seq", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1318395998000, :author {:login "haplo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/890d46f8c0e24dd6fb8546095b1144e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "lazy-cat", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ed7"} {:created-at 1322679999000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "realized?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ed8"} {:created-at 1322680082000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "doall", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ed9"} {:created-at 1370143899000, :author {:login "Mark Addleman", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/768de71b6c873394290733acf422b4d5?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "iterate", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eda"}], :line 683, :examples [{:updated-at 1448773249031, :created-at 1281346189000, :body ";; The following defines a lazy-seq of all positive numbers. Note that \n;; the lazy-seq allows us to make a recursive call in a safe way because\n;; the call does not happen immediately but instead creates a closure.\n\nuser=> (defn positive-numbers \n\t([] (positive-numbers 1))\n\t([n] (lazy-seq (cons n (positive-numbers (inc n))))))\n#'user/positive-numbers\n\nuser=> (take 5 (positive-numbers))\n(1 2 3 4 5)\n\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/299a3fab7a1a2d6644455dedae9fce0a?r=PG&default=identicon", :account-source "clojuredocs", :login "Stathis Sideris"} {:login "hgijeon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7885562?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon", :account-source "clojuredocs", :login "gstamp"}, :_id "542692cec026201cdc326ddd"} {:author {:login "jakubholynet", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/32b26dbbf1f84656393a57a292c73728?r=PG&default=identicon"}, :editors [{:login "jakubholynet", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/32b26dbbf1f84656393a57a292c73728?r=PG&default=identicon"} {:login "jakubholynet", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/32b26dbbf1f84656393a57a292c73728?r=PG&default=identicon"} {:login "redraiment", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/33087654dbc710e81f51fda5f8241f28?r=PG&default=identicon"} {:login "Stathis Sideris", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/299a3fab7a1a2d6644455dedae9fce0a?r=PG&default=identicon"} {:avatar-url "https://avatars.githubusercontent.com/u/7885562?v=3", :account-source "github", :login "hgijeon"} {:login "olfal1", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7503672?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/15624487?v=4", :account-source "github", :login "pluieciel"}], :body ";; A lazy-seq of Fibonacci numbers (fn = fn-1 + fn-2)\n;; The producer function takes exactly two parameters\n;; (because we need the last 2 elements to produce a new one)\nuser=> (defn fib \n ([]\n (fib 1 1))\n ([a b]\n (lazy-seq (cons a (fib b (+ a b))))))\n\nuser=> (take 5 (fib))\n(1 1 2 3 5)\n\n;; Another realization\n;; 1 2 3 5 8 ... Fibonacci numbers start from the 2nd position\n;; + 1 1 2 3 5 ... Fibonacci numbers start from the 1st position\n;; = 2 3 5 8 13 ... Fibonacci numbers start from the 3rd position\nuser=> (def fib\n (cons 1\n (lazy-seq (cons 1 (map + (rest fib) fib)))))\n\nuser=> (take 5 fib)\n(1 1 2 3 5)", :created-at 1322121310000, :updated-at 1661333181759, :_id "542692d3c026201cdc326feb"} {:author {:login "jakubholynet", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/32b26dbbf1f84656393a57a292c73728?r=PG&default=identicon"}, :editors [], :body ";; It might be easier to think about the producer function as a function\n;; that, given element n, produces element n+1 via a recursive call to \n;; itself, wrapped with lazy-seq to delay its execution\n;; We might also provide no-argument version of the function that calls \n;; itself for the first element(s) of the sequence being generated.\n;; => variant of fibonaci with a no-arg version and using cons first:\n(defn sum-last-2 \n ([] (sum-last-2 1 2)) \n ([n m] (cons n (lazy-seq (sum-last-2 m (+ n m))))))\n\nuser=> (take 6 (sum-last-2))\n(1 2 3 5 8 13)", :created-at 1330300424000, :updated-at 1330300424000, :_id "542692d3c026201cdc326ff0"} {:updated-at 1436122605747, :created-at 1354916731000, :body ";; An example combining lazy sequences with higher order functions\n;; Generate prime numbers using trial division.\n;; Note that the starting set of sieved numbers should be\n;; the set of integers starting with 2 i.e., (iterate inc 2) \n(defn sieve [s]\n (cons (first s)\n (lazy-seq (sieve (filter #(not= 0 (mod % (first s)))\n (rest s))))))\n\nuser=> (take 20 (sieve (iterate inc 2)))\n(2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71)\n\n\nSadly (nth (sieve (iterate inc 2)) 10000) results in StackOverflowError ;(", :editors [{:avatar-url "https://www.gravatar.com/avatar/b60d7f482b9f88cb3a673f370ea15c9c?r=PG&default=identicon", :account-source "clojuredocs", :login "emdeesee"} {:login "lambder", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/95941?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/d3df4ff6342ed6fba898021bf2d19a6d?r=PG&default=identicon", :account-source "clojuredocs", :login "esumitra"}, :_id "542692d3c026201cdc326ff1"} {:body ";; Other examples on this page are little too eager to produce the head of collection\n;; right away. lazy-seq was introduced to make it possible to postpone any computation\n;; until data is needed.\n;; While it is not relevant for these simple examples, it could be important\n;; for real apps where producing each element is expensive.\n\n;; Here is a demonstration.\n;; Let's define a function that prints mysqr when it's called\n(defn mysqr [n]\n (println \"mysqr\")\n (* n n))\n;; => #'user/mysqr\n\n;; Now function squares that is adopted from positive-numbers example above\n;; Note that lazy-seq is inside of cons\n(defn squares\n ([n] (cons (mysqr n) (lazy-seq (squares (inc n))))))\n;; => #'user/squares\n\n(def sqrs (squares 1))\n;; => mysqr <-- NOTE THAT mysqr WAS CALLED WHEN WE SIMPLY REQUESTED COLLECTION\n;; => #'user/sqrs\n\n(take 1 sqrs)\n;; => (1) <-- HERE WE ARE GETTING FIRST ELEMENT THAT WAS CALCULATED BEFORE\n\n;; Now let's redefine 'squares' by wrapping its entire body in lazy-seq:\n(defn squares\n ([n] (lazy-seq (cons (mysqr n) (squares (inc n))))))\n;; => #'user/squares\n\n;; And when we request the collection:\n(def sqrs (squares 1))\n;; => #'user/sqrs\n;; NOTE THAT mysqr WAS NOT CALLED HERE\n\n(take 1 sqrs)\n;; => mysqr <- AND HERE mysqr IS CALLED WHEN FIRST ELEMENT IS ACTUALLY REQUESTED\n;; => (1)", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423004375232, :updated-at 1423010785906, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :_id "54d152d7e4b0e2ac61831cfc"} {:updated-at 1542427316403, :created-at 1449368696760, :author {:login "esumitra", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/98965?v=3"}, :body ";; Compare recursive functions and lazy sequences\n;; generate (some) valid parenthesis combinations.\n;; (Side note: Everything this generates are valid combinations, but this\n;; doesn't generate all possible valid combinations.) \n;; valid paren combinations for 1 paren - ()\n;; valid paren combinations for 2 paren - ()(),(())\n;; valid paren combinations for 3 paren - ()()(),()(()),(())(),(()()),((()))\n\n;; given ith item, generate (i+1)th item\n(defn next-parens\n [xs]\n (set (mapcat (juxt\n #(str \"()\" %)\n #(str % \"()\")\n #(str \"(\" % \")\"))\n xs)))\n\n;; recursive function to get n paren combinations\n;; combinations are recursively calculated on the stack\n(defn parens-nth-item\n [n]\n (if (= 0 n)\n #{\"\"}\n (next-parens (parens-nth-item (dec n)))))\nuser=> (parens-nth-item 3)\n#{\"(()())\" \"((()))\" \"()()()\" \"()(())\" \"(())()\"}\n\n;; lazy function to get sequence of paren combinations\n;; combinations are lazily calculated on the heap\n(defn parens-sequence\n [xs]\n (lazy-seq (cons xs (parens-sequence (next-parens xs)))))\n\nuser=> (take 3 (parens-sequence #{\"\"}))\n(#{\"()\"} #{\"(())\" \"()()\"} #{\"(()())\" \"((()))\" \"()()()\" \"()(())\" \"(())()\"})", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/98965?v=3", :account-source "github", :login "esumitra"} {:login "peter-kehl", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/4270240?v=4"}], :_id "56639c78e4b0f47c7ec61144"} {:updated-at 1464067214072, :created-at 1464067214072, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :body "; Create a finite-length lazy seq\n(defn finite-lazy-builder [values]\n (lazy-seq\n ; We need the when-let so the lazy-seq will terminate\n (when-let [ss (seq values)]\n (cons (first values)\n (finite-lazy-builder (next values))))))\n\n(println (finite-lazy-builder [1 2 3 4 5] ))\n;=> (1 2 3 4 5)\n\n", :_id "5743e48ee4b0a1a06bdee49a"} {:updated-at 1661336397540, :created-at 1518199374837, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;generate a seq by multiplying the first n numbers starting from 1\n;;1*1\n;;1*2\n;;2*3\n;;6*4 .....\n\n(defn multiplen\n ([]\n (multiplen 1 1))\n ([total x]\n (let [new-total (* total x)]\n (lazy-seq\n (cons new-total (multiplen new-total (inc x)))))))\n\n;;take the first 5 elements \n(take 5 (multiplen))\n;;(1 2 6 24 120)\n\n;;Another realization of factorials\n(def factorials\n (lazy-seq\n (cons 1 (map * (iterate inc 2) factorials))))\n\n(take 5 factorials)\n;;(1 2 6 24 120)", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/15624487?v=4", :account-source "github", :login "pluieciel"}], :_id "5a7de24ee4b0316c0f44f8b2"} {:updated-at 1684792382708, :created-at 1684792382708, :author {:login "bdevel", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/65951?v=4"}, :body ";; From the \"Making Clojure Lazier\" docs,\n;; here's an example using a step function.\n\n(defn filter\n \"Returns a lazy sequence of the items in coll for which\n (pred item) returns true. pred must be free of side-effects.\"\n [pred coll]\n (let [step (fn [p c]\n (when-let [s (seq c)]\n (if (p (first s))\n (cons (first s) (filter p (rest s)))\n (recur p (rest s)))))]\n (lazy-seq (step pred coll))))\n", :_id "646be43ee4b08cf8563f4bbd"}], :macro true, :notes [{:body "I think every form of (cons a (lazy-seq (f b))) in examples should be changed to (lazy-seq (cons a (f b))) to be fully lazy.
    \n\nThink about
    \n(def one-over ((fn helper [n] (cons (/ 1 n) (lazy-seq (helper (inc n))))) 0))
    \nand
    \n(def one-over ((fn helper [n] (lazy-seq (cons (/ 1 n) (helper (inc n))))) 0))
    \n\nFirst one throws an exception right after hitting enter key, while second code postpones the calculation(and that's the point of lazyness!).
    \nTherefore, cons should be inside of lazy-seq.\n", :created-at 1448772755640, :updated-at 1448772839454, :author {:avatar-url "https://avatars.githubusercontent.com/u/7885562?v=3", :account-source "github", :login "hgijeon"}, :_id "565a8493e4b0be225c0c47a1"}], :arglists ["& body"], :doc "Takes a body of expressions that returns an ISeq or nil, and yields\n a Seqable object that will invoke the body only the first time seq\n is called, and will cache the result and return it on all subsequent\n seq calls. See also - realized?", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/lazy-seq"} {:added "1.0", :ns "clojure.core", :name "*print-length*", :file "clojure/core_print.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 16, :examples [{:author {:login "nipra", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/142529?v=3"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/19522656?v=4"}], :body ";; Oops! Don't do this!!!\nuser=> (iterate inc 0)\n;; Frantically doing C-c C-c :-P\n; Evaluation aborted.\n\nuser=> (set! *print-length* 10)\n10\n\n;; Now it's perfectly fine. Yay!\nuser=> (iterate inc 0)\n(0 1 2 3 4 5 6 7 8 9 ...)\n\n", :created-at 1279053974000, :updated-at 1610535308126, :_id "542692cac026201cdc326b12"}], :notes [{:body "```(set! *print-length* nil)``` to revert as it also affects pr-sr which breaks the edn output", :created-at 1641496128326, :updated-at 1641496156661, :author {:avatar-url "https://avatars.githubusercontent.com/u/132936?v=4", :account-source "github", :login "gzmask"}, :_id "61d73e40e4b0b1e3652d759c"}], :arglists [], :doc "*print-length* controls how many items of each collection the\n printer will print. If it is bound to logical false, there is no\n limit. Otherwise, it must be bound to an integer indicating the maximum\n number of items of each collection to print. If a collection contains\n more items, the printer will print items up to the limit followed by\n '...' to represent the remaining items. The root binding is nil\n indicating no limit.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*print-length*"} {:added "1.0", :ns "clojure.core", :name "*file*", :type "var", :see-alsos nil, :examples [{:updated-at 1615735028888, :created-at 1615735028888, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :body ";; Given a file named \"example.clj\" is available in the current folder\n;; with content:\n\n(ns example)\n(when *compile-files* (println \"Compiling:\" *file*))\n\n;; If we start a REPL adding \".\" as part of the classpath,\n;; then we can see the following:\n\n(binding [*compile-path* \".\"]\n (compile 'example))\n;; Compiling: example.clj\n;; example\n", :_id "604e28f4e4b0b1e3652d7490"}], :notes [{:updated-at 1324600617000, :body "Does this actually work? I couldn't get it to print anything but NO_SOURCE_PATH. (And no, this wasn't in the REPL.)", :created-at 1324600599000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fd3"} {:updated-at 1349216667000, :body "If you're having trouble getting this feature to work as advertised, check out [this StackOverflow Question](http://stackoverflow.com/questions/12692698/file-variable-not-working/12693068).", :created-at 1349216667000, :author {:login "Jeff Terrell", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/658b2643cf2a8192286b5bb1ecb62cf8?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fe8"}], :arglists [], :doc "The path of the file being evaluated, as a String.\n\n When there is no file, e.g. in the REPL, the value is not defined.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*file*"} {:added "1.0", :ns "clojure.core", :name "compare-and-set!", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1350642558000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "atom", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b1e"} {:created-at 1360265895000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "reset!", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b1f"} {:created-at 1360265902000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "swap!", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b20"} {:created-at 1527705104286, :author {:login "agarman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/138454?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "swap-vals!", :ns "clojure.core"}, :_id "5b0eee10e4b045c27b7fac7f"}], :line 2368, :examples [{:author {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}, :editors [{:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; first we make a demonstration atom\n(def a (atom 0))\n;; #'user/a \n\n;; failing to set the demonstration atom because the old-value does not match. \n(compare-and-set! a 10 20)\n;;=> false\n\n;; as you can see there was no change to the atom\n@a\n;;=> 0\n\n;; but when the old-value matches the atom is set to the new-value.\n(compare-and-set! a 0 10)\n;;=> true\n\n@a\n;;=> 10\n", :created-at 1308629522000, :updated-at 1420734640517, :_id "542692cfc026201cdc326e27"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; Use compare-and-set! to implement a version of swap!\n;; that stops retrying after some number of attempts, for example\n;; because of a slow update fn and high concurrency on the atom:\n\n(defn swap-or-bail! [a f & [attempts]]\n (loop [i (or attempts 3)]\n (if (zero? i)\n (println \"Could not update. Bailing out.\")\n (let [old (deref a)\n success? (compare-and-set! a old (f old))]\n (when-not success?)\n (println \"Update failed. Retry\" i)\n (recur (dec i)))))))\n\n(defn slow-inc [x]\n (Thread/sleep 5000) \n (inc x))\n\n(def a (atom 0))\n(def f (future (swap-or-bail! a slow-inc)))\n(reset! a 1)\n;; \"Update failed. Retry 3\"\n(reset! a 2)\n;; \"Update failed. Retry 2\"\n(reset! a 3)\n;; Could not update. Bailing out.", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1553605079299, :updated-at 1584291384572, :_id "5c9a21d7e4b0ca44402ef6cb"}], :notes [{:author {:login "chbrown", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/360279?v=3"}, :updated-at 1471197839931, :created-at 1471197839931, :body "`compare-and-set!` actually runs an equality comparison, not an identity comparison. The documentation should read:\n\n> Atomically sets the value of atom to newval if and only if the current value of the atom is identical equal to oldval.\n\n (def my-sym (atom 'a))\n (identical? @my-sym 'a)\n ;;=> false\n (= @my-sym 'a)\n ;;=> true\n (compare-and-set! my-sym 'a 'z)\n ;;=> true\n @my-sym\n ;;=> z", :_id "57b0b28fe4b02d8da95c2700"} {:author {:login "favila", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1603620?v=3"}, :updated-at 1492977098400, :created-at 1492977098400, :body "The note that `compare-and-set!` uses equality comparison is wrong, `compare-and-set!` really _does_ use *identity comparison* (Java `==`). Internally, Clojure uses the `AtomicReference.compareAndSet(old, new)` method.\n\nThe reason his example works is due to interning of the `a` symbol: in his example, each `a` is the same (identical) object.\n\nBut as you can see from the example below, even numeric autoboxing can lead to surprising results:\n\n (def a (atom 0))\n ;=> #'user/a\n (compare-and-set! a 0 100)\n ;=> true\n ;(compare-and-set! a 100 200)\n ;=> true\n ;; Fails?! (on Oracle JVM 8 with default settings)\n (compare-and-set! a 200 300)\n ;=> false\n @a\n ;=> 200 ; WAT?\n\nClojure almost always uses boxed numbers (via Java autoboxing) unless you take special steps to avoid it. compare-and-set! only accepts Objects, so numbers are autoboxed to Longs.\n\nJava JVMs will usually intern small integers; by default Oracle/OpenJDK will intern -127 to 128 (the `byte` range) so that all such boxed numbers are identical. This can be altered with the `-XX:AutoBoxCacheMax=` command line flag. This may vary by JVM implementation, too.\n\n(In fact, on ClojureCLR, `compare-and-set!` of longs always fails because the CLR does not intern small numbers, see [this bug report](https://dev.clojure.org/jira/browse/CLJCLR-28).)\n\nSo in the example above, `compare-and-set!` on 0 and 100 work fine due to this auto-interning, but the compare with 200 fails because: `(identical? 200 200)` is false due to autoboxing: two distinct invisible `Long` objects are created for each \"200\" value.\n\nYou don't have to worry about this with `swap!` because the \"old\" value it compares against for the compare-and-set operation is always from the atom itself, so identity comparison works as long as no one else put a different object in the atom in the meantime. However, it is easy to imagine a pathological case with a highly-contented atom where everyone keeps putting the same \"equal\" value into it over and over, and yet swappers have to retry over and over.", :_id "58fd05cae4b01f4add58fe9a"}], :arglists ["atom oldval newval"], :doc "Atomically sets the value of atom to newval if and only if the\n current value of the atom is identical to oldval. Returns true if\n set happened, else false", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/compare-and-set!"} {:ns "clojure.core", :name "*use-context-classloader*", :type "var", :see-alsos nil, :examples [{:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}], :body ";; *use-context-classloader* is always bound to true regarldess of any \n;; outer binding setting and thus ignored.\n;; The initial idea was to have a way to tell Clojure to ignore\n;; the context classloader (supposedly set by external libs or frameworks)\n;; in some pretty specific OSGi scenarios. Original context can be found at:\n;; https://groups.google.com/g/clojure/c/aXsFBdowdsA/m/1Ez894XuT30J and\n;; additional use cases https://clojure.atlassian.net/browse/CLJ-2593\n\n(import '[clojure.lang DynamicClassLoader])\n(def custom-classloader (DynamicClassLoader.))\n(.setContextClassLoader (Thread/currentThread) custom-classloader)\n\n(identical?\n (.. (fn []) getClass getClassLoader getParent)\n custom-classloader)\n;; true\n\n;; This should return false and use some other class loader\n(binding [*use-context-classloader* false]\n (identical?\n (.. (fn []) getClass getClassLoader getParent)\n custom-classloader))\n;; true\n\n;; WARNING: If the examples above don't seem to return the expected results, \n;; be aware that tools like Leiningen[https://leiningen.org/] or\n;; nRepl[https://github.com/nrepl/nrepl] alter the context class loader. \n;; Please use a vanilla REPL like \n;; clojure.deps[https://clojure.org/guides/getting_started] instead.", :author {:avatar-url "https://avatars.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1617620930283, :updated-at 1655802050958, :_id "606aefc2e4b0b1e3652d74b1"} {:updated-at 1655794528435, :created-at 1655794528435, :author {:login "KingMob", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/946421?v=4"}, :body ";; The above example has one minor caveat to be aware of for those who need \n;; to work with classloaders. *use-context-classloader* is not technically\n;; ignored, because RT/baseLoader will use it. But it's usually overridden \n;; by RT/makeClassLoader, which pushes a binding that sets it to true every \n;; time it's called. And RT/makeClassLoader is called every time eval or \n;; compile1 is called and in some versions of load(), so it happens a lot.", :_id "62b16b60e4b0b1e3652d7609"}], :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*use-context-classloader*"} {:ns "clojure.core", :name "await1", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1610778845682, :author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/19522656?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "await", :ns "clojure.core"}, :_id "600288dde4b0b1e3652d7434"} {:created-at 1610778852896, :author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/19522656?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "await-for", :ns "clojure.core"}, :_id "600288e4e4b0b1e3652d7435"}], :line 3291, :examples nil, :notes [{:body "Looking at the source, it seems to take an agent, wait until it's queue is empty, then return the agent. When the agent has a positive queue count, it implements the standard `(await a)` and then returns `a`, the agent.\n\nUse: `(await1 a)`", :created-at 1610778678000, :updated-at 1610778828434, :author {:avatar-url "https://avatars0.githubusercontent.com/u/19522656?v=4", :account-source "github", :login "Crowbrammer"}, :_id "60028836e4b0b1e3652d7433"}], :arglists ["a"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/await1"} {:added "1.0", :ns "clojure.core", :name "let", :special-form true, :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1290671337000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "letfn", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b09"} {:created-at 1399434293000, :author {:login "Chort409", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/73da2cf9145cfb9c900b31436ee435a6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "if-let", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ba0"} {:created-at 1412886358634, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "fn", :library-url "https://github.com/clojure/clojure"}, :_id "5436ef56e4b0ae795603157d"} {:created-at 1602614306958, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "for", :ns "clojure.core"}, :_id "5f85f422e4b0b1e3652d73de"}], :line 4481, :examples [{:author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:avatar-url "https://avatars2.githubusercontent.com/u/12958644?v=4", :account-source "github", :login "funkrider"} {:login "dijonkitchen", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4"}], :body ";; let is a Clojure special form, a fundamental building block of the language.\n;;\n;; In addition to parameters passed to functions, let provides a way to create\n;; lexical bindings of data structures to symbols. The binding, and therefore \n;; the ability to resolve the binding, is available only within the lexical \n;; context of the let. \n;; \n;; let uses pairs in a vector for each binding you'd like to make and the value \n;; of the let is the value of the last expression to be evaluated. let also \n;; allows for destructuring which is a way to bind symbols to only part of a \n;; collection.\n\n;; A basic use for a let:\nuser=> (let [x 1] \n x)\n1\n\n;; Note that the binding for the symbol y won't exist outside of the let:\nuser=> (let [y 1] \n y)\n1\nuser=> (prn y)\njava.lang.Exception: Unable to resolve symbol: y in this context (NO_SOURCE_FILE:7)\n\n;; Note that if you use def inside a let block, your interned variable is within \n;; the current namespace and will appear OUTSIDE of the let block. \nuser=> (let [y 1] \n (def z y) \n y)\n1\nuser=> z\n1\n\n;; Another valid use of let:\nuser=> (let [a 1 b 2] \n (+ a b))\n3\n\n;; The forms in the vector can be more complex (this example also uses\n;; the thread macro):\nuser=> (let [c (+ 1 2)\n [d e] [5 6]] \n (-> (+ d e) (- c)))\n8\n\n;; The bindings for let need not match up (note the result is a numeric\n;; type called a ratio):\nuser=> (let [[g h] [1 2 3]] \n (/ g h))\n1/2\n\n;; From http://clojure-examples.appspot.com/clojure.core/let with permission.", :created-at 1278720629000, :updated-at 1556647963303, :_id "542692c7c026201cdc3269bb"} {:updated-at 1285500534000, :created-at 1279162869000, :body "user=> (let [a (take 5 (range))\n {:keys [b c d] :or {d 10 b 20 c 30}} {:c 50 :d 100}\n [e f g & h] [\"a\" \"b\" \"c\" \"d\" \"e\"]\n _ (println \"I was here!\")\n foo 12\n bar (+ foo 100)]\n [a b c d e f g h foo bar])\nI was here!\n[(0 1 2 3 4) 20 50 100 \"a\" \"b\" \"c\" (\"d\" \"e\") 12 112]\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692c7c026201cdc3269c2"} {:author {:login "johnfn", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ffffd204ecbbae82a04f5b574d76746b?r=PG&default=identicon"}, :editors [], :body "; :as example \n\nuser=> (let [[x y :as my-point] [5 3]]\n (println x y)\n (println my-point))\n\n5 3\n[5 3]\n\n; :as names the group you just destructured.\n\n; equivalent to (and better than)\n\nuser=> (let [[x y] [5 3]\n my-point [x y]]\n ;...", :created-at 1312965326000, :updated-at 1312965326000, :_id "542692c7c026201cdc3269c4"} {:author {:login "leifp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d2f37720f063404ef83b987d2824353d?r=PG&default=identicon"}, :editors [], :body ";;; map destructuring, all features\nuser=>\n(let [\n ;;Binding Map\n {:keys [k1 k2] ;; bind vals with keyword keys\n :strs [s1 s2] ;; bind vals with string keys\n :syms [sym1 sym2] ;; bind vals with symbol keys\n :or {k2 :default-kw, ;; default values\n s2 :default-s, \n sym2 :default-sym} \n :as m} ;; bind the entire map to `m`\n ;;Data\n {:k1 :keyword1, :k2 :keyword2, ;; keyword keys\n \"s1\" :string1, \"s2\" :string2, ;; string keys\n 'sym1 :symbol1, ;; symbol keys\n ;; 'sym2 :symbol2 ;; `sym2` will get default value\n }] \n [k1 k2 s1 s2 sym1 sym2 m]) ;; return value\n\n[:keyword1, :keyword2, \n :string1, :string2,\n :symbol1, :default-sym, ;; key didn't exist, so got the default\n {'sym1 :symbol1, :k1 :keyword1, :k2 :keyword2, \n \"s1\" :string1, \"s2\" :string2}]\n\n;; remember that vector and map destructuring can also be used with \n;; other macros that bind variables, e.g. `for` and `doseq`", :created-at 1335261849000, :updated-at 1335261849000, :_id "542692d3c026201cdc326ff3"} {:author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :editors [], :body ";;; no value of a key\nuser> (let [{:keys [a b] :as m} (:x {})]\n [a b m])\n[nil nil nil]\n\n;;; same as above\nuser> (let [{:keys [a b] :as m} nil]\n [a b m])\n[nil nil nil]\n\n;;; similar case on Vector\nuser> (let [[a b :as v] nil]\n [a b v])\n[nil nil nil]\n", :created-at 1399634796000, :updated-at 1399634796000, :_id "542692d3c026201cdc326ff4"} {:body ";; lexical clojure (or let-over-fn) is an idiom for doing, in functional languages,\n;; something very similar to object based programming.\n;; Using combinations of 'let' and 'fn' can produce many interesting results.\n\n;; note the use of the ! on the functions to indicate the side effect\n(defn counter []\n (let [cnt (atom 0)]\n {:inc! (fn [] (swap! cnt inc))\n :dec! (fn [] (swap! cnt dec)) \n :get (fn [] @cnt)} ))\n\n;; we can now make and use the object\n(let [cnt (counter)]\n ((:inc! cnt))\n ((:inc! cnt)) \n ((:get cnt)))\n;;=> 2", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1412885156677, :updated-at 1412886345817, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :_id "5436eaa4e4b0ae795603157c"} {:updated-at 1464664767084, :created-at 1464664767084, :author {:login "freezhan", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5796449?v=3"}, :body "(let [[a b & c :as d] [1 2 3 4 5]]\n (println a) ; 1\n (println b) ; 2\n (println c) ; (3 4 5)\n d) ;[1 2 3 4 5]", :_id "574d02bfe4b0bafd3e2a046b"} {:editors [{:login "dijonkitchen", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4"}], :body ";;define F1Car record\n(defrecord F1Car [team engine tyre oil])\n\n;;build the constructor distructing a single map with options\n(defn make-f1team [f1-team f1-engine {:keys [f1-tyre f1-oil] :as opts}]\n (let [{:keys [tyre oil]} opts]\n (map->F1Car {:team f1-team\n :engine f1-engine\n :tyre f1-tyre\n :oil f1-oil})))\n\n;;create a record\n(def mclaren (make-f1team \"RedBull\" \"Renault\" {:f1-tyre\"Pirelli\" :f1-oil \"Castrol\"}))\n\n;;retrieve values\n(keys mclaren)\n(vals mclaren)\n(:team mclaren)\n(:oil mclaren)", :author {:avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4", :account-source "github", :login "ibercode"}, :created-at 1510307566093, :updated-at 1556648054942, :_id "5a0576eee4b0a08026c48caa"} {:updated-at 1556559048678, :created-at 1556559048678, :author {:login "funkrider", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/12958644?v=4"}, :body ";;It is possible to enumerate the symbols created within a let using a macro.\n(defmacro local-context []\n (let [symbols (keys &env)]\n (zipmap (map (fn [sym] `(quote ~sym)) symbols) symbols)))\n\n(let [a :b lc (local-context)] lc)\n;; => {a :b}", :_id "5cc734c8e4b0ca44402ef713"} {:updated-at 1651606596047, :created-at 1651606596047, :author {:login "rgkirch", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6143833?v=4"}, :body ";; the destructuring key, k in this example, doesn't have to be a literal keyword\n(let [k (keyword \"name\")\n {person-name k} {:name \"john\"}]\n person-name)\n;; => \"john\"", :_id "62718444e4b0b1e3652d75e5"}], :macro true, :notes [{:updated-at 1297072373000, :body "Nota Bene: `let` in Clojure is like `let*` in Scheme -- each init-expr has access to the preceding binding forms. (There is also a `let*`, but it is more or less `let` without destructuring, and in fact is the underlying implementation.)", :created-at 1297072373000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fb2"} {:body "Be aware that `let`’s `:or` always evaluates the default value, unlike the `or` macro:\n\n user=> (let [{:keys [a]\n :or {a (do (println \"toto\") 1)}} {}]\n a)\n toto\n 1\n\n user=> (let [{:keys [a]\n :or {a (do (println \"toto\") 1)}} {:a 2}]\n a)\n toto\n 2 ", :created-at 1554372403311, :updated-at 1554372446160, :author {:avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4", :account-source "github", :login "bfontaine"}, :_id "5ca5d733e4b0ca44402ef6fd"}], :arglists ["bindings & body"], :doc "binding => binding-form init-expr\n\n Evaluates the exprs in a lexical context in which the symbols in\n the binding-forms are bound to their respective init-exprs or parts\n therein.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/let", :forms ["(let [bindings*] exprs*)"]} {:added "1.0", :ns "clojure.core", :name "ref-set", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1284616929000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "ref", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d91"} {:created-at 1498153558604, :author {:login "devn", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "alter", :ns "clojure.core"}, :_id "594c0256e4b06e730307db40"} {:created-at 1498153567222, :author {:login "devn", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "commute", :ns "clojure.core"}, :_id "594c025fe4b06e730307db41"} {:created-at 1498153571630, :author {:login "devn", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "dosync", :ns "clojure.core"}, :_id "594c0263e4b06e730307db42"}], :line 2455, :examples [{:updated-at 1285495563000, :created-at 1280777271000, :body "user=> (def foo (ref {}))\n#'user/foo\n\nuser=> (dosync\n (ref-set foo {:foo \"bar\"}))\n{:foo \"bar\"}\n\nuser=> @foo\n{:foo \"bar\"}\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692c9c026201cdc326acb"}], :notes nil, :arglists ["ref val"], :doc "Must be called in a transaction. Sets the value of ref.\n Returns val.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ref-set"} {:added "1.1", :ns "clojure.core", :name "pop-thread-bindings", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1374313672000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "push-thread-bindings", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eff"} {:created-at 1374313678000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "binding", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f00"}], :line 1931, :examples nil, :notes nil, :arglists [""], :doc "Pop one set of bindings pushed with push-binding before. It is an error to\n pop bindings without pushing before.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/pop-thread-bindings"} {:added "1.0", :ns "clojure.core", :name "interleave", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1293096421000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "interpose", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ed3"} {:created-at 1325197345000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "zipmap", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ed4"}], :line 4309, :examples [{:author {:login "cdorrat", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5dedcb7069d39421760f6d255def10c3?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; This example takes a list of keys and a separate list of values and \n;; inserts them into a map.\n(apply assoc {} \n (interleave [:fruit :color :temp] \n [\"grape\" \"red\" \"hot\"]))\n\n;;=> {:temp \"hot\", :color \"red\", :fruit \"grape\"}\n", :created-at 1278756097000, :updated-at 1421097481582, :_id "542692ccc026201cdc326c48"} {:author {:login "kotarak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon"}, :editors [{:login "kotarak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; Simple example:\n(interleave [:a :b :c] [1 2 3])\n;;=> (:a 1 :b 2 :c 3)", :created-at 1279026371000, :updated-at 1421097499209, :_id "542692ccc026201cdc326c4c"} {:author {:login "kotarak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body ";; The shortest input stops interleave:\n\n(interleave [:a :b :c] [1 2])\n;;=> (:a 1 :b 2)\n\n(interleave [:a :b] [1 2 3])\n;;=> (:a 1 :b 2)", :created-at 1279026486000, :updated-at 1422937238232, :_id "542692ccc026201cdc326c4f"} {:author {:login "octopusgrabbus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(def s1 [[:000-00-0000 \"TYPE 1\" \"JACKSON\" \"FRED\"]\n [:000-00-0001 \"TYPE 2\" \"SIMPSON\" \"HOMER\"]\n [:000-00-0002 \"TYPE 4\" \"SMITH\" \"SUSAN\"]])\n\n(interleave (map #(nth % 0 nil) s1) (map #(nth % 1 nil) s1))\n;;=> (:000-00-0000 \"TYPE 1\" \n;; :000-00-0001 \"TYPE 2\"\n;; :000-00-0002 \"TYPE 4\")", :created-at 1334887108000, :updated-at 1421097410949, :_id "542692d3c026201cdc326fd1"} {:author {:login "octopusgrabbus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(def s1 [[:000-00-0000 \"TYPE 1\" \"JACKSON\" \"FRED\"]\n [:000-00-0001 \"TYPE 2\" \"SIMPSON\" \"HOMER\"]\n [:000-00-0002 \"TYPE 4\" \"SMITH\" \"SUSAN\"]])\n\n(def cols [0 2 3])\n\n(defn f1 \n [s1 col] \n (map #(get-in s1 [% col] nil) (range (count s1))))\n\n(apply interleave (map (partial f1 s1) cols))\n;;=> (:000-00-0000 \"JACKSON\" \"FRED\" \n;; :000-00-0001 \"SIMPSON\" \"HOMER\" \n;; :000-00-0002 \"SMITH\" \"SUSAN\")", :created-at 1334887172000, :updated-at 1421097441002, :_id "542692d3c026201cdc326fd2"} {:body "(interleave (repeat \"a\") [1 2 3])\n;;=>(\"a\" 1 \"a\" 2 \"a\" 3)\n", :author {:login "ttkk1024", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/145719?v=3"}, :created-at 1431650103962, :updated-at 1431650103962, :_id "55553f37e4b01ad59b65f4d1"} {:updated-at 1553297861379, :created-at 1553290561134, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :body ";; interleave can be used as an opposite of zipmap\n(let [m {:a 1, :b 2, :c 3}]\n (split-at (count m) (apply interleave m)))\n;; => [(:a :b :c) (1 2 3)]\n;; (but really, a simpler solution would be [(keys m) (vals m)].)", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4", :account-source "github", :login "bfontaine"}], :_id "5c955541e4b0ca44402ef6bc"}], :notes [{:body "Behaviour of
    (interleave [4 5 6])
    \napparently depends on which Clojure version you're using. In 1.10.0 the result is:\n
    [4 5 6]
    ", :created-at 1567536152090, :updated-at 1567536173810, :author {:avatar-url "https://avatars2.githubusercontent.com/u/179958?v=4", :account-source "github", :login "holtzermann17"}, :_id "5d6eb418e4b0ca44402ef7ab"}], :arglists ["" "c1" "c1 c2" "c1 c2 & colls"], :doc "Returns a lazy seq of the first item in each coll, then the second etc.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/interleave"} {:added "1.0", :ns "clojure.core", :name "printf", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1329894578000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "format", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e35"} {:created-at 1330170804000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.pprint", :name "cl-format", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e36"} {:created-at 1417278644991, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "println", :library-url "https://github.com/clojure/clojure"}, :_id "5479f4b4e4b03d20a10242b9"}], :line 5746, :examples [{:author {:login "lambder", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1c0c20072f52de3a6335cae183b865f6?r=PG&default=identicon"}, :editors [{:login "jeffi", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1195619?v=3"}], :body "(printf \"1 + 2 is %s%n\" 3)", :created-at 1299610618000, :updated-at 1433459544222, :_id "542692ccc026201cdc326cad"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; Click the link to clojure.core/format under See also for\n;; more extensive examples. printf and format take the same\n;; arguments -- the difference is that format returns a formatted\n;; string, whereas printf sends the formatted string to *out*.\n\n;; Also note that printf output is buffered, and does not automatically\n;; flush at any time, not even when printing newlines. Thus the last few lines\n;; of output may never appear if your program exits before the buffer is\n;; flushed. Use (flush) or a (println ...) call to force flushing of the buffer.", :created-at 1331440764000, :updated-at 1417278553807, :_id "542692d4c026201cdc327038"}], :notes nil, :arglists ["fmt & args"], :doc "Prints formatted output, as per format", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/printf"} {:added "1.0", :ns "clojure.core", :name "map?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1411815243526, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "hash-map", :library-url "https://github.com/clojure/clojure"}, :_id "5426974be4b0d1509f919f73"} {:created-at 1414508257391, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "set?", :library-url "https://github.com/clojure/clojure"}, :_id "544faee1e4b0dc573b892fa9"} {:created-at 1414508398671, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "vector?", :library-url "https://github.com/clojure/clojure"}, :_id "544faf6ee4b03d20a1024283"} {:created-at 1550854368361, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "associative?", :ns "clojure.core"}, :_id "5c7028e0e4b0ca44402ef6a0"}], :line 167, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "(map? {:a 1 :b 2 :c 3})\n;;=> true\n\n(map? (hash-map :a 1 :b 2))\n;;=> true\n\n(map? (sorted-map :a 1 :b 2))\n;;=> true\n\n(map? (array-map :a 1 :b 2))\n;;=> true\n\n(map? '(1 2 3))\n;;=> false\n\n(map? #{:a :b :c})\n;;=> false", :created-at 1279074290000, :updated-at 1423276232206, :_id "542692cbc026201cdc326bdf"} {:updated-at 1443731276562, :created-at 1443731276562, :author {:login "hura", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/671872?v=3"}, :body "\"Note that Records also implement `clojure.lang.IPersistentMap`:\"\n\n(defrecord XRec [])\n(map? (->XRec))\n;; => true", :_id "560d974ce4b08e404b6c1c8c"}], :notes nil, :arglists ["x"], :doc "Return true if x implements IPersistentMap", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/map_q"} {:added "1.0", :ns "clojure.core", :name "->", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1289746069000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "->>", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c48"} {:created-at 1412262619860, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "as->", :library-url "https://github.com/clojure/clojure"}, :_id "542d6adbe4b05f4d257a298a"} {:created-at 1412882642031, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "get-in", :library-url "https://github.com/clojure/clojure"}, :_id "5436e0d2e4b06dbffbbb00c5"} {:created-at 1431612379634, :author {:login "pladdy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/11509380?v=3"}, :to-var {:ns "clojure.core", :name "some->", :library-url "https://github.com/clojure/clojure"}, :_id "5554abdbe4b03e2132e7d162"} {:created-at 1436359125547, :author {:login "jw-00000", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2936?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "doto", :ns "clojure.core"}, :_id "559d19d5e4b00f9508fd66fd"} {:created-at 1471532173241, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "..", :ns "clojure.core"}, :_id "57b5cc8de4b0b5e6d7a4fa59"}], :line 1677, :examples [{:updated-at 1447300863348, :created-at 1278953347000, :body ";; Use of `->` (the \"thread-first\" macro) can help make code\n;; more readable by removing nesting. It can be especially\n;; useful when using host methods:\n\n;; Arguably a bit cumbersome to read:\nuser=> (first (.split (.replace (.toUpperCase \"a b c d\") \"A\" \"X\") \" \"))\n\"X\"\n\n;; Perhaps easier to read:\nuser=> (-> \"a b c d\" \n .toUpperCase \n (.replace \"A\" \"X\") \n (.split \" \") \n first)\n\"X\"\n\n;; It can also be useful for pulling values out of deeply-nested\n;; data structures:\nuser=> (def person \n {:name \"Mark Volkmann\"\n :address {:street \"644 Glen Summit\"\n :city \"St. Charles\"\n :state \"Missouri\"\n :zip 63304}\n :employer {:name \"Object Computing, Inc.\"\n :address {:street \"12140 Woodcrest Dr.\"\n :city \"Creve Coeur\"\n :state \"Missouri\"\n :zip 63141}}})\n \nuser=> (-> person :employer :address :city)\n\"Creve Coeur\"\n\n;; same as above, but with more nesting\nuser=> (:city (:address (:employer person)))\n\"Creve Coeur\"\n\n;; Note that this operator (along with ->>) has at times been\n;; referred to as a 'thrush' operator.\n\n;; http://blog.fogus.me/2010/09/28/thrush-in-clojure-redux/\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/34f159f89cbd1d9beac0276f5a7af552?r=PG&default=identicon", :account-source "clojuredocs", :login "uvtc"} {:avatar-url "https://www.gravatar.com/avatar/34f159f89cbd1d9beac0276f5a7af552?r=PG&default=identicon", :account-source "clojuredocs", :login "uvtc"} {:avatar-url "https://www.gravatar.com/avatar/34f159f89cbd1d9beac0276f5a7af552?r=PG&default=identicon", :account-source "clojuredocs", :login "uvtc"} {:avatar-url "https://www.gravatar.com/avatar/1fabe200e8b19ec248fa8285cd6b493b?r=PG&default=identicon", :account-source "clojuredocs", :login "amithgeorge"} {:avatar-url "https://avatars.githubusercontent.com/u/333974?v=3", :account-source "github", :login "eneroth"} {:login "yang-wei", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5494874?v=3"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}, :_id "542692ccc026201cdc326c53"} {:author {:login "na_ka_na", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/38aaeb9ed42ddefd5aa63f8b9c4b84a4?r=PG&default=identicon"}, :editors [], :body ";; Your own REPL! (Read Eval Print Loop)\n\n;; We would need a little helper macro for that\n;; It does what its name says - loops forever\nuser=> (defmacro loop-forever [& body] `(loop [] ~@body (recur)))\n\n;; Your own REPL\nuser=> (loop-forever (println (eval (read)))) \n(+ 1 2)\n3\n\n;; If you read the above code left to right (outside in) it reads LPER.\n;; Inside out it reads REPL alright.\n\n;; Sometimes it might be easier to read code outside in, just like a sequence of steps:\n;; 1. Read, 2. Eval, 3. Print, 4. Loop\n;; Here's how -> helps you:\n\nuser=> (-> (read) (eval) (println) (loop-forever)) \n(+ 1 2)\n3\n\n;; Does that read easier for you? If it does, -> is your friend!\n\n;; To see what Clojure did behind the scenes with your -> expression:\nuser=> (require 'clojure.walk)\nnil\nuser=> (clojure.walk/macroexpand-all '(-> (read) (eval) (println) (loop-forever)))\n(loop* [] (println (eval (read))) (recur))\n\n;; You can even use ->'s cousin ->> to setup your own REPL:\nuser=> (->> (read) (eval) (println) (while true))\n(+ 1 2)\n3\n\n;; Can you see why we can't use -> to write the above?\n\n", :created-at 1294071196000, :updated-at 1294071196000, :_id "542692ccc026201cdc326c5a"} {:author {:login "BertrandDechoux", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/528360?v=3"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"} {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"} {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}], :body "user=> (def c 5)\nuser=> (-> c (+ 3) (/ 2) (- 1)) \n3\n\n;; and if you are curious why\nuser=> (use 'clojure.walk)\nuser=> (macroexpand-all '(-> c (+ 3) (/ 2) (- 1)))\n(- (/ (+ c 3) 2) 1)\n", :created-at 1339249204000, :updated-at 1339250710000, :_id "542692d1c026201cdc326f3c"} {:body ";; simplest usage example, fill as second item in the first and second form\n\nuser=> (-> \"foo\"\n (str \"bar\")\n (str \"zoo\"))\n\"foobarzoo\"\nuser=> (str \"foo\" \"bar\")\n\"foobar\"\nuser=> (str (str \"foo\" \"bar\") \"zoo\")\n\"foobarzoo\"", :author {:login "arathunku", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/749393?v=3"}, :created-at 1429647887382, :updated-at 1429647887382, :_id "5536b20fe4b01bb732af0a85"} {:editors [{:login "alvarogarcia7", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4199136?v=3"}], :body "(-> 3 (- 2)) ; It means (- 3 2)\n=> 1\n\n(->> 3 (- 2)) ; It means (- 2 3)\n=> -1\n\n(doto 3 (- 2)) ; It means (- 3 2) but return the first object 3\n=> 3", :author {:avatar-url "https://avatars.githubusercontent.com/u/4446025?v=3", :account-source "github", :login "expert0226"}, :created-at 1452151863527, :updated-at 1454886061151, :_id "568e1437e4b0e0706e05bd9e"} {:updated-at 1462650593323, :created-at 1462650593323, :author {:login "eggsyntax", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1233514?v=3"}, :body ";; Be cautious with anonymous functions; they must be wrapped in an outer\n;; pair of parens.\n(-> 10\n #(/ % 2))\n;; will throw an exception, but\n(-> 10\n (#(/ % 2)))\n;; will work fine. Similarly,\n(-> 10\n (fn [n] (/ n 2)))\n;; will throw an exception, but\n(-> 10\n ((fn [n] (/ n 2))))\n;; works as intended.\n", :_id "572e46e1e4b039e78aadabfc"} {:editors [{:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"}], :body ";; How to thread functions that expect more than one argument\n\n;; Say you want to thread this.\nuser=> (inc (/ 10 2))\n=> 6\n\n;; This obviously won't work\nuser=> (-> 2 10 / inc)\n=> ClassCastException java.lang.Long cannot be cast to clojure.lang.IFn\n\n;; Since Clojure is expecting a function instead of `10` in `(10 2)`\nuser=> (clojure.walk/macroexpand-all '(-> 2 10 + inc))\n=> (inc (+ (10 2)))\n\n;; Instead you have two options, either just\nuser=> (-> (/ 10 2) inc)\n=> 6\n\n;; or\nuser=> (-> 10 (/ 2) inc)\n=> 6", :author {:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"}, :created-at 1464759684437, :updated-at 1464761625892, :_id "574e7584e4b0bafd3e2a046d"} {:editors [{:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"}], :body ";; For large threads you can use commas (interpreted as whitespaces) \n;; to visualize where the items are going to be inserted.\n\nuser=> (-> + (reduce 10 [6 4]) (* 5) (/ 100))\n=> 1\n\n;; with two commas (you can use one if you prefer)\nuser=> (-> + (reduce ,, 10 [6 4]) (* ,, 5) (/ ,, 100))\n=> 1\n\n;; For instance:\n;; (reduce ,, 10 [6 4])\n;; means\n;; (reduce + 10 [6 4])", :author {:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"}, :created-at 1464761041214, :updated-at 1464761604810, :_id "574e7ad1e4b0bafd3e2a046e"} {:updated-at 1503919516240, :created-at 1503919516240, :author {:login "MokkeMeguru", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/30849444?v=4"}, :body ";; 4Clojure Question 38\n\n(= (#(-> %& \n sort \n reverse \n first) 1 8 3 4) 8)", :_id "59a3fd9ce4b09f63b945ac57"}], :macro true, :notes [{:updated-at 1280208863000, :body "See also ->> which is similar but threads the first expr as the last argument of the forms.", :created-at 1280208863000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f8e"} {:updated-at 1374299741000, :body "I have a [short blog](http://wangjinquan.me/show/Clojure%20线性(箭头)�作符) on this, in case you are still confused on it and understand Chinese.", :created-at 1374299714000, :author {:login "John Wang", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d66c259a1fa85832e41fb9b90c7e613c?r=PG&default=identicon"}, :_id "542692edf6e94c6970522008"} {:body "Can be used as an alternative to get-in.", :created-at 1412882630144, :updated-at 1412882630144, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :_id "5436e0c6e4b0ae795603157a"}], :arglists ["x & forms"], :doc "Threads the expr through the forms. Inserts x as the\n second item in the first form, making a list of it if it is not a\n list already. If there are more forms, inserts the first form as the\n second item in second form, etc.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/->"} {:added "1.0", :ns "clojure.core", :name "defstruct", :file "clojure/core.clj", :static true, :type "macro", :column 1, :see-alsos [{:created-at 1312838555000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "struct", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a87"} {:created-at 1312849643000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "create-struct", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a88"} {:created-at 1335411176000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defrecord", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a89"} {:created-at 1446587127297, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "deftype", :ns "clojure.core"}, :_id "56392af7e4b04b157a6648e3"} {:created-at 1446587141438, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defprotocol", :ns "clojure.core"}, :_id "56392b05e4b04b157a6648e4"}], :line 4045, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (defstruct person :name :age :height)\n#'user/person\n\nuser=> (struct person \"george\" 22 115)\n{:name \"george\", :age 22, :height 115}", :created-at 1280748955000, :updated-at 1285495885000, :_id "542692c7c026201cdc3269d6"}], :macro true, :notes [{:updated-at 1335411165000, :body "Structs are obsolete. Use records instead. See `defrecord`.", :created-at 1335411165000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fe0"} {:updated-at 1391537723000, :body "Are structs obsolete ? Or will become obsolete ? The docs for 'defrecord' have 'Alpha - Subject To Change' ?", :created-at 1391537723000, :author {:login "monojohnny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/79d11fd92782ff24d9ae806b72b73d2f?r=PG&default=identicon"}, :_id "542692edf6e94c697052201c"} {:updated-at 1392247001000, :body "The doc string for defrecord has been changed in Clojure 1.6 to remove the 'alpha' designation, along with many other Clojure functions: https://github.com/clojure/clojure/commit/93d13d0c0671130b329863570080c72799563ac7", :created-at 1392247001000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :_id "542692edf6e94c697052201d"} {:author {:login "jhigdon", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/45405?v=4"}, :updated-at 1550940905930, :created-at 1550940905930, :body "Adding to why people are saying it's obsolete:\n\nhttps://clojure.org/reference/datatypes#_deftype_and_defrecord\n\nexplains how where defstruct/deftype/defrecord differ\n\nand https://clojure.org/reference/data_structures#StructMaps is where they suggest a record might better serve your needs", :_id "5c717ae9e4b0ca44402ef6a1"} {:author {:login "metasoarous", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/88556?v=4"}, :updated-at 1605646244437, :created-at 1605646169773, :body "In _general_, records should be preferred over structs. However, structs aren't _entirely_ obsolete.\n\nThey can still be useful when you need/want to create record-like objects dynamically; That is, when you don't know the field names at compile time. A typical example of this might be loading rows from a CSV (as [semantic-csv](https://github.com/metasoarous/semantic-csv) does). The advantage in this case over using regular maps is significantly improved performance creating and using these objects.\n\nHowever, note that to use structs dynamically, you have to use `create-struct`, rather than `defstruct`, as above. So if anything, one could argue that `defstruct` is obsolete, but not necessary `create-struct` & `struct`.", :_id "5fb43759e4b0b1e3652d740d"}], :arglists ["name & keys"], :doc "Same as (def name (create-struct keys...))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/defstruct"} {:added "1.0", :ns "clojure.core", :name "*err*", :type "var", :see-alsos nil, :examples nil, :notes nil, :arglists [], :doc "A java.io.Writer object representing standard error for print operations.\n\n Defaults to System/err, wrapped in a PrintWriter", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*err*"} {:added "1.0", :ns "clojure.core", :name "get", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1324306493000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "map-indexed", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bb1"} {:created-at 1359887523000, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "get-in", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bb2"} {:created-at 1360286957000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "find", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bb3"} {:created-at 1416824761214, :author {:login "alilee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/16739?v=3"}, :to-var {:ns "clojure.core", :name "select-keys", :library-url "https://github.com/clojure/clojure"}, :_id "547307b9e4b03d20a10242b2"} {:created-at 1416824821178, :author {:login "alilee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/16739?v=3"}, :to-var {:ns "clojure.core", :name "nth", :library-url "https://github.com/clojure/clojure"}, :_id "547307f5e4b03d20a10242b3"}], :line 1494, :examples [{:updated-at 1545395916321, :created-at 1280321427000, :body "(get [1 2 3] 1)\n;;=> 2\n\n(get [1 2 3] 5)\n;;=> nil\n\n(get [1 2 3] 5 100)\n;;=> 100\n\n(get {:a 1 :b 2} :b)\n;;=> 2\n\n(get {:a 1 :b 2} :z \"missing\")\n;;=> \"missing\"\n\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "sanel", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/213914?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon", :account-source "clojuredocs", :login "gstamp"}, :_id "542692cdc026201cdc326cd7"} {:author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; to get an index of the element of a vector, use .indexOf\n(def v [\"one\" \"two\" \"three\" \"two\"])\n;; #'user/v\n\n(.indexOf v \"two\")\n;;=> 1\n\n(.indexOf v \"foo\")\n;;=> -1\n", :created-at 1324306658000, :updated-at 1421261046680, :_id "542692d3c026201cdc326fbd"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; the system environment has a hash-map semantic\n(get (System/getenv) \"SHELL\")\n;;=> \"/bin/bash\"\n\n(get (System/getenv) \"PATH\")\n;;=> \"/usr/local/bin:/sbin:/usr/sbin:/usr/bin:/bin\"", :created-at 1324314703000, :updated-at 1421261106767, :_id "542692d3c026201cdc326fbe"} {:updated-at 1421261190882, :created-at 1340441156000, :body ";; 'get' is not the only option\n(def my-map {:a 1 :b 2 :c 3})\n\n;; maps act like functions taking keys \n(my-map :a)\n;;=> 1\n\n;; even keys (if they are keywords) act like functions\n(:b my-map)\n;;=> 2", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"}, :_id "542692d3c026201cdc326fbf"} {:author {:login "cympfh", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7ad064788bb989f0c9ae552257355d6?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; it is tempting to try an index on a list\n(get '(a b c) 1)\n;;=> nil\n\n;; but you should use nth\n(nth '(a b c) 1)\n;;=> b", :created-at 1394404668000, :updated-at 1421261345010, :_id "542692d3c026201cdc326fc0"} {:updated-at 1461265877674, :created-at 1461265877674, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :body ";; Get also works with strings:\n(get \"abc\" 1)\n;;=> \\b", :_id "571925d5e4b0fc95a97eab50"} {:updated-at 1496171084580, :created-at 1492450542481, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/20086?v=3"}, :body ";; For sorted stuff, \"key\" must be of the same type of the existing keys. \n;; This allows descending the sorted tree in log(N) average.\n\n(get (hash-map :a 1 :b 2) \"a\" \"not found\")\n;; \"not found\"\n\n(get (sorted-map :a 1 :b 2) \"a\" \"not found\")\n;; ClassCastException\n\n;; get works on transient maps, but silently fails on transient sets.\n;; A similar issue affects contains?.\n\n(get (transient #{0 1 2}) 1)\n;; nil\n\n;; get uses int cast with precision loss, with (.intValue x).\n;; The example below is explained because 4294967296 equal 2^32, thus\n;; (.intValue 4294967296) returns 0.\n;; Be careful with sufficiently large keys:\n\n(get [\"a\" \"b\" \"c\"] 4294967296)\n;; \"a\"", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/20086?v=3", :account-source "github", :login "reborg"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/109629?v=3"}], :_id "58f4fceee4b01f4add58fe94"} {:editors [{:login "puppe", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1393865?v=4"}], :body ";; Specifying 'not-found' does NOT guarantee that the return value is\n;; not 'nil'.\n\n(get {} :a 42)\n;;=> 42\n\n(get {:a nil} :a 42)\n;;=> nil\n\n;; This may be especially relevant if you use records, as all pre-defined keys\n;; will usually be present.\n\n(defrecord R [a b])\n(def r (map->R {}))\n\nr\n;;=> #user.R{:a nil :b nil}\n\n(get r :a 42)\n;;=> nil\n\n;; Consider using 'or' instead, as 'nil' is \"falsy\".\n\n(or (get {:a nil} :a) 42)\n;;=> 42", :author {:avatar-url "https://avatars2.githubusercontent.com/u/1393865?v=4", :account-source "github", :login "puppe"}, :created-at 1576172735814, :updated-at 1576172805891, :_id "5df27cbfe4b0ca44402ef7f8"} {:editors [{:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4"}], :body ";; Specifying not-found doesn't mean that the expression won't be evaluated.\n;; This can be a problem if you intend to materialize the not-found value \n;; only if key is not set.\n\n(get {:a 1} :a (#(println \"else\")))\n;; else\n;;=> 1\n\n;; using an `or` can solve your problem here\n(or (get {:a 1} :a)\n (println \"not found\"))\n;;=> 1", :author {:avatar-url "https://avatars2.githubusercontent.com/u/633523?v=4", :account-source "github", :login "timofeytt"}, :created-at 1595920651962, :updated-at 1666965797097, :_id "5f1fd10be4b0b1e3652d7326"} {:updated-at 1690985032681, :created-at 1690985032681, :author {:login "usametov", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5256128?v=4"}, :body ";; how to deal with nil map, defensive coding example:\n;; try to get :a key from nil map \n(get nil :a :a1)\n;;=> :a1\n", :_id "64ca6248e4b08cf8563f4bd7"}], :notes [{:body "Why is this character/string?", :created-at 1420334049781, :updated-at 1420334049781, :author {:login "Pierre-Thibault", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10163425?v=3"}, :_id "54a893e1e4b09260f767ca86"} {:author {:login "hgijeon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7885562?v=3"}, :updated-at 1449649145088, :created-at 1449649145088, :body "(:mykey my-hash-map :none) means the same as (get my-hash-map :mykey :none) and
    \n('mysym my-hash-map :none) means the same as (get my-hash-map 'mysym :none).
    \nSo, you can use (:a {:a 1 :b 2} :not-inserted) as (get {:a 1 :b 2} :a :not-inserted).
    \nSee \nhttp://clojure.org/data_structures#Data Structures-Keywords and\nhttp://clojure.org/data_structures#Data Structures-Symbols", :_id "5667e3f9e4b0f47c7ec61147"} {:author {:login "navigaid", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/10371727?v=4"}, :updated-at 1545127452738, :created-at 1545127452738, :body "`(get get get get)` is equivalent to `get`\n\nas in:\n\n```\n((get get get get) {:a 1} :a)\n```", :_id "5c18c61ce4b0ca44402ef5ec"}], :arglists ["map key" "map key not-found"], :doc "Returns the value mapped to key, not-found or nil if key not present.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/get"} {:added "1.0", :ns "clojure.core", :name "doto", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1436359076539, :author {:login "jw-00000", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2936?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "->", :ns "clojure.core"}, :_id "559d19a4e4b00f9508fd66fb"} {:created-at 1436359083907, :author {:login "jw-00000", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2936?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "->>", :ns "clojure.core"}, :_id "559d19abe4b00f9508fd66fc"} {:created-at 1557781859408, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "..", :ns "clojure.core"}, :_id "5cd9dd63e4b0ca44402ef722"}], :line 3852, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [{:login "ozzloy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c546d3f104228c483309c760926e6e3?r=PG&default=identicon"} {:avatar-url "https://avatars.githubusercontent.com/u/37649?v=3", :account-source "github", :login "fasiha"} {:login "dominem", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11671382?v=4"}], :body ";; Note that even though println returns nil, doto still returns the HashMap object\n(doto (java.util.HashMap.)\n (.put \"a\" 1)\n (.put \"b\" 2)\n (println))\n;;=> #\n;;=> {\"b\" 2, \"a\" 1}\n\n;; Equivalent to\n(def m (java.util.HashMap.))\n(.put m \"a\" 1)\n(.put m \"b\" 2)\nm\n;;=> {\"a\" 1, \"b\" 2}\n(println m)\n;;=> #object[java.util.HashMap 0x727fcc37 {a=1, b=2}]", :created-at 1293673034000, :updated-at 1565336332524, :_id "542692c9c026201cdc326ae6"} {:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"} {:login "jakebasile", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/766907?v=2"}], :body ";; quick demonstration of using a Collections function on the resulting ArrayList\n\nuser=> (def al (doto (java.util.ArrayList.) (.add 11) (.add 3) (.add 7)))\n#'user/al\nuser=> al\n#\nuser=> (java.util.Collections/sort al)\nnil\nuser=> al\n#\nuser=>", :created-at 1313965605000, :updated-at 1412632698246, :_id "542692c9c026201cdc326ae8"} {:author {:login "jimpil", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c3cf214ed0c5f0bca153b1c1177575d6?r=PG&default=identicon"}, :editors [{:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"} {:login "schmee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3405586?v=3"}], :body ";; careful when calling 'dotimes' from within a 'doto' statement\nuser=> (doto (java.util.ArrayList.)\n (.add -2)\n (.add -1)\n (dotimes [i 3] (.add i)))\njava.lang.IllegalArgumentException: dotimes requires a vector for its binding (NO_SOURCE_FILE:1)\n\n; what has happened is that (java.util.ArrayList.) has secretly\n; become the first argument to 'dotimes' and thus the exception\n; informs us that it can't find the binding vector required for\n; 'dotimes' to expand. You can cure this behaviour by simply using\n; 'do' instead of 'doto' or by wrapping the call to 'dotimes' in\n; a function. e.g:\n\n;using 'let' with implicit 'do' instead of 'doto'\nuser=> (let [al (java.util.ArrayList.)]\n (.add al -2)\n (.add al -1)\n (dotimes [i 3] (.add al i))\n al);return the ArrayList\n# ;exactly what we intended\n\n;wrapping 'dotimes' in a function literal\nuser=>(doto (java.util.ArrayList.)\n (.add -2)\n (.add -1)\n (#(dotimes [i 3] (.add % i))))\n# ;exactly what we intended again\n", :created-at 1339783113000, :updated-at 1421092637298, :_id "542692d2c026201cdc326f98"} {:updated-at 1650763751893, :created-at 1633711183120, :author {:login "benjamin-asdf", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/38900087?v=4"}, :body "; useful during development when you want to log something\n; without changing the structure of your code\n\n(+\n (doto 42 println)\n 10)\n\n=> 52\n\n; similarly wrapping tap> in a threading macro for intermediate results\n\n(-> :hello\n {:hello \"Hello\"}\n (doto tap>) ; tap> \"Hello\"\n (str \" World!\"))\n\n=> \"Hello World!\"", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/38900087?v=4", :account-source "github", :login "benjamin-asdf"} {:login "dgb23", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10947371?v=4"}], :_id "6160744fe4b0b1e3652d7554"}], :macro true, :notes nil, :arglists ["x & forms"], :doc "Evaluates x then calls all of the methods and functions with the\n value of x supplied at the front of the given arguments. The forms\n are evaluated in order. Returns x.\n\n (doto (new java.util.HashMap) (.put \"a\" 1) (.put \"b\" 2))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/doto"} {:added "1.0", :ns "clojure.core", :name "identity", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1365638085000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "nil?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e76"} {:created-at 1493319344537, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "some?", :ns "clojure.core"}, :_id "59023eb0e4b01f4add58fe9e"} {:created-at 1544362967323, :author {:login "Ramblurr", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/14830?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "constantly", :ns "clojure.core"}, :_id "5c0d1bd7e4b0ca44402ef5e9"}], :line 1451, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (identity 4)\n4", :created-at 1279071803000, :updated-at 1332950516000, :_id "542692ccc026201cdc326c9a"} {:author {:login "cschreiner", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/93bff5e102f3d5bcc426e28e06c3c503?r=PG&default=identicon"}, :editors [{:login "cschreiner", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/93bff5e102f3d5bcc426e28e06c3c503?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (filter identity [1 2 3 nil 4 false true 1234])\n(1 2 3 4 true 1234)", :created-at 1279209894000, :updated-at 1332950531000, :_id "542692ccc026201cdc326c9c"} {:author {:login "cschreiner", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/93bff5e102f3d5bcc426e28e06c3c503?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (map #(%1 %2) (cycle [inc identity]) [1 2 3 4 5 6 7 8 9 10])\n(2 2 4 4 6 6 8 8 10 10)\n", :created-at 1279209982000, :updated-at 1285500217000, :_id "542692ccc026201cdc326c9f"} {:author {:login "cschreiner", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/93bff5e102f3d5bcc426e28e06c3c503?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (partition-by identity (sort \"abcdaabccc\"))\n((\\a \\a \\a) (\\b \\b) (\\c \\c \\c \\c) (\\d))\n", :created-at 1280212301000, :updated-at 1285501489000, :_id "542692ccc026201cdc326ca1"} {:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body "user=> (map first (partition-by identity [1 1 2 3 3 1 1 5 5]))\n(1 2 3 1 5)", :created-at 1310849421000, :updated-at 1310849421000, :_id "542692ccc026201cdc326ca3"} {:author {:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"}, :editors [], :body "user=> (group-by identity \"abracadabra\")\n{\\a [\\a \\a \\a \\a \\a], \\b [\\b \\b], \\r [\\r \\r], \\c [\\c], \\d [\\d]}", :created-at 1312216209000, :updated-at 1312216209000, :_id "542692ccc026201cdc326ca4"} {:body "user=> (map #(identity %) [1 2 3 4]) ; ~ (map (fn [x] x) [1 2 3 4])\n(1 2 3 4)", :author {:login "protsenkovi", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/431393?v=3"}, :created-at 1417761372684, :updated-at 1417761372684, :_id "5481525ce4b03d20a10242c3"} {:updated-at 1539899393566, :created-at 1539899393566, :author {:login "peter-kehl", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/4270240?v=4"}, :body "; `identity` can serve in workarounds, because you can't pass a macro\n; to a function. For example, you can't pass `and` as a parameter to `apply`:\n(apply and '(true 1 \"yes\"))\n; \\=> CompilerException... Can't take value of a macro...\n\n; Instead:\n(every? identity '(true 1 \"yes\"))\n", :_id "5bc90001e4b00ac801ed9ee7"}], :notes [{:updated-at 1280212784000, :body "I don't quite see the usefulness of this :P", :created-at 1280212784000, :author {:login "Jacolyte", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f91"} {:updated-at 1313418353000, :body "It's useful for example with -> macro when we eventually want to return its argument (in this case: state)\r\n\r\n\r\n\r\n(defn example[state]\r\n (-> state\r\n update-function-1\r\n update-function-2\r\n identity))", :created-at 1313418233000, :author {:login "dturczanski", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22c58e86fe0fa676e1fcbe71c1dba1bf?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fc5"} {:updated-at 1316077178000, :body "Here is another good example:\r\n
    (some identity ((juxt :foo :bar) {:bar :b}))
    \r\nequivalent to \r\n
     (let [map {:bar b}] (or (:foo map) (:bar map)))", :created-at 1316077178000, :author {:login "lancepantz", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9fbd3eb69f978b77c1bd66436971cdb2?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fcb"} {:body "user=> (mapcat identity [[[0 1] [1 2]] [[11 12]]])\n([0 1] [1 2] [11 12])\n", :created-at 1424195865165, :updated-at 1424195865165, :author {:login "tlightsky", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/429211?v=3"}, :_id "54e38119e4b0b716de7a652c"}], :arglists ["x"], :doc "Returns its argument.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/identity"} {:added "1.0", :ns "clojure.core", :name "into", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1399644560000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "conj", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c52"} {:created-at 1539774381439, :author {:login "witek", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/209520?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "concat", :ns "clojure.core"}, :_id "5bc717ade4b00ac801ed9edb"}], :line 6887, :examples [{:author {:login "Miki", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/52338b3d753f00bb7724f2d2ca060a4?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"}], :body "; Maps can be constructed from a sequence of 2-vectors or a sequence \n; of maps\nuser=> (into (sorted-map) [ [:a 1] [:c 3] [:b 2] ] )\n{:a 1, :b 2, :c 3}\nuser=> (into (sorted-map) [ {:a 1} {:c 3} {:b 2} ] )\n{:a 1, :b 2, :c 3}\n\n; When maps are the input source, they convert into an unordered sequence \n; of key-value pairs, encoded as 2-vectors\nuser=> (into [] {1 2, 3 4})\n[[1 2] [3 4]]\n", :created-at 1278846273000, :updated-at 1404822264000, :_id "542692cbc026201cdc326bac"} {:author {:login "cran1988", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/6261b9b7e6263f013dfb1330a43a501?r=PG&default=identicon"}, :editors [{:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"} {:avatar-url "https://avatars.githubusercontent.com/u/4881607?v=3", :account-source "github", :login "sa2812"}], :body "; Items are conj'ed one at a time, which puts them at the head of \n; the destination list\nuser=> (into () '(1 2 3))\n(3 2 1)\n\n; This does not happen for a vector, however, due to the behavior of conj:\nuser=> (into [1 2 3] '(4 5 6))\n[1 2 3 4 5 6]\n", :created-at 1310276614000, :updated-at 1436264587298, :_id "542692cbc026201cdc326baf"} {:updated-at 1514491228692, :created-at 1334632023000, :body "(defn test-key-inclusion-cols\n  \"return all values in column1 that aren't in column2\"\n  [column1 column2]\n  (filter (complement (into #{} column2)) column1))\n", :editors [{:login "jcburley", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/430319?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon", :account-source "clojuredocs", :login "octopusgrabbus"}, :_id "542692d3c026201cdc326fd8"} {:author {:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"}, :editors [], :body "; Change from one type of map to another\nuser=> (into (sorted-map) {:b 2 :c 3 :a 1})\n{:a 1, :b 2, :c 3}", :created-at 1399534625000, :updated-at 1399534625000, :_id "542692d3c026201cdc326fd9"} {:updated-at 1448739135641, :created-at 1448739135641, :author {:login "dxlr8r", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1648056?v=3"}, :body "; Convert a nested ordering map to hash-map (or another)\nuser=> (use 'flatland.ordered.map)\nuser=> (def ord-map (ordered-map :a \"a\" :b \"b\" :c {:d \"d\" :e \"e\"}))\nuser=> ord-map\n#ordered/map ([:a \"a\"] [:b \"b\"] [:c {:d \"d\", :e \"e\"}]) \n\nuser=> (use 'clojure.walk)\nuser=> (defn disorder [ordering-map map-fn] \n  (postwalk #(if (map? %) (into map-fn %) %) ordering-map))\n\nuser=> (disorder ord-map {})\n{:a \"a\", :b \"b\", :c {:d \"d\", :e \"e\"}}", :_id "565a013fe4b0be225c0c47a0"} {:updated-at 1458739828450, :created-at 1458739828450, :author {:login "ha0ck", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3716736?v=3"}, :body ";impl apply merge\nuser=> (into {:x 4} [{:a 1} {:b 2} {:c 3}])\n\n{:x 4, :a 1, :b 2, :c 3}", :_id "56f29a74e4b07ac9eeceed15"} {:updated-at 1462324693090, :created-at 1462324000684, :author {:login "fasiha", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/37649?v=3"}, :body ";; How do we use a transducer?\n\n; Define the transducer with `comp` but in `->` order:\n(def xform (comp (map #(+ 2 %))\n                 (filter odd?)))\n; adds 2, then omits if result is even.\n\n(into [-1 -2] xform (range 10))\n; => [-1 -2 3 5 7 9 11]\n\n\n; Alternatively, using `transduce` directly:\n(transduce xform conj [-1 -2] (range 10))\n; => [-1 -2 3 5 7 9 11]\n\n; Alternatively, using reduce and explicitly calling `map` and `filter`:\n(reduce conj [-1 -2] (->> (range 10)\n                          (map #(+ 2 %))\n                          (filter odd?)))\n; => [-1 -2 3 5 7 9 11]\n\n\n;; Let's benchmark, using Criterium (https://github.com/hugoduncan/criterium)\n(require '[criterium.core :refer [quick-bench]])\n(quick-bench (into [-1 -2] xform (range 1000000)))\n;   Execution time lower quantile : 54.368948 ms ( 2.5%)\n;   Execution time upper quantile : 55.976303 ms (97.5%)\n\n(quick-bench (transduce xform conj [-1 -2] (range 1000000)))\n;   Execution time lower quantile : 77.738505 ms ( 2.5%)\n;   Execution time upper quantile : 87.088016 ms (97.5%): 1.5x slower than into\n\n(quick-bench (reduce conj [-1 -2] (->> (range 1000000) \n                                       (map #(+ 2 %))\n                                       (filter odd?))))\n;   Execution time lower quantile : 92.607522 ms ( 2.5%)\n;   Execution time upper quantile : 100.426780 ms (97.5%): 1.8x slower than into", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/37649?v=3", :account-source "github", :login "fasiha"}], :_id "57294b20e4b050526f331420"} {:updated-at 1482220266209, :created-at 1482220266209, :author {:login "aksenov", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1590180?v=3"}, :body ";; Interesting case you can't directly convert list or sequence into map (due performance reasons). One should use vector instead.\n\n;; This is ok:\n(into {} [[:a \"a\"] [:b \"b\"]])\n;;=> {:a \"a\", :b \"b\"}\n\n;; But this isn't:\n(into {} ['(:a \"a\") '(:b \"b\")])\n;;=> ClassCastException clojure.lang.Keyword cannot be cast to java.util.Map$Entry clojure.lang.ATransientMap.conj (ATransientMap.java:44)", :_id "5858e2eae4b004d3a355e2c8"} {:editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :body ";; merging two arrays using the transducer `cat`\n(into [] cat [[1 2 3 ] [4 5 6 ]])\n;=> [1 2 3 4 5 6]\n\n(into '() cat [[1 2 3 ] [4 5 6 ]])\n;=> (6 5 4 3 2 1)\n\n(into '() [1 2 3 4 5 6])\n;=> (6 5 4 3 2 1)", :author {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}, :created-at 1517940935300, :updated-at 1519691300149, :_id "5a79f0c7e4b0e2d9c35f741e"} {:editors [{:login "lsevero", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/3440467?v=4"}], :body ";Into is useful to concatenate vectors of maps\n(def a [{:a 1 :b 2} {:a 3 :b 4}])\n(def b [{:c \"c\" :d \"d\"} {:c \"cc\" :d \"dd\"}])\n\n(into a b)\n;=> [{:a 1, :b 2} {:a 3, :b 4} {:c \"c\", :d \"d\"} {:c \"cc\", :d \"dd\"}]\n\n;concat will return a similar result, but will be a lazy-seq instead of a vector", :author {:avatar-url "https://avatars2.githubusercontent.com/u/3440467?v=4", :account-source "github", :login "lsevero"}, :created-at 1582056539595, :updated-at 1582056838335, :_id "5e4c445be4b0ca44402ef83d"} {:editors [{:login "littleli", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/544082?v=4"}], :body ";; Java 9 introduced immutable collections constructed with static 'of' methods\n;; These collections have specific implementation details and are used usually along with Java streams\n;; They cannot be used as operators like this (a-map :key)\n;; Use 'into' to convert them to Clojure collections with improved utility\n\n(into [] (java.util.List/of :a :b :c))\n;=> [:a :b :c]\n\n(into #{} (java.util.Set/of :a :b :c))\n;=> #{:c :b :a}\n\n(into {} (java.util.Map/of :a \"aa\" :b \"bb\" :c \"cc\"))\n;=> {:c \"cc\", :b \"bb\", :a \"aa\"}\n", :author {:avatar-url "https://avatars0.githubusercontent.com/u/544082?v=4", :account-source "github", :login "littleli"}, :created-at 1588591562483, :updated-at 1596476819086, :_id "5eaffbcae4b087629b5a18fd"} {:updated-at 1600132004721, :created-at 1600132004721, :author {:login "luiszambon", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/41161270?v=4"}, :body "; into will return the coll type of the first parameter\n\n(def list-example '(1 2 3 4))\n;=> #'list-example\n(def vector-example [1 2 3 4])\n;=> #'vector-example\n(def set-example #{1 2 3 4})\n;=> #'set-example\n\n(class (into list-example vector-example))\n;=> clojure.lang.PersistentList\n(class (into vector-example list-example))\n;=> clojure.lang.PersistentVector\n(class (into set-example list-example))\n;=> clojure.lang.PersistentHashSet", :_id "5f6013a4e4b0b1e3652d73bd"}], :notes nil, :arglists ["" "to" "to from" "to xform from"], :doc "Returns a new coll consisting of to-coll with all of the items of\n  from-coll conjoined. A transducer may be supplied.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/into"} {:added "1.0", :ns "clojure.core", :name "areduce", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "amap", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342853655000, :_id "542692ebf6e94c6970521ec7"}], :line 5265, :examples [{:updated-at 1446748965601, :created-at 1281617241000, :body ";; This should be about as quick as summing up a array of floats in java.\n\nuser=> (defn asum [^floats xs]\n         (areduce xs i ret (float 0)\n                  (+ ret (aget xs i))))\n\nuser=> (asum (float-array [1 2 3]))\n6.0\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon", :account-source "clojuredocs", :login "gstamp"}, :_id "542692cec026201cdc326df8"}], :macro true, :notes nil, :arglists ["a idx ret init expr"], :doc "Reduces an expression across an array a, using an index named idx,\n  and return value named ret, initialized to init, setting ret to the \n  evaluation of expr at each step, returning ret.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/areduce"} {:added "1.0", :ns "clojure.core", :name "long", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "int", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917169000, :_id "542692eaf6e94c6970521b73"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "longs", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917368000, :_id "542692eaf6e94c6970521b74"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "long-array", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917373000, :_id "542692eaf6e94c6970521b75"} {:created-at 1496088186511, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unchecked-long", :ns "clojure.core"}, :_id "592c7e7ae4b093ada4d4d79c"}], :line 3480, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "rand0m86", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/aa88f28de4d9335e744f8d10d5ebf8a6?r=PG&default=identicon"} {:login "rand0m86", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/aa88f28de4d9335e744f8d10d5ebf8a6?r=PG&default=identicon"}], :body "v.1.3.0\nuser=> (let [num (* 1234567890 21)] [num (int num) (long num)])\n[25925925690 156121914 25925925690]\n\nv.1.6.0\nuser=> (let [num (* 1234567890 21)] [num (int num) (long num)])\nIllegalArgumentException Value out of range for int: 25925925690", :created-at 1281031682000, :updated-at 1406257844000, :_id "542692c7c026201cdc326992"} {:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "rand0m86", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/aa88f28de4d9335e744f8d10d5ebf8a6?r=PG&default=identicon"} {:login "rand0m86", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/aa88f28de4d9335e744f8d10d5ebf8a6?r=PG&default=identicon"}], :body "v.1.3.0\nuser=> (= 21 (long 21))\ntrue \n\n;; but\nuser=> (.equals 21 (long 21))\nfalse \n\n;; and thus\nuser=> (get {21 :twenty-one} (long 21))\nnil \n\nv.1.6.0\nuser=> (= 21 (long 21))\ntrue \n\nuser=> (.equals 21 (long 21))\ntrue\n\nuser=> (.equals 21.0 (long 21))\nfalse\n\nuser=> (.equals (long 21.0) (long 21)) \ntrue", :created-at 1281031694000, :updated-at 1406257882000, :_id "542692c7c026201cdc326996"} {:updated-at 1596590278008, :created-at 1596590278008, :author {:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}, :body "(long 123)\n;;=> 123\n\n(long 1.23)\n;;=> 1\n\n(long 1.2345678901234567890)\n;;=> 1\n\n(long -1)\n;;=> -1\n\n;; Casting a string does not work\n(long \"123\")\n;;=> Execution error (ClassCastException) at user/eval187 (REPL:1).\n;;java.lang.String cannot be cast to java.lang.Number\n\n;; Use Java interop instead\n(Long/parseLong \"123\")\n;;=> 123\n\n;; Content originally posted by u/didibus on https://clojuredocs.org/clojure.core/num", :_id "5f2a08c6e4b0b1e3652d7361"}], :notes [{:updated-at 1394070050000, :body "the second example is no longer true.", :created-at 1394070050000, :author {:login "clojureking", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/92625b8a6be91bb8c688d0d07b4e2a32?r=PG&default=identicon"}, :_id "542692edf6e94c6970522020"}], :arglists ["x"], :doc "Coerce to long", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/long"} {:added "1.0", :ns "clojure.core", :name "double", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1579780040730, :author {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "float", :ns "clojure.core"}, :_id "5e2987c8e4b0ca44402ef81c"} {:created-at 1579780063873, :author {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "bigdec", :ns "clojure.core"}, :_id "5e2987dfe4b0ca44402ef81d"}], :line 3492, :examples [{:author {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (double 1)\n1.0", :created-at 1283814485000, :updated-at 1332952958000, :_id "542692cec026201cdc326ddb"} {:updated-at 1522204835943, :created-at 1522204835943, :author {:login "yuxuan813", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/22159831?v=4"}, :body ";; Ratios can be explicitly coerced to a floating-point representation:\nuser=> (double 1/3)\n;= 0.3333333333333333", :_id "5abb00a3e4b045c27b7fac28"} {:updated-at 1596590762065, :created-at 1596590762065, :author {:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}, :body ";; Casting a string does not work\n(double \"123.456\")\n;;=> Execution error (ClassCastException) at user/eval197 (REPL:1).\n;;java.lang.String cannot be cast to java.lang.Number\n\n;; Use Java interop instead\n(Double/parseDouble \"123.456\")\n;;=> 123.456\n\n;; Content originally posted by u/didibus on https://clojuredocs.org/clojure.core/num", :_id "5f2a0aaae4b0b1e3652d7366"}], :notes nil, :arglists ["x"], :doc "Coerce to double", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/double"} {:added "1.7", :ns "clojure.core", :name "volatile?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1437146147516, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "volatile!", :ns "clojure.core"}, :_id "55a91c23e4b0080a1b79cda6"} {:created-at 1492395420814, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "vswap!", :ns "clojure.core"}, :_id "58f4259ce4b01f4add58fe8e"} {:created-at 1492395448747, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "vreset!", :ns "clojure.core"}, :_id "58f425b8e4b01f4add58fe8f"}], :line 2548, :examples [{:editors [{:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}], :body "(def a (volatile! 0))\n\nuser=> (volatile? a)\n;;=> true\n\n(def b 0)\n\nuser=> (volatile? b)\n;;=> false", :author {:avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3", :account-source "github", :login "ertugrulcetin"}, :created-at 1460034117197, :updated-at 1460034139185, :_id "57065a45e4b075f5b2c864cf"}], :notes nil, :arglists ["x"], :doc "Returns true if x is a volatile.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/volatile_q"} {:added "1.0", :ns "clojure.core", :name "definline", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1612735270827, :author {:login "KingMob", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/946421?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defmacro", :ns "clojure.core"}, :_id "60206326e4b0b1e3652d744b"}], :line 5229, :examples nil, :macro true, :notes [{:updated-at 1354753534000, :body "Note that, as for macros, the arguments to definline are potentially subject to double evaluation if they are used more than once in the body. For example:\r\n\r\n
    \r\nuser=> (definline bad-sqr [x] `(* ~x ~x))\r\n#'user/bad-sqr\r\nuser=> (bad-sqr (do (println \"x\") 5))\r\nx\r\nx\r\n25\r\n
    \r\n\r\n", :created-at 1354753534000, :author {:login "glchapman", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a5176d5d971ba68c15f4afe376aeaf18?r=PG&default=identicon"}, :_id "542692edf6e94c6970521ff8"} {:updated-at 1385846788000, :body "Any non-like-a-function behaviour should be avoided, because otherwise function will behave differently depending on whether it's inlined or not:\r\n\r\n user=> (definline bad-if [cond then] `(if ~cond ~then))\r\n #'user/bad-if\r\n user=> (bad-if nil (do (prn :side-effect) :not-returned))\r\n nil\r\n user=> (let [bad-if bad-if] (bad-if nil (do (prn :side-effect) :not-returned)))\r\n :side-effect\r\n nil\r\n", :created-at 1385846788000, :author {:login "Alexey Tarasevich", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/43e0398b89022d32b43de4c968069312?r=PG&default=identicon"}, :_id "542692edf6e94c6970522013"}], :arglists ["name & decl"], :doc "Experimental - like defmacro, except defines a named function whose\n body is the expansion, calls to which may be expanded inline as if\n it were a macro. Cannot be used with variadic (&) args.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/definline"} {:added "1.0", :ns "clojure.core", :name "nfirst", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1343067247000, :author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "next", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eb5"} {:created-at 1482184108272, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "first", :ns "clojure.core"}, :_id "585855ace4b004d3a355e2c3"} {:created-at 1482184112724, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ffirst", :ns "clojure.core"}, :_id "585855b0e4b004d3a355e2c4"} {:created-at 1482184132251, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "fnext", :ns "clojure.core"}, :_id "585855c4e4b004d3a355e2c5"} {:created-at 1482184136369, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nnext", :ns "clojure.core"}, :_id "585855c8e4b004d3a355e2c6"}], :line 105, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (nfirst [])\nnil \n\nuser=> (nfirst ['(a b c) '(b a c) '(c b a) '(a c b)])\n(b c)\n\nuser=> (nfirst {:a 1, :b 2, :c 3, :d 4})\n(1)\n\nuser=> (nfirst #{1 2 3})\njava.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Integer (NO_SOURCE_FILE:0)", :created-at 1281033567000, :updated-at 1332950990000, :_id "542692cec026201cdc326d83"}], :notes nil, :arglists ["x"], :doc "Same as (next (first x))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/nfirst"} {:added "1.0", :ns "clojure.core", :name "meta", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1302719092000, :author {:login "dnaumov", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/361cb3cfa29928ddff4c49cbb5ad0cbd?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-meta", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ec0"} {:created-at 1302719254000, :author {:login "dnaumov", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/361cb3cfa29928ddff4c49cbb5ad0cbd?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "*print-meta*", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ec1"} {:created-at 1489661787389, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/10404?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "vary-meta", :ns "clojure.core"}, :_id "58ca6f5be4b01f4add58fe75"}], :line 202, :examples [{:author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(use 'clojure.pprint)\n(pprint (meta #'first))\n;;=> prints the following...\n{:ns #,\n :name first,\n :added \"1.0\",\n :file \"clojure/core.clj\",\n :static true,\n :column 1,\n :line 49,\n :arglists ([coll]),\n :doc\n \"Returns the first item in the collection. Calls seq on its\\n \n argument. If coll is nil, returns nil.\"}", :created-at 1280777073000, :updated-at 1434396446014, :_id "542692cfc026201cdc326e8f"} {:updated-at 1519676797874, :created-at 1519670280917, :author {:login "finalfantasia", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/2316604?v=4"}, :body ";; attach metadata to s.\n;; ^:private is a shorthand notation for ^{:private true} and\n;; ^String is a shorthand notation for ^{:tag java.lang.String}.\n(def ^:private ^String s \"Hello, world!\")\n\n;; inspect the metadata attached to s.\n;; note, you need to use the var #'s, instead of the symbol s, as the argument.\n(clojure.pprint/pprint (meta #'s))\n;; =>\n{:private true,\n :tag java.lang.String,\n :line 3,\n :column 1,\n :file \"/tmp/form-init5430922801479403331.clj\",\n :name s,\n :ns #object[clojure.lang.Namespace 0x13fca031 \"user\"]}\n", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/2316604?v=4", :account-source "github", :login "finalfantasia"}], :_id "5a945408e4b0316c0f44f8f0"} {:editors [{:login "randomizedthinking", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5283430?v=4"}], :body ";; attach metadata to var x\n(def ^{:version 1} x [1 2 3])\n\n;; retrieve metadata of var x: note the notation\n(meta #'x)\n;; =>\n{:version 1,\n :line 3,\n :column 1,\n :file \"...\",\n :name x,\n :ns ...}\n\n;; attach metadata to an obj\n(def y ^{:version 1} [1 2 3])\n\n(meta y) ;=> {:version 1}\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/5283430?v=4", :account-source "github", :login "randomizedthinking"}, :created-at 1670874928008, :updated-at 1670875211552, :_id "63978730e4b0b1e3652d7699"}], :notes nil, :arglists ["obj"], :doc "Returns the metadata of obj, returns nil if there is no metadata.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/meta"} {:ns "clojure.core", :name "find-protocol-impl", :file "clojure/core_deftype.clj", :type "function", :column 1, :see-alsos nil, :line 535, :examples nil, :notes nil, :arglists ["protocol x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/find-protocol-impl"} {:added "1.0", :ns "clojure.core", :name "bit-and-not", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 1320, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (bit-and-not 2r1100 2r1001) ; (and X (not Y))\n4\n;; 4 = 2r0100", :created-at 1280339735000, :updated-at 1332952979000, :_id "542692cfc026201cdc326e25"} {:body ";; here is the truth table for AND-NOT (which is not the same as NAND) \n(Integer/toBinaryString (bit-and-not 2r1100 2r1010) )\n;;=> \"100\"\n;; or 2r0100\n\n;; NAND would be...\n(Integer/toBinaryString (bit-not (bit-and 2r1100 2r1010)) )\n;;=> \"11111111111111111111111111110111\"\n;; which is clearly not the same\n\n;; this operation is material non-implication\n(= (bit-and-not 2r1100 2r1010) (bit-and 2r1100 (bit-not 2r1010)) )\n;;=> true\n", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1414515398672, :updated-at 1414515782150, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :_id "544fcac6e4b03d20a1024296"} {:updated-at 1666990058605, :created-at 1666990058605, :author {:login "bhlieberman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/60364696?v=4"}, :body ";;flip the bits of a seq\n(map (fn [n] (bit-and-not 0xff n)) (range 1 10)) ; ~n & 0xff\n;;=> (254 253 252 251 250 249 248 247 246)\n", :_id "635c3feae4b0b1e3652d767d"}], :notes nil, :arglists ["x y" "x y & more"], :doc "Bitwise and with complement", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bit-and-not"} {:added "1.5", :ns "clojure.core", :name "*default-data-reader-fn*", :file "clojure/core.clj", :type "var", :column 1, :see-alsos [{:created-at 1529611952524, :author {:login "puredanger", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/171129?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "*data-readers*", :ns "clojure.core"}, :_id "5b2c06b0e4b00ac801ed9e1a"} {:created-at 1529611964217, :author {:login "puredanger", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/171129?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "tagged-literal", :ns "clojure.core"}, :_id "5b2c06bce4b00ac801ed9e1b"}], :dynamic true, :line 7787, :examples [{:editors [{:login "puredanger", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/171129?v=4"}], :body ";; Clojure includes a generic tagged-literal type, able to read any\n;; tagged literal. This makes a great default-data-reader-fn.\n\n;; Clojure can't read tagged literals without a registered reader:\nuser=> #object[clojure.lang.Namespace 0x23bff419 \"user\"]\nRuntimeException No reader function for tag object clojure.lang.LispReader$CtorReader.readTagged (LispReader.java:1430)\n\n;; Set tagged-literal to be the default tagged value reader:\nuser=> (set! *default-data-reader-fn* tagged-literal)\n\n;; Try again\nuser=> #object[clojure.lang.Namespace 0x23bff419 \"user\"]\n#object [clojure.lang.Namespace 599782425 \"user\"]\n\n;; Now it works, and reads to a TaggedLiteral object, which\n;; supports ILookup on :tag and :form keys\nuser=> [(:tag *1) (:form *1)]\n[object [clojure.lang.Namespace 599782425 \"user\"]]\n", :author {:avatar-url "https://avatars0.githubusercontent.com/u/171129?v=4", :account-source "github", :login "puredanger"}, :created-at 1529611907877, :updated-at 1529636650211, :_id "5b2c0683e4b00ac801ed9e19"}], :notes nil, :arglists [], :doc "When no data reader is found for a tag and *default-data-reader-fn*\n is non-nil, it will be called with two arguments,\n the tag and the value. If *default-data-reader-fn* is nil (the\n default), an exception will be thrown for the unknown tag.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*default-data-reader-fn*"} {:added "1.0", :ns "clojure.core", :name "var?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1289214474000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "def", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dc9"} {:created-at 1289214479000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "var", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dca"} {:created-at 1362015178000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "var-get", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dcc"} {:created-at 1362015184000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "var-set", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dcd"} {:created-at 1362015190000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-local-vars", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dce"}], :line 4975, :examples [{:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [], :body "(def my-symbol)\n(var? #'my-symbol)\n=> true\n\n(var? (var my-symbol))\n=> true\n\n(var? (def my-symbol2))\n=> true", :created-at 1289214469000, :updated-at 1289214469000, :_id "542692cac026201cdc326b63"} {:author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :editors [], :body "=> *clojure-version*\n{:major 1, :minor 5, :incremental 0, :qualifier \"RC17\"}\n=> var?\n#\n=> (var?)\n;ArityException Wrong number of args (0) passed to: core$var-QMARK- clojure.lang.AFn.throwArity (AFn.java:437)\n=> (var? 1)\nfalse\n=> (var? defn)\n;CompilerException java.lang.RuntimeException: Can't take value of a macro: #'clojure.core/defn, compiling:(NO_SOURCE_PATH:1:1) \n=> (var? #'defn)\ntrue\n=> (var? #'defn 1 2 3 4)\n;ArityException Wrong number of args (5) passed to: core$var-QMARK- clojure.lang.AFn.throwArity (AFn.java:437)\n=> (var? (var defn))\ntrue\n=> (var? apply)\nfalse\n=> (var? #'apply)\ntrue\n", :created-at 1362015139000, :updated-at 1362015139000, :_id "542692d5c026201cdc3270b2"}], :notes nil, :arglists ["v"], :doc "Returns true if v is of type clojure.lang.Var", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/var_q"} {:ns "clojure.core", :name "method-sig", :file "clojure/core_proxy.clj", :type "function", :column 1, :see-alsos nil, :line 20, :examples [{:updated-at 1682607087713, :created-at 1496052873728, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body ";;;; (method-sig) turns java.lang.reflect.Method into a vector \n;;;; of the form [name (param-types) return-type]\n\n(->> String .getMethods (filter #(= (.getName %) \"indexOf\")))\n;;=> (#object[java.lang.reflect.Method 0x4a499a6c \"public int java.lang.String.indexOf(java.lang.String,int)\"]\n;; #object[java.lang.reflect.Method 0x29b045b3 \"public int java.lang.String.indexOf(int)\"]\n;; #object[java.lang.reflect.Method 0x55ce8ae4 \"public int java.lang.String.indexOf(java.lang.String)\"]\n;; #object[java.lang.reflect.Method 0x33a58323 \"public int java.lang.String.indexOf(int,int)\"])\n\n(->> String .getMethods (filter #(= (.getName %) \"indexOf\")) (map method-sig))\n;;=> ([\"indexOf\" (java.lang.String int) int]\n;; [\"indexOf\" (int) int]\n;; [\"indexOf\" (java.lang.String) int]\n;; [\"indexOf\" (int int) int])", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4", :account-source "github", :login "tomdl89"}], :_id "592bf489e4b093ada4d4d791"}], :notes nil, :arglists ["meth"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/method-sig"} {:added "1.0", :ns "clojure.core", :name "unchecked-add-int", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1423522083291, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "+", :library-url "https://github.com/clojure/clojure"}, :_id "54d93923e4b0e2ac61831d2d"} {:created-at 1423522088305, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "+'", :library-url "https://github.com/clojure/clojure"}, :_id "54d93928e4b081e022073c73"} {:created-at 1488034480881, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unchecked-subtract-int", :ns "clojure.core"}, :_id "58b19ab0e4b01f4add58fe63"}], :line 1191, :examples [{:updated-at 1488034461415, :created-at 1488034461415, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :body ";; Adding two int-range Longs works\n(unchecked-add-int 1 1)\n;;=> 2\n\n;; Adding two int-range BigInts works\n(unchecked-add-int 1N 1N)\n;;=> 2\n\n;; Doubles are truncated\n(unchecked-add-int 1 1.9)\n;;=> 2\n\n;; BigDecimals are truncated\n(unchecked-add-int 1 1.9M)\n;;=> 2\n\n;; Uncaught integer overflow\n(unchecked-add-int Integer/MAX_VALUE 1)\n;;=> -2147483648\n\n;; Uncaught integer underflow\n(unchecked-add-int Integer/MIN_VALUE -1)\n;;=> 2147483647\n\n;; Fails for Longs outside of int range\n(unchecked-add-int 2147483648 0)\n;;=> IllegalArgumentException Value out of range for int: 2147483648 clojure.lang.RT.intCast (RT.java:1205)\n\n;; Fails for BigInts outside of int range\n(unchecked-add-int 2147483648N 0)\n;;=> IllegalArgumentException Value out of range for int: 2147483648 clojure.lang.RT.intCast (RT.java:1205)\n\n;; Fails for Doubles outside of int range\n(unchecked-add-int 2147483648.0 0)\n;;=> IllegalArgumentException Value out of range for int: 2147483648 clojure.lang.RT.intCast (RT.java:1205)\n\n;; Fails for BigDecimals outside of int range\n(unchecked-add-int 2147483648.0M 0)\n;;=> IllegalArgumentException Value out of range for int: 2147483648 clojure.lang.RT.intCast (RT.java:1205)", :_id "58b19a9de4b01f4add58fe62"}], :notes nil, :arglists ["x y"], :doc "Returns the sum of x and y, both int.\n Note - uses a primitive operator subject to overflow.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-add-int"} {:ns "clojure.core", :name "unquote-splicing", :file "clojure/core.clj", :type "var", :column 1, :see-alsos [{:created-at 1319195960000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unquote", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d37"}], :line 14, :examples [{:author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=2"}, :editors [], :body "user=> (let [x `(2 3)] \n `(1 ~x))\n(1 (2 3))\n\nuser=> (let [x `(2 3)] \n `(1 ~@x)) \n(1 2 3)\n", :created-at 1305077817000, :updated-at 1305077817000, :_id "542692c8c026201cdc326a73"} {:author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :editors [], :body "user=> `(1 2 ~(list 3 4))\n\n(1 2 (3 4))\n\nuser=> `(1 2 ~@(list 3 4))\n\n(1 2 3 4)\n\n; borrowed from StackOverflow: \n; http://stackoverflow.com/questions/4571042/can-someone-explain-clojures-unquote-splice-in-simple-terms", :created-at 1319196585000, :updated-at 1319196585000, :_id "542692d5c026201cdc3270b0"} {:editors [{:login "green-coder", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4"}], :body ";; The splicing works at any location in the enclosing structure.\n`(1 ~@(list 2 3) 4 ~@(list 5 6) 7)\n=> (1 2 3 4 5 6 7)\n\n;; The enclosing structure can be a list, a vector or a set.\n`[1 ~@(list 2 3) 4 ~@(list 5 6) 7]\n=> [1 2 3 4 5 6 7]\n\n`#{1 ~@(list 2 3) 4 ~@(list 5 6) 7}\n=> #{7 1 4 6 3 2 5}\n\n;; The splicing produces a sequence from any `sequential?` value.\n`(1 ~@'(2 3) 4 ~@[5 6] 7 ~@(range 8 10))\n=> (1 2 3 4 5 6 7 8 9)\n\n`(1 ~@{2 3 4 5} 6)\n=> (1 [2 3] [4 5] 6)\n\n;; It currently does not work well inside maps.\n;; https://dev.clojure.org/jira/browse/CLJ-1425\n`{1 2 ~@[3 4]}\nSyntax error reading source at (REPL:1:15).\nMap literal must contain an even number of forms\n\n`{1 ~@[2 3] 4 ~@[5 6]}\n=> {1 2, 3 4, 5 6}\n\n;; Workaround: don't use the map literals\n`(hash-map 1 2 ~@[3 4])\n=> (clojure.core/hash-map 1 2 3 4)", :author {:avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4", :account-source "github", :login "green-coder"}, :created-at 1547668738996, :updated-at 1547671826780, :_id "5c3f8d02e4b0ca44402ef61c"}], :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unquote-splicing"} {:added "1.6", :ns "clojure.core", :name "hash-ordered-coll", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1495656275875, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "hash-unordered-coll", :ns "clojure.core"}, :_id "5925e753e4b093ada4d4d744"} {:created-at 1495656285147, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "hash", :ns "clojure.core"}, :_id "5925e75de4b093ada4d4d745"}], :line 5186, :examples [{:updated-at 1495656268428, :created-at 1495656268428, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body ";;;; Clojure's (hash-ordered-coll) produces the same hash code regardless\n;;;; of collection type when both of the following two conditions are met:\n;;;; (1) collections contain the same elements\n;;;; (2) collection elements are ordered the same when returned by .iterator()\n\n(hash-ordered-coll [1 2])\n;;=> 156247261\n(hash-ordered-coll '(1 2))\n;;=> 156247261\n(hash-ordered-coll (sorted-set 1 2))\n;;=> 156247261\n(hash-ordered-coll (doto (new java.util.ArrayList) (.add 1) (.add 2)))\n;;=> 156247261\n(hash-ordered-coll (doto (new java.util.TreeSet) (.add 1) (.add 2)))\n;;=> 156247261\n\n(hash-ordered-coll [2 1])\n;;=> -1994590503\n(hash-ordered-coll '(2 1))\n;;=> -1994590503\n(hash-ordered-coll (sorted-set-by > 2 1))\n;;=> -1994590503\n(hash-ordered-coll (doto (new java.util.ArrayList) (.add 2) (.add 1)))\n;;=> -1994590503\n(hash-ordered-coll (doto (new java.util.TreeSet >) (.add 2) (.add 1)))\n;;=> -1994590503\n\n;;;; Notice that this differs from (hash) which \n;;;; (1) doesn't rely on element order as returned by .iterator()\n;;;; (2) falls back on Java's .hashCode() for non-Clojure collections\n\n(hash [1 2])\n;;=> 156247261\n(hash '(1 2))\n;;=> 156247261\n(hash (sorted-set 1 2))\n;;=> 460223544\n(hash (sorted-set-by > 2 1))\n;;=> 460223544\n(hash (doto (new java.util.ArrayList) (.add 1) (.add 2)))\n;;=> 994\n(hash (doto (new java.util.TreeSet) (.add 1) (.add 2)))\n;;=> 3\n", :_id "5925e74ce4b093ada4d4d743"} {:updated-at 1495657079980, :created-at 1495657079980, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body ";;;;\n;;;; Only accepts implementations of java.lang.Iterable\n;;;;\n\n(hash-ordered-coll true)\n;;=> ClassCastException java.lang.Boolean cannot be cast to java.lang.Iterable\n(hash-ordered-coll 1)\n;;=> ClassCastException java.lang.Long cannot be cast to java.lang.Iterable\n(hash-ordered-coll \\c)\n;;=> ClassCastException java.lang.Character cannot be cast to java.lang.Iterable\n\n;;;;\n;;;; Being seqable is not sufficient!\n;;;;\n\n(hash-ordered-coll \"12\")\n;;=> ClassCastException java.lang.String cannot be cast to java.lang.Iterable\n(hash-ordered-coll (int-array [1 2]))\n;;=> ClassCastException [I cannot be cast to java.lang.Iterable\n(hash-ordered-coll nil)\n;;=> NullPointerException", :_id "5925ea77e4b093ada4d4d747"}], :notes nil, :arglists ["coll"], :doc "Returns the hash code, consistent with =, for an external ordered\n collection implementing Iterable.\n See http://clojure.org/data_structures#hash for full algorithms.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/hash-ordered-coll"} {:added "1.1", :ns "clojure.core", :name "future", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1332389737000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "future-cancel", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c95"} {:created-at 1336536261000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "shutdown-agents", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c96"} {:created-at 1349259124000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "promise", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c97"} {:created-at 1349558136000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "realized?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c98"} {:created-at 1291441344000, :author {:login "pauldoo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5cb916d3c8abc9f45a093209e72489fb?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "delay", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e73"} {:created-at 1291473035000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "future?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e74"} {:created-at 1300437104000, :author {:login "ninjudd", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7ced25585a7556e9b9b975c1f9e136e3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "future-call", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e75"} {:created-at 1413483298913, :author {:login "Chort409", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1062637?v=2"}, :to-var {:ns "clojure.core", :name "future-done?", :library-url "https://github.com/clojure/clojure"}, :_id "54400b22e4b05802a3cc25dc"} {:created-at 1537551889359, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "locking", :ns "clojure.core"}, :_id "5ba52e11e4b00ac801ed9ea3"}], :line 6990, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "azkesz", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/467196a4f2498080c9740a81fcbde855?r=PG&default=identicon"} {:login "azkesz", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/467196a4f2498080c9740a81fcbde855?r=PG&default=identicon"} {:login "azkesz", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/467196a4f2498080c9740a81fcbde855?r=PG&default=identicon"} {:login "yayitswei", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/179c73a6ff978b738c014abeb1ead0f9?r=PG&default=identicon"} {:login "luke", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ac463e1534de6c3a7bbe42365286cd?r=PG&default=identicon"}], :body ";; A future's calculation is started here and it runs in another thread\nuser=> (def f (future (Thread/sleep 10000) (println \"done\") 100))\n#'user/f\n;;if you wait 10 seconds before dereferencing it you'll see \"done\"\n\n;; When you dereference it you will block until the result is available.\nuser=> @f\ndone\n100\n\n;; Dereferencing again will return the already calculated value.\n=> @f\n100\n", :created-at 1281077331000, :updated-at 1346904770000, :_id "542692c9c026201cdc326a74"} {:author {:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "yayitswei", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/179c73a6ff978b738c014abeb1ead0f9?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/2139?v=3", :account-source "github", :login "jamieorc"} {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}], :body ";; save the example in a script (e.g. test-future.clj) then run it in the console\n;;\n;; > clojure test-future.clj\n\n(println \"[Main] calculate the answer to life the universe and everything\")\n\n;; Used Thread/sleep to simulate long running process\n(def what-is-the-answer-to-life\n (future \n (println \"[Future] started computation\")\n (Thread/sleep 3000) ;; running for 3 seconds\n (println \"[Future] completed computation\")\n 42))\n \n(println \"[Main] created future\")\n\n(Thread/sleep 1000)\n(println \"[Main] do other things while waiting for the answer\")\n(println \"[Main] get the answer\")\n(println \"[Main] the result\" @what-is-the-answer-to-life)\n(shutdown-agents)\n\n\n;; You may get something like this\n;;\n;; [Main] calculate the answer to life, the universe and everything\n;; [Future] started computation\n;; [Main] created future\n;; [Main] do other things while waiting for the answer\n;; [Main] get the answer\n;; [Future] completed computation\n;; [Main] the result 42\n\n\n;; Note: If you leave out the call to (shutdown-agents), the program\n;; will on most (all?) OS/JVM combinations \"hang\" for 1 minute before\n;; the process exits. It is waiting for a thread created by the\n;; future call to be shut down. shutdown-agents will shut them down\n;; immediately, or (System/exit ) will exit immediately\n;; without waiting for them to shut down.\n\n;; This wait occurs even if you use futures indirectly through some other Clojure\n;; functions that use them internally, such as pmap or clojure.java.shell/sh\n\n;; http://dev.clojure.org/jira/browse/CLJ-124 is a ticket opened against Clojure,\n;; as this 1-minute wait is not considered desirable behavior.", :created-at 1312375403000, :updated-at 1518117159450, :_id "542692c9c026201cdc326a7b"} {:editors [{:avatar-url "https://avatars.githubusercontent.com/u/367789?v=3", :account-source "github", :login "mattvvhat"} {:login "bkovitz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3"}], :updated-at 1462724896381, :created-at 1428550055119, :author {:avatar-url "https://avatars.githubusercontent.com/u/367789?v=3", :account-source "github", :login "mattvvhat"}, :body ";; Futures will not raise their exceptions...\n=> (def my-future (future (/ 1 0))\n\n;; ...until dereferenced!\n=> @my-future\nArithmeticException Divide by zero clojure.lang.Numbers.divide", :_id "5525f1a7e4b033f34014b768"} {:editors [{:login "siddharthjain-in", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6537820?v=4"}], :body ";; Given two URLs, create two futures to slurp their HTML, and return \n;; the page that returns first.\n;; This works because promises can only be delivered once.\n(let [p (promise)]\n (let [angieslist \"https://angieslist.com\" \n homeadvisor \"https://homeadvisor.com\"]\n (doseq [url [angieslist homeadvisor]]\n (future (let [response (slurp url)]\n (deliver p response)))))\n @p)\n", :author {:avatar-url "https://avatars1.githubusercontent.com/u/1291508?v=4", :account-source "github", :login "tomgeorge"}, :created-at 1590118285193, :updated-at 1627314798087, :_id "5ec7478de4b087629b5a190e"} {:editors [{:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4"}], :body ";; You may want to do some cleanup whenever you cancel your `future`\n;; InterruptedException is the catch!\n\n;; lets say we want to feed our doge, but only a limited time...\n(defn connect! [conn] (println (reset! conn \"[doge] very yum\")))\n(defn response [conn] (println (reset! conn \"[doge] so full\")))\n(defn clean [conn] (println (reset! conn \"[doge] so hungry\")))\n\n(let [feed-time (rand-int 2000)\n connection (atom \"[doge] such ready\")\n doge-ops (future\n (try\n (println @connection)\n (connect! connection)\n (Thread/sleep 1000)\n (response connection)\n (catch InterruptedException ie\n (clean connection))\n (finally (println \"[doge] wow\"))))]\n (printf \"[Main] granting many feeding time: %dms\\n\" feed-time)\n (if (= :too-late (deref doge-ops feed-time :too-late))\n (do (println \"[Main] stop!\")\n (future-cancel doge-ops))\n @doge-ops))\n\n;; if he's lucky:\n[Main] granting many feeding time: 1582ms\n[doge] such ready\n[doge] very yum\n[doge] so full\n[doge] wow\n=> nil\n\n;; if he's unlucky:\n[Main] granting many feeding time: 569ms\n[doge] such ready\n[doge] very yum\n[Main] stop!\n=> true\n[doge] so hungry\n[doge] wow\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4", :account-source "github", :login "loeschzwerg"}, :created-at 1651240015047, :updated-at 1651241054178, :_id "626bec4fe4b0b1e3652d75d8"}], :macro true, :notes nil, :arglists ["& body"], :doc "Takes a body of expressions and yields a future object that will\n invoke the body in another thread, and will cache the result and\n return it on all subsequent calls to deref/@. If the computation has\n not yet finished, calls to deref/@ will block, unless the variant of\n deref with timeout is used. See also - realized?.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/future"} {:added "1.0", :ns "clojure.core", :name "reset-meta!", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1458508963890, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "meta", :ns "clojure.core"}, :_id "56ef14a3e4b09295d75dbf31"} {:created-at 1458508972022, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "vary-meta", :ns "clojure.core"}, :_id "56ef14ace4b09295d75dbf32"} {:created-at 1458508987478, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "alter-meta!", :ns "clojure.core"}, :_id "56ef14bbe4b09295d75dbf33"} {:created-at 1458509000330, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "with-meta", :ns "clojure.core"}, :_id "56ef14c8e4b09295d75dbf34"}], :line 2416, :examples [{:updated-at 1458508861290, :created-at 1458508861290, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :body "(def ^{:key \"val\"} my-var \"\")\n;;=> #'user/my-var\n\n(meta #'my-var)\n;;=> {:key \"val\", :ns #, :name my-var, :file \"NO_SOURCE_PATH\", :column 1, :line 1}\n\n(reset-meta! #'my-var {:new-key \"new-val\"}) ; replace all metadata\n;;=> {:new-key \"new-val\"}\n\n(meta #'my-var)\n;;=> {:new-key \"new-val\"}\n\n", :_id "56ef143de4b0b41f39d96ceb"}], :notes nil, :arglists ["iref metadata-map"], :doc "Atomically resets the metadata for a namespace/var/ref/agent/atom", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/reset-meta!"} {:added "1.0", :ns "clojure.core", :name "cycle", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1360759662000, :author {:login "rahulpilani", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3c3585fc1c6bf074ed5f268c9ebcb2f?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "lazy-seq", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ea1"} {:created-at 1434128252248, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:ns "clojure.core", :name "map", :library-url "https://github.com/clojure/clojure"}, :_id "557b0f7ce4b03e2132e7d18d"} {:created-at 1553543700422, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "repeat", :ns "clojure.core"}, :_id "5c993214e4b0ca44402ef6c9"}], :line 2979, :examples [{:author {:login "nipra", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/142529?v=3"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"}], :body "user=> (take 5 (cycle [\"a\" \"b\"]))\n(\"a\" \"b\" \"a\" \"b\" \"a\")\n\nuser=> (take 10 (cycle (range 0 3)))\n(0 1 2 0 1 2 0 1 2 0)\n\n", :created-at 1279160241000, :updated-at 1305843374000, :_id "542692ccc026201cdc326c30"} {:body ";; Typically map works through its set of collections\n;; until any one of the collections is consumed.\n;; 'cycle' can be used to repeat the shorter collections\n;; until the longest collection is consumed.\n(mapv #(vector %2 %1) (cycle [1 2 3 4]) [:a :b :c :d :e :f :g :h :i :j :k :l])\n;;=> [[:a 1] [:b 2] [:c 3] [:d 4] [:e 1] [:f 2] [:g 3] [:h 4] [:i 1] [:j 2] [:k 3] [:l 4]]", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1434128630375, :updated-at 1434128842939, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :_id "557b10f6e4b01ad59b65f4f2"}], :notes nil, :arglists ["coll"], :doc "Returns a lazy (infinite!) sequence of repetitions of the items in coll.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/cycle"} {:added "1.0", :ns "clojure.core", :name "fn", :special-form true, :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1360339005000, :author {:login "ViljamiPeltola", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1535c08820796d57a212a46a6bdd4cca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defn", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c77"}], :line 4513, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"} {:login "jumblerg", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f9e06cdf33ea6f2958a8b6430d9fe22?r=PG&default=identicon"} {:login "jumblerg", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f9e06cdf33ea6f2958a8b6430d9fe22?r=PG&default=identicon"}], :body ";; simple anonymous function passed to (map )\nuser=> (map (fn [x] (* x x)) (range 1 10))\n(1 4 9 16 25 36 49 64 81) \n\n;; anonymous function with a name. not so anonymous now is it?\n;; this is useful in stack traces\n(fn add [a b] (+ a b))\n\n;; anonymous function with two params, the second is destructured\nuser=> (reduce (fn [m [k v]] (assoc m v k)) {} {:b 2 :a 1 :c 3})\n{2 :b, 1 :a, 3 :c} \n\n;; define and instantly call an anonymous function\nuser=> ((fn [a b c] (+ a b c)) 2 4 6)\n12\n\n;; define and instantly call an anonymous variadic function \n;; \"nums\" is a list here\nuser=> ((fn [& nums] (/ (apply + nums) (count nums))) 1 2 3 4)\n5/2 \n\n;; define and instantly call an anonymous mixed function\n;; \"nums\" is a list, while \"int\" is a number\nuser=> ((fn [int & nums] (+ int (/ (apply + nums) (count nums)))) 10 1 2 3 4)\n25/2 \n\n;; define and instantly call an anonymous overloaded function \n;; even though it is quite pointless\nuser=> ((fn ([a] (inc a)) ([a b] (+ a b))) 3)\n4\n\n", :created-at 1280346731000, :updated-at 1410072276000, :_id "542692c7c026201cdc326977"} {:author {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; the shortcut form for (fn ) is #( )\n;; where parameters are referred by their index with the prefix %\n\n;; the equivalent of \nuser=> ((fn [a b c] (+ a b c)) 2 4 6)\n12\n\n;; is\nuser=> (#(+ %1 %2 %3) 2 4 6)\n12\n", :created-at 1284093085000, :updated-at 1285487263000, :_id "542692c7c026201cdc326983"} {:editors [{:login "enc7", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/12020265?v=3"}], :body ";; shortcut form #() cannot be used for maps etc.\n\nuser=> ((fn [] {:a 1}))\n{:a 1}\n\nuser=> (#({:a 1}))\nArityException Wrong number of args (0) passed to: PersistentArrayMap\n\nuser=> (#([1]))\nArityException Wrong number of args (0) passed to: PersistentVector\n\n;; explanation for the\tfirst error:\n;; #(f) is a shortcut for (fn [] (f))\n;; that means (#({:a 1})) is shortcut for ((fn [] ({:a 1})))\n;; which leads to the error above because you cannot apply a map to an empty\n;; argument list.\n\n;; i.e. you can only use #() shortcut if the fn body is a list.\n;; As ((fn [] {:a 1})) has the same result \n;; as ((fn [] (identity {:a 1}))), you can write:\n\nuser=> (#(identity {:a 1}))\n{:a 1}", :author {:avatar-url "https://avatars.githubusercontent.com/u/5733420?v=3", :account-source "github", :login "trimtab613"}, :created-at 1442862274788, :updated-at 1448575959557, :_id "560054c2e4b08e404b6c1c80"} {:updated-at 1515615145069, :created-at 1515615145069, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;map and anonymous function\n;;apply a function to a collection using an anonymous function\n\n(defn byten\n [nums]\n (map #(* 10 %) nums))\n\n(byten [1 2 3 4 5])\n;;(10 20 30 40 50)", :_id "5a5673a9e4b0a08026c48ceb"} {:updated-at 1565772877274, :created-at 1565772877274, :author {:login "terjedahl", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/11754710?v=4"}, :body ";; shortcut form #() expands to an args-list-count as per \n;; the highest N in %N references within it, \n;; irrespective of whether a lower %N is referenced or not:\n\n(macroexpand-1 '#(prn))\n;;=> (fn* [] (prn))\n\n(macroexpand-1 '#(prn %))\n;;=> (fn* [p1__13122#] (prn p1__13122#))\n\n(macroexpand-1 '#(prn %1))\n;;=> (fn* [p1__13127#] (prn p1__13127#))\n\n(macroexpand-1 '#(prn %2))\n;;=> (fn* [p1__13133# p2__13132#] (prn p2__13132#))\n\n\n;; This will not work because the shortcut expands to a 0-arg fn:\n(let [a (atom :val0)] \n (add-watch a :key #(prn 'CHANGED))\n (reset! a :val1))\n;; Execution error (ArityException) at user/eval13174 (form-init5982058823921663207.clj:3).\n;; Wrong number of args (4) passed to: user/eval13174/fn--13175\n\n;; But this will work because simply referring to %4 expands it to a 4-arg fn:\n(let [a (atom :val0)] \n (add-watch a :key #(do %4 (prn 'CHANGED)))\n (reset! a :val1))\n;;CHANGED\n;;=> :val1 \n\n;; See the 4th bullet-point under \"dispatch macro\":\n;; https://clojure.org/reference/reader#_dispatch", :_id "5d53cc4de4b0ca44402ef7a3"}], :macro true, :notes [{:updated-at 1396626727000, :body "The signature is wrong. It should be (quoting from [clojure.org][1])\r\n\r\n`(fn name? [params* ] exprs*)`\r\n\r\n`(fn name? ([params* ] exprs*)+)`\r\n\r\n\r\n [1]: http://clojure.org/special_forms#fn", :created-at 1396626504000, :author {:login "Thumbnail", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/db68e51797a2382e185b42ce6534b7a4?r=PG&default=identicon"}, :_id "542692edf6e94c6970522023"} {:author {:login "terjedahl", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/11754710?v=3"}, :updated-at 1461052793332, :created-at 1461052793332, :body "What is the purpose of `name?` ?", :_id "5715e579e4b0fc95a97eab4d"} {:author {:login "vvvvalvalval", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5859120?v=3"}, :updated-at 1463756441418, :created-at 1463756441418, :body "@terjedahl `name?` allows for self-recursion, as well as generating more human-friendly class names; it can also make the code clearer.", :_id "573f2699e4b0a1a06bdee494"} {:author {:login "battlmonstr", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/11477595?v=3"}, :updated-at 1471784633567, :created-at 1471784633567, :body "This leaves more questions. What is the performance cost? Why (fn name...) is repeated twice? What is a \"binding-form\"?\n\nThe syntax looks good compared to [lambda function](http://dobegin.com/lambda-functions-everywhere/) syntax in other programming languages.", :_id "57b9a6b9e4b0709b524f04d2"} {:author {:login "bfabry", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/29587?v=3"}, :updated-at 1475793669553, :created-at 1475793669553, :body "`fn` also supports the prepost map, the same as `defn`\n```\nboot.user=> (def adder (fn [x] {:post [(pos? %)]} (inc x)))\n#'boot.user/adder\nboot.user=> (adder -2)\n\njava.lang.AssertionError: Assert failed: (pos? %)\n```", :_id "57f6d305e4b0709b524f052a"} {:body "A function can be defined taking specified keyword arguments:\n\n```clojure\n(defn foo [req-1 req-2 & {:keys [key-1 key-2]}\n (list req-1 req-2 key-1 key-2))\n\n(foo a b)\n(foo a b :key-1 100)\n(foo a b :key-2 200)\n(foo a b :key-2 100 :key-1 200)\n```", :created-at 1602578421430, :updated-at 1602578490558, :author {:avatar-url "https://avatars1.githubusercontent.com/u/6414129?v=4", :account-source "github", :login "jimka2001"}, :_id "5f8567f5e4b0b1e3652d73d9"}], :arglists ["& sigs"], :doc "params => positional-params* , or positional-params* & next-param\n positional-param => binding-form\n next-param => binding-form\n name => symbol\n\n Defines a function", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/fn", :forms ["(fn name? [params*] exprs*)" "(fn name? ([params*] exprs*) +)"]} {:added "1.0", :ns "clojure.core", :name "seque", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 5397, :examples [{:author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (let [start (System/nanoTime)\n q (seque\n (iterate\n #(do (Thread/sleep 400) (inc %))\n 0))]\n (println \"sleep five seconds...\")\n (Thread/sleep 5000)\n (doseq [i (take 20 q)]\n (println (int (/ (- (System/nanoTime) start) 1e7))\n \":\" i)))\n\n\n;; The iterate form returns a lazy seq that delays nearly a half-second \n;; before returning each subsequent item. Here seque starts a thread \n;; generating the lazy seq.\n\n;; The body of the let allows the seque thread to get ahead by five seconds\n;; before it begins consuming the seq using doseq. The doseq prints a \n;; timestamp and the value from the seq when it becomes available. The\n;; first 11 or so are available almost instantly, until the consuming \n;; doseq catches up with the producing iterate, at which point the consumer\n;; blocks for 400ms before each item can be printed.\n\n;;sleep five seconds...\n500 : 0\n500 : 1\n500 : 2\n500 : 3\n500 : 4\n500 : 5\n500 : 6\n500 : 7\n500 : 8\n500 : 9\n500 : 10\n500 : 11\n520 : 12\n560 : 13\n600 : 14\n640 : 15\n680 : 16\n720 : 17\n760 : 18\n800 : 19\n\n", :created-at 1283038869000, :updated-at 1285494350000, :_id "542692c9c026201cdc326ad1"} {:updated-at 1519066526582, :created-at 1519066439016, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; A relatively fast producer (a file filter) and a variable speed consumer\n;; (because of pagination) are piped together. Use seque to enable search ahead \n;; of \"n\" items assuming consumer will soon paginate.\n\n(defn search-files [q root n]\n (->> (java.io.File. root)\n file-seq\n (map (memfn getPath))\n (filter #(re-find q %))\n (seque n)))\n\n(defn paginate [n]\n (let [root (System/getProperty \"user.home\")\n search (search-files #\"\\.clj$\" root 1000)]\n (loop [results (partition n search)]\n (println (with-out-str (clojure.pprint/write (first results))))\n (println \"more?\")\n (when (= \"y\" (read-line))\n (recur (rest results))))))\n\n(paginate 3)\n;; (\"/Users/reborg/.atom/fixtures/bad.clj\"\n;; \"/Users/reborg/.atom/fixtures/empty.clj\"\n;; \"/Users/reborg/.atom/fixtures/good.clj\")\n;; more?\n\n;; Note: seque is now producing 997 items ahead.", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5a8b1d47e4b0316c0f44f8cd"}], :notes nil, :arglists ["s" "n-or-q s"], :doc "Creates a queued seq on another (presumably lazy) seq s. The queued\n seq will produce a concrete seq in the background, and can get up to\n n items ahead of the consumer. n-or-q can be an integer n buffer\n size, or an instance of java.util.concurrent BlockingQueue. Note\n that reading from a seque can block if the reader gets ahead of the\n producer.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/seque"} {:added "1.0", :ns "clojure.core", :name "empty?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1350338539000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "seq", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ba1"} {:created-at 1435246118250, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:ns "clojure.core", :name "empty", :library-url "https://github.com/clojure/clojure"}, :_id "558c1e26e4b0fad27b85f926"} {:created-at 1448373938039, :author {:login "BernhardBln", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4759839?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "not-empty", :ns "clojure.core"}, :_id "56546eb2e4b0538444398279"}], :line 6206, :examples [{:updated-at 1441306150425, :created-at 1279073789000, :body "user=> (empty? ())\ntrue\nuser=> (empty? '(1))\nfalse", :editors [{:login "Ortuna", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/221008?v=3"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/147981?v=3", :account-source "github", :login "dpritchett"}, :_id "542692cac026201cdc326b85"} {:updated-at 1350271972000, :created-at 1279386965000, :body "user=> (every? empty? [\"\" [] () '() {} #{} nil])\ntrue\n\n;example of recommended idiom for testing if not empty\nuser=> (every? seq [\"1\" [1] '(1) {:1 1} #{1}])\ntrue", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon", :account-source "clojuredocs", :login "dansalmo"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692cac026201cdc326b86"} {:updated-at 1441306161007, :created-at 1280205236000, :body "user=> (drop-while empty? [\"\" [] \"foobar\"])\n(\"foobar\")", :editors [{:login "Ortuna", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/221008?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon", :account-source "clojuredocs", :login "Jacolyte"}, :_id "542692cac026201cdc326b89"} {:author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :editors [], :body "user=> (empty? nil)\ntrue", :created-at 1401128995000, :updated-at 1401128995000, :_id "542692d2c026201cdc326f9c"} {:editors [{:login "nodename", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/48810?v=4"}], :body ";; A collection with a \"nothing\" in it is not empty.\n(= true\n (every? false? [(empty? [nil])\n (empty? #{nil})\n (empty? '(nil))]))\n\n;; But a collection of nothing is empty.\n(= true\n (every? true? [(empty? [])\n (empty? #{})\n (empty? '())]))", :author {:avatar-url "https://avatars.githubusercontent.com/u/7597818?v=3", :account-source "github", :login "Jjunior130"}, :created-at 1482301932387, :updated-at 1664300394921, :_id "585a21ece4b004d3a355e2d4"}], :notes [{:updated-at 1402523411000, :body "Some explanation of why (seq x) is preferable over (not (empty? x)) would be good. Because it's far less readable. When I come across (not (empty? x)) in some code, I immediately understand the author's intention. Not so much with (seq x).", :created-at 1402523411000, :author {:login "cap10morgan", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ccd26ba29b49316b38a46f0aa0e96893?r=PG&default=identicon"}, :_id "542692edf6e94c6970522029"} {:updated-at 1405724559000, :body "I think this is an efficiency thing. If you expand the source you can see that empty? is equivalent to (not (seq coll)) so (not (empty? coll)) would macroexpand to (not (not (seq coll)) ", :created-at 1405724559000, :author {:login "phreed", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a0c739cf289be18be932dc3022e6fd3?r=PG&default=identicon"}, :_id "542692edf6e94c697052202d"} {:body "Avoiding `(not (empty? s))` because it macroexpands into `(not (not ...))`, on the grounds of efficiency, is ridiculous. \n\nI'm a fan of:\n\n```clojure\n(when (not-empty s)\n ...)\n```", :created-at 1421094984999, :updated-at 1421094984999, :author {:login "moea", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1453611?v=3"}, :_id "54b43048e4b081e022073c01"} {:author {:login "cmal", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1773318?v=3"}, :updated-at 1478343485388, :created-at 1478343485388, :body "If I just want to return false when empty, true when not empty, then what can I use if I am going to avoid (not (empty? ...))?", :_id "581dbb3de4b024b73ca35a22"} {:author {:login "yogsototh", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/93899?v=3"}, :updated-at 1481783695983, :created-at 1481783695983, :body "Just note `(not (empty? x))` is not perfectly equivalent to `seq`:\n\n~~~\nuser=> (seq '(1 2))\n(1 2)\nuser=> (not (empty? '(1 2)))\ntrue\n~~~", :_id "5852398fe4b004d3a355e2ba"} {:body "```\nuser> (let [r (and (not (empty? [])))] r)\n;; => false\nuser> (let [r (and (seq []))] r)\n;; => nil\n```\n", :created-at 1605311878358, :updated-at 1605311895281, :author {:avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4", :account-source "github", :login "MicahElliott"}, :_id "5faf1d86e4b0b1e3652d7405"} {:author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}, :updated-at 1685380825029, :created-at 1685380764695, :body "`(seq x)` is considered idiomatic, so in theory it should be understood by experienced Clojurians. `(not (empty? x))` might be better when you expect your code to be read by those who don't fit that description. (However, there are a number of Clojure idioms that could be confusing to those without much experience; avoiding them all might not be desirable.)", :_id "6474de9ce4b08cf8563f4bc3"}], :arglists ["coll"], :doc "Returns true if coll has no items - same as (not (seq coll)).\n Please use the idiom (seq x) rather than (not (empty? x))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/empty_q"} {:added "1.0", :ns "clojure.core", :name "short", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "int", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917689000, :_id "542692ebf6e94c6970521f21"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "byte", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917692000, :_id "542692ebf6e94c6970521f22"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "shorts", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917699000, :_id "542692ebf6e94c6970521f23"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "short-array", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917703000, :_id "542692ebf6e94c6970521f24"} {:created-at 1496261330759, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unchecked-short", :ns "clojure.core"}, :_id "592f22d2e4b06e730307db1a"}], :line 3498, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (class (short 1))\njava.lang.Short", :created-at 1281948540000, :updated-at 1332952892000, :_id "542692c7c026201cdc3269a1"} {:editors [{:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}], :body "(short 123)\n;;=> 123\n\n(short 1.23)\n;;=> 1\n\n(short 1.2345678901234567890)\n;;=> 1\n\n(short -1.23)\n;;=> -1\n\n;; Casting a string does not work\n(short \"123\")\n;;=> Execution error (ClassCastException) at user/eval169 (REPL:1).\n;;java.lang.String cannot be cast to java.lang.Number\n\n;; Use Java interop instead\n(Short/parseShort \"123\")\n;;=> 123\n\n;; Content originally posted by u/didibus on https://clojuredocs.org/clojure.core/num", :author {:avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4", :account-source "github", :login "wdhowe"}, :created-at 1596573268703, :updated-at 1596590353567, :_id "5f29c654e4b0b1e3652d735f"}], :notes nil, :arglists ["x"], :doc "Coerce to short", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/short"} {:added "1.2", :ns "clojure.core", :name "definterface", :file "clojure/core_deftype.clj", :type "macro", :column 1, :see-alsos [{:created-at 1432923318577, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :to-var {:ns "clojure.core", :name "defprotocol", :library-url "https://github.com/clojure/clojure"}, :_id "5568acb6e4b03e2132e7d17b"} {:created-at 1432923344729, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :to-var {:ns "clojure.core", :name "gen-interface", :library-url "https://github.com/clojure/clojure"}, :_id "5568acd0e4b01ad59b65f4e9"} {:created-at 1432923416186, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :to-var {:ns "clojure.core", :name "defrecord", :library-url "https://github.com/clojure/clojure"}, :_id "5568ad18e4b01ad59b65f4ea"} {:created-at 1432923425325, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :to-var {:ns "clojure.core", :name "deftype", :library-url "https://github.com/clojure/clojure"}, :_id "5568ad21e4b03e2132e7d17d"}], :line 20, :examples [{:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; Part of a definterface from a Clojure program for the n-body problem\n;; at the Computer Language Benchmarks Game web site.\n;; For the rest of the program using it, see:\n;; http://github.com/jafingerhut/clojure-benchmarks/blob/master/nbody/nbody.clj-14.clj\n\n;; Currently Clojure does not permit type hints of arrays, e.g. ^ints as\n;; argument types or return types in a definterface. This may be enhanced\n;; later.\n\n(definterface IBody\n (^String name []) ;; return type String, no arguments\n (^double mass []) ;; return type double\n (^double x [])\n (clone [] \"returns copy of self\") ; return type defaults to ^Object\n ;; 3 arguments of type double. A deftype that implements this interface\n ;; must implement the method p! The definterface must use:\n ;; _BANG_ for ! in Clojure method name\n ;; _PLUS_ for +\n ;; _ for -\n (p_BANG_ [^double x ^double y ^double z] \"set pos.\")\n ;; After name demangling, this must be implemented by Clojure method named v+!\n (v_PLUS__BANG_ [^double vx ^double vy ^double vz] \"add to velocity\"))\n", :created-at 1298555484000, :updated-at 1298556086000, :_id "542692cdc026201cdc326d3c"} {:body ";; Note these differences between defprotocol and definterface:\n\n;; defprotocol requires that methods specify a first parameter, which \n;; will be the record object, while definterface requires that this\n;; parameter be left out:\n(definterface I (fooey []))\n;=> user.I\n(defprotocol P (fooey []))\n;=> IllegalArgumentException Definition of function fooey in protocol P must take at least one arg. clojure.core/emit-protocol/fn--5964 (core_deftype.clj:612)\n(defprotocol P (fooey [this]))\n;=> P\n\n;; However, defrecord requires that a parameter for the record object\n;; be used, even with interfaces. (A similar point applies to deftype.)\n(defrecord Irec [stuff] I (fooey [] \"foo\"))\n;=> CompilerException java.lang.IllegalArgumentException: Must supply at least one argument for 'this' in: fooey, compiling:(NO_SOURCE_PATH:1:1) \n(defrecord Irec [stuff] I (fooey [this] \"foo\"))\n;=> user.Irec\n(defrecord Prec [stuff] P (fooey [this] \"foo\"))\n;=> user.Prec\n\n;; Using an interface, only the dot form of the method is available with \n;; defrecord, while the protocol also allows use of normal Clojure function\n;; syntax. (Similar points apply to deftype.)\n(.fooey (Irec. 42))\n;=> \"foo\"\n(fooey (Irec. 42))\n;=> IllegalArgumentException No implementation of method: :fooey of protocol: #'user/P found for class: user.Irec clojure.core/-cache-protocol-fn (core_deftype.clj:544)\n(.fooey (Prec. 42))\n;=> \"foo\"\n(fooey (Prec. 42))\n;=> \"foo\"\n", :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :created-at 1432922847490, :updated-at 1432923131996, :editors [{:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}], :_id "5568aadfe4b03e2132e7d175"}], :macro true, :notes nil, :arglists ["name & sigs"], :doc "Creates a new Java interface with the given name and method sigs.\n The method return types and parameter types may be specified with type hints,\n defaulting to Object if omitted.\n\n (definterface MyInterface\n (^int method1 [x])\n (^Bar method2 [^Baz b ^Quux q]))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/definterface"} {:added "1.10", :ns "clojure.core", :name "add-tap", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1590688364048, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "tap>", :ns "clojure.core"}, :_id "5ecffa6ce4b087629b5a1919"} {:created-at 1590688390865, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "remove-tap", :ns "clojure.core"}, :_id "5ecffa86e4b087629b5a191c"} {:created-at 1661551771193, :author {:login "djblue", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1986211?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "datafy", :ns "clojure.datafy"}, :_id "6309449be4b0b1e3652d765a"}], :line 7868, :examples [{:updated-at 1660914021711, :created-at 1660914021711, :author {:login "earthfail", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/21296448?v=4"}, :body ";; log to a file\n(defn log [x] \n (spit \"event.log\" (str x \\newline) :append true))\n\n;; add log function to tap\n(add-tap log) ;;_=> returns nil\n\n(add-tap println)\n\n\n(tap> \"hello\") \n;; prints hello\n;; returns true if successful\n;; event.log:\n;; hello\\n\n(tap> \"clojure\")\n;; prints clojure\n;; returns true\n;; event.log:\n;; hello\\n\n;; clojure\\n\n\n;; the tap set is a hash-set so every adding the same function twice has no effect \n(add-tap println) \n(tap> \"<3\")\n;; prints <3\n;; returns true\n;; event.log:\n;; hello\\n\n;; clojure\\n\n;; <3\\n", :_id "62ff8965e4b0b1e3652d763e"} {:editors [{:login "djblue", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1986211?v=4"}], :body ";; Your tap target function can do interesting things when it receives a value\n;; before printing it\n(require '[clojure.datafy :refer [datafy]])\n(add-tap (comp prn datafy))\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/1986211?v=4", :account-source "github", :login "djblue"}, :created-at 1661551901572, :updated-at 1662581217249, :_id "6309451de4b0b1e3652d765b"}], :notes nil, :arglists ["f"], :doc "adds f, a fn of one argument, to the tap set. This function will be called with anything sent via tap>.\n This function may (briefly) block (e.g. for streams), and will never impede calls to tap>,\n but blocking indefinitely may cause tap values to be dropped.\n Remember f in order to remove-tap", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/add-tap"} {:added "1.4", :ns "clojure.core", :name "filterv", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1413317009497, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "filter", :library-url "https://github.com/clojure/clojure"}, :_id "543d8191e4b02688d208b1b7"} {:created-at 1534449404739, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "mapv", :ns "clojure.core"}, :_id "5b75d6fce4b00ac801ed9e61"}], :line 6921, :examples [{:editors [{:login "dijonkitchen", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4"}], :updated-at 1550019407140, :created-at 1413316994942, :author {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=2", :account-source "github", :login "phreed"}, :body ";; very similar to filter but returns a vector\n(filterv even? (range 10))\n;;=> [0 2 4 6 8]\n\n(filterv (fn [x]\n (= (count x) 1))\n [\"a\" \"aa\" \"b\" \"n\" \"f\" \"lisp\" \"clojure\" \"q\" \"\"])\n;;=> [\"a\" \"b\" \"n\" \"f\" \"q\"]\n\n(filterv #(= (count %) 1)\n [\"a\" \"aa\" \"b\" \"n\" \"f\" \"lisp\" \"clojure\" \"q\" \"\"])\n;;=> [\"a\" \"b\" \"n\" \"f\" \"q\"]\n", :_id "543d8182e4b0a3cf052fe477"}], :notes nil, :arglists ["pred coll"], :doc "Returns a vector of the items in coll for which\n (pred item) returns logical true. pred must be free of side-effects.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/filterv"} {:added "1.0", :ns "clojure.core", :name "hash", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1369891154000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "get", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aa5"} {:created-at 1495647939893, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "hash-ordered-coll", :ns "clojure.core"}, :_id "5925c6c3e4b093ada4d4d737"} {:created-at 1495647979480, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "hash-unordered-coll", :ns "clojure.core"}, :_id "5925c6ebe4b093ada4d4d738"}], :line 5165, :examples [{:updated-at 1456675282601, :created-at 1280319931000, :body "user=> (hash \"a\")\n1455541201\nuser=> (.hashCode \"a\") ; notice that this is different than (hash \"a\")\n97\nuser=> (hash 1)\n1392991556\nuser=> (.hashCode 1) ; notice that this is different than (hash 1)\n1\nuser=> (hash nil)\n0\nuser=> (hash [1 2 3])\n30817\nuser=> (hash [1 2 3 4])\n955331", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon", :account-source "clojuredocs", :login "gstamp"}, :_id "542692cbc026201cdc326bc4"} {:updated-at 1548542144072, :created-at 1548542144072, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :body ";; In most cases, hash is _consistent_ with =, meaning that for two values x, y,\n;; if (= x y), then (= (hash x) (hash y)). This is a property of hash that\n;; is relied upon for hash-based lookup of keys in maps and\n;; elements in sets to work correctly.\n\n;; There are some pairs of Java objects x, y where even though (= x y) is true,\n;; (= (hash x) (hash y)) is _not_ true.\n\n;; Search for the word \"consistent\" in this article for some categories of such\n;; objects: https://clojure.org/guides/equality\n\n;; In particular, the section titled \"Equality and hash\":\n;; https://clojure.org/guides/equality#equality_and_hash", :_id "5c4ce0c0e4b0ca44402ef640"} {:editors [{:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4"}], :body ";; Equality is measured by the content\n;; Hashes of lists AND vectors are equal by content\n=> (= (hash '(1 2 3)) (hash [1 2 3]))\ntrue\n\n;; Also works with clojure-\"Objects\" like LazySeq\n=> (= (hash [1 2 3]) (hash (map identity [1 2 3])))\ntrue\n\n;; but not with sets\n=> (= (hash [1 2 3]) (hash (set [1 2 3])))\nfalse", :author {:avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4", :account-source "github", :login "loeschzwerg"}, :created-at 1647338501091, :updated-at 1647339498450, :_id "62306405e4b0b1e3652d75bb"}], :notes [{:author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :updated-at 1456676195346, :created-at 1456676195346, :body "Despite what the doc-string says values returned by `(hash)` are different from `(.hashCode)` for more than just `Integer`, `Short`, `Byte` and Clojure collections.\n\nThe list also includes: Keywords, Symbols, Functions, Sequences, `String`, `Long` and `BigInteger` (as of Clojure 1.7.0).", :_id "56d31d63e4b0b41f39d96cd5"}], :arglists ["x"], :doc "Returns the hash code of its argument. Note this is the hash code\n consistent with =, and thus is different than .hashCode for Integer,\n Short, Byte and Clojure collections.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/hash"} {:added "1.0", :ns "clojure.core", :name "quot", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1305751242000, :author {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rem", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b7e"} {:created-at 1305751245000, :author {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "mod", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b7f"} {:created-at 1435174860426, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:ns "clojure.core", :name "unchecked-divide-int", :library-url "https://github.com/clojure/clojure"}, :_id "558b07cce4b0fad27b85f923"} {:created-at 1468958158412, :author {:login "chrismurrph", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10278575?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "/", :ns "clojure.core"}, :_id "578e85cee4b0bafd3e2a04b2"}], :line 1261, :examples [{:updated-at 1632985121009, :created-at 1279992131000, :body ";; (quot m n) is the value of m/n, rounded towards 0 to the nearest integer.\n;; m, n need not be integers.\n\nuser=> (quot 10 3)\n3\n\nuser=> (quot 11 3)\n3\n\nuser=> (quot 12 3)\n4\n\nuser=> (quot -5.9 3)\n-1.0\n\nuser=> (quot 10 -3)\n-3\n\nuser=> (quot 15 0)\nArithmeticException / by zero clojure.lang.Numbers.quotient (Numbers.java:1764)\n\n\n;; For ClojureScript (at least v1.10.597), `num`, `div` should be integer.\n;; Otherwise, it does not work correctly due to its implementation:\nhttp://cljs.github.io/api/cljs.core/quot\n\n;; in clojure,\nuser=> (quot 286.3 21.2)\n13.0\n\n;; in clojurescript\ncljs.user=> (quot 286.3 21.2)\n12", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "jngbng", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/552977?v=4"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}, :_id "542692cbc026201cdc326bec"} {:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}], :body ";; note that the \"/\" function and the quot function are not equivalent\n\nuser=> (= (/ 4 2) (quot 4 2))\ntrue\n\nuser=> (= (/ 3 2) (quot 3 2))\nfalse\n", :created-at 1316301245000, :updated-at 1316301327000, :_id "542692cbc026201cdc326bf0"}], :notes nil, :arglists ["num div"], :doc "quot[ient] of dividing numerator by denominator.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/quot"} {:added "1.0", :ns "clojure.core", :name "ns-aliases", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1374148394000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "alias", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b61"} {:created-at 1512036368133, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ns-unalias", :ns "clojure.core"}, :_id "5a1fd810e4b0a08026c48cc7"}], :line 4274, :examples [{:editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "domokato", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2388832?v=4"}], :updated-at 1646765005254, :created-at 1416004195771, :author {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}, :body ";; clojure.core contains an alias\n(ns-aliases 'clojure.core)\n;;=> {jio #}\n\n;; To start with there are no namespace aliases in the user namespace.\n(ns-aliases 'user)\n;;=> {}\n\n;; ...but we can add an alias to the user namespace.\n(alias 'string 'clojure.string) \n(ns-aliases 'user)\n;;=> {string #{Namespace clojure.string>}\n\n", :_id "54668263e4b0dc573b892fc9"} {:body ";; Suppose you want to pass a namespace as an argument...\n(ns wip (:require [clojure.string :as string]\n [clojure.pprint :as pp]))\n(defn foo [nspace] nspace)\n\n;; ...pretty easy to do if you use the namespace symbol.\n(foo (the-ns 'clojure.string))\n;;=> #\n\n;; but, a bit of a problem if you want to pass the alias.\n(foo (the-ns 'string))\n;; java.lang.Exception: No namespace: string found...\n\n;; We can make a function that will serve using ns-aliases.\n(defn the-alias [name] (get (ns-aliases *ns*) name))\n(the-alias 'string)\n;;=> #\n\n(foo (the-alias 'string))\n;;=> #\n\n;; A more direct function can be written.\n;; but this uses an undocumented function.\n(defn the-alias [alias-name] (.lookupAlias *ns* (symbol alias-name)))\n(the-alias \"pp\")\n;;=> #\n\n\n\n\n", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1416006101219, :updated-at 1416243613962, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :_id "546689d5e4b0dc573b892fcc"}], :notes nil, :arglists ["ns"], :doc "Returns a map of the aliases for the namespace.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ns-aliases"} {:added "1.0", :ns "clojure.core", :name "read", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1313054766000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "read-string", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f56"} {:created-at 1352963657000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "*read-eval*", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f57"}], :line 3741, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [], :body "user=> (read)\n( + 1 1 ) ; <= User types this\n(+ 1 1)\nuser=> (eval (read))\n(+ 1 1) ; <= User types this\n2\n", :created-at 1286263972000, :updated-at 1286263972000, :_id "542692c8c026201cdc326a15"} {:author {:login "Chris Riddoch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c908fbef70e8540f700a6b362cf57e9e?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; WARNING: You SHOULD NOT use clojure.core/read or\n;; clojure.core/read-string to read data from untrusted sources. They\n;; were designed only for reading Clojure code and data from trusted\n;; sources (e.g. files that you know you wrote yourself, and no one\n;; else has permission to modify them).\n\n;; Instead, either:\n\n;; (1) Use another data serialization format such as JSON, XML,\n;; etc. and a library for reading them that you trust not to have\n;; vulnerabilities, or\n\n;; (2) if you want a serialization format that can be read safely and\n;; looks like Clojure data structures, use edn\n;; (https://github.com/edn-format/edn). For Clojure 1.3 and later,\n;; the tools.reader contrib library provides an edn reader\n;; (http://github.com/clojure/tools.reader). There is also\n;; clojure.edn/read and clojure.edn/read-string provided in Clojure\n;; 1.5.\n\n;; You definitely should not use clojure.core/read or read-string if\n;; *read-eval* has its default value of true, because an attacker\n;; could cause your application to execute arbitrary code while it is\n;; reading. Example:\n\nuser=> (read-string \"#=(clojure.java.shell/sh \\\"echo\\\" \\\"hi\\\")\")\n{:exit 0, :out \"hi\\n\", :err \"\"}\n\n;; It is straightforward to modify the example above into more\n;; destructive ones that remove all of your files, copy them to\n;; someone else's computer over the Internet, install Trojans, etc.\n\n;; Even if you do bind *read-eval* to false first, like so:\n\n(defn read-string-unsafely [s]\n (binding [*read-eval* false]\n (read-string s)))\n\n;; you may hope you are safe reading untrusted data that way, but in\n;; Clojure 1.4 and earlier, an attacker can send data that causes your\n;; system to execute arbitrary Java constructors. Most of these are\n;; benign, but it only takes one to ruin your application's day.\n;; Examples that should scare you:\n\n;; This causes a socket to be opened, as long as the JVM sandboxing\n;; allows it.\n(read-string-unsafely \"#java.net.Socket[\\\"www.google.com\\\" 80]\")\n\n;; This causes precious-file.txt to be created if it doesn't exist, or\n;; if it does exist, its contents will be erased (given appropriate\n;; JVM sandboxing permissions, and underlying OS file permissions).\n(read-string-unsafely \"#java.io.FileWriter[\\\"precious-file.txt\\\"]\")\n\n;; The particular issue of executing arbitrary Java constructors used\n;; in the examples above no longer works in Clojure 1.5 when\n;; *read-eval* is false. Even so, you SHOULD NEVER USE\n;; clojure.core/read or clojure.core/read-string for reading untrusted\n;; data. Use an edn reader or a different data serialization format.\n\n;; Why should I do this, you may ask, if Clojure 1.5 closes the Java\n;; constructor hole? Because clojure.core/read and read-string are\n;; designed to be able to do dangerous things, and they are not\n;; documented nor promised to be safe from unwanted side effects. If\n;; you use them for reading untrusted data, and a dangerous side\n;; effect is found in the future, you will be told that you are using\n;; the wrong tool for the job. clojure.edn/read and read-string, and\n;; the tools.reader.edn library, are documented to be safe from\n;; unwanted side effects, and if any bug is found in this area it\n;; should get quick attention and corrected.\n\n;; If you understand all of the above, and want to use read or\n;; read-string to read data from a _trusted_ source, continue on\n;; below.\n\n;; read wants its reader arg (or *in*) to be a java.io.PushbackReader.\n;; with-open closes r after the with-open body is done. *read-eval*\n;; specifies whether to allow #=() forms when reading, and evaluate\n;; them as a side effect while reading.\n\n(defn read-from-file-with-trusted-contents [filename]\n (with-open [r (java.io.PushbackReader.\n (clojure.java.io/reader filename))]\n (binding [*read-eval* false]\n (read r))))\n\nuser=> (spit \"testfile.txt\" \"{:a 1 :b 2 :c 3}\")\nnil\nuser=> (read-from-file-with-trusted-contents \"testfile.txt\")\n{:a 1, :b 2, :c 3}\n", :created-at 1325831086000, :updated-at 1364783739000, :_id "542692d5c026201cdc327056"}], :notes [{:updated-at 1286264042000, :body "This function is for reading clojure objects not a general input function.", :created-at 1286264042000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f98"}], :arglists ["" "stream" "stream eof-error? eof-value" "stream eof-error? eof-value recursive?" "opts stream"], :doc "Reads the next object from stream, which must be an instance of\n java.io.PushbackReader or some derivee. stream defaults to the\n current value of *in*.\n\n Opts is a persistent map with valid keys:\n :read-cond - :allow to process reader conditionals, or\n :preserve to keep all branches\n :features - persistent set of feature keywords for reader conditionals\n :eof - on eof, return value unless :eofthrow, then throw.\n if not specified, will throw\n\n Note that read can execute code (controlled by *read-eval*),\n and as such should be used only with trusted sources.\n\n For data structure interop use clojure.edn/read", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/read"} {:added "1.3", :ns "clojure.core", :name "unchecked-double", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 3552, :examples [{:updated-at 1507300542297, :created-at 1507300542297, :author {:login "PhillRoyle", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/7779270?v=4"}, :body "\n;; the function taking a BigDecimal with limited decimal places\n(unchecked-double 1.77M)\n=> 1.77\n\n;; the function taking a double with limited decimal places\n(unchecked-double 1.22)\n=> 1.22\n\n;; the function taking '0'\n(unchecked-double 0)\n=> 0.0\n\n;; the function does (eventually) round up...:\n(unchecked-double 1.000000000123456789)\n=> 1.0000000001234568\n;;...or down:\n(unchecked-double 1.000000000123456489)\n=> 1.0000000001234566", :_id "59d794bee4b03026fe14ea51"}], :notes nil, :arglists ["x"], :doc "Coerce to double. Subject to rounding.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-double"} {:added "1.0", :ns "clojure.core", :name "key", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1318592856000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "keys", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f60"} {:created-at 1434396249722, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:ns "clojure.core", :name "val", :library-url "https://github.com/clojure/clojure"}, :_id "557f2659e4b01ad59b65f4f4"} {:created-at 1517622978859, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "map", :ns "clojure.core"}, :_id "5a7516c2e4b0e2d9c35f7411"} {:created-at 1517622990497, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "hash-map", :ns "clojure.core"}, :_id "5a7516cee4b0e2d9c35f7412"}], :line 1567, :examples [{:updated-at 1434395508050, :created-at 1280777907000, :body ";; the following emulates 'keys'\n(map key {:a 1 :b 2})\n;;=> (:a :b)\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692cac026201cdc326b66"} {:body ";; extracts the key of a map entry\n(key (clojure.lang.MapEntry. :a :b))\n;;=> :a\n", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1434396125134, :updated-at 1434396125134, :_id "557f25dde4b03e2132e7d191"}], :notes nil, :arglists ["e"], :doc "Returns the key of the map entry.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/key"} {:added "1.0", :ns "clojure.core", :name "longs", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "long-array", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917385000, :_id "542692ebf6e94c6970521f53"}], :line 5383, :examples [{:updated-at 1656673080931, :created-at 1656673080931, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body "(def my-floats (float-array [1.1 2.2 3.3]));; => #'user/my-floats\n\n;; long-array will convert where possible\n(long-array my-floats);; => [1, 2, 3]\n\n;; longs will not\n(try (longs my-floats)\n (catch ClassCastException e (ex-message e)));; => \"[F cannot be cast to [J\"", :_id "62bed338e4b0b1e3652d7614"} {:editors [{:login "randomizedthinking", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5283430?v=4"}], :body ";; longs does cast but not convert arrays\n;; it is used as a type-hinting device to avoid reflections\n;; very important for computation intensive codes\n(binding [*print-meta* true]\n (def ^longs x (long-array [1 2 4]))\n (clojure.pprint/pprint #'x)) ;; ^{:tag #function[clojure.core/longs], ...}", :author {:avatar-url "https://avatars.githubusercontent.com/u/5283430?v=4", :account-source "github", :login "randomizedthinking"}, :created-at 1679352950506, :updated-at 1679353150365, :_id "6418e476e4b08cf8563f4b80"} {:updated-at 1682270999390, :created-at 1682270999390, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; Casting avoids expensive reflection, so to see the benefit, enable warning:\n(set! *warn-on-reflection* true)\n\n;; We'll def a long-array but won't type-hint the var:\n(def my-array (long-array [10 20 30 40 50 60]))\n\n;; and try to amap over it without using `longs` or type hinting amap's args:\n(amap my-array i _ (unchecked-inc ^long (aget my-array i)))\n;; Reflection warning… call to static method alength on clojure.lang.RT can't be resolved (argument types: unknown).\n;; Reflection warning… call to static method aclone on clojure.lang.RT can't be resolved (argument types: unknown).\n;; Reflection warning… call to static method aget on clojure.lang.RT can't be resolved (argument types: unknown, int).\n;; Reflection warning… call to static method aset on clojure.lang.RT can't be resolved (argument types: unknown, int, long).\n;; => [11, 21, 31, 41, 51, 61]\n\n;; We can use `longs` to avoid reflection:\n(amap (longs my-array) i _ (unchecked-inc ^long (aget (longs my-array) i)))\n;; => [11, 21, 31, 41, 51, 61]\n\n;; Just as we can type hint in place:\n(amap ^longs my-array i _ (unchecked-inc ^long (aget ^longs my-array i)))\n;; => [11, 21, 31, 41, 51, 61]\n\n;; Or type hint the var:\n(def ^\"[J\" my-array (long-array [10 20 30 40 50 60]))\n(amap my-array i _ (unchecked-inc ^long (aget my-array i)))\n;; => [11, 21, 31, 41, 51, 61]\n", :_id "64456b17e4b08cf8563f4b90"}], :notes nil, :arglists ["xs"], :doc "Casts to long[]", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/longs"} {:added "1.0", :ns "clojure.core", :name "not=", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1412341716329, :author {:login "verma", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/242524?v=2"}, :to-var {:ns "clojure.core", :name "=", :library-url "https://github.com/clojure/clojure"}, :_id "542e9fd4e4b05f4d257a29a0"} {:created-at 1412341728824, :author {:login "verma", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/242524?v=2"}, :to-var {:ns "clojure.core", :name "not", :library-url "https://github.com/clojure/clojure"}, :_id "542e9fe0e4b05f4d257a29a1"}], :line 819, :examples [{:author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"} {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (not= 1 1)\nfalse\n\nuser=> (not= 1 2)\ntrue\n\nuser=> (not= true true)\nfalse\n\nuser=> (not= true false)\ntrue\n\nuser=> (not= true true true true)\nfalse\n\nuser=> (not= true true false true)\ntrue\n", :created-at 1280778104000, :updated-at 1285495471000, :_id "542692c6c026201cdc32690f"} {:updated-at 1565641574887, :created-at 1565641574887, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :body ";; See the Clojure Equality guide for more details:\n;; https://clojure.org/guides/equality", :_id "5d51cb66e4b0ca44402ef7a1"} {:updated-at 1677517538988, :created-at 1677513608119, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; An exception to the docstring:\n\n(not= ##NaN ##NaN)\n;; => false\n\n(not (= ##NaN ##NaN))\n;; => true\n\n;; This is because of various shortcuts for checking identity when checking equality.\n;; As a rule of thumb, don't rely on either for testing against the ##NaN literal.\n;; Decide on which logic you want, and explicitly test. E.g.\n\n(defn != [x y]\n (or (not= x y)\n (Double/isNaN x)\n (Double/isNaN y)))\n\n(!= ##NaN ##NaN)\n;; => true", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4", :account-source "github", :login "tomdl89"}], :_id "63fcd388e4b08cf8563f4b73"}], :notes nil, :tag "java.lang.Boolean", :arglists ["x" "x y" "x y & more"], :doc "Same as (not (= obj1 obj2))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/not="} {:added "1.0", :ns "clojure.core", :name "string?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1596596389180, :author {:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "str", :ns "clojure.core"}, :_id "5f2a20a5e4b0b1e3652d7371"}], :line 160, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user=> (string? \"abc\")\ntrue\n\nuser=> (string? \"\")\ntrue\n\nuser=> (string? \\a)\nfalse\n\nuser=> (string? 1)\nfalse\n\nuser=> (string? [\"a\" \"b\" \"c\"])\nfalse\n\nuser=> (string? nil)\nfalse", :created-at 1280546643000, :updated-at 1423277887409, :_id "542692c7c026201cdc326945"}], :notes nil, :arglists ["x"], :doc "Return true if x is a String", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/string_q"} {:added "1.9", :ns "clojure.core", :name "uri?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1627821463966, :author {:login "Okwori", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/16775439?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "instance?", :ns "clojure.core"}, :_id "61069597e4b0b1e3652d7525"}], :line 7845, :examples [{:updated-at 1495999488091, :created-at 1495999488091, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body "(uri? (new java.net.URI \"http://clojuredocs.org/\"))\n;;=> true\n\n(uri? (new java.net.URL \"http://clojuredocs.org/\"))\n;;=> false\n(uri? \"http://clojuredocs.org/\")\n;;=> false\n", :_id "592b2400e4b093ada4d4d781"} {:updated-at 1627822753593, :created-at 1627822683340, :author {:login "Okwori", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/16775439?v=4"}, :body ";; When fetching URI db.type\n\n;;(uri? #object[com.cognitect.transit.impl.URIImpl 0x3ec31528 \"https://www.datomic.com/details.html\")\n(uri? (com.cognitect.transit.impl.URIImpl. \"https://www.datomic.com/details.html\"))\n;;=> false\n\n(instance? com.cognitect.transit.impl.URIImpl \n (com.cognitect.transit.impl.URIImpl. \"https://www.datomic.com/details.html\")) \n;;=> true\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/16775439?v=4", :account-source "github", :login "Okwori"}], :_id "61069a5be4b0b1e3652d7526"}], :notes nil, :arglists ["x"], :doc "Return true if x is a java.net.URI", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/uri_q"} {:added "1.0", :ns "clojure.core", :name "aset-double", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1349125867000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "double-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521abb"}], :line 3966, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; create an array of 10 doubles and set one of the elements to 3.1415\n\nuser=> (def ds (double-array 10))\n#'user/ds\nuser=> (vec ds)\n[0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0]\nuser=> (aset-double ds 3 3.1415)\n3.1415\nuser=> (vec ds)\n[0.0 0.0 0.0 3.1415 0.0 0.0 0.0 0.0 0.0 0.0]\nuser=>", :created-at 1313914664000, :updated-at 1313914664000, :_id "542692ccc026201cdc326c88"}], :notes [{:body "See [aset](http://clojuredocs.org/clojure.core/aset) for illustrations of multi-dimensional syntax.", :created-at 1432829167201, :updated-at 1432829167201, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :_id "55673cefe4b01ad59b65f4e1"}], :arglists ["array idx val" "array idx idx2 & idxv"], :doc "Sets the value at the index/indices. Works on arrays of double. Returns val.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/aset-double"} {:added "1.0", :ns "clojure.core", :name "unchecked-multiply-int", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 1219, :examples nil, :notes nil, :arglists ["x y"], :doc "Returns the product of x and y, both int.\n Note - uses a primitive operator subject to overflow.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-multiply-int"} {:ns "clojure.core", :name "chunk-rest", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1443934917158, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-first", :ns "clojure.core"}, :_id "5610b2c5e4b08e404b6c1c95"} {:created-at 1443934931280, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-next", :ns "clojure.core"}, :_id "5610b2d3e4b0686557fcbd45"}], :line 704, :examples [{:updated-at 1443935100136, :created-at 1443935100136, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :body "(let [chunked-cons (seq (range 1 42))\n rest-chunk (chunk-rest chunked-cons)]\n\n (class rest-chunk)\n ;; => clojure.lang.LazySeq\n\n (first rest-chunk)\n ;; => 33\n\n (last rest-chunk)\n ;; => 41\n)", :_id "5610b37ce4b08e404b6c1c96"}], :notes nil, :tag "clojure.lang.ISeq", :arglists ["s"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/chunk-rest"} {:added "1.0", :ns "clojure.core", :name "pcalls", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1299212798000, :author {:login "weakreference", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/86146f8bd5207b97701c0f16f0017334?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pvalues", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521be6"} {:created-at 1336537809000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "future", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521be7"} {:created-at 1518042729804, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pmap", :ns "clojure.core"}, :_id "5a7b7e69e4b0316c0f44f8aa"}], :line 7037, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (pcalls function-1 function-2 ...)\n\n(result1 result2 ...)", :created-at 1281093054000, :updated-at 1332951378000, :_id "542692cdc026201cdc326ccf"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; pcalls is implemented using Clojure futures. See examples for 'future'\n;; for discussion of an undesirable 1-minute wait that can occur before\n;; your standalone Clojure program exits if you do not use shutdown-agents.", :created-at 1336537804000, :updated-at 1336537804000, :_id "542692d4c026201cdc32702e"}], :notes nil, :arglists ["& fns"], :doc "Executes the no-arg fns in parallel, returning a lazy sequence of\n their values", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/pcalls"} {:ns "clojure.core", :name "*allow-unresolved-vars*", :type "var", :see-alsos nil, :examples [{:updated-at 1596399672161, :created-at 1596398748332, :author {:login "eltonlaw", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/14999531?v=4"}, :body ";; Symbols are resolved during analysis phase, throws error\n;; because a is not defined anywhere reachable\nuser=> (clojure.lang.Compiler/analyze clojure.lang.Compiler$C/EXPRESSION '(+ 1 a))\n\nSyntax error compiling at (REPL:1:68).\nUnable to resolve symbol: a in this context\n\n;; Don't throw an exception on unresolvable symbol, assumption that\n;; there's somewhere else vars are defined not visible to analyzer\n;; (Ex. some external javascript library)\nuser=> (binding [*allow-unresolved-vars* true]\n #_=> (clojure.lang.Compiler/analyze clojure.lang.Compiler$C/EXPRESSION '(+ 1 a)))\n\n#object[clojure.lang.Compiler$StaticMethodExpr 0x1441fb4f \"clojure.lang.Compiler$StaticMethodExpr@1441fb4f\"]\n", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/14999531?v=4", :account-source "github", :login "eltonlaw"}], :_id "5f271c9ce4b0b1e3652d732e"}], :notes [{:author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :updated-at 1617633337145, :created-at 1617633337145, :body "Originally added to support specific ClojureScript use of the analyzer in the preliminary version of ClojureScript by C.Houser, see https://github.com/richhickey/clojure-contrib/blob/master/clojurescript/src/clojure/contrib/clojurescript.clj#L307-L310.", :_id "606b2039e4b0b1e3652d74b3"}], :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*allow-unresolved-vars*"} {:added "1.2", :ns "clojure.core", :name "remove-all-methods", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1337585106000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "remove-method", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c88"} {:created-at 1341270438000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "prefers", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c89"} {:created-at 1341270443000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "methods", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c8a"} {:created-at 1341270446000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "get-method", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c8b"} {:created-at 1341270452000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defmulti", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c8c"} {:created-at 1341270455000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defmethod", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c8d"}], :line 1789, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; example showing use of multi-methods before and after remove-all-methods\n;; after removing all the methods, both circle and line tos functions throw\n;; exceptions\n\nuser=> (defmulti tos :Ob)\nnil\nuser=> (defn line [p1 p2] {:Ob :line :p1 p1 :p2 p2})\n#'user/line\nuser=> (defn circle [cent rad] {:Ob :circle :cent cent :rad rad})\n#'user/circle\nuser=> (defmethod tos :line [l] (str \"Line:\" (l :p1) (l :p2)))\n#\nuser=> (defmethod tos :circle [c] (str \"Circle:\" (c :cent) (c :rad)))\n#\nuser=> (println (tos (circle [2 3] 3.3)))\nCircle:[2 3]3.3\nnil\nuser=> (println (tos (line [1 1][0 0])))\nLine:[1 1][0 0]\nnil\nuser=> (remove-all-methods tos)\n#\nuser=> (println (tos (circle [2 3] 3.3)))\njava.lang.IllegalArgumentException: No method in multimethod 'tos' for dispatch\nvalue: :circle (NO_SOURCE_FILE:0)\nuser=> (println (tos (line [1 1][0 0])))\njava.lang.IllegalArgumentException: No method in multimethod 'tos' for dispatch\nvalue: :line (NO_SOURCE_FILE:0)\nuser=>", :created-at 1313920017000, :updated-at 1313920017000, :_id "542692ccc026201cdc326c6b"}], :notes nil, :arglists ["multifn"], :doc "Removes all of the methods of multimethod.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/remove-all-methods"} {:added "1.0", :ns "clojure.core", :name "ns-resolve", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1289661007000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "resolve", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b3d"}], :line 4359, :examples [{:author {:login "jamesqiu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc1268deaa7f2e78fe2b5ea76e6481d8?r=PG&default=identicon"}, :editors [], :body "user=> (defn f [n] (* n n n))\n#'user/f\nuser=> ((ns-resolve *ns* (symbol \"f\")) 10)\n1000", :created-at 1328007015000, :updated-at 1328007015000, :_id "542692d4c026201cdc32701e"} {:author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :editors [], :body ";; See also http://clojure.org/namespaces for information on namespaces in Clojure and how to inspect and manipulate them", :created-at 1348479408000, :updated-at 1348479408000, :_id "542692d4c026201cdc32701f"} {:updated-at 1601821751716, :created-at 1601821751716, :author {:login "jimka2001", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/6414129?v=4"}, :body ";; In the binary form of `ns-resolve`, if a fully qualified symbol is given as second argument of `ns-resolve`, then the namespace (given as first argument) is ignored\n(ns-resolve (find-ns 'clojure.core) 'clojure-rte.core/xyzzy)\n;; => #'clojure-rte.core/xyzzy", :_id "5f79dc37e4b0b1e3652d73c8"}], :notes [{:updated-at 1332557686000, :body "The appropriate value for the env arg is what you get from the implicit &env arg available to a macro.", :created-at 1332557686000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fdb"}], :arglists ["ns sym" "ns env sym"], :doc "Returns the var or Class to which a symbol will be resolved in the\n namespace (unless found in the environment), else nil. Note that\n if the symbol is fully qualified, the var/Class to which it resolves\n need not be present in the namespace.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ns-resolve"} {:added "1.5", :ns "clojure.core", :name "as->", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1411997691800, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "->", :library-url "https://github.com/clojure/clojure"}, :_id "54295ffbe4b09282a148f1ed"} {:created-at 1411997716841, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "->>", :library-url "https://github.com/clojure/clojure"}, :_id "54296014e4b09282a148f1ee"} {:created-at 1411997732554, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "cond->", :library-url "https://github.com/clojure/clojure"}, :_id "54296024e4b09282a148f1ef"} {:created-at 1411997750265, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "cond->>", :library-url "https://github.com/clojure/clojure"}, :_id "54296036e4b09282a148f1f1"} {:created-at 1411997759234, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "some->", :library-url "https://github.com/clojure/clojure"}, :_id "5429603fe4b09282a148f1f2"} {:created-at 1411997771032, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "some->>", :library-url "https://github.com/clojure/clojure"}, :_id "5429604be4b09282a148f1f3"}], :line 7572, :examples [{:body "(def owners [{:owner \"Jimmy\"\n :pets (ref [{:name \"Rex\"\n :type :dog}\n {:name \"Sniffles\"\n :type :hamster}])} \n {:owner \"Jacky\" \n :pets (ref [{:name \"Spot\" \n :type :mink}\n {:name \"Puff\" \n :type :magic-dragon}])}])\n\n;; This example is contrived as there are other more \n;; terse ways of expressing the idea. It demonstrates\n;; several of the ways to extract items from a collection.\n;; Notice how the collection can be used in function or \n;; parameter position.\n(as-> owners $ (nth $ 0) (:pets $) (deref $) ($ 1) ($ :type))\n;;=> :hamster", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1412263021928, :updated-at 1412263021928, :_id "542d6c6de4b05f4d257a298b"} {:body "(as-> 0 n\n (inc n) ; n is 0 here passed from first parameter to as->\n (inc n)) ; n is 1 here passed from result of previous inc expression\n;;=> 2", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1422928871993, :updated-at 1422928871993, :_id "54d02be7e4b0e2ac61831cf2"} {:editors [{:login "jamesmacaulay", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/340?v=3"}], :body "; use it in the middle of a -> pipeline to sprinkle in some flexibility\n(-> [10 11]\n (conj 12)\n (as-> xs (map - xs [3 2 1]))\n (reverse))\n; (11 9 7)", :author {:avatar-url "https://avatars.githubusercontent.com/u/340?v=3", :account-source "github", :login "jamesmacaulay"}, :created-at 1452207578399, :updated-at 1452207828195, :_id "568eeddae4b0f37b65a3c280"} {:updated-at 1456947738297, :created-at 1456947738297, :author {:login "x", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/693546?v=3"}, :body ";; when you want to use arbitrary positioning of your argument in a thread macro\n(as-> {:a 1 :b 2} m\n (update m :a + 10)\n (reduce (fn [s [_ v]] (+ s v)) 0 m))\n\n;; when you'd like an if statement in your thread\n(as-> {:a 1 :b 2} m\n (update m :a + 10)\n (if update-b\n (update m :b + 10)\n m))", :_id "56d7421ae4b0b41f39d96cdb"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"} {:login "greydrizzle", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/5403136?v=4"}], :body ";; as-> with destructured binding\n\n(let [req {:host \"//mysite.com\" :path \"/a/123\" :x \"15.1\" :y \"84.2\"}]\n (as-> req {:keys [host path x y] :as m}\n (assoc m :url (str host path))\n (assoc m :coord [(Double/valueOf x) (Double/valueOf y)])))\n\n;; {:host \"//mysite.com\" :path \"/a/123\" :x \"15.1\" :y \"84.2\" :url \"//mysite.com/a/123\" :coord [15.1 84.2]}", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1532889321412, :updated-at 1554166083397, :_id "5b5e08e9e4b00ac801ed9e3a"}], :macro true, :notes nil, :arglists ["expr name & forms"], :doc "Binds name to expr, evaluates the first form in the lexical context\n of that binding, then binds name to that result, repeating for each\n successive form, returning the result of the last form.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/as->"} {:added "1.0", :ns "clojure.core", :name "aset-boolean", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1493752979563, :author {:login "barak-haviv", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/2076998?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "boolean-array", :ns "clojure.core"}, :_id "5908dc93e4b01f4add58fea1"}], :line 3956, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; create an array of 10 booleans and set one value to true\n;; using aset-boolean\n\nuser=> (def bs (boolean-array 10))\n#'user/bs\nuser=> (vec bs)\n[false false false false false false false false false false]\nuser=> (aset-boolean bs 2 true)\ntrue\nuser=> (vec bs)\n[false false true false false false false false false false]\nuser=>", :created-at 1313914167000, :updated-at 1313914167000, :_id "542692ccc026201cdc326c67"}], :notes [{:body "See [aset](http://clojuredocs.org/clojure.core/aset) for illustrations of multi-dimensional syntax.", :created-at 1432829103674, :updated-at 1432829103674, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :_id "55673cafe4b03e2132e7d171"}], :arglists ["array idx val" "array idx idx2 & idxv"], :doc "Sets the value at the index/indices. Works on arrays of boolean. Returns val.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/aset-boolean"} {:added "1.0", :ns "clojure.core", :name "trampoline", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1289618007000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "loop", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521df6"} {:created-at 1289618015000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "recur", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521df7"} {:created-at 1422376146394, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:ns "clojure.core", :name "letfn", :library-url "https://github.com/clojure/clojure"}, :_id "54c7bcd2e4b081e022073c35"}], :line 6299, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(defn foo [x]\n (if (< x 0)\n (println \"done\")\n #(foo (do (println :x x) (dec x)))))\n;; #'user/foo\n\n;; `trampoline` will keep calling the function \n;; for as long as \"foo\" returns a function.\n\n(trampoline foo 10)\n;; :x 10\n;; :x 9\n;; :x 8\n;; :x 7\n;; :x 6\n;; :x 5\n;; :x 4\n;; :x 3\n;; :x 2\n;; :x 1\n;; :x 0\n;; done\n;;=> nil", :created-at 1293675043000, :updated-at 1422375388791, :_id "542692cfc026201cdc326e3b"} {:body ";; Short tutorial-style article with example of using trampoline at this link:\n;; http://jakemccrary.com/blog/2010/12/06/trampolining-through-mutual-recursion/", :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :created-at 1421338043181, :updated-at 1421338043181, :_id "54b7e5bbe4b0e2ac61831cb5"} {:body ";; Using mutually recursive functions to implement a finite state machine (FSM)\n;; This machine has three states {a b c} and \n;; seven transitions {:a-b :a-c :b-a :b-c :c-a :c-b :final}.\n\n(defn foo [cmds]\n(letfn\n [(a-> [[_ & rs]]\n #(case _ \n :a-b (b-> rs)\n :a-c (c-> rs)\n false))\n (b-> [[_ & rs]]\n #(case _ \n :b-a (a-> rs)\n :b-c (c-> rs)\n false))\n (c-> [[_ & rs]]\n #(case _ \n :c-a (a-> rs)\n :c-b (c-> rs)\n :final true\n false))]\n (trampoline a-> cmds)))\n \n(foo [:a-b :b-c :c-a :a-c :final])\n;;=> true", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1422376023904, :updated-at 1422376335709, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :_id "54c7bc57e4b081e022073c33"} {:body ";; from \n;; Mutually recursive functions are nice for implementing \n;; finite state machines (FSAs)\n\n(defn elevator [commands]\n (letfn\n [(ff-open [[_ & r]]\n \"When the elevator is open on the 1st floor\n it can either close or be done.\"\n #(case _\n :close (ff-closed r)\n :done true\n false))\n (ff-closed [[_ & r]]\n \"When the elevator is closed on the 1st floor\n it can either open or go up.\"\n #(case _\n :open (ff-open r)\n :up (sf-closed r)\n false))\n (sf-closed [[_ & r]]\n \"When the elevator is closed on the 2nd floor\n it can either go down or open.\"\n #(case _\n :down (ff-closed r)\n :open (sf-open r)\n false))\n (sf-open [[_ & r]]\n \"When the elevator is open on the 2nd floor\n it can either close or be done\"\n #(case _\n :close (sf-closed r)\n :done true\n false))]\n\n (trampoline ff-open commands)))\n\n(elevator [:close :open :close :up :open :open :done])\n ;=> false\n(elevator [:close :up :open :close :down :open :done])\n ;=> true\n;; run at your own risk!\n(elevator (cycle [:close :open])) \n ; ... runs forever", :author {:login "foxlog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/150418?v=3"}, :created-at 1431484190885, :updated-at 1592576350068, :editors [{:login "foxlog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/150418?v=3"} {:avatar-url "https://avatars0.githubusercontent.com/u/1719584?v=4", :account-source "github", :login "eihli"}], :_id "5552b71ee4b01ad59b65f4cf"} {:updated-at 1482914635322, :created-at 1482914635322, :author {:login "mhmdsalem1993", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10787314?v=3"}, :body ";; without trampoline\n(declare hatt)\n(defn catt [n]\n (when-not (zero? n)\n (when (zero? (rem n 100))\n (println \"catt:\" n))\n (hatt (dec n))))\n(defn hatt [n]\n (when-not (zero? n)\n (if (zero? (rem n 100))\n (println \"hatt:\" n))\n (catt (dec n))))\n\n;; std=> catt: 100000000\n;; std=> catt: 99999900\n;; std=> catt: 99999800\n;; std=> catt: 99999700\n;; std=> catt: 99999600\n;; std=> catt: 99999500\n;; std=> catt: 99999400\n;; .\n;; .\n;; .\n;; std => CompilerException java.lang.StackOverflowError\n\n;; with trampoline\n\n(declare hattr)\n\n(defn cattr [n]\n (when-not (zero? n)\n (when (zero? (rem n 100))\n (println \"cattr:\" n))\n (fn [] (hattr (dec n)))))\n(defn hattr [n]\n (when-not (zero? n)\n (if (zero? (rem n 100))\n (println \"hatttr:\" n))\n (fn [] (cattr (dec n)))))\n\n(trampoline cattr 10000000)\n\n;; std=> catt: 100000000\n;; std=> catt: 99999900\n;; std=> catt: 99999800\n;; std=> catt: 99999700\n;; std=> catt: 99999600\n;; std=> catt: 99999500\n;; std=> catt: 99999400\n;; .\n;; .\n;; .\n;; std=> catt: 100\n", :_id "58637b4be4b0fd5fb1cc9645"}], :notes [{:updated-at 1291742621000, :body "A tutorial on how to use trampoline is available here: \r\n\r\nhttp://pramode.net/clojure/2010/05/08/clojure-trampoline/\r\n\r\nand here:\r\n\r\nhttp://jakemccrary.com/blog/2010/12/06/trampolining-through-mutual-recursion.html", :created-at 1286956413000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f9a"} {:author {:login "dvingo", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/467827?v=4"}, :updated-at 1588175434827, :created-at 1588175434827, :body "The links above are dead. Here are the archived versions:\n\nhttps://web.archive.org/web/20190626232715/http://pramode.net:80/clojure/2010/05/08/clojure-trampoline/\n\nhttps://web.archive.org/web/20110111121137/http://jakemccrary.com:80/blog/2010/12/06/trampolining-through-mutual-recursion.html", :_id "5ea9a24ae4b087629b5a18eb"}], :arglists ["f" "f & args"], :doc "trampoline can be used to convert algorithms requiring mutual\n recursion without stack consumption. Calls f with supplied args, if\n any. If f returns a fn, calls that fn with no arguments, and\n continues to repeat, until the return value is not a fn, then\n returns that non-fn value. Note that if you want to return a fn as a\n final value, you must wrap it in some data structure and unpack it\n after trampoline returns.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/trampoline"} {:added "1.9", :ns "clojure.core", :name "double?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1496005756299, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "float?", :ns "clojure.core"}, :_id "592b3c7ce4b093ada4d4d784"} {:created-at 1496005947631, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "decimal?", :ns "clojure.core"}, :_id "592b3d3be4b093ada4d4d785"} {:created-at 1496005954103, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "bigdec?", :ns "clojure.core"}, :_id "592b3d42e4b093ada4d4d786"}], :line 1426, :examples [{:updated-at 1496005747580, :created-at 1496005747580, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body ";;;; true for instances of java.lang.Double\n\n(double? 1.0)\n;;=> true\n(double? (new Double \"1\"))\n;;=> true\n\n;;;; false for instances of java.lang.Float, java.lang.BigDecimal\n\n(double? (new Float \"1\"))\n;;=> false\n(double? 1.0M)\n;;=> false\n(double? (new BigDecimal \"1\"))\n;;=> false\n", :_id "592b3c73e4b093ada4d4d783"}], :notes nil, :arglists ["x"], :doc "Return true if x is a Double", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/double_q"} {:added "1.0", :ns "clojure.core", :name "when-not", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1302596050000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "when", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d1b"} {:created-at 1323280013000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "when-let", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d1c"} {:created-at 1334293346000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "if", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d1d"}], :line 499, :examples [{:updated-at 1423066223241, :created-at 1280776138000, :body ";; build tuples over sets with the same cardinality \n(map\n #(when-not (= %2 %3) [%1 %2 %3])\n (iterate inc 0) ; a lazy list of indecies\n [:a :b :c]\n [:a :a :a])\n;;=> (nil [1 :b :a] [2 :c :a])\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692c8c026201cdc326a4a"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; See examples for \"if\" explaining Clojure's idea of logical true\n;; and logical false.", :created-at 1334293370000, :updated-at 1334293370000, :_id "542692d6c026201cdc3270b7"} {:body ";; when-not is similar to unless (in other languages).\n;; An alias can be provided with a macro\n(defmacro unless [& args] `(when-not ~@args))\n\n(map #(unless (= %2 %3) [%1 %2 %3])\n (iterate inc 0) ; a lazy list for indecies\n [:a :b :c]\n [:a :a :a]) \n;;=> (nil [1 :b :a] [2 :c :a])", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1423066081989, :updated-at 1423066244981, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :_id "54d243e1e4b081e022073c5c"} {:updated-at 1546901293467, :created-at 1546901293467, :author {:login "dijonkitchen", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4"}, :body "(when-not false 2)\n;; 2\n", :_id "5c33d72de4b0ca44402ef614"} {:updated-at 1546901306925, :created-at 1546901306925, :author {:login "dijonkitchen", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4"}, :body "(when-not true 2)\n;; nil\n", :_id "5c33d73ae4b0ca44402ef615"}], :macro true, :notes nil, :arglists ["test & body"], :doc "Evaluates test. If logical false, evaluates body in an implicit do.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/when-not"} {:added "1.0", :ns "clojure.core", :name "*1", :file "clojure/core.clj", :type "var", :column 1, :see-alsos [{:created-at 1302912238000, :author {:login "hoornet", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5834f829a9def19620d4014c46642172?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "*2", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b4a"} {:created-at 1302912243000, :author {:login "hoornet", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5834f829a9def19620d4014c46642172?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "*3", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b4b"}], :dynamic true, :line 6279, :examples [{:updated-at 1412880834853, :created-at 1279047952000, :body "\"Hello!\"\n;;=> \"Hello!\"\n\n*1\n;;=> \"Hello!\"\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=2", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692cac026201cdc326b1a"}], :notes nil, :arglists [], :doc "bound in a repl thread to the most recent value printed", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*1"} {:added "1.0", :ns "clojure.core", :name "vec", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1291951288000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vector", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521adb"} {:created-at 1291951295000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vector?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521adc"} {:created-at 1291951303000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vector-of", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521add"}], :line 367, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4", :account-source "github", :login "dijonkitchen"} {:login "whiteknees", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/67022623?v=4"}], :body "user=> (vec '(1 2 3))\n[1 2 3]\n\nuser=> (vec [1 2 3])\n[1 2 3]\n\nuser=> (vec #{1 2 3})\n[1 2 3]\n\nuser=> (vec {:a 1 :b 2 :c 3})\n[[:a 1] [:b 2] [:c 3]]\n\nuser=> (vector {:a 1 :b 2 :c 3})\n[{:a 1, :b 2, :c 3}]\n\nuser=> (vec '())\n[]\n\nuser=> (vec nil)\n[]", :created-at 1279075384000, :updated-at 1663872522168, :_id "542692c9c026201cdc326a97"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; Warning. If the arg is a Java array, then the returned vector will alias it,\n;; and modifying the array will thus modify the vector. To avoid this, do\n;; not modify the array after the vec call. One way to guarantee this is to\n;; make a copy of the array, call vec on the new array, and then lose all\n;; references to the copy so it cannot be accessed in any way.\n\nuser=> (def a (to-array (repeat 4 0)))\n#'user/a\nuser=> (seq a)\n(0 0 0 0)\nuser=> (def v (vec a))\n#'user/v\nuser=> v\n[0 0 0 0]\n\n;; Now change a, and v changes, too, since they share state.\nuser=> (aset a 2 -5)\n-5\nuser=> v\n[0 0 -5 0]\n\n;; One way to avoid this\nuser=> (def v (vec (aclone a)))\n#'user/v\nuser=> v\n[0 0 -5 0]\nuser=> (aset a 2 -20)\n-20\nuser=> v\n[0 0 -5 0]\n", :created-at 1334463665000, :updated-at 1334463665000, :_id "542692d5c026201cdc3270b4"}], :notes nil, :arglists ["coll"], :doc "Creates a new vector containing the contents of coll. Java arrays\n will be aliased and should not be modified.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/vec"} {:added "1.0", :ns "clojure.core", :name "*print-meta*", :type "var", :see-alsos [{:created-at 1351128584000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pr", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e5d"} {:created-at 1623879909739, :author {:login "squiter", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/238017?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pprint", :ns "clojure.pprint"}, :_id "60ca70e5e4b0b1e3652d750d"}], :examples [{:author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :editors [{:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"} {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}], :body "user=> (binding [*print-meta* true] \n (pr (var defmacro)) )\n;;^{:macro true, :ns #, :name defmacro, :arglists ^{:line 424, :column 15} ([name doc-string? attr-map? [params*] body] [name doc-string? attr-map? ^{:line 425, :column 46} ([params*] body) + attr-map?]), :column 1, :added \"1.0\", :doc \"Like defn, but the resulting function name is declared as a\\n macro and will be used as a macro by the compiler when it is\\n called.\", :line 419, :file \"clojure/core.clj\"} #'clojure.core/defmacro\nnil\n", :created-at 1351126556000, :updated-at 1351126806000, :_id "542692d1c026201cdc326f37"} {:updated-at 1623879875905, :created-at 1623879875905, :author {:login "squiter", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/238017?v=4"}, :body "user=> (binding [*print-meta* true]\n (-> \"{:a ^{:b :c} {}}\"\n clojure.edn/read-string\n clojure.pprint/pprint))\n{:a ^{:b :c} {}}\nnil", :_id "60ca70c3e4b0b1e3652d750c"}], :notes [{:updated-at 1351128651000, :body "\"printing an object\" means via **pr** not print or println", :created-at 1351128651000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :_id "542692edf6e94c6970521ff1"} {:author {:login "squiter", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/238017?v=4"}, :updated-at 1623879652487, :created-at 1623879652487, :body "The `*print-meta*` works for `print` and `pprint` after Clojure 1.10.2. Source: https://clojure.atlassian.net/browse/CLJ-1445", :_id "60ca6fe4e4b0b1e3652d750b"}], :arglists [], :doc "If set to logical true, when printing an object, its metadata will also\n be printed in a form that can be read back by the reader.\n\n Defaults to false.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*print-meta*"} {:added "1.0", :ns "clojure.core", :name "when", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1323279976000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "when-not", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aed"} {:created-at 1323279997000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "when-let", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aee"} {:created-at 1334293253000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "if", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aef"} {:created-at 1602793798332, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "boolean", :ns "clojure.core"}, :_id "5f88b146e4b0b1e3652d73e5"}], :line 493, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"} {:login "frangio", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/646001f0ba2b7df47a16c0a1d5b62225?r=PG&default=identicon"}], :body "user=> (when (= 1 1) true)\ntrue\n\nuser=> (when (not= 1 1) true)\nnil", :created-at 1279071998000, :updated-at 1325845615000, :_id "542692cec026201cdc326df2"} {:author {:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"}, :editors [{:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"} {:login "ElieLabeca", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/724e1112a2be4d5af767c0cf152d087e?r=PG&default=identicon"}], :body "user=> (def has-value (when true\n (println \"Hello World\")\n \"Returned Value\"))\nHello World\n#'user/has-value\n\nuser=> has-value\n\"Returned Value\"\n\n", :created-at 1311798084000, :updated-at 1331756178000, :_id "542692cec026201cdc326df5"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; See examples for \"if\" explaining Clojure's idea of logical true\n;; and logical false.", :created-at 1334293296000, :updated-at 1334293296000, :_id "542692d6c026201cdc3270b5"} {:body ";; When is a macro of (if .. do ..)\n\nuser=> (macroexpand '(when 1 2 3 4))\n(if 1 (do 2 3 4))\n\n;; if 1 is true, do will evaluate 2 3 4, but return values of 2 and 3 would be \n;; ignored. Value of 4 (last value) would always be returned. \n;; See https://clojuredocs.org/clojure.core/do for details\n\nuser=> (if 1 (do 2 3 4))\n4\n\n", :author {:login "nickzam", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/89377?v=3"}, :created-at 1421838215231, :updated-at 1421838215231, :_id "54bf8787e4b0e2ac61831cbe"}], :macro true, :notes nil, :arglists ["test & body"], :doc "Evaluates test. If logical true, evaluates body in an implicit do.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/when"} {:added "1.0", :ns "clojure.core", :name "int", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1333595304000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "char", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d49"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "long", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917185000, :_id "542692ebf6e94c6970521d4a"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "integer?", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917243000, :_id "542692ebf6e94c6970521d4b"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "ints", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917294000, :_id "542692ebf6e94c6970521d4c"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "int-array", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917326000, :_id "542692ebf6e94c6970521d4d"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "short", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917681000, :_id "542692ebf6e94c6970521d4e"}], :line 882, :examples [{:updated-at 1661231771832, :created-at 1280208450000, :body "user=> (int 1)\n1\n\nuser=> (int 1M)\n1\n\nuser=> (int 1.2)\n1\n\nuser=> (int \\1)\n49\n\nuser=> (int \\a)\n97\n\n;; Strings cannot be cast to an int.\nuser=> (int \"1\")\nExecution error (ClassCastException) at user/eval175 (REPL:1).\njava.lang.String cannot be cast to java.lang.Character\n\n;; Use Java interop instead\n(Integer/parseInt \"1\")\n;;=> 1\n\n;; Using JavaScript interop for ClojureScript\n(js/parseInt \"5\")\n;;=> 5\n\n(js/parseInt \"5.22\")\n;;=> 5", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"} {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"} {:avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon", :account-source "clojuredocs", :login "Ljos"} {:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"} {:avatar-url "https://avatars.githubusercontent.com/u/747125?v=4", :account-source "github", :login "metehan"} {:login "mathisto", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8226466?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon", :account-source "clojuredocs", :login "Jacolyte"}, :_id "542692cec026201cdc326d78"}], :notes [{:author {:login "jw-00000", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/2936?v=4"}, :updated-at 1529869571125, :created-at 1529869571125, :body "To convert a string containing a number to an integer, use Java's Integer/parseInt, e.g. `(Integer/parseInt \"-10\")`.", :_id "5b2ff503e4b00ac801ed9e1e"}], :arglists ["x"], :doc "Coerce to int", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/int"} {:added "1.8", :ns "clojure.core", :name "map-entry?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1602615292813, :author {:login "victoraldecoa", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/2746668?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "key", :ns "clojure.core"}, :_id "5f85f7fce4b0b1e3652d73e3"} {:created-at 1602615302919, :author {:login "victoraldecoa", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/2746668?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "val", :ns "clojure.core"}, :_id "5f85f806e4b0b1e3652d73e4"}], :line 1478, :examples [{:updated-at 1476873674402, :created-at 1476873674402, :author {:login "G1enY0ung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/15034155?v=3"}, :body "user=> (class {:a 1 :b 2})\nclojure.lang.PersistentArrayMap\n\nuser=> (class (first {:a 1 :b 2}))\nclojure.lang.MapEntry\n;; A map entry is treated as an ordered collection of key and value.\n;; https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/MapEntry.java\n\nuser=> (map-entry? (first {:a 1 :b 2}))\ntrue", :_id "58074dcae4b001179b66bdce"}], :notes nil, :arglists ["x"], :doc "Return true if x is a map entry", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/map-entry_q"} {:added "1.0", :ns "clojure.core", :name "ns-refers", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1288055172000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "ns-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a82"}], :line 4254, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [], :body "user> (ns-refers 'clojure.main)\n{sorted-map #'clojure.core/sorted-map, read-line #'clojure.core/read-line, re-pattern #'clojure.core/re-pattern, keyword? #'clojure.core/keyword?, val #'clojure.core/val, chunked-seq? #'clojure.core/chunked-seq?, *compile-path* #'clojure.core/*compile-path*, ...chop...}", :created-at 1288075058000, :updated-at 1288075058000, :_id "542692c9c026201cdc326af9"}], :notes nil, :arglists ["ns"], :doc "Returns a map of the refer mappings for the namespace.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ns-refers"} {:added "1.0", :ns "clojure.core", :name "rand", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1292321223000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rand-int", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f6a"} {:created-at 1311342603000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rand-nth", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f6b"} {:created-at 1434034912362, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:ns "clojure.core", :name "shuffle", :library-url "https://github.com/clojure/clojure"}, :_id "5579a2e0e4b03e2132e7d18c"}], :line 4911, :examples [{:author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Test `rand` never returns `n`:\nuser=> (some (partial <= 10) (take 100000 (repeatedly (fn [] (int (rand 10))))))\nnil\n", :created-at 1279658909000, :updated-at 1285497610000, :_id "542692c8c026201cdc326a0f"} {:author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :editors [], :body "user=> (rand)\n0.17469201779243182\n\nuser=> (rand 100)\n49.542391492950834", :created-at 1286329327000, :updated-at 1286329327000, :_id "542692c8c026201cdc326a11"}], :notes nil, :arglists ["" "n"], :doc "Returns a random floating point number between 0 (inclusive) and\n n (default 1) (exclusive).", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/rand"} {:added "1.0", :ns "clojure.core", :name "second", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1295238626000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "first", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b2a"} {:created-at 1303125643000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "nth", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b2b"} {:created-at 1374512098000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "fnext", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b2c"} {:created-at 1374512133000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "next", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b2d"}], :line 91, :examples [{:updated-at 1423275208669, :created-at 1279071308000, :body "user=> (second '(:alpha :bravo :charlie))\n:bravo\n\nuser=> (second [1 2 3])\n2\n\nuser=> (second {:a 1 :b 2 :c 3})\n[:b 2]\n\nuser=> (second #{1 2 3})\n2\n\nuser=> (second [1 2])\n2\n\nuser=> (second [1])\nnil\n\nuser=> (second [])\nnil\n\nuser=> (second nil)\nnil", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"} {:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"} {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/147981?v=3", :account-source "github", :login "dpritchett"}, :_id "542692c7c026201cdc326949"}], :notes [{:author {:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}, :updated-at 1520169736267, :created-at 1520169736267, :body "Synonym of `fnext`.", :_id "5a9bf308e4b0316c0f44f90b"}], :arglists ["x"], :doc "Same as (first (next x))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/second"} {:added "1.2", :ns "clojure.core", :name "vector-of", :file "clojure/gvec.clj", :type "function", :column 1, :see-alsos [{:created-at 1291951396000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vec", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c44"} {:created-at 1291951401000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vector", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c45"} {:created-at 1291951406000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vector?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c46"}], :line 484, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user=> (conj (vector-of :int) 1 2 3)\n[1 2 3] ; <-- note, these are unboxed internally\n\nuser=> (vector-of :int 1 2 3)\n[1 2 3] ; same here\n\nuser=> (type (conj (vector-of :int) 1 2 3))\nclojure.core.Vec\n", :created-at 1284711309000, :updated-at 1423523824042, :_id "542692c6c026201cdc3268d1"}], :notes [{:author {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}, :updated-at 1581663088148, :created-at 1581663088148, :body "The primary use of `vector-of` is to be space efficient. As most of Clojure deals with boxed types, boxing/unboxing will happen everytime an element is taken out/inserted.", :_id "5e464370e4b0ca44402ef838"}], :arglists ["t" "t & elements"], :doc "Creates a new vector of a single primitive type t, where t is one\n of :int :long :float :double :byte :short :char or :boolean. The\n resulting vector complies with the interface of vectors in general,\n but stores the values unboxed internally.\n\n Optionally takes one or more elements to populate the vector.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/vector-of"} {:ns "clojure.core", :name "hash-combine", :file "clojure/core_deftype.clj", :type "function", :column 1, :see-alsos nil, :line 126, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Calculates the hashes for x and y and produces a new hash that represents\n;; the combination of the two.\n\nuser=> (hash-combine 100 \"a\")\n-1640524969\n", :created-at 1280320404000, :updated-at 1285496804000, :_id "542692cdc026201cdc326d1e"}], :notes nil, :arglists ["x y"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/hash-combine"} {:added "1.0", :ns "clojure.core", :name ">", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1291975136000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "=", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c4f"} {:created-at 1291975141000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "not=", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c50"} {:created-at 1291975147000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "<", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c51"}], :line 1070, :examples [{:author {:login "mattdw", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ee24aacb65359196b0a1bad050f9a62f?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "Iceland_jack", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c889e0a95a3bb07f90ab28ad442f1127?r=PG&default=identicon"}], :body "user=> (> 1 2)\nfalse\nuser=> (> 2 1)\ntrue\nuser=> (> 2 2)\nfalse\nuser=> (> 6 5 4 3 2)\ntrue\nuser=> (sort > (vals {:foo 5, :bar 2, :baz 10}))\n(10 5 2)", :created-at 1280322039000, :updated-at 1340813399000, :_id "542692ccc026201cdc326c96"}], :notes nil, :arglists ["x" "x y" "x y & more"], :doc "Returns non-nil if nums are in monotonically decreasing order,\n otherwise false.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/>"} {:added "1.0", :ns "clojure.core", :name "replace", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1281451180000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.walk", :name "prewalk-replace", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dc2"} {:created-at 1281451198000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.walk", :name "postwalk-replace", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dc3"} {:created-at 1385849073000, :author {:login "Alexey Tarasevich", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/43e0398b89022d32b43de4c968069312?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dc4"} {:created-at 1439523160945, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "replace", :ns "clojure.string"}, :_id "55cd6158e4b072d7f27980e7"}], :line 5058, :examples [{:updated-at 1670326100220, :created-at 1280289240000, :body ";; Vectors in the first argument are implicitly treated like maps\n;; from zero-based indexes to values so this is equivalent to\n;;\n;; (replace {0 :zeroth, 1 :first, 2 :second, 3 :third, 4 :fourth} [0 2 4 0])\nuser=> (replace [:zeroth :first :second :third :fourth] [0 2 4 0])\n[:zeroth :second :fourth :zeroth]\n\nuser=> (replace [10 9 8 7 6] [0 2 4])\n[10 8 6]", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/c889e0a95a3bb07f90ab28ad442f1127?r=PG&default=identicon", :account-source "clojuredocs", :login "Iceland_jack"} {:avatar-url "https://www.gravatar.com/avatar/c889e0a95a3bb07f90ab28ad442f1127?r=PG&default=identicon", :account-source "clojuredocs", :login "Iceland_jack"} {:login "agnul", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7526067?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/2c8ecc24181d171df85a26458b9cd5f?r=PG&default=identicon", :account-source "clojuredocs", :login "jneira"}, :_id "542692cbc026201cdc326bca"} {:author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=2"}, :editors [{:login "Iceland_jack", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c889e0a95a3bb07f90ab28ad442f1127?r=PG&default=identicon"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user=> (replace {2 :two, 4 :four} [4 2 3 4 5 6 2])\n[:four :two 3 :four 5 6 :two]\n\nuser=> (replace '{0 ZERO, 1 ONE, 2 TWO} '(This is the code 0 1 2 0))\n(This is the code ZERO ONE TWO ZERO)", :created-at 1305078367000, :updated-at 1423093999544, :_id "542692cbc026201cdc326bce"} {:author {:login "Alexey Tarasevich", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/43e0398b89022d32b43de4c968069312?r=PG&default=identicon"}, :editors [], :body "; Behaves somewhat similar to map, but notice the differences\nuser=> (map [:zeroth :first :second :third :fourth] [0 2 4 0])\n(:zeroth :second :fourth :zeroth)\n\n; 1. replace returns a vector, while map returns a seq\n; 2. replace keeps unmatched values, while map replace with nil\nuser=> (map {} [0])\n(nil)\nuser=> (map [] [0])\nIndexOutOfBoundsException clojure.lang.PersistentVector.arrayFor (PersistentVector.java:107)\n", :created-at 1385849488000, :updated-at 1385849488000, :_id "542692d5c026201cdc327071"} {:updated-at 1472236519899, :created-at 1472236519899, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body "user=> (replace {2 :a, 4 :b} [1 2 3 4])\n;;=> [1 :a 3 :b]", :_id "57c08be7e4b0709b524f04d5"} {:updated-at 1517940922527, :created-at 1517935073686, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; On hash-maps:\n\n(def user {:name \"jack\" :city \"London\" :id 123})\n(defn entry [k v] (clojure.lang.MapEntry/create k v))\n(def sub {(entry :city \"London\") [:postcode \"WD12\"]})\n\n(into {} (replace sub user))\n;; {:name \"jack\", :postcode \"WD12\", :id 123}", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5a79d9e1e4b0e2d9c35f741b"}], :notes [{:updated-at 1280289719000, :body "The behaviour for vectors was a little strange for me. I'd say replace \"selects\" from \"smap\" the indexes which are in \"coll\"", :created-at 1280289719000, :author {:login "jneira", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2c8ecc24181d171df85a26458b9cd5f?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f92"}], :arglists ["smap" "smap coll"], :doc "Given a map of replacement pairs and a vector/collection, returns a\n vector/seq with any elements = a key in smap replaced with the\n corresponding val in smap. Returns a transducer when no collection\n is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/replace"} {:added "1.9", :ns "clojure.core", :name "int?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495654441434, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "integer?", :ns "clojure.core"}, :_id "5925e029e4b093ada4d4d73c"} {:created-at 1495654448767, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "number?", :ns "clojure.core"}, :_id "5925e030e4b093ada4d4d73d"} {:created-at 1495654503504, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pos-int?", :ns "clojure.core"}, :_id "5925e067e4b093ada4d4d73e"} {:created-at 1495654510856, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "neg-int?", :ns "clojure.core"}, :_id "5925e06ee4b093ada4d4d73f"} {:created-at 1495654522385, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nat-int?", :ns "clojure.core"}, :_id "5925e07ae4b093ada4d4d740"}], :line 1400, :examples [{:editors [{:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}], :body ";; Note that this will return true for things which aren't strictly Java ints:\n(int? 42) \n;; => true\n\n(int? (java.lang.Integer. 42)) \n;; => true\n\n(int? (java.lang.Long. 42)) \n;; => true\n\n(int? 42.0)\n;; => false\n\n(int? (bigdec 42))\n;; => false\n\n;; The distinction between int? and integer? is that integer? will return true \n;; for BigInts:\n\n(int? (bigint 42)) \n;; => false\n\n(integer? (bigint 42)) \n;; => true\n\n(int? java.math.BigInteger/ONE)\n;; => false\n\n(integer? java.math.BigInteger/ONE)\n;; => true\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/94482?v=3", :account-source "github", :login "timgilbert"}, :created-at 1495654364949, :updated-at 1495655962185, :_id "5925dfdce4b093ada4d4d73a"} {:editors [{:login "liuchong", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/236058?v=4"}], :body ";; Here is the definition, it's simple (and 呵呵哒):\n;;\n;; (defn int?\n;; \"Return true if x is a fixed precision integer\"\n;; {:added \"1.9\"}\n;; [x] (or (instance? Long x)\n;; (instance? Integer x)\n;; (instance? Short x)\n;; (instance? Byte x)))\n;;\n\n(int? (Long/MAX_VALUE))\n;; => true\n\n(int? (Long/MIN_VALUE))\n;; => true\n\n(int? 0.0)\n;; => false", :author {:avatar-url "https://avatars2.githubusercontent.com/u/236058?v=4", :account-source "github", :login "liuchong"}, :created-at 1572414469669, :updated-at 1572414534344, :_id "5db92405e4b0ca44402ef7d5"}], :notes nil, :arglists ["x"], :doc "Return true if x is a fixed precision integer", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/int_q"} {:added "1.0", :ns "clojure.core", :name "associative?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1570520657017, :author {:login "xmo-odoo", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/7571158?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "assoc", :ns "clojure.core"}, :_id "5d9c3e51e4b0ca44402ef7c5"} {:created-at 1570520665970, :author {:login "xmo-odoo", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/7571158?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "assoc-in", :ns "clojure.core"}, :_id "5d9c3e59e4b0ca44402ef7c6"} {:created-at 1570520672069, :author {:login "xmo-odoo", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/7571158?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "update", :ns "clojure.core"}, :_id "5d9c3e60e4b0ca44402ef7c7"} {:created-at 1570520678789, :author {:login "xmo-odoo", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/7571158?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "update-in", :ns "clojure.core"}, :_id "5d9c3e66e4b0ca44402ef7c8"}], :line 6244, :examples [{:author {:login "Clinton", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e460563f35b0b25d8671d6ef83f54ce?r=PG&default=identicon"}, :editors [], :body "user=> (associative? [1 2 3]) ; vector\ntrue\nuser=> (associative? '(1 2 3)) ; list\nfalse\nuser=> (associative? {:a 1 :b 2}) ; map\ntrue\nuser=> (associative? #{:a :b :c}) ; set\nfalse\nuser=> (associative? \"fred\") ; string\nfalse\n", :created-at 1327061297000, :updated-at 1327061297000, :_id "542692d2c026201cdc326f4d"}], :notes nil, :arglists ["coll"], :doc "Returns true if coll implements Associative", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/associative_q"} {:added "1.3", :ns "clojure.core", :name "unchecked-int", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1496090254478, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "int", :ns "clojure.core"}, :_id "592c868ee4b093ada4d4d79f"}], :line 3534, :examples [{:updated-at 1496090244589, :created-at 1496090244589, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body "(unchecked-int 1)\n;;=> 1\n(unchecked-int 1N)\n;;=> 1\n(unchecked-int 1.1)\n;;=> 1\n(unchecked-int 1.9)\n;;=> 1\n(unchecked-int 5/3)\n;;=> 1\n\n(unchecked-int -1)\n;;=> -1\n(unchecked-int -1N)\n;;=> -1\n(unchecked-int -1.1)\n;;=> -1\n(unchecked-int -1.9)\n;;=> -1\n(unchecked-int -5/3)\n;;=> -1\n\n;;;; Note that (unchecked-int) does not range check its argument\n;;;; so integer overflow or rounding may occur. \n;;;; Use (int) if you want to throw an exception in such cases.\n\n(unchecked-int 2147483648)\n;;=> -2147483648\n(unchecked-int -2147483649)\n;;=> 2147483647\n\n(int 2147483648)\n;;=> IllegalArgumentException Value out of range for int: 2147483648\n(long -2147483649)\n;;=> IllegalArgumentException Value out of range for int: -2147483649\n\n(unchecked-int 1.0E9)\n;;=> 1000000000\n(unchecked-int 1.0E10)\n;;=> 2147483647\n(unchecked-int 1.0E11)\n;;=> 2147483647\n\n(int 1.0E9)\n;;=> 1000000000\n(int 1.0E10)\n;;=> IllegalArgumentException Value out of range for int: 1.0E10\n(int 1.0E11)\n;;=> IllegalArgumentException Value out of range for int: 1.0E11", :_id "592c8684e4b093ada4d4d79e"}], :notes nil, :arglists ["x"], :doc "Coerce to int. Subject to rounding or truncation.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-int"} {:added "1.2", :ns "clojure.core", :name "set-error-handler!", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1287220602000, :author {:login "hugoduncan", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/80fa2a15219b987664e4d6f5c78b4c27?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "agent", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c1e"} {:created-at 1287220615000, :author {:login "hugoduncan", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/80fa2a15219b987664e4d6f5c78b4c27?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "agent-error", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c1f"} {:created-at 1329375224000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "restart-agent", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c20"}], :line 2194, :examples [{:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [{:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"} {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"} {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}], :body "(def bond (agent 7))\n\n(defn err-handler-fn [ag ex]\n (println \"evil error occured: \" ex \" and we still have value \" @ag))\n\n(set-error-handler! bond err-handler-fn)\n\n;;division by zero:\n\n(send bond (fn [x] (/ x 0)))\n=>evil error occured: #Divide by zero> and we still have value 7\n\n(send bond inc)\n=>FAILURE ;;Agent is failed, needs restart, but keeps the last OK value\n\n@bond\n=>7\n\n(restart-agent bond 7) ;; or replace 7 with @ag\n\n(send bond inc)\n=># ;;because of async update\n\n@bond\n=>8\n", :created-at 1329375108000, :updated-at 1329375308000, :_id "542692d5c026201cdc32707d"} {:updated-at 1497900465897, :created-at 1497900465897, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/7083783?v=3"}, :body "(deftest t-rstart\n (future (println \"running in a thread...\"))\n (let [agt (agent 0)\n\n ; This doesn't work\n h01 (fn [a e]\n (println :10 \"agent error found:\" )\n (println :11 \"restarting agent...\")\n (restart-agent a 100)\n (Thread/sleep 100)\n (println :12 \"agent restarted, state=\" @a))\n\n ; This works. Need to call restart-agent in a separate thread\n h02 (fn [a e]\n (println :20 \"agent error found:\" )\n (future\n (println :21 \"restarting agent...\")\n (restart-agent a 200)\n (println :22 \"agent restarted, state=\" @a))) ;=> 200\n ]\n (set-error-handler! agt h02)\n (send agt inc)\n (Thread/sleep 100) (println :01 @agt) ;=> 1\n (Thread/sleep 100) (send agt #(/ % 0))\n (Thread/sleep 100) (println :02 @agt) ;=> 200\n (Thread/sleep 100) (send agt inc)\n (Thread/sleep 100) (println :03 @agt) ;=> 201\n))\n\n; Output\n; running in a thread...\n; :01 1\n; :20 agent error found:\n; :21 restarting agent...\n; :22 agent restarted, state= 200\n; :02 200\n; :03 201", :_id "594825b1e4b06e730307db3c"}], :notes nil, :arglists ["a handler-fn"], :doc "Sets the error-handler of agent a to handler-fn. If an action\n being run by the agent throws an exception or doesn't pass the\n validator fn, handler-fn will be called with two arguments: the\n agent and the exception.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/set-error-handler!"} {:ns "clojure.core", :name "inst-ms*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["inst"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core/inst-ms*"} {:added "1.0", :ns "clojure.core", :name "keyword?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1495715288280, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "simple-keyword?", :ns "clojure.core"}, :_id "5926cdd8e4b093ada4d4d761"} {:created-at 1495715310898, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "qualified-keyword?", :ns "clojure.core"}, :_id "5926cdeee4b093ada4d4d763"} {:created-at 1548518287990, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "keyword", :ns "clojure.core"}, :_id "5c4c838fe4b0ca44402ef637"}], :line 568, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"} {:login "borkdude", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/284934?v=4"}], :body "(keyword? 'x)\n;;=> false\n\n(keyword? :x)\n;;=> true\n\n(keyword? true)\n;;=> false\n\n;; Note: some of the keywords below are non-conformant and will not work\n;; with destructuring. For more info see 'keyword'.\n\n(keyword? :-)\n;;=> true\n\n(keyword? :+)\n;;=> true\n\n(keyword? :-o)\n;;=> true\n\n(keyword? :')\n;;=> true\n\n(keyword? :#)\n;;=> true\n\n(keyword? :)\n;;=> true\n\n(keyword? :'/-)\n;;=> true\n\n(keyword? :'//-)\n;;=> true\n\n(keyword? :////)\n;;=> true\n\n(keyword? :'//-,)\n;;=> true\n\n(keyword? :'//,-)\n;;=> ArityException Wrong number of args (2) passed to: core/keyword? clojure.lang.AFn.throwArity (AFn.java:429)\n;; Note: the comma is taken as space, so the code above is equivalent to\n(keyword? :'// -)\n\n(keyword? :-:)\n;;=> RuntimeException Invalid token: :-: clojure.lang.Util.runtimeException (Util.java:221)\n;;=> RuntimeException Unmatched delimiter: ) clojure.lang.Util.runtimeException (Util.java:221)\n;; https://clojure.org/reference/reader states:\n;; \"Symbols beginning or ending with ':' are reserved by Clojure.\"\n\n(keyword? :-:-)\n;;=> true\n;; https://clojure.org/reference/reader states:\n;; \"A symbol can contain one or more non-repeating ':'s\" and:\n;; \"Keywords are like symbols, [...]\"\n\n(keyword? :....)\n;;=> true\n\n(keyword? :,,,,)\n;;=> RuntimeException Invalid token: : clojure.lang.Util.runtimeException (Util.java:221)\n;;=> RuntimeException Unmatched delimiter: ) clojure.lang.Util.runtimeException (Util.java:221)\n;; Note: the comma is taken as space, so the code above is equivalent to\n(keyword? : )\n\n(keyword? :a:b:c)\n;;=> true\n\n(keyword? :a.b.c)\n;;=> true\n\n(keyword? :73)\n;;=> true\n\n", :created-at 1279074168000, :updated-at 1551304081227, :_id "542692c6c026201cdc3268cc"}], :notes nil, :arglists ["x"], :doc "Return true if x is a Keyword", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/keyword_q"} {:added "1.0", :ns "clojure.core", :name "force", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1342465196000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "delay", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d92"}], :line 761, :examples [{:author {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}, :editors [{:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}], :body ";; an example for delay using an event-queue\nuser> (import [java.util.concurrent PriorityBlockingQueue])\njava.util.concurrent.PriorityBlockingQueue\nuser> (defn create-event-element [delayed-event tme]\n (struct event delayed-event tme))\n#'user/create-event-element\nuser> (defn comp-queue [e1 e2]\n (if (< (:time e1) (:time e2))\n true false))\n#'user/comp-queue\nuser> (defn update [n]\n\t(reset! c n))\n#'user/update\nuser> (defn create-event-queue [comp-queue size]\n (new PriorityBlockingQueue size (comp comp-queue)))\n#'user/create-event-queue\nuser> (def queue (create-event-queue comp-queue 10))\n#'user/queue\nuser> (def elements (take 10 (repeatedly \n\t\t\t (fn[](create-event-element \n\t\t\t\t (delay (update (rand-int 20)))\n\t\t\t\t (rand))))))\n#'user/elements\nuser> (def c (atom 0))\n#'user/c\nuser> @c\n0\nuser> (doseq [e elements]\n\t (.add queue e))\nnil\nuser> (dotimes [_ 10]\n\t (let [e (.poll queue)]\n\t\t (println \"c=\" @c)\n\t\t (print \"time=\" (:time e) \":\")\n\t\t (println (force (:object e)))))\nc= 0\ntime= 0.07805244345581108 :19\nc= 19\ntime= 0.24297414417455565 :6\nc= 6\ntime= 0.24427040715816817 :0\nc= 0\ntime= 0.24938478920862384 :17\nc= 17\ntime= 0.33612588239752494 :6\nc= 6\ntime= 0.5148481493716295 :5\nc= 5\ntime= 0.5823642080700586 :7\nc= 7\ntime= 0.7674970100941858 :4\nc= 4\ntime= 0.9206272921555505 :14\nc= 14\ntime= 0.9958255204018474 :4\nnil\nuser> @c\n4\nuser> (def elements (take 10 (repeatedly \n\t\t\t (fn[](create-event-element \n\t\t\t\t (delay (update (rand-int 20)))\n\t\t\t\t (rand))))))\n#'user/elements\n;; if we check 'element', delay objects will be evaluated. The below is\n;; this example. Please compare the above with the below.\nuser> elements \n({:object #, :time 0.48566816399656854} {:object #, :time 0.9374202154797486} {:object #, :time 0.3271116626875401} {:object #, :time 0.8843712542267577} {:object #, :time 0.86383171974926} {:object #, :time 0.2120086056700251} {:object #, :time 0.9406336968276247} {:object #, :time 0.2150071400135528} {:object #, :time 0.7520042839572664} {:object #, :time 0.6264819751284463})\n;; The object of the last elements is #. Therefore,\n;; This indicates the atom 'c' has already updated.\nuser> @c \n1 \nuser> (doseq [e elements]\n\t (.add queue e))\nnil\n;; 'atom c' has never been updated because it has already\n;; been evaluated.\nuser> (dotimes [_ 10]\n\t (let [e (.poll queue)]\n\t\t (println \"c=\" @c)\n\t\t (print \"time=\" (:time e) \":\")\n\t\t (println (force (:object e)))))\nc= 1\ntime= 0.2120086056700251 :14\nc= 1\ntime= 0.2150071400135528 :0\nc= 1\ntime= 0.3271116626875401 :17\nc= 1\ntime= 0.48566816399656854 :16\nc= 1\ntime= 0.6264819751284463 :1\nc= 1\ntime= 0.7520042839572664 :7\nc= 1\ntime= 0.86383171974926 :10\nc= 1\ntime= 0.8843712542267577 :15\nc= 1\ntime= 0.9374202154797486 :19\nc= 1\ntime= 0.9406336968276247 :5\nnil\nuser> ", :created-at 1308852117000, :updated-at 1308852376000, :_id "542692cdc026201cdc326ce6"} {:author {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}, :editors [{:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}], :body ";; the tarai benchmark comparing non-lazy version with lazy-version\n(defn tarai [x y z]\n (if (<= (x) (y))\n (y)\n (recur (fn [] (tarai (fn [] (- (x) 1)) y z))\n (fn [] (tarai (fn [] (- (y) 1)) z x))\n (fn [] (tarai (fn [] (- (z) 1)) x y)))))\n\n(defn tarai-d [x y z]\n (if (<= (force x) (force y))\n (force y)\n (recur (delay (tarai-d (- (force x) 1) y z))\n (delay (tarai-d (- (force y) 1) z x))\n (delay (tarai-d (- (force z) 1) x y)))))\n\nuser> (dotimes [_ 10] (time (tarai (fn [] 192) (fn [] 96) (fn [] 0))))\n\"Elapsed time: 139.660729 msecs\"\n\"Elapsed time: 132.493587 msecs\"\n\"Elapsed time: 135.867772 msecs\"\n\"Elapsed time: 132.924774 msecs\"\n\"Elapsed time: 137.491084 msecs\"\n\"Elapsed time: 134.72752 msecs\"\n\"Elapsed time: 132.969652 msecs\"\n\"Elapsed time: 135.795754 msecs\"\n\"Elapsed time: 134.261724 msecs\"\n\"Elapsed time: 138.059968 msecs\"\n\nnil\nuser> (dotimes [_ 10 ] (time (tarai-d 192 96 0)))\n\"Elapsed time: 3.181795 msecs\"\n\"Elapsed time: 2.960096 msecs\"\n\"Elapsed time: 3.000855 msecs\"\n\"Elapsed time: 3.140536 msecs\"\n\"Elapsed time: 3.658821 msecs\"\n\"Elapsed time: 3.319659 msecs\"\n\"Elapsed time: 2.9182 msecs\"\n\"Elapsed time: 3.125442 msecs\"\n\"Elapsed time: 2.944342 msecs\"\n\"Elapsed time: 2.951613 msecs\"\nnil", :created-at 1308905934000, :updated-at 1308906319000, :_id "542692cdc026201cdc326ce9"} {:updated-at 1564512316203, :created-at 1564511910921, :author {:login "jordangedney", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/5439697?v=4"}, :body ";; Similarly to deref/@ you can evaluate a delay using force\n\nuser> (def new-delay (delay (println \"I only print once\") 5))\n#'user/new-delay\n\nuser> (force new-delay)\nI only print once\n5\n\nuser> (force new-delay)\n5\n\n;; force works with expressions other than delays: \n\nuser> (force (println \"\\\\O\"))\n\\O\nnil\n\nuser> (force :field)\n:field", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/5439697?v=4", :account-source "github", :login "jordangedney"}], :_id "5d408ea6e4b0ca44402ef78d"}], :notes nil, :arglists ["x"], :doc "If x is a Delay, returns the (possibly cached) value of its expression, else returns x", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/force"} {:added "1.1", :ns "clojure.core", :name "bound-fn*", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1350609405000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bound-fn", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e82"}], :line 1994, :examples [{:author {:login "metajack", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/194d8437f5baed192c90be27369c4922?r=PG&default=identicon"}, :editors [], :body "(def ^:dynamic *some-var* nil)\n\n(defn f [] (println *some-var*))\n\n;; run f without a new binding\nuser=> (f)\nnil\nnil\n\n;; run f with a new binding\nuser=> (binding [*some-var* \"hello\"]\n (f))\nhello\nnil\n\n;; run f in a thread with a new binding\nuser=> (binding [*some-var* \"goodbye\"]\n (.start (Thread. f)))\nnil\nnil\n\n;; run a bound f in a thread with a new binding\nuser=> (binding [*some-var* \"goodbye\"]\n (.start (Thread. (bound-fn* f))))\ngoodbye\nnil\n", :created-at 1331769960000, :updated-at 1331769960000, :_id "542692d2c026201cdc326f5d"} {:updated-at 1613596413856, :created-at 1613596413856, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :body ";; Capture thread local bindings so the lazy sequence can realize outside\n;; the binding block\n\n(def ^:dynamic *a* nil)\n\n(binding [*a* 1] (map #(+ % *a*) (range 10)))\n;; NullPointerException clojure.lang.Numbers.ops (Numbers.java:1013)\n\n(binding [*a* 1] (map (bound-fn* #(+ % *a*)) (range 10)))\n;; (1 2 3 4 5 6 7 8 9 10)\n", :_id "602d86fde4b0b1e3652d7456"}], :notes nil, :arglists ["f"], :doc "Returns a function, which will install the same bindings in effect as in\n the thread at the time bound-fn* was called and then call f with any given\n arguments. This may be used to define a helper function which runs on a\n different thread, but needs the same bindings in place.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bound-fn*"} {:added "1.2", :ns "clojure.core", :name "namespace-munge", :file "clojure/core_deftype.clj", :type "function", :column 1, :see-alsos [{:created-at 1559582586002, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "munge", :ns "clojure.core"}, :_id "5cf5577ae4b0ca44402ef747"}], :line 13, :examples [{:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";;; replace \"-\" to \"_\" (this is the only conversion this fn does)\nuser=> (namespace-munge \"hello-world\")\n\"hello_world\"", :author {:avatar-url "https://avatars.githubusercontent.com/u/932074?v=3", :account-source "github", :login "redraiment"}, :created-at 1487211126912, :updated-at 1683030639215, :_id "58a50a76e4b01f4add58fe58"}], :notes nil, :arglists ["ns"], :doc "Convert a Clojure namespace name to a legal Java package name.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/namespace-munge"} {:added "1.2", :ns "clojure.core", :name "group-by", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1318588913000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "partition-by", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bf8"} {:created-at 1332443915000, :author {:login "Cosmi", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10f2eae92de67116fa98d06ec55fcf29?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "frequencies", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bf9"}], :line 7146, :examples [{:author {:login "mvonrohr", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/59714f4428e8ef53b809ee923203531?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; group strings by their length\n(group-by count [\"a\" \"as\" \"asd\" \"aa\" \"asdf\" \"qwer\"])\n;;=> {1 [\"a\"], 2 [\"as\" \"aa\"], 3 [\"asd\"], 4 [\"asdf\" \"qwer\"]}\n\n;; group integers by a predicate\n(group-by odd? (range 10))\n;;=> {false [0 2 4 6 8], true [1 3 5 7 9]}\n", :created-at 1279083015000, :updated-at 1420742429526, :_id "542692cdc026201cdc326cd2"} {:author {:login "Brool", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/781c0e32be2a2f7117dabd76a3fb7c3?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "uvtc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/34f159f89cbd1d9beac0276f5a7af552?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; group by a primary key\n(group-by :user-id [{:user-id 1 :uri \"/\"} \n {:user-id 2 :uri \"/foo\"} \n {:user-id 1 :uri \"/account\"}])\n\n;;=> {1 [{:user-id 1, :uri \"/\"} \n;; {:user-id 1, :uri \"/account\"}],\n;; 2 [{:user-id 2, :uri \"/foo\"}]}\n", :created-at 1285069474000, :updated-at 1420742470832, :_id "542692cdc026201cdc326cd4"} {:editors [{:login "Canna71", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5303303?v=3"}], :body ";; group by multiple criteria\n(def words [\"Air\" \"Bud\" \"Cup\" \"Awake\" \"Break\" \"Chunk\" \"Ant\" \"Big\" \"Check\"])\n(group-by (juxt first count) words)\n\n;;{[\\A 3] [\"Air\" \"Ant\"], \n;;[\\B 3] [\"Bud\" \"Big\"], \n;;[\\C 3] [\"Cup\"], \n;;[\\A 5] [\"Awake\"], \n;;[\\B 5] [\"Break\"], \n;;[\\C 5] [\"Chunk\" \"Check\"]}", :author {:avatar-url "https://avatars.githubusercontent.com/u/5303303?v=3", :account-source "github", :login "Canna71"}, :created-at 1471771939875, :updated-at 1471772272493, :_id "57b97523e4b0709b524f04cf"} {:updated-at 1486507759173, :created-at 1486507759173, :author {:login "pavanred", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/60858?v=3"}, :body "user=> (group-by :category [{:category \"a\" :id 1}\n {:category \"a\" :id 2}\n {:category \"b\" :id 3}])\n;;{\"a\" [{:category \"a\", :id 1} {:category \"a\", :id 2}], \n;; \"b\" [{:category \"b\", :id 3}]}\n\nuser=> (group-by #(get % :category) [{:category \"a\" :id 1}\n {:category \"a\" :id 2}\n {:category \"b\" :id 3}])\n;;{\"a\" [{:category \"a\", :id 1} {:category \"a\", :id 2}], \n;; \"b\" [{:category \"b\", :id 3}]}\n\nuser=> (defn my-category [item] (get item :category))\n;;#'user/my-category\n\nuser=> (group-by my-category [{:category \"a\" :id 1}\n {:category \"a\" :id 2}\n {:category \"b\" :id 3}])\n;;{\"a\" [{:category \"a\", :id 1} {:category \"a\", :id 2}], \n;; \"b\" [{:category \"b\", :id 3}]}\n", :_id "589a4eefe4b01f4add58fe3f"} {:updated-at 1528069898970, :created-at 1528069898970, :author {:login "statcompute", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/4590938?v=4"}, :body "(require '[ultra-csv.core :refer [read-csv]])\n \n(def ds (read-csv \"/home/liuwensui/Downloads/nycflights.csv\"))\n \n(map\n (fn [x] {:year (first (key x))\n :month (last (key x))\n :flights (count (val x))})\n (group-by (juxt :year :month) ds))", :_id "5b147f0ae4b00ac801ed9e0b"} {:editors [{:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}], :body ";; Find anagrams\n(def words [\"meat\" \"mat\" \"team\" \"mate\" \"eat\" \"tea\"])\n\n(group-by set words)\n;;=> {#{\\a \\e \\m \\t} [\"meat\" \"team\" \"mate\"],\n;; #{\\a \\m \\t} [\"mat\"], \n;; #{\\a \\e \\t} [\"eat\" \"tea\"]}\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4", :account-source "github", :login "MicahElliott"}, :created-at 1581460975386, :updated-at 1581461174115, :_id "5e432defe4b0ca44402ef830"}], :notes nil, :arglists ["f coll"], :doc "Returns a map of the elements of coll keyed by the result of\n f on each element. The value at each key will be a vector of the\n corresponding elements, in the order they appeared in coll.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/group-by"} {:added "1.0", :ns "clojure.core", :name "prn", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1290672937000, :author {:login "dale", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a7a1eca257c6cea943fea41e5cc3e9a3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "println", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cc3"} {:created-at 1291028040000, :author {:login "dale", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a7a1eca257c6cea943fea41e5cc3e9a3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pr", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cc4"}], :line 3714, :examples [{:updated-at 1402400103000, :created-at 1335592532000, :body "user=> (prn \"fred\" 1)\n\"fred\" 1\nnil\n\nuser=> (def items [ \"hello\" :a 1 (list :b 2) \\c {:d 4} #{5 6 7} ])\n#'user/items\n\n; prn outputs items in a machine-readable format, such as in a source\n; file. Note the double-quotes around the string \"hello\" and the escaped letter \"c\".\nuser=> (prn items)\n[\"hello\" :a 1 (:b 2) \\c {:d 4} #{5 6 7}]\nnil\n\n; println is for human-readable output, like a report. Note the lack of quotes around the string \"hello\", and the unescaped letter \"c\". \nuser=> (println items)\n[hello :a 1 (:b 2) c {:d 4} #{5 6 7}]\nnil\n\n; pr-str produces a string with escaped punctuation, so that println yields the same result as the original prn call.\nuser=> (println (pr-str items))\n[\"hello\" :a 1 (:b 2) \\c {:d 4} #{5 6 7}]\nnil\n\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon", :account-source "clojuredocs", :login "cloojure"} {:avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon", :account-source "clojuredocs", :login "cloojure"} {:avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon", :account-source "clojuredocs", :login "cloojure"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692d4c026201cdc32703b"}], :notes nil, :arglists ["& more"], :doc "Same as pr followed by (newline). Observes *flush-on-newline*", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/prn"} {:added "1.2", :ns "clojure.core", :name "extend", :file "clojure/core_deftype.clj", :type "function", :column 1, :see-alsos [{:created-at 1326611307000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "satisfies?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e53"} {:created-at 1326611311000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "extends?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e54"} {:created-at 1326611316000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "extenders", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e55"} {:created-at 1394618470000, :author {:login "Chort409", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/73da2cf9145cfb9c900b31436ee435a6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "extend-type", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e56"} {:created-at 1394618476000, :author {:login "Chort409", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/73da2cf9145cfb9c900b31436ee435a6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "extend-protocol", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e57"}], :line 768, :examples [{:author {:login "semperos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/edeae8e7534b3d554e4ec2c35ffc68d?r=PG&default=identicon"}, :editors [{:login "semperos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/edeae8e7534b3d554e4ec2c35ffc68d?r=PG&default=identicon"}], :body "; From Sean Devlin's talk on protocols at Clojure Conj\n(defprotocol Dateable\n (to-ms [t]))\n\n(extend java.lang.Number\n Dateable\n {:to-ms identity})\n\n(extend java.util.Date\n Dateable\n {:to-ms #(.getTime %)})\n\n(extend java.util.Calendar\n Dateable\n {:to-ms #(to-ms (.getTime %))})", :created-at 1296704103000, :updated-at 1296705296000, :_id "542692c7c026201cdc3269d3"} {:updated-at 1542060365406, :created-at 1542060009207, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; \"extend\" enables the definition of concrete implementations\n;; after declaration time. This provides \n;; a lightweight version of abstract methods/classes.\n\n(defprotocol IBaz\n (foo [_])\n (bar [_])\n (baz [_]))\n\n;; DefaultBaz contains some default implementations.\n(def DefaultBaz\n {:foo (fn [_] (str \"DefaultBaz::foo\"))\n :bar (fn [_] (str \"DefaultBaz::bar\"))})\n\n(defrecord MyBaz [])\n\n;; MyBaz accepts \"bar\" as default from the \"super-class\"\n;; but overrides \"foo\". \"baz\" is provided without override.\n(extend MyBaz\n IBaz\n (assoc DefaultBaz \n :foo (fn [this] (str \"MyBaz::foo\"))\n :baz (fn [this] (str \"MyBaz::baz\"))))\n\n(def my-baz (->MyBaz))\n(foo my-baz)\n;; \"MyBaz::foo\"\n\n;; Note: additional \"extend-*\" calls will change all instances\n;; created so far.\n\n(extend-type MyBaz\n IBaz\n (foo [this] (str \"NEW\")))\n\n(foo my-baz)\n;; \"NEW\"", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5be9f7e9e4b00ac801ed9ef3"}], :notes nil, :arglists ["atype & proto+mmaps"], :doc "Implementations of protocol methods can be provided using the extend construct:\n\n (extend AType\n AProtocol\n {:foo an-existing-fn\n :bar (fn [a b] ...)\n :baz (fn ([a]...) ([a b] ...)...)}\n BProtocol \n {...} \n ...)\n \n extend takes a type/class (or interface, see below), and one or more\n protocol + method map pairs. It will extend the polymorphism of the\n protocol's methods to call the supplied methods when an AType is\n provided as the first argument. \n\n Method maps are maps of the keyword-ized method names to ordinary\n fns. This facilitates easy reuse of existing fns and fn maps, for\n code reuse/mixins without derivation or composition. You can extend\n an interface to a protocol. This is primarily to facilitate interop\n with the host (e.g. Java) but opens the door to incidental multiple\n inheritance of implementation since a class can inherit from more\n than one interface, both of which extend the protocol. It is TBD how\n to specify which impl to use. You can extend a protocol on nil.\n\n If you are supplying the definitions explicitly (i.e. not reusing\n exsting functions or mixin maps), you may find it more convenient to\n use the extend-type or extend-protocol macros.\n\n Note that multiple independent extend clauses can exist for the same\n type, not all protocols need be defined in a single extend call.\n\n See also:\n extends?, satisfies?, extenders", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/extend"} {:added "1.0", :ns "clojure.core", :name "unchecked-multiply", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1423522441619, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "*", :library-url "https://github.com/clojure/clojure"}, :_id "54d93a89e4b081e022073c76"} {:created-at 1423522447793, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "*'", :library-url "https://github.com/clojure/clojure"}, :_id "54d93a8fe4b0e2ac61831d31"}], :line 1226, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "kentros", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/765acc548dfd021fd854d75f9da3d0a9?r=PG&default=identicon"}], :body ";; the unchecked-multiply function silently overflows\n\nuser=> (* 1000000000000 10)\n10000000000000\nuser=> (unchecked-multiply 1000000000000 10)\n10000000000000\n\nuser=> (* 3037000500 3037000500)\nArithmeticException integer overflow clojure.lang.Numbers.throwIntOverflow (Numbers.java:1424)\nuser=> (unchecked-multiply 3037000500 3037000500)\n-9223372036709301616\n\n", :created-at 1313910992000, :updated-at 1407321150000, :_id "542692c6c026201cdc326917"}], :notes nil, :arglists ["x y"], :doc "Returns the product of x and y, both long.\n Note - uses a primitive operator subject to overflow.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-multiply"} {:added "1.5", :ns "clojure.core", :name "some->>", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1412083996468, :author {:login "jw-00000", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2936?v=2"}, :to-var {:ns "clojure.core", :name "->>", :library-url "https://github.com/clojure/clojure"}, :_id "542ab11ce4b0df9bb778a59d"} {:created-at 1412084003950, :author {:login "jw-00000", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2936?v=2"}, :to-var {:ns "clojure.core", :name "some->", :library-url "https://github.com/clojure/clojure"}, :_id "542ab123e4b0df9bb778a59e"}], :line 7598, :examples [{:editors [{:login "pzeldin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/12401420?v=3"}], :body ";; an example of looking up a value from a\n;; map and performing an operation(addition)\n;; on it if it exists\nuser=> (some->> {:y 3 :x 5}\n (:y)\n (- 2))\n\n-1\n\n\n;; if we were to look up a value which\n;; doesn't exist, it will safely short-circuit\nuser=> (some->> {:y 3 :x 5}\n (:z)\n (- 2))\n\nnil\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/1583002?v=3", :account-source "github", :login "superfunc"}, :created-at 1446217046027, :updated-at 1457975262515, :_id "56338556e4b04b157a6648dc"}], :macro true, :notes nil, :arglists ["expr & forms"], :doc "When expr is not nil, threads it into the first form (via ->>),\n and when that result is not nil, through the next etc", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/some->>"} {:added "1.4", :ns "clojure.core", :name "default-data-readers", :file "clojure/core.clj", :type "var", :column 1, :see-alsos nil, :line 7750, :examples [{:updated-at 1546539310208, :created-at 1546539310208, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; As of Clojure 1.10 the content is:\ndefault-data-readers\n;; {uuid #'clojure.uuid/default-uuid-reader, \n;; inst #'clojure.instant/read-instant-date}\n\n;; Which allows reading of UUIDs and Instants:\n(type (read-string \"#inst \\\"2017-08-23T10:22:22.000-00:00\\\"\"))\n;; java.util.Date\n(type (read-string \"#uuid \\\"374c8c4-fd89-4f1b-a11f-42e334ccf5ce\\\"\"))\n;; java.util.UUID\n\n;; And is overridable with \"*data-readers*\"\n(binding [*data-readers* {'uuid identity}]\n (read-string \"#uuid \\\"374c8c4-fd89-4f1b-a11f-42e334ccf5ce\\\"\"))\n;; \"374c8c4-fd89-4f1b-a11f-42e334ccf5ce\"\n\n;; Or options from edn/read-string\n(require '[clojure.edn :as edn])\n(edn/read-string {:readers {'inst (constantly :nope)}} \n \"#inst \\\"2017-08-23T10:22:22.000-00:00\\\"\")\n;; :nope", :_id "5c2e512ee4b0ca44402ef60d"}], :notes nil, :arglists [], :doc "Default map of data reader functions provided by Clojure. May be\n overridden by binding *data-readers*.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/default-data-readers"} {:ns "clojure.core", :name "->VecSeq", :file "clojure/gvec.clj", :type "function", :column 1, :see-alsos nil, :line 58, :examples nil, :notes nil, :arglists ["am vec anode i offset"], :doc "Positional factory function for class clojure.core.VecSeq.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/->VecSeq"} {:added "1.0", :ns "clojure.core", :name "even?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "odd?", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1354423235000, :_id "542692ebf6e94c6970521dd1"}], :line 1386, :examples [{:updated-at 1406097631000, :created-at 1279073824000, :body "user=> (even? 2)\ntrue\n\nuser=> (even? 1)\nfalse", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/147981?v=3", :account-source "github", :login "dpritchett"}, :_id "542692ccc026201cdc326cb5"} {:author {:login "replore", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e7869fe1a48cb1814c657eaca6bea3eb?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (filter even? (range 10))\n(0 2 4 6 8)", :created-at 1321356072000, :updated-at 1332949375000, :_id "542692d2c026201cdc326f9e"}], :notes nil, :arglists ["n"], :doc "Returns true if n is even, throws an exception if n is not an integer", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/even_q"} {:added "1.0", :ns "clojure.core", :name "unchecked-dec", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1289217146000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-add", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c37"} {:created-at 1289217151000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-dec", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c38"} {:created-at 1289217154000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-inc", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c39"} {:created-at 1289217159000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-negate", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c3a"} {:created-at 1289217163000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-divide", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c3b"} {:created-at 1289217168000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-subtract", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c3c"} {:created-at 1289217172000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-multiply", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c3d"} {:created-at 1289217176000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-remainder", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c3e"} {:created-at 1423522315984, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "dec", :library-url "https://github.com/clojure/clojure"}, :_id "54d93a0be4b0e2ac61831d2e"} {:created-at 1423522329856, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "dec'", :library-url "https://github.com/clojure/clojure"}, :_id "54d93a19e4b081e022073c75"}], :line 1170, :examples [{:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (unchecked-dec 4)\n3\n\nuser=> (unchecked-dec Integer/MIN_VALUE)\n2147483647\n\n", :created-at 1289217142000, :updated-at 1289267924000, :_id "542692c6c026201cdc326939"} {:updated-at 1488018651069, :created-at 1488018651069, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :body ";; Illustrates the difference between (dec), (dec') and (unchecked-dec)\n\n;; The \"N\" suffix denotes a BigInt instance\n;; https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/BigInt.java\n\nLong/MIN_VALUE\n;;=> -9223372036854775808\n\n(dec Long/MIN_VALUE)\n;;=> ArithmeticException integer overflow clojure.lang.Numbers.throwIntOverflow (Numbers.java:1501)\n\n(dec' Long/MIN_VALUE)\n;;=> -9223372036854775809N \n\n;; Notice how the resulting number becomes POSITIVE:\n(unchecked-dec Long/MIN_VALUE)\n;;=> 9223372036854775807 \n\n\n", :_id "58b15cdbe4b01f4add58fe5e"}], :notes nil, :arglists ["x"], :doc "Returns a number one less than x, a long.\n Note - uses a primitive operator subject to overflow.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-dec"} {:ns "clojure.core", :name "Inst", :file "clojure/core.clj", :type "var", :column 1, :see-alsos nil, :line 6780, :examples nil, :notes nil, :arglists [], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core/Inst"} {:added "1.7", :ns "clojure.core", :name "tagged-literal?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 7719, :examples nil, :notes nil, :arglists ["value"], :doc "Return true if the value is the data representation of a tagged literal", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/tagged-literal_q"} {:added "1.0", :ns "clojure.core", :name "double-array", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1349125799000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "doubles", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ac2"} {:created-at 1349125811000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "aget", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ac3"} {:created-at 1349125816000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "aset", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ac4"} {:created-at 1349125826000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "aset-double", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ac5"}], :line 5317, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; create a double array using double-array\n;; and show it can be used with the standard Java functions\n;; binarySearch and fill\n\nuser=> (def ds (double-array (range 3 20)))\n#'user/ds\nuser=> (type ds)\n[D\nuser=> (vec ds)\n[3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0]\nuser=> (java.util.Arrays/binarySearch ds 10.0)\n7\nuser=> (java.util.Arrays/fill ds 3 8 99.0)\nnil\nuser=> (vec ds)\n[3.0 4.0 5.0 99.0 99.0 99.0 99.0 99.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19\n.0]\nuser=>", :created-at 1313906832000, :updated-at 1313906832000, :_id "542692cac026201cdc326b10"} {:updated-at 1661427039227, :created-at 1661427039227, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=4"}, :body "(double-array [1 2.2 3.5])\n;;=> #object[\"[D\" 0x249e3e74 \"[D@249e3e74\"]\n\n(vec (double-array [1 2.2 3.5]))\n;;=> [1.0 2.2 3.5]", :_id "63075d5fe4b0b1e3652d7651"}], :notes nil, :arglists ["size-or-seq" "size init-val-or-seq"], :doc "Creates an array of doubles", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/double-array"} {:added "1.0", :ns "clojure.core", :name "in-ns", :type "function", :see-alsos [{:created-at 1331258262000, :author {:login "frangio", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/646001f0ba2b7df47a16c0a1d5b62225?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ns", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c41"}], :examples [{:updated-at 1497795624520, :created-at 1285103646000, :body ";; Let's create new namespace, create new variable in it, then access it from\n;; another namespace\n\n;; create the namespace and switch to it\n(in-ns 'first-namespace)\n;;=> #\n\n;; create a variable and check it\n;; first-namespace=> \n(def my-var \"some value\")\n;;=> #'first-namespace/my-var\n\n;; first-namespace=> \nmy-var\n;;=> \"some value\"\n\n;; create another namespace and switch to this one\n;; first-namespace=> \n(in-ns 'second-namespace)\n;;=> #\n\n;; use variable from the other namespace here\n;; second-namespace=> \nfirst-namespace/my-var\n;;=> \"some value\"\n\n;; in-ns works within top-level forms (e.g. the compiler or the REPL)\n;; It may fail when called within a function at runtime because *ns* is a Var\n;; and unless there are thread-local bindings for *ns*, it cannot be set!\nsecond.namespace=> (defn swap-ns! [ns-name] (clojure.core/in-ns ns-name))\n;; #'second.namespace/swap-ns!\n\nsecond.namespace=> (swap-ns! 'other.ns)\n;; #namespace[other.ns]\n\n;; Later, at runtime...\n;; Throws IllegalStateException(\"Can't change/establish root binding of: *ns* with set\")\n;; Remember, *ns* is a root var and in-ns calls set!, which only works after\n;; someone somewhere calls the binding macro (or Java equivalent)\n(defn -main\n [& args]\n (println *ns*)\n (second.namespace/swap-ns! 'arbitrary-namespace))\n;; prints #namespace[clojure.core] and then will crash", :editors [{:avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon", :account-source "clojuredocs", :login "belun"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "Artiavis", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1834136?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon", :account-source "clojuredocs", :login "belun"}, :_id "542692cdc026201cdc326d10"} {:author {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; The \"in-ns\" function works almost the same as \"ns\", but does not load\n;; clojure.core \n\n;; user=>\n(in-ns 'my-namespace)\n;;=> #\n\n;; the function clojure.core/inc won't just work\n;; my-namespace=> \n(inc 1)\n;; java.lang.Exception: Unable to resolve symbol: inc in this context\n;; (NO_SOURCE_FILE:15)\n\n;; my-namespace=>\n(clojure.core/inc 1)\n;;=> 2\n", :created-at 1285105578000, :updated-at 1423811341705, :_id "542692cdc026201cdc326d13"}], :notes nil, :arglists ["name"], :doc "Sets *ns* to the namespace named by the symbol, creating it if needed.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/in-ns"} {:added "1.0", :ns "clojure.core", :name "create-ns", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1284970193000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "remove-ns", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cb1"} {:created-at 1284970227000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "find-ns", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cb2"} {:created-at 1502465564365, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "intern", :ns "clojure.core"}, :_id "598dce1ce4b0d19c2ce9d712"}], :line 4132, :examples [{:author {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:avatar-url "https://avatars.githubusercontent.com/u/412966?v=3", :account-source "github", :login "nasser"}], :body ";; This won't work because the symbol my-new-namespace isn't defined yet\nuser=> (create-ns my-new-namespace)\njava.lang.Exception: Unable to resolve symbol: my-new-namespace in this context (NO_SOURCE_FILE:2)\n\n\n;; This won't work because create-ns expects a symbol, not a string \nuser=> (create-ns \"my-new-namespace\")\njava.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.Symbol (NO_SOURCE_FILE:0)\n\n\n;; Here my-new-namespace is quoted and passed literally to create-ns\n;; without being looked up. It works as documented.\nuser=> (create-ns 'my-new-namespace)\n#\n", :created-at 1284947276000, :updated-at 1457302200380, :_id "542692cac026201cdc326b8f"} {:author {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"}, :editors [{:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:avatar-url "https://avatars.githubusercontent.com/u/340?v=3", :account-source "github", :login "jamesmacaulay"} {:login "siddharthjain-in", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6537820?v=4"}], :body ";; Let's create a namespace and check for our result\n;; the new namespace will be \"my-new-namespace\"\n\n;; it does not exist yet, so looking for it, finds nothing\nuser=> (find-ns 'my-new-namespace) \nnil\n\n;; let's create it\nuser=> (create-ns 'my-new-namespace)\n#\n\n;; now searching for it again will have a result\nuser=> (find-ns 'my-new-namespace)\n#\n", :created-at 1284947982000, :updated-at 1651887290877, :_id "542692cac026201cdc326b91"} {:author {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"}, :editors [{:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; You can create a namespace, not switch to it and still work in, by storing it\n\n;; create the namespace\nuser=> (def for-later-use (create-ns 'my-namespace))\n#'user/for-later-use\n\n;; assign a value for a variable\nuser=> (intern for-later-use 'my-var \"some value\")\n#'my-namespace/my-var\n;; notice how the \"for-later-use\" symbol has been evaluated to the namespace it represents\n\n;; check the new variable\nuser=> my-namespace/my-var\n\"some value\"\n\n;; you can also work on a namespace by using the its name\n;; (but quoting it) instead of the return of \"create-ns\"\nuser=> (intern 'my-namespace 'my-var \"some other value\")\n#'my-namespace/my-var\n\n;; check the new assignment and see what's changed\nuser=> my-namespace/my-var\n\"some other value\"\n", :created-at 1285113908000, :updated-at 1285485928000, :_id "542692cbc026201cdc326b96"}], :notes nil, :arglists ["sym"], :doc "Create a new namespace named by the symbol if one doesn't already\n exist, returns it or the already-existing namespace of the same\n name.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/create-ns"} {:added "1.0", :ns "clojure.core", :name "re-matcher", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1282039999000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "re-find", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b2e"}], :line 4849, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [{:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}], :body "user=> (def *matcher* (re-matcher #\"\\d+\" \"abc12345def\"))\n#'user/*matcher*\n\nuser=> (re-find *matcher*)\n\"12345\"", :created-at 1280546885000, :updated-at 1317219277000, :_id "542692c8c026201cdc326a0d"} {:updated-at 1622895302889, :created-at 1622895302889, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=4"}, :body ";\n; Java supports named capture groups\n;\n; Define a phone number pattern with some named groups\n(let [patt (re-pattern \"(?\\\\d{3})-(?\\\\d{3})-(?\\\\d{4})\")]\n ; `re-matches` will find the capturing groups and stick them in a vector\n ; after the full match The capture groups are numbered starting with 1.\n ; The full match is like group zero.\n (is= [\"619-239-5464\" \"619\" \"239\" \"5464\"] (re-matches patt \"619-239-5464\"))\n\n ; Construct a java.util.regex.Matcher. Keep in mind that it is a mutable object!\n (let [matcher (re-matcher patt \"619-239-5464\")]\n ; Execute the Matcher via `re-find`. It returns all 4 groups and caches them\n (is= [\"619-239-5464\" \"619\" \"239\" \"5464\"] (re-find matcher))\n\n ; `re-groups` simply returns the cached result from the Matcher\n (is= [\"619-239-5464\" \"619\" \"239\" \"5464\"] (re-groups matcher))\n\n ; We need the instance function Matcher.group( ) to\n ; extract the named group\n (is= \"619\" (.group matcher \"area\"))\n (is= \"239\" (.group matcher \"prefix\"))\n (is= \"5464\" (.group matcher \"tail\"))))\n", :_id "60bb6ac6e4b0b1e3652d7507"}], :notes [{:body "17:44 < mearnsh> tsdh: re-matcher should be avoided because the Matcher object it returns mutates in a non-thread-safe way", :created-at 1417436686825, :updated-at 1417436686825, :author {:login "r4um", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/629631?v=3"}, :_id "547c5e0ee4b0dc573b892fe8"} {:author {:login "timmc", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/78608?v=3"}, :updated-at 1461677086067, :created-at 1461677086067, :body "It's fine to use from a controlled context. For instance, if you have a let that creates a Matcher, pulls out groups, and returns the data, you're working in a single-threaded context and the mutable object never even escapes.\n", :_id "571f6c1ee4b0fc95a97eab57"}], :tag "java.util.regex.Matcher", :arglists ["re s"], :doc "Returns an instance of java.util.regex.Matcher, for use, e.g. in\n re-find.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/re-matcher"} {:added "1.0", :ns "clojure.core", :name "defn", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1334710750000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "def", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521edb"} {:created-at 1334710756000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defn-", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521edc"} {:created-at 1361269869000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defmacro", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521edd"} {:created-at 1399636777000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "fn", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ede"} {:created-at 1460434537177, :author {:login "ivanpierre", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/625541?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "declare", :ns "clojure.core"}, :_id "570c7669e4b075f5b2c864e7"}], :line 283, :examples [{:updated-at 1361268155000, :created-at 1279161740000, :body "user=> (defn foo [a b c]\n\t (* a b c))\n#'user/foo\nuser=> (foo 1 2 3)\n6\n\nuser=> (defn bar [a b & [c]]\n (if c\n (* a b c)\n (* a b 100)))\n#'user/bar\nuser=> (bar 5 6)\n3000\nuser=> (bar 5 6 2)\n60\n\nuser=> (defn baz [a b & {:keys [c d] :or {c 10 d 20}}]\n (* a b c d))\n#'user/baz\nuser=> (baz 2 3)\n1200\nuser=> (baz 2 3 :c 5)\n600\nuser=> (baz 2 3 :c 5 :d 6)\n180\n\nuser=> (defn boo [a b & {:keys [c d] :or {c 10 d 20} :as all-specified}]\n (println all-specified)\n (* a b c d))\n#'user/boo\nuser=> (boo 2 3)\nnil\n1200\nuser=> (boo 2 3 :c 5)\n{:c 5}\n600\nuser=> (boo 1 2 :d 3 :c 4)\n{:c 4, :d 3}\n24\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon", :account-source "clojuredocs", :login "AtKaaZ"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692cbc026201cdc326bd1"} {:author {:login "kotarak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon"}, :editors [{:login "kotarak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (defn bar\n ([a b] (bar a b 100))\n ([a b c] (* a b c)))\n#'user/bar\nuser=> (bar 5 6)\n3000\nuser=> (bar 5 6 2)\n60\n", :created-at 1279213901000, :updated-at 1285496324000, :_id "542692cbc026201cdc326bd6"} {:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}], :body ";; You can use destructuring to have keyword arguments. This would be a\n;; pretty verbose version of map (in an example a bit more verbose than\n;; the first above):\n\n(defn keyworded-map [& {function :function sequence :sequence}]\n (map function sequence))\n\n;; You can call it like this:\n\nuser=> (keyworded-map :sequence [1 2 3] :function #(+ % 2))\n(3 4 5)\n\n\n;; The declaration can be shortened with \":keys\" if your local variables \n;; should be named in the same way as your keys in the map:\n\n(defn keyworded-map [& {:keys [function sequence]}]\n (map function sequence))\n", :created-at 1280457897000, :updated-at 1317454000000, :_id "542692cbc026201cdc326bd9"} {:author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :editors [{:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"} {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"} {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}], :body "(defn somefn\n [req1 req2 ;required params\n & {:keys [a b c d e] ;optional params\n :or {a 1 ;optional params with preset default values other than the nil default\n ; b takes nil if not specified on call\n c 3 ; c is 3 when not specified on call\n d 0 ; d is 0 --//--\n ; e takes nil if not specified on call\n }\n :as mapOfParamsSpecifiedOnCall ;takes nil if no extra params(other than the required ones) are specified on call\n }]\n (println req1 req2 mapOfParamsSpecifiedOnCall a b c d e)\n )\n\n=> (somefn 9 10 :b 2 :d 4)\n;9 10 {:b 2, :d 4} 1 2 3 4 nil\nnil\n=> (somefn)\n;ArityException Wrong number of args (0) passed to: funxions$somefn ;clojure.lang.AFn.throwArity (AFn.java:437)\n=> (somefn 9 10)\n;9 10 nil 1 nil 3 0 nil\nnil\n=> (somefn 9 10 :x 123)\n;9 10 {:x 123} 1 nil 3 0 nil\nnil\n=> (somefn 9 10 123)\n;IllegalArgumentException No value supplied for key: 123 ;clojure.lang.PersistentHashMap.create (PersistentHashMap.java:77)\n=> (somefn 9 10 123 45)\n;9 10 {123 45} 1 nil 3 0 nil\nnil\n=> (try \n (somefn 9 10 123)\n (catch IllegalArgumentException e (println \"caught:\" e)))\n;caught: #\nnil", :created-at 1361269606000, :updated-at 1361269847000, :_id "542692d2c026201cdc326f7c"} {:updated-at 1442603127799, :created-at 1442603127799, :author {:login "dxlr8r", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1648056?v=3"}, :body ";; :as only include parameters provided, not the default (:or) ones.\n;; This is some boilerplate code to get around this. \n;; Hopefully not needed in the future revisions of Clojure.\n\n(defn bar [f g h & {:keys [override]}]\n (let [default {:a 1 :b 2 :c 3}\n args (merge default override)]\n (conj '() f g h args)))\n\n(bar 1 2 3 :override {:a 9 :z 5}) ; returns -> ({:z 5, :a 9, :b 2, :c 3} 3 2 1)\n", :_id "55fc6077e4b06a9ffaad4fc1"} {:updated-at 1516276416080, :created-at 1516276416080, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;defn basic examples\n(defn say-hi [name]\n (str \"Hi \" name))\n\n(say-hi \"Jack\")\n;;\"Hi Jack\"\n\n;;the same result using def\n(def say-hello (fn [name]\n (str \"Hello \" name)))\n\n(say-hello \"Bob\")\n;;\"Hello Bob\"\n\n;;the same result using def and an anonymous function\n(def say-bye #(str \"Bye Bye \" %))\n\n(say-bye \"Mark\")\n;;\"Bye Bye Mark\"", :_id "5a608ac0e4b0a08026c48cff"} {:updated-at 1516725425484, :created-at 1516725425484, :author {:login "jakubholynet", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/624958?v=4"}, :body ";;define a function with metadata\n(defn hello {:awesome true} [] nil)\n\n(meta #'hello)\n=>\n{:arglists ([]),\n :awesome true,\n ...\n}\n\n;; define a function with a return value type hint\n(defn hinted ^long [] 42)\n\n(-> #'hinted meta :arglists first meta :tag)\n=> long\n\n;; both metadata on the fn and return type hint (on the argument vector)\n(defn hinted+meta {:awesome true} ^long [] 42)", :_id "5a6764b1e4b09621d9f53a76"} {:updated-at 1547395275348, :created-at 1547395275348, :author {:login "victorb", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/459764?v=4"}, :body ";; Documentation can also be added with `defn`\n=> (defn add \"Adds two numbers\" [x y] (+ x y))\n#'user/add\n\n;; This documentation can be read with the `doc` function\n=> (doc add) \n-------------------------\nuser/add\n([x y])\n Adds two numbers\n\n;; It can also be used when searching for functions with `find-doc`\n=> (find-doc \"two numbers\")\n-------------------------\nuser/add\n([x y])\n Adds two numbers", :_id "5c3b60cbe4b0ca44402ef61a"} {:updated-at 1550694890901, :created-at 1550694890901, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :body ";; prepost-map examples\n\n;; check that exactly one of :a or :b are in the argument map: \n(defn example\n [{:keys [a b]}]\n {:pre [(not (and a b))\n (or a b)]}\n (println a b))\n;; #'user/example\n\n(example {:a 1 :b 2})\n;; Execution error (AssertionError) at user/example (REPL:1).\n;; Assert failed: (not (and a b))\n\n(example {:c 1 :d 2})\n;; Execution error (AssertionError) at user/example (REPL:1).\n;; Assert failed: (or a b)\n\n(example {:a 1 :c 2})\n;; 1 nil\n;; nil\n\n;; check that the error-free average is between the max and min of the arguments:\n(defn avg\n [error & nums]\n {:post [(<= (apply min nums) % (apply max nums))]}\n (/ (apply + error nums)\n (count nums)))\n;; #'user/avg\n\n(avg 0 1 2 3 4 5)\n;; 3\n\n(avg 100 1 2 3 4 5)\n;; Execution error (AssertionError) at user/avg (REPL:1).\n;; Assert failed: (<= (apply min nums) % (apply max nums))\n", :_id "5c6db9eae4b0ca44402ef69c"} {:updated-at 1578771116812, :created-at 1578770937032, :author {:login "boraseoksoon", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/6975179?v=4"}, :body ";; To inverse boolean\n\n(defn ! [bool]\n (if (= bool true)\n false true))\n\n(! true)\n;; => false\n\n(! false)\n;; => true", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/6975179?v=4", :account-source "github", :login "boraseoksoon"}], :_id "5e1a21f9e4b0ca44402ef813"} {:updated-at 1590107719852, :created-at 1590107719852, :author {:login "mdave16", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/15642321?v=4"}, :body "; You can also destructure inside the method\n(defn foo\n \"Will be passed a hash\"\n [{x :bar y :baz}]\n (+ x y))\n\n(foo 1 2)\n; Wrong number of args (2) passed\n\n(foo {:bar 1 :baz 2})\n; 3\n\n(defn potentially-confusing-fn\n \"Will be passed a hash with one key\"\n [{x :match}]\n (* x x))\n\n(potentially-confusing-fn 1)\n; NullPointerException and nil return\n\n(potentially-confusing-fn {:match 2})\n; 4", :_id "5ec71e47e4b087629b5a190d"}], :macro true, :notes nil, :arglists ["name doc-string? attr-map? [params*] prepost-map? body" "name doc-string? attr-map? ([params*] prepost-map? body) + attr-map?"], :doc "Same as (def name (fn [params* ] exprs*)) or (def\n name (fn ([params* ] exprs*)+)) with any doc-string or attrs added\n to the var metadata. prepost-map defines a map with optional keys\n :pre and :post that contain collections of pre or post conditions.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/defn"} {:added "1.0", :ns "clojure.core", :name "ref", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1284616785000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "alter", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d3e"} {:created-at 1284616936000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "ref-set", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d3f"} {:created-at 1323973222000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "add-watch", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d40"} {:created-at 1326521654000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "dosync", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d41"} {:created-at 1349393302000, :author {:login "eric", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2b0c9ae6f1da9716451e7c86bc87230b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "commute", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d42"} {:created-at 1349397556000, :author {:login "eric", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2b0c9ae6f1da9716451e7c86bc87230b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ensure", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d43"} {:created-at 1364770237000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref-history-count", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d44"} {:created-at 1364770253000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref-min-history", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d45"} {:created-at 1364770260000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref-max-history", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d46"} {:created-at 1364873716000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "set-validator!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d47"}], :line 2262, :examples [{:author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"} {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"} {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"} {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"} {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"} {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}], :body "user=> (ref [])\n#\n\nuser=> (ref 1 :validator pos?)\n#\n\n=> (ref 0 :validator pos?)\nIllegalStateException Invalid reference state clojure.lang.ARef.validate (ARef.java:33)\n\n=> (dosync (ref-set (ref 1 :validator pos?) 0))\nIllegalStateException Invalid reference state clojure.lang.ARef.validate (ARef.java:33)\n\n=> (dosync (ref-set (ref 1 :validator pos?) 2))\n2", :created-at 1280779137000, :updated-at 1360387666000, :_id "542692cac026201cdc326b3a"} {:updated-at 1470997853281, :created-at 1470997853281, :author {:login "Lacty", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7412474?v=3"}, :body "; create(ref)\n(def a (ref '(1 2 3)))\n\n; read(deref)\n(deref a) ; -> (1 2 3)\n\n; rewrite(ref-set)\n; (ref-set a '(3 2 1)) err!\n(dosync (ref-set a '(3 2 1)))\n\n(deref a) ; -> (3 2 1)", :_id "57ada55de4b0bafd3e2a04e7"} {:updated-at 1548668131418, :created-at 1548668131418, :author {:login "Activeghost", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10783037?v=4"}, :body ";; EXAMPLE: Storing an object in a state map to control it's lifecycle\n(def state (ref {}))\n\n(defn start->streams\n []\n (log/info \"[start->streams] enter\")\n\n;; deref state and do something with it (in this case, check if we have created it)\n (when (not (instance? KafkaStreams (:streams @state)))\n (let [config-file (s/conform ::configs/configuration-file (configs/config CONFIG_PATH))\n kafka-config (s/conform ::configs/kafka-configuration (:processor.config/kafka-configuration config-file))\n stream-processing-props {StreamsConfig/APPLICATION_ID_CONFIG (:applicationid kafka-config)\n StreamsConfig/COMMIT_INTERVAL_MS_CONFIG (:auto.commit.interval.ms kafka-config)\n StreamsConfig/BOOTSTRAP_SERVERS_CONFIG (:bootstrap-servers kafka-config)\n StreamsConfig/DEFAULT_KEY_SERDE_CLASS_CONFIG (.getName (.getClass (Serdes/String)))\n StreamsConfig/DEFAULT_VALUE_SERDE_CLASS_CONFIG (.getName (.getClass (Serdes/String)))\n StreamsConfig/PROCESSING_GUARANTEE_CONFIG StreamsConfig/EXACTLY_ONCE}]\n (try \n (log/infof \"[start->streams] creating kafka stream with config: %s\" stream-processing-props)\n\n (dosync \n\n;; update the ref and store an object in the state map\n (alter state conj (-> { :streams (KafkaStreams. (topology) (StreamsConfig. stream-processing-props))})))\n (log/info \"[start->streams] stream created\")\n\n (catch Exception e (log/error e)))))\n\n;; deref the state and call an fn on the contained object\n (.start (:streams @state)))\n", :_id "5c4ecce3e4b0ca44402ef655"} {:updated-at 1553601306531, :created-at 1553601306531, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Refs automatically deref their content when used as a function:\n(def m (ref {:a 1 :b 2}))\n\n(m :a)\n;; 1\n\n;; Refs natural ordering is by creation time (oldest first), not their content:\n(def z (ref 10))\n(def y (ref 12))\n(def x (ref 1))\n\n(map deref (sort [x y z]))\n;; (10 12 1)", :_id "5c9a131ae4b0ca44402ef6ca"}], :notes nil, :arglists ["x" "x & options"], :doc "Creates and returns a Ref with an initial value of x and zero or\n more options (in any order):\n\n :meta metadata-map\n\n :validator validate-fn\n\n :min-history (default 0)\n :max-history (default 10)\n\n If metadata-map is supplied, it will become the metadata on the\n ref. validate-fn must be nil or a side-effect-free fn of one\n argument, which will be passed the intended new state on any state\n change. If the new state is unacceptable, the validate-fn should\n return false or throw an exception. validate-fn will be called on\n transaction commit, when all refs have their final values.\n\n Normally refs accumulate history dynamically as needed to deal with\n read demands. If you know in advance you will need history you can\n set :min-history to ensure it will be available when first needed (instead\n of after a read fault). History is limited, and the limit can be set\n with :max-history.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ref"} {:added "1.3", :ns "clojure.core", :name "bigint", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1509577775565, :author {:login "chrm", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/448995?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "biginteger", :ns "clojure.core"}, :_id "59fa542fe4b0a08026c48c90"} {:created-at 1567418361421, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "bigdec", :ns "clojure.core"}, :_id "5d6ce7f9e4b0ca44402ef7aa"}], :line 3619, :examples [{:author {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"} {:login "rebcabin", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/880b0bb3a4be9237326dd69565444dee?r=PG&default=identicon"}], :body "user=> (bigint 30)\n30\n\n\n;; Actually do something BigInteger-ish... (http://download.oracle.com/javase/6/docs/api/)\n\nuser=> (def x (bigint 97))\n#'user/x\n\nuser=> (.isProbablePrime (.toBigInteger x) 100)\ntrue\n", :created-at 1283817133000, :updated-at 1375568824000, :_id "542692cec026201cdc326d94"} {:author {:login "rebcabin", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/880b0bb3a4be9237326dd69565444dee?r=PG&default=identicon"}, :editors [{:login "rebcabin", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/880b0bb3a4be9237326dd69565444dee?r=PG&default=identicon"} {:avatar-url "https://avatars2.githubusercontent.com/u/31996?v=4", :account-source "github", :login "avelino"}], :body "user> (= (bigint 42) (clojure.lang.BigInt/fromBigInteger (BigInteger. \"42\")))\ntrue\nuser> (= 42N (bigint 42))\ntrue\nuser> (= 42 (bigint 42))\ntrue\nuser> (= 42 (clojure.lang.BigInt/fromBigInteger (BigInteger. \"42\")))\ntrue\n", :created-at 1375568690000, :updated-at 1528931565159, :_id "542692d2c026201cdc326f4f"} {:author {:login "rebcabin", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/880b0bb3a4be9237326dd69565444dee?r=PG&default=identicon"}, :editors [{:login "rebcabin", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/880b0bb3a4be9237326dd69565444dee?r=PG&default=identicon"}], :body "user> (reduce * (repeat 20 1000))\nArithmeticException integer overflow clojure.lang.Numbers.throwIntOverflow (Numbers.java:1388)\n\nuser> (reduce * (repeat 20 (bigint 1000)))\n1000000000000000000000000000000000000000000000000000000000000N\n", :created-at 1375569614000, :updated-at 1375569672000, :_id "542692d2c026201cdc326f51"} {:updated-at 1509577762158, :created-at 1509577762158, :author {:login "chrm", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/448995?v=4"}, :body ";; There is a difference between `BigInt` and `BigInteger`. The first is from\n;; Clojure and should be better for performace, because less unboxing is\n;; necessary. The second is from Java and has more functionality.\n;; https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html\n\n(type 123N)\n;; => clojure.lang.BigInt\n\n(type (bigint 123))\n;; => clojure.lang.BigInt\n\n(type (biginteger 123))\n;; => java.math.BigInteger\n\n(.modInverse (bigint 123) (bigint 4))\n;; IllegalArgumentException No matching method found: modInverse for class\n;; clojure.lang.BigInt\n\n(.modInverse (biginteger 123) (biginteger 4))\n;; => 3", :_id "59fa5422e4b0a08026c48c8f"} {:updated-at 1535909892844, :created-at 1535909892844, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/7083783?v=4"}, :body "; It also works for strings\n(bigint \"12345\") => 12345N\n", :_id "5b8c2004e4b00ac801ed9e7e"} {:updated-at 1598220963933, :created-at 1598220963933, :author {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}, :body ";; Take care with ratios the decimal part is removed not rounded\nuser=> (bigint 5/4) ; 1.25\n;; 1N\n\nuser=> (bigint 5/2) ; 2.5\n;; 2N", :_id "5f42eaa3e4b0b1e3652d73a7"}], :notes [{:updated-at 1375486531000, :body "The last example does not seem to work; there seems to be a missing coercion from Clojure BigInt to Java BigInteger. I get
    \r\nIllegalArgumentException No matching method found: isProbablePrime for class clojure.lang.BigInt  clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:53)
    ", :created-at 1375486531000, :author {:login "rebcabin", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/880b0bb3a4be9237326dd69565444dee?r=PG&default=identicon"}, :_id "542692edf6e94c697052200a"}], :tag "clojure.lang.BigInt", :arglists ["x"], :doc "Coerce to BigInt", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bigint"} {:added "1.2", :ns "clojure.core", :name "extends?", :file "clojure/core_deftype.clj", :type "function", :column 1, :see-alsos [{:created-at 1302036433000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defprotocol", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cb6"} {:created-at 1491526670270, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/10404?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defrecord", :ns "clojure.core"}, :_id "58e6e40ee4b01f4add58fe84"} {:created-at 1491526677033, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/10404?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "deftype", :ns "clojure.core"}, :_id "58e6e415e4b01f4add58fe85"} {:created-at 1501651292857, :author {:login "chbrown", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/360279?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "satisfies?", :ns "clojure.core"}, :_id "5981615ce4b0d19c2ce9d705"}], :line 556, :examples [{:author {:login "mstoeckli", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/271f1fe6c39e19db5714ce29b64d3ad5?r=PG&default=identicon"}, :editors [], :body "user=> (defprotocol Area (get-area [this]))\nArea\n\nuser=> (defrecord Rectangle [width height]\n Area\n (get-area [this]\n (* width height)))\nuser.Rectangle\n\n(extends? Area Rectangle)\ntrue\n", :created-at 1337146392000, :updated-at 1337146392000, :_id "542692d3c026201cdc326fa4"}], :notes nil, :arglists ["protocol atype"], :doc "Returns true if atype extends protocol", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/extends_q"} {:added "1.1", :ns "clojure.core", :name "promise", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1343782692000, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "realized?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ed2"} {:created-at 1291473023000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "future", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f35"} {:created-at 1301868450000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "deliver", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f36"}], :line 7096, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "neveu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/197e0539bc06e120eea534aa2a7d3ec0?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (def x (promise))\n#'user/x\n;; Trying to deref at this point will make your repl wait forever\n\n\nuser=> (deliver x 100)\n#<core$promise$reify__5534@4369a50b: 100>\n\n;; the promise has been delivered, deref x will return immediately\nuser=> @x\n100\n\n", :created-at 1280748732000, :updated-at 1285488731000, :_id "542692c7c026201cdc3269c8"} {:author {:login "neotyk", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/366ff985977b3aab09510bc335cd44a4?r=PG&default=identicon"}, :editors [], :body ";; Create a promise\nuser> (def p (promise))\n#'user/p ; p is our promise\n\n;; Check if was delivered/realized\nuser> (realized? p)\nfalse ; No yet\n\n;; Delivering the promise\nuser> (deliver p 42)\n#\n\n;; Check again if it was delivered\nuser> (realized? p)\ntrue ; Yes!\n\n;; Deref to see what has been delivered\nuser> @p\n42\n\n;; Note that @ is shorthand for deref\nuser> (deref p)\n42\n", :created-at 1324962605000, :updated-at 1324962605000, :_id "542692d4c026201cdc32703f"} {:updated-at 1481568139131, :created-at 1474382276273, :author {:login "JoshAaronJones", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19951591?v=3"}, :body ";; Illustrates how threads can work together via promises\n;; First, an example to show a future that delivers\n\nuser=> (def p (promise))\n#'user/p\n\n;; future that will deliver the promise from another thread after 10 sec delay\nuser=> (future\n (Thread/sleep 10000)\n (deliver p 123))\n#future[{:status :pending, :val nil} 0x9a51df1]\n\n;; within 10 seconds dereference p, and wait for delivery of the value\nuser=> @p\n123\n\n\n;; Now, an example to show a future that blocks while waiting for a promise\n;; to be delivered -- this is used to achieve callback-style functionality\n\n;; redefine p\nuser=> (def p (promise))\n#'user/p\n\n;; create a new callback thread that will wait for a promise to be delivered\nuser=> (future\n (println \"About to block while waiting for 'p'\")\n (println \"Now I can do some work with the value \" @p))\nAbout to block while waiting for 'p'\n#future[{:status :pending, :val nil} 0x1737df29]\n\n;; deliver the promise, triggering the blocking callback thread\nuser=> (deliver p 123)\nNow I can do some work with the value 123\n#promise[{:status :ready, :val 123} 0x674a4c4a]", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/19951591?v=3", :account-source "github", :login "JoshAaronJones"} {:login "jamieorc", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2139?v=3"}], :_id "57e149c4e4b0709b524f0502"}], :notes nil, :arglists [""], :doc "Returns a promise object that can be read with deref/@, and set,\n once only, with deliver. Calls to deref/@ prior to delivery will\n block, unless the variant of deref with timeout is used. All\n subsequent derefs will return the same delivered value without\n blocking. See also - realized?.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/promise"} {:added "1.0", :ns "clojure.core", :name "aset-char", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 3981, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; create an array of 10 characters (initially set to blank by default)\n;; and set one of the elements to the character \"a\"\n\nuser=> (def cs (char-array 10))\n#'user/cs\nuser=> (vec cs)\n[\\ \\ \\ \\ \\ \\ \\ \\ \\ \\ ]\nuser=> (aset-char cs 3 \\a)\n\\a\nuser=> (vec cs)\n[\\ \\ \\ \\a \\ \\ \\ \\ \\ \\ ]\nuser=>", :created-at 1313914505000, :updated-at 1313914505000, :_id "542692c9c026201cdc326ad3"}], :notes [{:body "See [aset](http://clojuredocs.org/clojure.core/aset) for illustrations of multi-dimensional syntax.", :created-at 1432829137215, :updated-at 1432829137215, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :_id "55673cd1e4b01ad59b65f4de"}], :arglists ["array idx val" "array idx idx2 & idxv"], :doc "Sets the value at the index/indices. Works on arrays of char. Returns val.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/aset-char"} {:added "1.0", :ns "clojure.core", :name "rseq", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1293103256000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "reverse", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c2e"}], :line 1581, :examples [{:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (vec (range 10))\n[0 1 2 3 4 5 6 7 8 9]\n\nuser=> (rseq (vec (range 10)))\n(9 8 7 6 5 4 3 2 1 0)\n", :created-at 1282324324000, :updated-at 1285494434000, :_id "542692c8c026201cdc326a58"} {:author {:login "clojureking", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/92625b8a6be91bb8c688d0d07b4e2a32?r=PG&default=identicon"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "(rseq (into (sorted-map) {:a 1 :b 2}))\n;; => ([:b 2] [:a 1])", :created-at 1409352627000, :updated-at 1423095124718, :_id "542692d5c026201cdc327078"} {:updated-at 1613699307202, :created-at 1613698736253, :author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :body ";; Huge performance boost for vectors and sorted maps over `reverse`.\n\n(def nums (vec (range 1000000)))\n(time (reverse nums))\n;; \"Elapsed time: 30.1222 msecs\"\n(time (rseq nums))\n;; \"Elapsed time: 0.0664 msecs\"", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4", :account-source "github", :login "Crowbrammer"}], :_id "602f16b0e4b0b1e3652d7457"} {:updated-at 1680191517830, :created-at 1680191517830, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; The docstring doesn't mention sorted-sets directly\n;; Arguably they are implied by mention of sorted-maps\n\n(def ss (into (sorted-set) (range 1e6)))\n\n;; So this is a constant time way of getting the last element:\n\n(time (first (rseq ss)))\n\"Elapsed time: 0.04606 msecs\"\n;; => 999999\n\n;; vs the linear approach:\n\n(time (last ss))\n\"Elapsed time: 164.557625 msecs\"\n;; => 999999\n\n", :_id "6425b01de4b08cf8563f4b88"}], :notes nil, :arglists ["rev"], :doc "Returns, in constant time, a seq of the items in rev (which\n can be a vector or sorted-map), in reverse order. If rev is empty returns nil", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/rseq"} {:added "1.10", :ns "clojure.core", :name "ex-cause", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1636723273402, :author {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ex-info", :ns "clojure.core"}, :_id "618e6a49e4b0b1e3652d756f"} {:created-at 1636723280306, :author {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ex-data", :ns "clojure.core"}, :_id "618e6a50e4b0b1e3652d7570"} {:created-at 1636723289915, :author {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ex-message", :ns "clojure.core"}, :_id "618e6a59e4b0b1e3652d7571"}], :line 4808, :examples [{:updated-at 1636723247465, :created-at 1636723247465, :author {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4"}, :body ";; (ex-cause e) gives you the next linked exception in an Exception-chain\n;; Use \n(def a 1) ;;=> #'user/a\n(def b 0) ;;=> #'user/b\n\n(def chain \n (try \n (/ a b)\n (catch ArithmeticException ae\n (ex-info ;; contextualize ae with ExceptionInfo\n \"Send help, please\"\n {:divisor a\n :divident b}\n ae)))) \n;;=> #'user/chain\n\nchain\n;;=>\n;#error{:cause \"Divide by zero\",\n; :via [{:type clojure.lang.ExceptionInfo,\n; :message \"Send help, please\",\n; :data {:divisor 1, :divident 0},\n; :at [...]}\n; {:type java.lang.ArithmeticException,\n; :message \"Divide by zero\",\n; :at [clojure.lang.Numbers divide \"Numbers.java\" 188]}],\n; :trace [[clojure.lang.Numbers divide \"Numbers.java\" 188]\n; [...]\n; [java.lang.Thread run \"Thread.java\" 829]]}\n\n(ex-cause chain)\n;;=>\n;#error{:cause \"Divide by zero\",\n; :via [{:type java.lang.ArithmeticException, ;; <-- ae is first.\n; :message \"Divide by zero\",\n; :at [clojure.lang.Numbers divide \"Numbers.java\" 188]}],\n; :trace [[clojure.lang.Numbers divide \"Numbers.java\" 188]\n; [...]", :_id "618e6a2fe4b0b1e3652d756e"} {:updated-at 1636972033983, :created-at 1636972033983, :author {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4"}, :body ";; You can use ex-cause to extract the messages of a chain:\n(defn ex-msg-chain [ex delimiter]\n (->> ex\n (iterate ex-cause)\n (take-while some?)\n (mapv ex-message)\n (interpose delimiter)\n (apply str))\n;;=> #'user/ex-msg-chain\n\n;; Let's try this on a simple chained Exception\n(def chained-ex\n (ex-info \"top-level\"\n {:level 1}\n (ex-info \"sec-level\"\n {:level 2}\n (ex-info \"low-level\"\n {:level 3}))))\n;;=> #'user/chained-ex\n\n(ex-msg-chain chained-ex \" -> \")\n;;=> \"top-level -> sec-level -> low-level\"", :_id "61923601e4b0b1e3652d7578"}], :notes nil, :arglists ["ex"], :doc "Returns the cause of ex if ex is a Throwable.\n Otherwise returns nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ex-cause"} {:added "1.0", :ns "clojure.core", :name "construct-proxy", :file "clojure/core_proxy.clj", :type "function", :column 1, :see-alsos [{:created-at 1539823552877, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "get-proxy-class", :ns "clojure.core"}, :_id "5bc7d7c0e4b00ac801ed9edf"} {:created-at 1539823559598, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "proxy", :ns "clojure.core"}, :_id "5bc7d7c7e4b00ac801ed9ee0"}], :line 290, :examples [{:updated-at 1539823495958, :created-at 1539823495958, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Compared to \"proxy\" you have the option to pick different \n;; constructors on the same proxy class.\n\n(def MyThread (get-proxy-class Thread))\n\n(defn t\n ([clazz f] (construct-proxy clazz f))\n ([clazz id f] (construct-proxy clazz f id)))\n\n(str (t MyThread #()))\n;; \"Thread[Thread-2,5,main]\"\n\n(str (t MyThread \"***MYTHREAD***\" #()))\n;; \"Thread[***MYTHREAD***,5,main]\"\n", :_id "5bc7d787e4b00ac801ed9ede"}], :notes nil, :arglists ["c & ctor-args"], :doc "Takes a proxy class and any arguments for its superclass ctor and\n creates and returns an instance of the proxy.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/construct-proxy"} {:added "1.0", :ns "clojure.core", :name "agent-errors", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 2236, :examples nil, :deprecated "1.2", :notes nil, :arglists ["a"], :doc "DEPRECATED: Use 'agent-error' instead.\n Returns a sequence of the exceptions thrown during asynchronous\n actions of the agent.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/agent-errors"} {:added "1.0", :ns "clojure.core", :name "*compile-files*", :type "var", :see-alsos nil, :examples [{:updated-at 1584381840421, :created-at 1584381840421, :author {:login "devn", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/10421?v=4"}, :body ";; Ensure that the `require` doesn't result in AOT'd class files\n(binding [*compile-files* false]\n (require 'foo.bar))", :_id "5e6fbf90e4b087629b5a18bf"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}], :body ";; The \"defruntime\" macro below prevents initialization of a definition \n;; during AOT compilation but allows it (once only) at runtime. Can be used to\n;; load configuration files or other runtime only data.\n\n(defmacro defruntime [sym & body]\n `(defonce ~sym\n (when-not *compile-files* ~@body)))\n\n(defruntime config\n (println \"This won't happen during AOT compile\"))\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1613847596666, :updated-at 1614012007913, :_id "60315c2ce4b0b1e3652d745f"}], :notes nil, :arglists [], :doc "Set to true when compiling files, false otherwise.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*compile-files*"} {:added "1.10", :ns "clojure.core", :name "ex-message", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1602605078561, :author {:login "m0smith", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/398808?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ex-data", :ns "clojure.core"}, :_id "5f85d016e4b0b1e3652d73db"} {:created-at 1602605096620, :author {:login "m0smith", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/398808?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ex-info", :ns "clojure.core"}, :_id "5f85d028e4b0b1e3652d73dc"}], :line 4800, :examples [{:updated-at 1587607327636, :created-at 1587603158684, :author {:login "thiagorfaria", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/5934045?v=4"}, :body "(try\n (let [error-message \"Something went wrong!\"\n error-data {:error 404}]\n (throw (ex-info error-message error-data)))\n (catch Exception e\n (prn (str \"Oops! \" (ex-message e)))\n (prn (str \"Because! \" (ex-data e)))))\n\n;; => \"Oops! Something went wrong!\"\n;; \"Because! {:error 404}\"", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/5934045?v=4", :account-source "github", :login "thiagorfaria"}], :_id "5ea0e6d6e4b087629b5a18dc"}], :notes nil, :arglists ["ex"], :doc "Returns the message attached to ex if ex is a Throwable.\n Otherwise returns nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ex-message"} {:ns "clojure.core", :name "*math-context*", :type "var", :see-alsos [{:created-at 1635281435762, :author {:login "Chouser", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/36110?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "with-precision", :ns "clojure.core"}, :_id "61786a1be4b0b1e3652d755c"}], :examples nil, :notes nil, :tag "java.math.MathContext", :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*math-context*"} {:added "1.0", :ns "clojure.core", :name "float", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1496073295794, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unchecked-float", :ns "clojure.core"}, :_id "592c444fe4b093ada4d4d796"} {:created-at 1593104025671, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "bigdec", :ns "clojure.core"}, :_id "5ef4d699e4b0b1e3652d730f"}], :line 3486, :examples [{:updated-at 1496073286628, :created-at 1283814444000, :body "(float 1)\n;;=> 1.0\n(float 1.11)\n;;=> 1.11\n(float 1.111111111111111111111111111M)\n;;=> 1.1111112\n\n;;;; Note that (float) range checks its argument and throws an exception\n;;;; if the value is out of range.\n;;;; Use (unchecked-float) instead if you want to skip the range checks.\n\n(float Double/MAX_VALUE)\n;;=> IllegalArgumentException Value out of range for float: 1.7976931348623157E308\n(unchecked-float Double/MAX_VALUE)\n;;=> Infinity\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon", :account-source "clojuredocs", :login "Miles"}, :_id "542692c9c026201cdc326afd"} {:editors [{:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}], :body ";; Casting a string does not work\n(float \"123.456\")\n;;=> Execution error (ClassCastException) at user/eval193 (REPL:1).\n;;java.lang.String cannot be cast to java.lang.Number\n\n;; Use Java interop instead\n(Float/parseFloat \"123.456\")\n;;=> 123.456\n\n;; Content originally posted by u/didibus on https://clojuredocs.org/clojure.core/num", :author {:avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4", :account-source "github", :login "wdhowe"}, :created-at 1596590631704, :updated-at 1596590780119, :_id "5f2a0a27e4b0b1e3652d7365"}], :notes nil, :arglists ["x"], :doc "Coerce to float", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/float"} {:added "1.0", :ns "clojure.core", :name "pr-str", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1299623857000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pr", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b27"} {:created-at 1313054793000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "read-string", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b28"} {:created-at 1360241771000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "prn-str", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b29"} {:created-at 1517964034880, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "str", :ns "clojure.core"}, :_id "5a7a4b02e4b0e2d9c35f7420"}], :line 4736, :examples [{:author {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}, :editors [{:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"} {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}], :body "user=> (def x [1 2 3 4 5])\n#'user/x\nuser=> x\n[1 2 3 4 5]\n\n\n;; Turn that data into a string...\nuser=> (pr-str x)\n\"[1 2 3 4 5]\"\n\n\n;; ...and turn that string back into data!\nuser=> (read-string (pr-str x))\n[1 2 3 4 5]\n", :created-at 1284257614000, :updated-at 1287792086000, :_id "542692cbc026201cdc326c20"} {:author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :editors [], :body ";; you can think of pr-str as the inverse of read-string\n;; turn string into symbols\nuser=> (read-string \"(a b foo :bar)\")\n(a b foo :bar)\n\n;;turn symbols into a string\nuser=> (pr-str '(a b foo :bar))\n\"(a b foo :bar)\"", :created-at 1346843924000, :updated-at 1346843924000, :_id "542692d4c026201cdc327032"} {:author {:login "GyrosOfWar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8abc292bf5d9e88cfcbcfbe492774a38?r=PG&default=identicon"}, :editors [{:login "GyrosOfWar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8abc292bf5d9e88cfcbcfbe492774a38?r=PG&default=identicon"} {:login "GyrosOfWar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8abc292bf5d9e88cfcbcfbe492774a38?r=PG&default=identicon"} {:login "GyrosOfWar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8abc292bf5d9e88cfcbcfbe492774a38?r=PG&default=identicon"}], :body "(defn write-object\n \"Serializes an object to disk so it can be opened again later.\n Careful: It will overwrite an existing file at file-path.\"\n [obj file-path]\n (with-open [wr (writer file-path)]\n (.write wr (pr-str obj)))))", :created-at 1391924453000, :updated-at 1391924601000, :_id "542692d4c026201cdc327033"} {:updated-at 1516110350763, :created-at 1516110350763, :author {:login "martinklepsch", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/97496?v=4"}, :body ";; Be careful with side-effects that are part of lazy sequences.\n;; Especially printing can yield unexpected results.\nuser=> (->> (range 10)\n (map #(do (println %) %))\n (pr-str))\n\n\"(0\\n1\\n2\\n3\\n4\\n5\\n6\\n7\\n8\\n9\\n0 1 2 3 4 5 6 7 8 9)\"\n", :_id "5a5e020ee4b0a08026c48cf7"} {:editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :body ";; sometimes when printing lazy sequences you do not get what you want.\n(str (take 5 (range 10)))\n;=> \"clojure.lang.LazySeq@1b554e1\"\n\n;; in those cases `pr-str` to the rescue.\n(pr-str (take 5 (range 10)))\n;=> \"(0 1 2 3 4)\"", :author {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}, :created-at 1517963998229, :updated-at 1517964057656, :_id "5a7a4adee4b0e2d9c35f741f"} {:editors [{:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}], :body ";; Be aware that pr-str and friends are influenced by a couple global variables\n;; such as *print-length*:\n\n(set! *print-length* 10)\n(pr-str (range 15))\n;=> \"(0 1 2 3 4 5 6 7 8 9 ...)\"\n\n(set! *print-length* -1)\n(pr-str (range 15))\n;=> \"(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14)\"", :author {:avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4", :account-source "github", :login "bfontaine"}, :created-at 1522748816082, :updated-at 1522748961361, :_id "5ac34d90e4b045c27b7fac30"}], :notes nil, :tag "java.lang.String", :arglists ["& xs"], :doc "pr to a string, returning it", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/pr-str"} {:added "1.0", :ns "clojure.core", :name "concat", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1332796328000, :author {:login "Olivenmann", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d5b1703fb08dd81e4cb2f653a3aaf10b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "conj", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521da6"} {:created-at 1343083284000, :author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "into", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521da7"} {:created-at 1520441797302, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "lazy-cat", :ns "clojure.core"}, :_id "5aa019c5e4b0316c0f44f90f"} {:created-at 1590171359727, :author {:login "themustafabasit", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/24441401?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "quote", :ns "clojure.core"}, :_id "5ec816dfe4b087629b5a190f"} {:created-at 1597428941227, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "mapcat", :ns "clojure.core"}, :_id "5f36d4cde4b0b1e3652d7377"} {:created-at 1597429044495, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "zipmap", :ns "clojure.core"}, :_id "5f36d534e4b0b1e3652d7378"} {:created-at 1685378146800, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "cat", :ns "clojure.core"}, :_id "6474d462e4b08cf8563f4bbf"} {:created-at 1685378175177, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "cat", :ns "clojure.core.reducers"}, :_id "6474d47fe4b08cf8563f4bc0"}], :line 718, :examples [{:updated-at 1473090562851, :created-at 1279026744000, :body "\nuser=> (concat [1 2] [3 4])\n(1 2 3 4)\n\nuser=> (into [] (concat [1 2] [3 4]))\n[1 2 3 4]\n\nuser=> (concat [:a :b] nil [1 [2 3] 4])\n(:a :b 1 [2 3] 4)\n\n=> (concat [1] [2] '(3 4) [5 6 7] #{9 10 8})\n(1 2 3 4 5 6 7 8 9 10)\n;; The last three elements might appear in a different order.\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon", :account-source "clojuredocs", :login "john.r.woodward"} {:avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon", :account-source "clojuredocs", :login "john.r.woodward"} {:avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon", :account-source "clojuredocs", :login "AtKaaZ"} {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon", :account-source "clojuredocs", :login "kotarak"}, :_id "542692c9c026201cdc326a99"} {:author {:login "Bob Jarvis", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5ba4bce40c00d30a3b924cbaaf94c17a?r=PG&default=identicon"}, :editors [], :body "user=> (concat \"abc\" \"def\")\n(\\a \\b \\c \\d \\e \\f)\n", :created-at 1392247889000, :updated-at 1392247889000, :_id "542692d2c026201cdc326f66"} {:body "user=> (apply concat '(([1 2]) ([3 4] [5 6]) ([7 8])))\n([1 2] [3 4] [5 6] [7 8])\n", :author {:login "prabhathk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/11288784?v=3"}, :created-at 1430731339291, :updated-at 1430731382642, :editors [{:login "prabhathk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/11288784?v=3"}], :_id "55473a4be4b06eaacc9cda88"} {:updated-at 1501863107172, :created-at 1501863107172, :author {:login "RobinNagpal", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/745748?v=4"}, :body "user=> (concat '(1 2 3) '(4 5 6))\n;; (1 2 3 4 5 6)", :_id "59849cc3e4b0d19c2ce9d707"} {:updated-at 1501863170406, :created-at 1501863170406, :author {:login "RobinNagpal", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/745748?v=4"}, :body "user=> (concat [1 2 3] [4 5 6])\n;; (1 2 3 4 5 6)", :_id "59849d02e4b0d19c2ce9d708"} {:editors [{:login "RobinNagpal", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/745748?v=4"}], :body "(concat {:a \"A\" :b \"B\" :c \"C\"} {:d \"D\" :e \"E\"})\n;; ([:a \"A\"] [:b \"B\"] [:c \"C\"] [:d \"D\"] [:e \"E\"])", :author {:avatar-url "https://avatars3.githubusercontent.com/u/745748?v=4", :account-source "github", :login "RobinNagpal"}, :created-at 1501863260134, :updated-at 1501863287333, :_id "59849d5ce4b0d19c2ce9d709"} {:updated-at 1520436404730, :created-at 1520436404730, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body "(defn padding-right [s width pad] \n (apply str (take width (concat s (repeat pad)))))\n\n(padding-right \"Clojure\" 10 \" \")\n;; \"Clojure \"", :_id "5aa004b4e4b0316c0f44f90e"} {:editors [{:login "manojarya", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/2968153?v=4"}], :body ";; beware! concat returns a lazy 'sequence'. \n\n(conj (concat [1 2] [3 4]) 5) ; doesn't return (1 2 3 4 5)\n;;=>(5 1 2 3 4)", :author {:avatar-url "https://avatars0.githubusercontent.com/u/2968153?v=4", :account-source "github", :login "manojarya"}, :created-at 1569483435769, :updated-at 1569512850496, :_id "5d8c6aabe4b0ca44402ef7c1"} {:editors [{:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}], :body ";; Here is a good article by Stuart Sierra in his \"Clojure Dont's\" series\n;; on concat, and how using it in certain ways can lead to surprisingly large\n;; stack usage:\n;; https://stuartsierra.com/2015/04/26/clojure-donts-concat\n\n(first (reduce concat (map next-results (range 1 4000))))\n;; StackOverflowError clojure.core/seq (core.clj:133)\n\n(nth (iterate #(concat % [1 2 3]) [1 2 3]) 4000)\n;; StackOverflowError clojure.core/seq (core.clj:133)", :author {:avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4", :account-source "github", :login "jafingerhut"}, :created-at 1577571723261, :updated-at 1611951560722, :_id "5e07d58be4b0ca44402ef801"} {:updated-at 1590171425117, :created-at 1588243083702, :author {:login "themustafabasit", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/24441401?v=4"}, :body ";; list 1\n(def list1 (list 'let ['x 10]))\n;; => #'user/list1\nlist1\n;; => (let [x 10])\n\n;; list 2\n(def list2 (list '(println \"x:\" x) '(println \"Bye!\")))\n;; => #'user/list2\nlist2\n;; => ((println \"x:\" x) (println \"Bye!\"))\n\n;; ***\n;; concat all the elements of list1 & list2, and return a new list \n;; In this case - let + [x 10] + (println \"x:\" x) + (println \"Bye!\")\n\n(concat list1 list2)\n;; => (let [x 10] (println \"x:\" x) (println \"Bye!\"))\n\n(eval (concat list1 list2))\n;; => x: 10\n;; Bye!\n;; nil\n\n\n;; see also - quote", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/24441401?v=4", :account-source "github", :login "themustafabasit"}], :_id "5eaaaa8be4b087629b5a18ec"} {:editors [{:login "wactbprot", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/113518?v=4"}], :body "(concat [1 2 3] nil)\n;; => (1 2 3)\n\n(concat [1 2 3] [nil])\n;; => (1 2 3 nil)", :author {:avatar-url "https://avatars.githubusercontent.com/u/113518?v=4", :account-source "github", :login "wactbprot"}, :created-at 1612534560315, :updated-at 1612534622108, :_id "601d5320e4b0b1e3652d7449"}], :notes nil, :arglists ["" "x" "x y" "x y & zs"], :doc "Returns a lazy seq representing the concatenation of the elements in the supplied colls.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/concat"} {:added "1.0", :ns "clojure.core", :name "aset-short", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 3971, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; create an array of 10 shorts and set one of the values to 31415\n\nuser=> (def ss (short-array 10))\n#'user/ss\nuser=> (vec ss)\n[0 0 0 0 0 0 0 0 0 0]\nuser=> (aset-short ss 3 31415)\n31415\nuser=> (vec ss)\n[0 0 0 31415 0 0 0 0 0 0]\nuser=>", :created-at 1313915280000, :updated-at 1313915280000, :_id "542692cac026201cdc326b1c"}], :notes [{:body "See [aset](http://clojuredocs.org/clojure.core/aset) for illustrations of multi-dimensional syntax.", :created-at 1432829129279, :updated-at 1432829129279, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :_id "55673cc9e4b01ad59b65f4dd"}], :arglists ["array idx val" "array idx idx2 & idxv"], :doc "Sets the value at the index/indices. Works on arrays of short. Returns val.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/aset-short"} {:added "1.5", :ns "clojure.core", :name "set-agent-send-off-executor!", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1553631504676, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "set-agent-send-executor!", :ns "clojure.core"}, :_id "5c9a8910e4b0ca44402ef6d9"} {:created-at 1553631511505, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "send-via", :ns "clojure.core"}, :_id "5c9a8917e4b0ca44402ef6da"} {:created-at 1559240493574, :author {:login "pdbrown", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1607096?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "shutdown-agents", :ns "clojure.core"}, :_id "5cf01f2de4b0ca44402ef73a"}], :line 2095, :examples [{:updated-at 1553631658338, :created-at 1553631497381, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; This permanently change the thread pool used by agents receiving \n;; tasks with \"send-off\". Use this to control thread pools of applications\n;; you don't own.\n\n(import '[java.util.concurrent Executors])\n(def fj-pool (Executors/newWorkStealingPool 20))\n(set-agent-send-off-executor! fj-pool)", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5c9a8909e4b0ca44402ef6d8"}], :notes nil, :arglists ["executor"], :doc "Sets the ExecutorService to be used by send-off", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/set-agent-send-off-executor!"} {:added "1.0", :ns "clojure.core", :name "ns", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1289000801000, :author {:login "remleduff", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f14b40211cdc07185c43edf8f4bd7a5b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "use", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f07"} {:created-at 1289000808000, :author {:login "remleduff", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f14b40211cdc07185c43edf8f4bd7a5b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "require", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f08"} {:created-at 1289000818000, :author {:login "remleduff", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f14b40211cdc07185c43edf8f4bd7a5b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "refer", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f09"} {:created-at 1291628676000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "import", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f0a"} {:created-at 1312583994000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ns-publics", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f0b"} {:created-at 1340999276000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "in-ns", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f0c"} {:created-at 1355453198000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "remove-ns", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f0d"} {:created-at 1366844150000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ns-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f0e"} {:created-at 1398960898000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "*ns*", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f0f"} {:created-at 1686507880947, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "alias", :ns "clojure.core"}, :_id "64861168e4b08cf8563f4bc9"}], :line 5764, :examples [{:updated-at 1514387836686, :created-at 1279069109000, :body ";; Generate a Java class\n(ns org.clojuredocs.test\n (:gen-class))\n\n(defn -main [] (println \"Hello, World!\"))\n\n\n;; After compilation:\nsh$ java -cp classes org.clojuredocs.test\nHello, World!\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon", :account-source "clojuredocs", :login "devijvers"} {:avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon", :account-source "clojuredocs", :login "devijvers"} {:avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon", :account-source "clojuredocs", :login "devijvers"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:login "jcburley", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/430319?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon", :account-source "clojuredocs", :login "devijvers"}, :_id "542692cac026201cdc326b6e"} {:updated-at 1541261966025, :created-at 1284948992000, :body ";; Let's create a namespace and then assign it as the current namespace\nuser=> (create-ns 'my-new-namespace)\n#namespace[my-new-namespace]\n\nuser=> (ns 'my-new-namespace)\njava.lang.ClassCastException: clojure.lang.PersistentList cannot be cast to\n clojure.lang.Symbol (NO_SOURCE_FILE:26)\n;; oops, this is not the way to do it; if create-ns needs a symbol, ns does not\n\nuser=> (ns my-new-namespace)\nnil\n\nmy-new-namespace=>\n;; it worked as the current namespace is our newly created one\n\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon", :account-source "clojuredocs", :login "belun"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:login "enocom", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1175430?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon", :account-source "clojuredocs", :login "belun"}, :_id "542692cac026201cdc326b73"} {:author {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"}, :editors [{:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Generating a class so we can call Clojure from Java \n(ns com.domain.tiny\n (:gen-class\n :name com.domain.tiny\n :methods [#^{:static true} [binomial [int int] double]]))\n\n(defn binomial\n \"Calculate the binomial coefficient.\"\n [n k]\n (let [a (inc n)]\n (loop [b 1\n c 1]\n (if (> b k)\n c\n (recur (inc b) (* (/ (- a b) b) c))))))\n\n(defn -binomial\n \"A Java-callable wrapper around the 'binomial' function.\"\n [n k]\n (binomial n k))\n\n(defn -main []\n (println (str \"(binomial 5 3): \" (binomial 5 3)))\n (println (str \"(binomial 10042 111): \" (binomial 10042 111))))\n\n\n;; Calling from Java\nimport com.domain.tiny;\n\npublic class Main {\n\n public static void main(String[] args) {\n System.out.println(\"(binomial 5 3): \" + tiny.binomial(5, 3));\n System.out.println(\"(binomial 10042, 111): \" + tiny.binomial(10042, 111));\n }\n}\n\n\n;; The result was:\n(binomial 5 3): 10.0\n(binomial 10042, 111): 4.9068389575068143E263\n\n\n;; Example was borrowed from clartaq @ Stack Overflow", :created-at 1285031740000, :updated-at 1285486378000, :_id "542692cac026201cdc326b76"} {:author {:login "remleduff", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f14b40211cdc07185c43edf8f4bd7a5b?r=PG&default=identicon"}, :editors [{:login "remleduff", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f14b40211cdc07185c43edf8f4bd7a5b?r=PG&default=identicon"} {:login "remleduff", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f14b40211cdc07185c43edf8f4bd7a5b?r=PG&default=identicon"} {:login "remleduff", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f14b40211cdc07185c43edf8f4bd7a5b?r=PG&default=identicon"} {:login "remleduff", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f14b40211cdc07185c43edf8f4bd7a5b?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=3"}], :body ";; Create a namespace named demo.namespace.\n(ns demo.namespace)\n\n;; Clojure recommends namespaces be at least \"two segments\" (ie, they should\n;; have at least one '.') otherwise it will create a class in the \"default\n;; package\", which is discouraged.\n\n;; If this declaration appears in a file named \"demo/namespace.clj\" present\n;; in your classpath, it is known as a \"lib\", \"demo/namespace.clj\" is the lib's\n;; \"root resource\". See http://clojure.org/libs\n\n;; From a clean repl you can load the lib using\nuser=>(require 'demo.namespace) \n; or\nuser=>(use 'demo.namespace)", :created-at 1288999353000, :updated-at 1423811574430, :_id "542692cac026201cdc326b79"} {:author {:login "remleduff", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f14b40211cdc07185c43edf8f4bd7a5b?r=PG&default=identicon"}, :editors [{:login "remleduff", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f14b40211cdc07185c43edf8f4bd7a5b?r=PG&default=identicon"} {:login "remleduff", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f14b40211cdc07185c43edf8f4bd7a5b?r=PG&default=identicon"} {:login "remleduff", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f14b40211cdc07185c43edf8f4bd7a5b?r=PG&default=identicon"} {:login "remleduff", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f14b40211cdc07185c43edf8f4bd7a5b?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=3"}], :body ";; This example will illustrate changing between namespaces at the repl\n\n;; At the repl, the ns macro can be used to create a namespace, but it is\n;; used to change the current namespace (be careful of typos)\nuser=>(ns demo.namespace)\nnil\ndemo.namespace=> ; The prompt at the repl is now \"demo.namespace\" reflecting\n ; that the current namespace is no longer \"user\".\n\n;; Add a new function to demo.namespace\ndemo.namespace=>(defn foo [] (prn \"Hello from demo.namespace\"))\n#'demo.namespace/foo\n\n;; From within \"demo.namespace\" we can use foo without qualifying it\ndemo.namespace=>(foo)\n\"Hello from demo.namespace\"\nnil\n\n;; Switch back to the \"user\" namespace\ndemo.namespace=>(ns user)\nnil\n\n;; We can no longer use \"foo\" without qualification\nuser=> (foo)\njava.lang.Exception: Unable to resolve symbol: foo in this context\n (NO_SOURCE_FILE:4)\n\nuser=> (demo.namespace/foo)\n\"Hello from demo.namespace\"\nnil\n\n;; The public symbols of \"demo.namespace\" can be \"referred into\" the \"user\"\n;; namespace if desired\nuser=> (refer 'demo.namespace)\nnil\n\n;; foo is now an alias in the \"user\" namespace which refers to the\n;; \"demo.namespace/foo\" symbol\nuser=> (foo)\n\"Hello from demo.namespace\"\nnil", :created-at 1289000535000, :updated-at 1423811666025, :_id "542692cac026201cdc326b7e"} {:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [], :body "(ns rosettacode.24game\n (:require [clojure.string :as str])\n (:use clojure.test))\n\n(deftest test\n (is (= \"ABC\" (str/capitalize \"abc\")))", :created-at 1289383303000, :updated-at 1289383303000, :_id "542692cac026201cdc326b83"} {:author {:login "scode", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/87b4fd6e7ac86cbf1f1b683f7856057?r=PG&default=identicon"}, :editors [], :body ";; Multiple required namespaces with aliases\n(ns demo.namespace\n (:require [com.example.httplib :as httplib]\n [com.example.otherlib :as otherlib]))\n", :created-at 1297670267000, :updated-at 1297670267000, :_id "542692cac026201cdc326b84"} {:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body ";; In clojure 1.4 and higher you can use the refer function from within\n;; a require which is equivalent to (:use foo only [...]) but still \n;; allows you to reference the required namespace:\n(ns my.ns.example\n (:require [my.lib :refer [function1 function2]]))\n\n;; And :refer :all is equivalent to :use :\n(ns my.ns.example\n (:require [my.lib :refer :all]))\n", :created-at 1340687963000, :updated-at 1357904913000, :_id "542692d4c026201cdc327014"} {:updated-at 1358656144000, :created-at 1358656144000, :body "(ns foo.bar\n (:refer-clojure :exclude [ancestors printf])\n (:require [clojure.contrib sql sql.tests])\n (:use [my.lib this that])\n (:import [java.util Date Timer Random]\n (java.sql Connection Statement)))", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692d4c026201cdc327017"} {:editors [{:login "PetrGlad", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/124476?v=3"}], :body "; Gotchas\n(ns newns1 [:require clojure.string])\n; newns1=> nil ; Success\n; Note use of vector instead of list - ns macro successfuly processes it \n; but some tools that read this code might not recognize this dependency.\n; Always write ns as per documentation.\n\n(in-ns 'newns2)\n; newns2=> #object[clojure.lang.Namespace 0x29a8c1fb \"newns2\"]\n; New namespace was successfully created\n(first [])\n; newns2=> CompilerException java.lang.RuntimeException: \n; Unable to resolve symbol: first in this context, \n; compiling:(NO_SOURCE_PATH:7:1) \n; Although \"first\" is in core library, it's name is not available here. \n; To fix this do\n(clojure.core/refer-clojure)\n; newns2=> nil\n(first [])\n; newns2=> nil ; Success\n\n; \"ns\" macro both switches to a namespace and refers default library, \n; \"in-ns\" just switches to given namespace\n(ns newns3)\n; newns3=> nil\n(first [])\n; newns3=> nil\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/124476?v=3", :account-source "github", :login "PetrGlad"}, :created-at 1473163926788, :updated-at 1473164242037, :_id "57ceb296e4b0709b524f04e4"} {:updated-at 1508739714948, :created-at 1508739714948, :author {:login "thescalaguy", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/24409454?v=4"}, :body ";; Shows how to use an attr-map\n;; These are arbitrary key-value pairs\n(ns cljdocs.example.core\n \"This is a doc string, FYI :D\"\n {:author \"John Doe\"\n :last-update-date \"23-10-2017\"})\n=> nil\n\n;; The keys in the attr-map are merged with the compiler-generated attr-map\n(meta *ns*)\n=> {:doc \"This is a doc string, FYI :D\", :author \"John Doe\", :last-update-date \"23-10-2017\"}\n", :_id "59ed8a82e4b03026fe14ea93"} {:updated-at 1549690956926, :created-at 1549690956926, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1836941?v=4"}, :body ";; If you import a Java class with an unqualified name (perhaps from local\n;; source file), use the bare class name without placing it in a vector or list:\n(ns foo.bar\n (:import MyClass))", :_id "5c5e684ce4b0ca44402ef674"} {:updated-at 1627881643879, :created-at 1604651002536, :author {:login "green-coder", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4"}, :body ";; References to things in a given namespace can be locally renamed.\n(ns foo.bar\n (:require [clojure.string :refer [blank?]\n :rename {blank? contains-only-spaces-likes?}]))\n\n(contains-only-spaces-likes? \" \")\n; => true\n", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4", :account-source "github", :login "green-coder"}], :_id "5fa507fae4b0b1e3652d73ff"}], :macro true, :notes [{:updated-at 1291628686000, :body "Good description of use/require/import here:\r\n\r\nhttp://blog.8thlight.com/articles/2010/12/6/clojure-libs-and-namespaces-require-use-import-and-ns", :created-at 1291628686000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fac"} {:body "[How to `ns` — Stuart Sierra’s Opinionated Style Guide for Clojure Namespace Declarations]( https://stuartsierra.com/2016/clojure-how-to-ns.html)\n> Make it look like this:\n>
    (ns com.example.my-application.server\n  \"Example application HTTP server and routing.\"\n  (:refer-clojure :exclude [send])\n  (:require\n   [clojure.core.async :as async :refer [! >!!]]\n   [com.example.my-application.base]\n   [com.example.my-application.server.sse :as server.sse]\n   [io.pedestal.http :as http]\n   [io.pedestal.http.sse :as http.sse]\n   [ring.util.response :as response])\n  (:import\n   (java.nio.file Files LinkOption)\n   (org.apache.commons.io FileUtils)))
    ", :created-at 1597543297488, :updated-at 1597552862469, :author {:avatar-url "https://avatars3.githubusercontent.com/u/2316604?v=4", :account-source "github", :login "finalfantasia"}, :_id "5f389381e4b0b1e3652d7379"} {:author {:login "matasaru", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1546100?v=4"}, :updated-at 1668983174412, :created-at 1668983174412, :body "The post referred in the first note has moved to:\n\nhttps://8thlight.com/insights/clojure-libs-and-namespaces-require-use-import-and-ns", :_id "637aa986e4b0b1e3652d768c"}], :arglists ["name docstring? attr-map? references*"], :doc "Sets *ns* to the namespace named by name (unevaluated), creating it\n if needed. references can be zero or more of: (:refer-clojure ...)\n (:require ...) (:use ...) (:import ...) (:load ...) (:gen-class)\n with the syntax of refer-clojure/require/use/import/load/gen-class\n respectively, except the arguments are unevaluated and need not be\n quoted. (:gen-class ...), when supplied, defaults to :name\n corresponding to the ns name, :main true, :impl-ns same as ns, and\n :init-impl-ns true. All options of gen-class are\n supported. The :gen-class directive is ignored when not\n compiling. If :gen-class is not supplied, when compiled only an\n nsname__init.class will be generated. If :refer-clojure is not used, a\n default (refer 'clojure.core) is used. Use of ns is preferred to\n individual calls to in-ns/require/use/import:\n\n (ns foo.bar\n (:refer-clojure :exclude [ancestors printf])\n (:require (clojure.contrib sql combinatorics))\n (:use (my.lib this that))\n (:import (java.util Date Timer Random)\n (java.sql Connection Statement)))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ns"} {:added "1.0", :ns "clojure.core", :name "symbol", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1289212889000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "var", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d00"} {:created-at 1289212892000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "var?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d01"} {:created-at 1331269623000, :author {:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "symbol?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d02"} {:created-at 1331269707000, :author {:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "name", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d03"} {:created-at 1331269713000, :author {:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "namespace", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d04"} {:created-at 1350410406000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "keyword", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d05"} {:created-at 1450416041205, :author {:login "blx", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/887504?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "resolve", :ns "clojure.core"}, :_id "567397a9e4b09a2675a0ba79"} {:created-at 1571179415471, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "deref", :ns "clojure.core"}, :_id "5da64b97e4b0ca44402ef7cd"}], :line 589, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; Returns a symbol with the given namespace and name.\n;;\n;; (symbol name): name can be a string or a symbol.\n;;\n;; (symbol ns name): ns and name must both be strings.\n;;\n;; A symbol string begins with a non-numeric character and can contain\n;; alphanumeric characters and *, +, !, -, _, and ?. (see\n;; http://clojure.org/reader for details).\n;;\n;; symbol does not validate input strings for ns and name, and may return\n;; improper symbols with undefined behavior for non-conformant ns and\n;; name.\n\nuser=> (symbol 'foo)\nfoo\n\nuser=> (symbol \"foo\")\nfoo\n\nuser=> (symbol \"clojure.core\" \"foo\")\nclojure.core/foo\n", :created-at 1280546541000, :updated-at 1331646095000, :_id "542692c8c026201cdc326a06"} {:updated-at 1406075648000, :created-at 1331680187000, :body ";; some gotchas to be aware of:\n\nuser=> (symbol \"user\" 'abc)\nClassCastException clojure.lang.Symbol cannot be cast to java.lang.String clojure.core/symbol (core.clj:523)\n\nuser=> (symbol *ns* \"abc\")\nClassCastException clojure.lang.Namespace cannot be cast to java.lang.String clojure.core/symbol (core.clj:523)\n\nuser=> (symbol 'user \"abc\")\nClassCastException clojure.lang.Symbol cannot be cast to java.lang.String clojure.core/symbol (core.clj:523)\n\n\n;; Warning - the following generated symbols are non-conformant and may wreak\n;; serious havoc in the near/far future when least expected...\n\nuser=> (symbol \"abc def\")\nabc def\n\nuser=> (symbol \"123def\")\n123def\n\nuser=> (symbol \"/123/def/ghi\")\n/123/def/ghi\n\nuser=> (symbol \"/abc/def/ghi\")\n/abc/def/ghi", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"}], :author {:avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon", :account-source "clojuredocs", :login "franks42"}, :_id "542692d5c026201cdc3270a0"} {:body ";; but keywords and numbers are not names\n(symbol 3)\n;; Long cannot be cast to String\n\n;; ... and so they cannot be converted to symbols\n(symbol :dog) \n;; Keyword cannot be cast to String", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1412434976752, :updated-at 1412435184005, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :_id "54300c20e4b05f4d257a29a3"}], :notes nil, :tag "clojure.lang.Symbol", :arglists ["name" "ns name"], :doc "Returns a Symbol with the given namespace and name. Arity-1 works\n on strings, keywords, and vars.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/symbol"} {:added "1.0", :ns "clojure.core", :name "to-array-2d", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1375613655000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "to-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eac"}], :line 4003, :examples [{:author {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user> (def a (to-array-2d [[1 2 3][4 5 6]]))\n#'user/a\nuser> (alength a)\n2\nuser> (alength (aget a 0))\n3\nuser> (aget a 0 0)\n1\nuser> (aget a 0 1)\n2\nuser> (aget a 0 2)\n3\nuser> (aget a 1 0)\n4\nuser> (aget a 2 0)\n→ ERROR\nnil\n\nuser> ", :created-at 1307740341000, :updated-at 1325519043000, :_id "542692cac026201cdc326b5b"} {:updated-at 1486711509639, :created-at 1313976771000, :body ";; quick example of a ragged array where the length of each element of the \n;; 2d array is unique\n\nuser=> (def a (to-array-2d [[0][1 2][3 4 5][6 7 8 9]]))\n#'user/a\nuser=> (map alength [(aget a 0)(aget a 1)(aget a 2)])\n(1 2 3)\nuser=>\nuser=> (aget a 0 2)\nArrayIndexOutOfBoundsException java.lang.reflect.Array.get (Array.java:-2)", :editors [{:login "zezhenyan", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8064559?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon", :account-source "clojuredocs", :login "shockbob"}, :_id "542692cac026201cdc326b5d"}], :notes nil, :tag "[[Ljava.lang.Object;", :arglists ["coll"], :doc "Returns a (potentially-ragged) 2-dimensional array of Objects\n containing the contents of coll, which can be any Collection of any\n Collection.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/to-array-2d"} {:added "1.0", :ns "clojure.core", :name "mod", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1305751254000, :author {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rem", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e34"} {:created-at 1414324069552, :author {:login "alilee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/16739?v=2"}, :to-var {:ns "clojure.core", :name "quot", :library-url "https://github.com/clojure/clojure"}, :_id "544cdf65e4b03d20a102427c"} {:created-at 1468958800877, :author {:login "chrismurrph", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10278575?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "/", :ns "clojure.core"}, :_id "578e8850e4b0bafd3e2a04b3"}], :line 3566, :examples [{:author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :editors [{:login "jeffmad", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c526ef2dcf52b0cf18875fcb5616cee0?r=PG&default=identicon"} {:login "jeffmad", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c526ef2dcf52b0cf18875fcb5616cee0?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "rvlieshout", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/139665?v=2"}], :body "user=> (mod 10 5)\n0\n\nuser=> (mod 10 6)\n4\n\nuser=> (mod 10 10)\n0\n\nuser=> (mod 10 -1)\n0\n\n;; The mod function is defined as the amount by which a number exceeds the\n;; largest integer multiple of the divisor that is not greater than that number.\n;; The largest integer multiple of 5 not greater than -2 is 5 * -1 = -5.\n;; The amount by which -2 exceeds -5 is 3. \n;;\nuser=> (mod -2 5) \n3", :created-at 1279992236000, :updated-at 1415184216966, :_id "542692cec026201cdc326d7d"} {:updated-at 1558287692250, :created-at 1466434631179, :author {:login "dijonkitchen", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/11434205?v=3"}, :body ";; rem and mod are commonly used to get the remainder.\n;; mod means Knuth's mod, Don't confuse it with ANSI C's %\n;; operator, which despite being pronounced\n;; 'mod' actually implements rem, i.e. -10 % 3 = -1.\n;; mod has sign of divisor.\n;; Absolute value depends on dividend and divisor having \n;; same sign or not.\n\nuser=> (mod -10 3)\n2\n\nuser=> (rem -10 3)\n-1\n\nuser=> (mod 10 -3)\n-2\nuser=> (mod -10 -3)\n-1\nuser=> (mod 10 3)\n1", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/7660326?v=4", :account-source "github", :login "Shinkenjoe"} {:login "vaer-k", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4069456?v=4"}], :_id "57680447e4b0bafd3e2a048a"} {:updated-at 1486561191724, :created-at 1486561191724, :author {:login "betegelse", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6758479?v=3"}, :body ";; It works for float / double numbers, too, where it is defined as\n;; (- n (* (Math/floor (/ n d)) d))\n\nuser=> (mod 1.5 1)\n;;=> 0.5\n\nuser=> (mod 475.095 7)\n;;=> 6.095000000000027\n\nuser=> (mod 1024.8402 5.12)\n;;=> 0.8402000000000953\n\nuser=> (mod -1024.8402 5.12)\n;;=> 4.279799999999905\n\nuser=> (let [n 1024.8402\n d 5.12\n q (Math/floor (/ n d))\n r (mod n d)]\n (->> (* q d) (+ r) (- n)))\n;;=> 0.0\n", :_id "589b1fa7e4b01f4add58fe40"}], :notes [{:updated-at 1314955596000, :body "The difference between **rem** and **mod** can be remembered by noting that **mod** always returns a value between 0 and div.", :created-at 1314955596000, :author {:login "wdkrnls", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/6d08a2f792f289b95fe1d982d4133d71?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fc8"} {:updated-at 1350500565000, :body "I am confused by the comment about the definition on lines 13+ of the example - which is not accurate when invoking mod when 'num' is positive and 'div' negative. Applying the definition to
    (mod 10 -3)
    we have \r\n
  • the largest multiple of -3 not exceeding 10 is 9, from using -3 as a multiplier
  • \r\n
  • however (mod 10 -3) yields -2, meaning that 10 exceeds the largest multiple not greater than 10 by -2 i.e. 10 - -2 = 12 is the largest multiple <= 10, a contradiction.
  • \r\n
  • therefore (mod 10 -3) should yield 1, not -2
  • \r\n\r\nSo unless I misunderstood, the definition should be changed to something like:
    \r\n

    \"The mod function is defined as the amount by which a number exceeds the largest integer multiple of the divisor that is not greater than that number, except when the number is positive and the divisor negative, in which case the result is the amount by which the number exceeds the smallest multiple that is not smaller than the number.\"

    \r\n\r\nOr, change the implementation to something similar to:\r\n\r\n
    (defn mod-2\r\n\t  [num div]\r\n\t  (let [m (rem num div)]\r\n\t    (if (or (zero? m) (= (pos? num) (pos? div)))\r\n\t     \tm\r\n\t     \t(if (pos? div) (+ m div) m)))) \r\n
    \r\n\t \t\r\nto fit the current definition.", :created-at 1350430293000, :author {:login "kingcode", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3d7dd4232cb043d2a3efd99e08ff0983?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fef"}], :arglists ["num div"], :doc "Modulus of num and div. Truncates toward negative infinity.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/mod"} {:added "1.0", :ns "clojure.core", :name "amap", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "areduce", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342853671000, :_id "542692ebf6e94c6970521d8d"} {:created-at 1346930905000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d8e"}], :line 5249, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "(def an-array (int-array 25000 (int 0)))\n\nuser=> (time (amap ^ints an-array \n idx \n ret \n (+ (int 1) \n (aget ^ints an-array idx))))\n\n\"Elapsed time: 14.708653 msecs\"\n\n;; Note: without type hinting the performance of would not be good.", :created-at 1281078010000, :updated-at 1285495171000, :_id "542692ccc026201cdc326c51"}], :macro true, :notes nil, :arglists ["a idx ret expr"], :doc "Maps an expression across an array a, using an index named idx, and\n return value named ret, initialized to a clone of a, then setting \n each element of ret to the evaluation of expr, returning the new \n array ret.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/amap"} {:added "1.0", :ns "clojure.core", :name "pop", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1366675885000, :author {:login "jjcomer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ef581bba2f97adb539c67a35465b3e1b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "peek", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e4d"} {:created-at 1399433581000, :author {:login "Yun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f18708f979ad613ab134cb5002558965?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rest", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e4e"} {:created-at 1400493789000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "conj", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e4f"} {:created-at 1580395434633, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "butlast", :ns "clojure.core"}, :_id "5e32ebaae4b0ca44402ef829"}], :line 1467, :examples [{:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (peek [1 2 3])\n3\nuser=> (pop [1 2 3])\n[1 2]\nuser=> (peek '(1 2 3))\n1\nuser=> (pop '(1 2 3))\n(2 3)", :created-at 1282321157000, :updated-at 1332951332000, :_id "542692cec026201cdc326db5"} {:updated-at 1523918116720, :created-at 1486084396464, :author {:login "HomoEfficio", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/17228983?v=3"}, :body "user=> (peek ())\nnil\nuser=> (pop ())\nIllegalStateException Can't pop empty list\n\nuser=> (peek [])\nnil\nuser=> (pop [])\nIllegalStateException Can't pop empty vector\n\nuser=> (peek (clojure.lang.PersistentQueue/EMPTY))\nnil\nuser=> (into [] (pop (clojure.lang.PersistentQueue/EMPTY)))\n[] ;; Can pop empty Queue", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5893d92ce4b01f4add58fe39"} {:updated-at 1518213815646, :created-at 1518213815646, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Use a vector as a LIFO stack to check for balanced brackets\n\n(require '[clojure.set :refer [map-invert]])\n\n(defn balance [form]\n (let [brackets {\\[ \\] \\( \\) \\{ \\}}\n scan (fn [q x]\n (cond\n (brackets x) (conj q x)\n ((map-invert brackets) x)\n (if (= (brackets (peek q)) x)\n (pop q)\n (throw\n (ex-info\n (str \"Unmatched delimiter \" x) {})))\n :else q))]\n (reduce scan [] form)))\n\n(balance \"(let [a (inc 1]) (+ a 2))\")\n;; ExceptionInfo Unmatched delimiter ]\n\n(balance \"(let [a (inc 1)] (+ a 2))\")\n;; []\n", :_id "5a7e1ab7e4b0316c0f44f8b4"} {:updated-at 1518707324327, :created-at 1518707324327, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;basic example on vector and list\n\n;;pop on vector returns a new vector removing the last element\n(pop [1 2 3])\n;; [1 2]\n\n;;pop on list returns a new list removing the first element\n(pop '(1 2 3)) ;; (2 3)", :_id "5a85a27ce4b0316c0f44f8be"}], :notes [{:updated-at 1349888752000, :body "Small reminder:\r\n\r\n
    \r\nDo not work for arbitrary seq but just for persistent types implementing clojure.lang.IPersistentStack (like clojure.lang.Persistent*).\r\n\r\n
    \r\nExample:\r\n
    user> (pop (cons 1 '()))\r\n; Evaluation aborted.\r\n
    \r\ndo not work because type is clojure.lang.Cons but\r\n\r\n
    user> (pop (conj '() 1))\r\n()\r\n
    \r\nworks because type is clojure.lang.PersistentList.", :created-at 1349885055000, :author {:login "tomby42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/305033855efb82d6041586b874b5bb24?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521feb"}], :arglists ["coll"], :doc "For a list or queue, returns a new list/queue without the first\n item, for a vector, returns a new vector without the last item. If\n the collection is empty, throws an exception. Note - not the same\n as next/butlast.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/pop"} {:added "1.0", :ns "clojure.core", :name "use", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1284770251000, :author {:login "rbolkey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d537f88b794c220d6ce447add22c12a7?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "refer", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dd2"} {:created-at 1284770260000, :author {:login "rbolkey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d537f88b794c220d6ce447add22c12a7?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "require", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dd3"} {:created-at 1289380610000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ns", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dd4"} {:created-at 1291628646000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "import", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dd5"}], :line 6093, :examples [{:author {:login "scode", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/87b4fd6e7ac86cbf1f1b683f7856057?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Use the namespace clojure.java.io:\nuser=> (use '(clojure.java io))\n\n", :created-at 1279160083000, :updated-at 1285497782000, :_id "542692cfc026201cdc326e03"} {:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "clizzin", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/555813697e5dc358bb27d5efd3ffa23?r=PG&default=identicon"}], :body ";; Imports only the split function from clojure.string.\nuser=> (use '[clojure.string :only (split)])\nnil\n\n;; split is now available without a namespace qualification.\nuser=> (split \"hello world\" #\" \")\n[\"hello\" \"world\"]\n\n;; You can also add the :as keyword to import the rest of clojure.string\n;; with a namespace qualification.\nuser=> (use '[clojure.string :as s :only (split)])\nnil\n\n;; Now we can access any function in clojure.string using s.\nuser=> (s/replace \"foobar\" \"foo\" \"squirrel\")\n\"squirrelbar\"\n\n;; And we can still call split with or without the s qualification.\nuser=> (split \"hello world\" #\" \")\n[\"hello\" \"world\"]\nuser=> (s/split \"hello world\" #\" \")\n[\"hello\" \"world\"]", :created-at 1279596076000, :updated-at 1294233809000, :_id "542692cfc026201cdc326e05"} {:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [{:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}], :body "(ns some.namespace\n (:require [clojure.contrib.json :as json])\n (:use [clojure.string :only [trim lower-case split]]\n [clojure.contrib.shell-out]\n [clojure.pprint]\n [clojure.test]))\n", :created-at 1291021620000, :updated-at 1338424818000, :_id "542692cfc026201cdc326e08"} {:updated-at 1474049969039, :created-at 1474049969039, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :body ";; use accepts other keywords from require that aren't listed in the docstring.\n\n;; If you try to load a namespace, and it fails to load due to an error in\n;; the source code, when you load it again after fixing the problem, you\n;; can get a \"namespace not found\" exception. Use :reload to avoid this:\n(use '[my.namespace] :reload)\n\n;; However, if the error was in source for a namespace required or used\n;; from my.namespace, you'll get the \"namespace not found\" exception\n;; after fixing the problem, even using :reload. Use :reload-all to avoid this:\n(use '[my.namespace] :reload-all)\n\n;; You can also use :verbose, which does what you would think it would do:\n(use '[my.namespace] :verbose)", :_id "57dc37b1e4b0709b524f04fb"} {:updated-at 1648959694945, :created-at 1648959694945, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}, :body ";; As the docstring says,\n;;\n;; The arguments and semantics for :exclude, :only, and :rename are the same\n;; as those documented for clojure.core/refer\n;;\n;; but the syntax for these options is derived from require, not refer.\n;; Here is an example using Clojure 1.11, in which the abs function was\n;; introduced into clojure.core.\n\n;; First let's try it with require and refer separately:\nuser=> (require 'clojure.math.numeric-tower)\nnil\nuser=> (refer 'clojure.math.numeric-tower :exclude '[abs])\nnil\nuser=> abs\n#object[clojure.core$abs 0x36fdf831 \"clojure.core$abs@36fdf831\"]\n;; The last line shows that we've correctly excluded the version of\n;; abs that numeric-tower defines, and instead are using the version of abs\n;; that's now in clojure.core.\n\n;; Now let's try it with use. The refer-style syntax doesn't work:\nuser=> (use 'clojure.math.numeric-tower :exclude '[abs])\nSyntax error compiling at (/private/var/folders/68/d0l7z7p906l07fj6s7j5_ygm0000gq/T/form-init6849217183418449171.clj:1:1).\nUnsupported option(s) supplied: :exclude\n;; Instead :exclude must be wrapped up with the namespace in a sequence,\n;; as with options for require:\nuser=> (use '[clojure.math.numeric-tower :exclude [abs]])\nnil\nuser=> abs\n#object[clojure.core$abs 0x13abd924 \"clojure.core$abs@13abd924\"]\n", :_id "624920cee4b0b1e3652d75ca"}], :notes [{:updated-at 1291628658000, :body "Good description of use/require/import here:\r\n\r\nhttp://blog.8thlight.com/articles/2010/12/6/clojure-libs-and-namespaces-require-use-import-and-ns", :created-at 1291628658000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fab"} {:updated-at 1318868130000, :body "http://blog.8thlight.com/colin-jones/2010/12/05/clojure-libs-and-namespaces-require-use-import-and-ns.html", :created-at 1318868130000, :author {:login "vikbehal", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b773242b82712096e51f5f6aed5f9abd?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fd0"} {:author {:login "rafaroca", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/609454?v=4"}, :updated-at 1667422305527, :created-at 1667422305527, :body "The blog post from 8thlight is not available under the above URL anymore. The Wayback Machine has a snapshot of it.\n\nhttps://web.archive.org/web/20220323035057/https://8thlight.com/blog/colin-jones/2010/12/05/clojure-libs-and-namespaces-require-use-import-and-ns.html", :_id "6362d861e4b0b1e3652d7680"}], :arglists ["& args"], :doc "Like 'require, but also refers to each lib's namespace using\n clojure.core/refer. Use :use in the ns macro in preference to calling\n this directly.\n\n 'use accepts additional options in libspecs: :exclude, :only, :rename.\n The arguments and semantics for :exclude, :only, and :rename are the same\n as those documented for clojure.core/refer.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/use"} {:ns "clojure.core", :name "unquote", :file "clojure/core.clj", :type "var", :column 1, :see-alsos [{:created-at 1319196053000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unquote-splicing", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d5d"} {:created-at 1537911869941, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "quote", :ns "clojure.core"}, :_id "5baaac3de4b00ac801ed9ea6"}], :line 13, :examples [{:author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=2"}, :editors [{:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=2"}], :body "user=> (let [x 2]\n `(1 x 3))\n(1 user/x 3)\n\nuser=> (let [x 2]\n `(1 ~x 3))\n(1 2 3)\n", :created-at 1305077398000, :updated-at 1305077465000, :_id "542692cec026201cdc326d76"} {:author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :editors [], :body "user=> `(1 (dec 3) 3)\n\n(1 (clojure.core/dec 3) 3)\n\nuser => `(1 ~(dec 3) 3)\n\n(1 2 3)", :created-at 1319196729000, :updated-at 1319196729000, :_id "542692d5c026201cdc3270af"}], :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unquote"} {:added "1.0", :ns "clojure.core", :name "declare", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1336168390000, :author {:login "gavilancomun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f4b1f93f88e052f9eb412a8791b6ddf1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "def", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c7e"}], :line 2776, :examples [{:updated-at 1285500741000, :created-at 1279161281000, :body "user=> (defn foo []\n (undefined-func))\n; Evaluation aborted. Unable to resolve symbol: undefined-func in this context\nnil\n\nuser=> (declare undefined-func)\n#'user/undefined-func\n\nuser=> (defn foo []\n (undefined-func))\n#'user/foo\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692cdc026201cdc326d18"} {:author {:login "lu4nx", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4acdafde2cbf672ee0389cf8016378?r=PG&default=identicon"}, :editors [{:login "lu4nx", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4acdafde2cbf672ee0389cf8016378?r=PG&default=identicon"}], :body "user=> (declare show)\n#'user/show\nuser=> (defn welcome [user-name] (prn (show) user-name))\n#'user/welcome\nuser=> (defn show [] (prn \"welcome \"))\n#'user/show\nuser=> (welcome \"lu4nx\")\n\"welcome \"\nnil \"lu4nx\"\nnil\nuser=> ", :created-at 1385992546000, :updated-at 1385992606000, :_id "542692d2c026201cdc326f78"} {:body "; def will do too.\nuser=> (def show)\n#'user/show\nuser=> (defn welcome [user-name] (prn (show) user-name))\n#'user/welcome\nuser=> (defn show [] (prn \"welcome\"))\n#'user/show\nuser=> (welcome \"lu4nx\")\n\"welcome\"\nnil \"lu4nx\"\nnil", :author {:login "kimtg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7685905?v=3"}, :created-at 1425741679616, :updated-at 1425741679616, :_id "54fb176fe4b0b716de7a6533"} {:editors [{:login "owenRiddy", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/8080718?v=4"}], :body ";;Declare (like \"def\") has a natural partner in \"var\".\n;;Consider trying to embed a to-be-defined function in a data structure:\n\n(declare foo)\n(def bar {:handy-fn foo})\n(defn foo [] 42)\n((:handy-fn bar))\n;;IllegalStateException Attempting to call unbound fn: #'user/foo clojure.lang.Var$Unbound.throwArity (Var.java:43)\n\n;;:handy-fn in bar is now permanently linked to the unbound var\n;; present when the def was evaluated. This can be avoided\n;; by not evaluating foo when creating bar.\n\n(declare foo)\n;;(def bar {:handy-fn (var foo)})\n(def bar {:handy-fn #'foo})\n(defn foo [] 42)\n((:handy-fn bar))\n;; 42", :author {:avatar-url "https://avatars0.githubusercontent.com/u/8080718?v=4", :account-source "github", :login "owenRiddy"}, :created-at 1502501725640, :updated-at 1502501762521, :_id "598e5b5de4b0d19c2ce9d714"}], :macro true, :notes nil, :arglists ["& names"], :doc "defs the supplied var names with no bindings, useful for making forward declarations.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/declare"} {:added "1.1", :ns "clojure.core", :name "dissoc!", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1329969087000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "assoc!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ea9"} {:created-at 1577916166729, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "conj!", :ns "clojure.core"}, :_id "5e0d1706e4b0ca44402ef80b"}], :line 3381, :examples [{:author {:avatar-url "https://avatars.githubusercontent.com/u/1453?v=4", :account-source "github", :login "ghoseb"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; dissoc! works on a transient map\n\n;; WARNING: Below is an example of what is called \"bashing in place\" of\n;; a transient, and is _NOT_ the correct way to use transients. See assoc!\n;; examples for some discussion of the reason.\n;; Also see one example for conj! that contains a detailed example\n;; of a wrong result that can occur if you do not use its return value.\n\n(let [my-map (transient {:x 1 :y 2 :z 3})]\n (dissoc! my-map :x) ; mistake is to use my-map below, not dissoc! return val\n (persistent! my-map)) ; returns persistent map {:y 2 :z 3}\n\n\n;; Here is a correct way to do the operation described above:\n\n(let [my-map (transient {:x 1 :y 2 :z 3})\n x (dissoc! my-map :x)] ; after this, don't use my-map again, only x\n (persistent! x)) ; returns persistent map {:y 2 :z 3}", :created-at 1293728413000, :updated-at 1577916082525, :_id "542692cbc026201cdc326c15"}], :notes nil, :arglists ["map key" "map key & ks"], :doc "Returns a transient map that doesn't contain a mapping for key(s).", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/dissoc!"} {:added "1.2", :ns "clojure.core", :name "reductions", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1289800579000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "reduce", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b07"} {:created-at 1423043837477, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "reduced", :library-url "https://github.com/clojure/clojure"}, :_id "54d1ecfde4b081e022073c59"}], :line 7214, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (reductions + [1 1 1 1])\n(1 2 3 4)\nuser=> (reductions + [1 2 3])\n(1 3 6)\n\n;; This is just like reduce except that the calculation is collected during the reduce.\nuser=> (assert (= (reduce + [1 2 3]) \n (last (reductions + [1 2 3]))))\nnil\n", :created-at 1281363432000, :updated-at 1285494988000, :_id "542692cbc026201cdc326baa"} {:body "user=> (reductions conj [] '(1 2 3))\n([] [1] [1 2] [1 2 3])", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423043905622, :updated-at 1423043905622, :_id "54d1ed41e4b081e022073c5a"} {:body "user=> (reductions + [1 2 3 4 5])\n(1 3 6 10 15)\n\n;;defining the function to perform the same reductions\nuser=> (reductions (fn [sum num] (+ sum num)) [1 2 3 4 5])\n;;(1 3 6 10 15)\n\n;;reductions using a init value 100\nuser=> (reductions (fn [sum num] (+ sum num)) 100 [1 2 3 4 5])\n;;(100 101 103 106 110 115)\n\n;;defining a function for the same reductions\nuser=>(defn add [sum num] \n #_=>(+ sum num))\n;;#'user/add\n\nuser=>(reductions add [1 2 3 4 5])\n;;(1 3 6 10 15)", :author {:login "pavanred", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/60858?v=3"}, :created-at 1427434749175, :updated-at 1427476229157, :editors [{:login "pavanred", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/60858?v=3"}], :_id "5514ecfde4b08eb9aa0a8d3a"} {:updated-at 1488836230529, :created-at 1488836230529, :author {:login "matrix10657", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1264071?v=3"}, :body ";; useful for performing lazy calculations which rely on \n;; previous calculations\n\n;; e.g. Taking an infinite list of posts with some height and \n;; adding an offset to each, which is the sum of all previous \n;; heights\n\nuser=> (def posts (repeat {:height 50}))\n#'user/posts\n\nuser=> (take 3 posts)\n({:height 50} {:height 50} {:height 50})\n\nuser=> (def posts-with-offsets\n #_=> (map #(assoc %1 :offset %2)\n #_=> posts\n #_=> (reductions + 0 (map :height posts))))\n#'user/posts-with-offsets\n\nuser=> (take 3 posts-with-offsets)\n({:height 50, :offset 0} {:height 50, :offset 50} {:height 50, :offset 100})\n\n", :_id "58bdd686e4b01f4add58fe6b"}], :notes [{:author {:login "betegelse", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6758479?v=3"}, :updated-at 1486825461877, :created-at 1486825461877, :body "I think the description above would be clearer if it stated that the result of reductions is equivalent to the sequence of results of applying reduce to `(take n coll)`, with `n` starting with 1, that is, equivalent to\n```clojure\n(defn my-reduce [op coll] (for [n (range (count coll))] (reduce op (take (inc n) coll)))\n```\n", :_id "589f27f5e4b01f4add58fe4a"} {:author {:login "jayzawrotny", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/590297?v=4"}, :updated-at 1523454828509, :created-at 1523454828509, :body "In other libraries and languages this function may be referred to as \"scan\". ", :_id "5ace136ce4b045c27b7fac3c"}], :arglists ["f coll" "f init coll"], :doc "Returns a lazy seq of the intermediate values of the reduction (as\n per reduce) of coll by f, starting with init.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/reductions"} {:added "1.0", :ns "clojure.core", :name "aset-byte", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 3976, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; create an array of 10 bytes and set one of the values to 127\n\nuser=> (def bs (byte-array 10))\n#'user/bs\nuser=> (vec bs)\n[0 0 0 0 0 0 0 0 0 0]\nuser=> (aset-byte bs 2 127)\n127\nuser=> (vec bs)\n[0 0 127 0 0 0 0 0 0 0]\nuser=>", :created-at 1313914294000, :updated-at 1313914294000, :_id "542692c6c026201cdc32692c"}], :notes [{:body "See [aset](http://clojuredocs.org/clojure.core/aset) for illustrations of multi-dimensional syntax.", :created-at 1432829120788, :updated-at 1432829120788, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :_id "55673cc0e4b03e2132e7d172"}], :arglists ["array idx val" "array idx idx2 & idxv"], :doc "Sets the value at the index/indices. Works on arrays of byte. Returns val.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/aset-byte"} {:added "1.9", :ns "clojure.core", :name "indexed?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 6274, :examples [{:updated-at 1611630046254, :created-at 1611630046254, :author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :body "(indexed? '(1 2 3)) ;;=> false\n\n(indexed? [1 2 3]) ;;=> true\n\n(indexed? {:a \"Hi\" :hello \"Why\"}) ;;=> false\n\n(indexed? (sorted-set 1 2 3)) ;;=> false\n\n(indexed? #{1 2 3}) ;;=> false", :_id "600f85dee4b0b1e3652d743d"}], :notes nil, :arglists ["coll"], :doc "Return true if coll implements Indexed, indicating efficient lookup by index", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/indexed_q"} {:added "1.1", :ns "clojure.core", :name "ref-history-count", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1329984882000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref-min-history", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eb6"} {:created-at 1329984893000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref-max-history", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eb7"} {:created-at 1364770223000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eb8"}], :line 2463, :examples [{:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [], :body "user=> (def store (ref {}))\n#'user/store\nuser=> (ref-history-count store)\n0\nuser=> (ref-max-history store)\n10\nuser=> (ref-min-history store)\n0", :created-at 1329984988000, :updated-at 1329984988000, :_id "542692d5c026201cdc327069"} {:updated-at 1656667547237, :created-at 1656667547237, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; ref must have a :min-history of >0 to use the history queue\n\n(def r (ref 42 :min-history 2));; => #'user/r\n(ref-history-count r);; => 0\n(dosync (alter r inc));; => 43\n(ref-history-count r);; => 1\n(dosync (alter r inc));; => 44\n(ref-history-count r);; => 2", :_id "62bebd9be4b0b1e3652d7611"}], :notes nil, :arglists ["ref"], :doc "Returns the history count of a ref", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ref-history-count"} {:added "1.2", :ns "clojure.core", :name "-", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1351919398000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "-'", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d20"} {:created-at 1423527267534, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "unchecked-negate", :library-url "https://github.com/clojure/clojure"}, :_id "54d94d63e4b0e2ac61831d44"} {:created-at 1423527580571, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "unchecked-subtract", :library-url "https://github.com/clojure/clojure"}, :_id "54d94e9ce4b081e022073c85"} {:created-at 1525302779122, :author {:login "NealEhardt", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1338977?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "dec", :ns "clojure.core"}, :_id "5aea45fbe4b045c27b7fac5c"}], :line 1043, :examples [{:author {:login "MrHus", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4"}, :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (- 1)\n-1 \nuser=> (- 6 3) \n3\nuser=> (- 10 3 2) \n5", :created-at 1279418306000, :updated-at 1332950680000, :_id "542692c8c026201cdc326a4f"} {:body "\n(- 0 9000000000000000000 1000000000000000000)\n;; ArithmeticException: integer overflow\n\n(-' 0 9000000000000000000 1000000000000000000)\n;;=> 10000000000000000000N \n\n\n", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1412882447241, :updated-at 1412882447241, :_id "5436e00fe4b0ae7956031579"}], :notes nil, :arglists ["x" "x y" "x y & more"], :doc "If no ys are supplied, returns the negation of x, else subtracts\n the ys from x and returns the result. Does not auto-promote\n longs, will throw on overflow. See also: -'", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/-"} {:added "1.1", :ns "clojure.core", :name "assoc!", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1324959540000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "dissoc!", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a8d"} {:created-at 1324959556000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "transient", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a8e"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "conj!", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/1453?v=4", :account-source "github", :login "ghoseb"}, :created-at 1327875049000, :_id "542692eaf6e94c6970521a8f"} {:created-at 1417201150839, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "pop!", :library-url "https://github.com/clojure/clojure"}, :_id "5478c5fee4b03d20a10242b6"} {:created-at 1417201158048, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "disj!", :library-url "https://github.com/clojure/clojure"}, :_id "5478c606e4b03d20a10242b7"} {:created-at 1417201185853, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "persistent!", :library-url "https://github.com/clojure/clojure"}, :_id "5478c621e4b0dc573b892fe2"}], :line 3368, :examples [{:author {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/1453?v=4", :account-source "github", :login "ghoseb"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; The key concept to understand here is that transients are \n;; not meant to be `bashed in place`; always use the value \n;; returned by either assoc! or other functions that operate\n;; on transients.\n\n(defn merge2\n \"An example implementation of `merge` using transients.\"\n [x y]\n (persistent! (reduce\n (fn [res [k v]] (assoc! res k v))\n (transient x)\n y)))\n\n;; Why always use the return value, and not the original? Because the return\n;; value might be a different object than the original. The implementation\n;; of Clojure transients in some cases changes the internal representation\n;; of a transient collection (e.g. when it reaches a certain size). In such\n;; cases, if you continue to try modifying the original object, the results\n;; will be incorrect. See one example for conj! that contains a detailed\n;; example of a wrong result that can occur if you do not use its return value.\n\n;; Think of transients like persistent collections in how you write code to\n;; update them, except unlike persistent collections, the original collection\n;; you passed in should be treated as having an undefined value. Only the return\n;; value is predictable.", :created-at 1307739385000, :updated-at 1577916047949, :_id "542692c8c026201cdc326a21"} {:updated-at 1482997682425, :created-at 1482997682425, :author {:login "dalzony", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/562341?v=3"}, :body "(def m (assoc! (transient {}) :x 1 :y 2))\n\n(:x m)\n;; 1\n\n(:y m)\n;; 2\n\n(count m)\n;; 2", :_id "5864bfb2e4b0fd5fb1cc9649"}], :notes nil, :arglists ["coll key val" "coll key val & kvs"], :doc "When applied to a transient map, adds mapping of key(s) to\n val(s). When applied to a transient vector, sets the val at index.\n Note - index must be <= (count vector). Returns coll.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/assoc!"} {:added "1.0", :ns "clojure.core", :name "hash-set", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1471555426806, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "sorted-set", :ns "clojure.core"}, :_id "57b62762e4b0b5e6d7a4fa5a"} {:created-at 1532623831801, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "set", :ns "clojure.core"}, :_id "5b59fbd7e4b00ac801ed9e2d"}], :line 389, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "rafael", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7adbf4434f63cedd463196b652fa7a44?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "clojureking", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/92625b8a6be91bb8c688d0d07b4e2a32?r=PG&default=identicon"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :body ";; Any duplicates are squashed (no error)\n(hash-set 1 2 1 3 1 4 1 5)\n;;=> #{1 4 3 2 5}\n\n;; There is an equivalent reader macro '#{...}'\n(= (hash-set :c :a :b) #{:b :a :c})\n;;=> true \n\n;; A string can be treated as a sequence to produce\n;; a set of the characters found in the string.\n(apply hash-set (seq \"Lorem ipsum dolor sit amet\"))\n;;=> #{\\space \\a \\d \\e \\i \\L \\l \\m \\o \\p \\r \\s \\t \\u}\n\n;; or simply (see \"set\")\n(set \"Lorem ipsum dolor sit amet\")\n;;=> #{\\space \\a \\d \\e \\i \\L \\l \\m \\o \\p \\r \\s \\t \\u}", :created-at 1280503618000, :updated-at 1532623811799, :_id "542692c6c026201cdc326931"} {:updated-at 1643941642045, :created-at 1643941642045, :author {:login "jlb0170", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4674635?v=4"}, :body ";; The \"equivalent\" reader macro throws an error when receiving duplicates, however:\n#{ 1 2 1 }\n;;=> Duplicate key: 1", :_id "61fc8f0ae4b0b1e3652d75a7"}], :notes nil, :arglists ["" "& keys"], :doc "Returns a new hash set with supplied keys. Any equal keys are\n handled as if by repeated uses of conj.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/hash-set"} {:added "1.4", :ns "clojure.core", :name "reduce-kv", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1413271598814, :author {:login "viksit", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/198669?v=2"}, :to-var {:ns "clojure.core", :name "reduce", :library-url "https://github.com/clojure/clojure"}, :_id "543cd02ee4b0a3cf052fe475"} {:created-at 1423043757434, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "reduced", :library-url "https://github.com/clojure/clojure"}, :_id "54d1ecade4b081e022073c58"}], :line 6847, :examples [{:body "Let's assume you want to apply a function to a vector of maps,\n\nInput: [{:a 1 :b 2} {:a 3 :b 4}]\n\nsuch that all vals are incremented by 1.\n\nResult: [{:a 2 :b 3} {:a 4 :b 5}]\n\nAn easy way to do so is using reduce-kv,\n\n(def vector-of-maps [{:a 1 :b 2} {:a 3 :b 4}])\n\n(defn update-map [m f] \n (reduce-kv (fn [m k v] \n (assoc m k (f v))) {} m))\n\n(map #(update-map % inc) vector-of-maps)\n\n=> ({:b 3, :a 2} {:b 5, :a 4})", :author {:login "viksit", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/198669?v=2"}, :created-at 1413271555020, :updated-at 1413271555020, :_id "543cd003e4b02688d208b1b4"} {:body ";; Swap keys and values in a map\nuser=> (reduce-kv #(assoc %1 %3 %2) {} {:a 1 :b 2 :c 3})\n{1 :a, 2 :b, 3 :c}", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423043718645, :updated-at 1423043718645, :_id "54d1ec86e4b0e2ac61831d0f"} {:updated-at 1445117098242, :created-at 1445117098242, :author {:login "Luckvery", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1178168?v=3"}, :body ";; Swap keys with values, only if values are not empty,\n;; while turning values into proper keys\n\n(def someMap { :foo \"food\", :bar \"barista\", :baz \"bazaar\"})\n\n(defn swap [someMap]\n (reduce-kv (fn [m k v]\n (if (empty? v) m (assoc m (keyword v) (name k)))) {} someMap))\n\n(swap someMap)\n\n=> {:food \"foo\", :barista \"bar\", :bazaar \"baz\"}\n", :_id "5622bcaae4b04b157a6648d6"} {:editors [{:login "bpetri", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8858685?v=3"}], :body ";; Calculate total wins and winning streaks\n(def all-games \n [{:game 1 :won true} \n {:game 2 :won false} \n {:game 3 :won true} \n {:game 4 :won true}])\n\n(reduce-kv\n (fn [result index game]\n (let [last-game (last result)\n wins (if (:won game) \n (inc (:total last-game 0)) \n (:total last-game))\n streak (if (:won game) \n (inc (:streak last-game 0)) \n 0)]\n (println (assoc game :total wins :streak streak))\n (conj result (assoc game :total wins :streak streak))))\n []\n all-games)\n\n;; Output\n;; {:game 1, :won true, :total 1, :streak 1}\n;; {:game 2, :won false, :total 1, :streak 0}\n;; {:game 3, :won true, :total 2, :streak 1}\n;; {:game 4, :won true, :total 3, :streak 2}\n\n;; [{:game 1, :won true, :total 1, :streak 1} {:game 2, :won false, :total 1, :streak 0} {:game 3, :won true, :total 2, :streak 1} {:game 4, :won true, :total 3, :streak 2}]", :author {:avatar-url "https://avatars.githubusercontent.com/u/140163?v=3", :account-source "github", :login "puppybits"}, :created-at 1446938119194, :updated-at 1461160135892, :_id "563e8607e4b0290a56055d1f"} {:editors [{:login "jvanderhyde", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6516608?v=3"}], :body ";; You can define map-kv using reduce-kv, \n;; to do something to every value in a map.\n\n(defn map-kv [f coll]\n (reduce-kv (fn [m k v] (assoc m k (f v))) (empty coll) coll))\n\n(map-kv inc {:a 12, :b 19, :c 2})\n;;=> {:c 3, :b 20, :a 13}\n\n;; It works on vectors, too.\n(map-kv inc [1 1 2 3 5])\n;;=> [2 2 3 4 6]", :author {:avatar-url "https://avatars.githubusercontent.com/u/6516608?v=3", :account-source "github", :login "jvanderhyde"}, :created-at 1473374682272, :updated-at 1473374856199, :_id "57d1e9dae4b0709b524f04eb"} {:updated-at 1486417959138, :created-at 1486417959138, :author {:login "overset", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/34342?v=3"}, :body ";; It works with indexes on vectors as well\n\n(reduce-kv (fn [res idx itm] (assoc res idx itm)) {} [\"one\" \"two\" \"three\"])\n\n;;=> {2 \"three\", 1 \"two\", 0 \"one\"}", :_id "5898f027e4b01f4add58fe3c"} {:updated-at 1486833406498, :created-at 1486833406498, :author {:login "bsifou", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8908139?v=3"}, :body "\n(defn update-map-entries[m e]\n (reduce-kv (fn [r k v] (assoc r k v)) m e))\n\n;;user=> (update-map-entries {:a 1 :b 2 :c 3} {:a 5 :b 9})\n;;{:a 5, :b 9, :c 3}\n;;user=> (update-map-entries {:a 1 :b 2 :c 3} {:a 5 :b 9 :d 8})\n;;{:a 5, :b 9, :c 3, :d 8}\n\n\n", :_id "589f46fee4b01f4add58fe4b"} {:updated-at 1596611537211, :created-at 1596611537211, :author {:login "themustafabasit", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/24441401?v=4"}, :body ";; increment map values \n(def abc-map {:a 1\n :b 2\n :c 3})\n(seq abc-map)\n;; => ([:a 1] [:b 2] [:c 3])\n\n;; via reduce \n(reduce (fn [new-map [k v]]\n (assoc new-map k (inc v)))\n {}\n abc-map)\n;; => {:a 2, :b 3, :c 4}\n\n\n;; via reduce-kv\n(reduce-kv (fn [new-map k v]\n (assoc new-map k (inc v)))\n {}\n abc-map)\n;; => {:a 2, :b 3, :c 4}\n", :_id "5f2a5bd1e4b0b1e3652d7372"} {:updated-at 1602494138585, :created-at 1602494138585, :author {:login "cdol", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/47477903?v=4"}, :body ";; filter a coll of maps with arbitrary # of preds\n\n;; setup coll\n(def people '(\t{:gender \"male\", :age-group \"child\", :origin \"Germany\", :prename \"Hans\"}\n\t\t{:gender \"male\", :age-group \"adult\", :origin \"France\", :prename \"Jacques\"}\n\t\t{:gender \"male\", :age-group \"senior\", :origin \"Estonia\", :prename \"Rasmus\"}\n\t\t{:gender \"male\", :age-group \"adult\", :origin \"Poland\", :prename \"Jakub\"}\n\t\t{:gender \"male\", :age-group \"senior\", :origin \"Germany\", :prename \"Uwe\"}\n\t\t{:gender \"female\", :age-group \"adult\", :origin \"France\", :prename \"Amélie\"}\n\t\t{:gender \"female\", :age-group \"child\", :origin \"Estonia\", :prename \"Sofia\"}\n\t\t{:gender \"female\", :age-group \"child\", :origin \"Germany\", :prename \"Emma\"}\n\t\t{:gender \"female\", :age-group \"child\", :origin \"Estonia\", :prename \"Alisa\"}\n\t\t{:gender \"female\", :age-group \"senior\", :origin \"Poland\", :prename \"Anna\"}))\n\n;; select elements using reduce-kv & filter\n(defn multi-pred [coll m] \n (reduce-kv \n (fn [erg k v] (filter #(= v (k %)) erg)) coll m) )\n\n;; two \"preds\"\n(multi-pred people {:gender \"male\", :age-group \"senior\"})\n;; => ({:gender \"male\", :age-group \"senior\", :origin \"Estonia\", :prename \"Rasmus\"} {:gender \"male\", :age-group \"senior\", :origin \"Germany\", :prename \"Uwe\"})\n\n;; three \"preds\"\n(multi-pred people {:gender \"female\", :age-group \"child\", :origin \"Estonia\"})\n;; => ({:gender \"female\", :age-group \"child\", :origin \"Estonia\", :prename \"Sofia\"} {:gender \"female\", :age-group \"child\", :origin \"Estonia\", :prename \"Alisa\"})", :_id "5f841ebae4b0b1e3652d73d6"} {:updated-at 1639378520202, :created-at 1639378520202, :author {:login "cloudbuck3t", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/90472507?v=4"}, :body ";; an example to show how to add a new key to nested maps.\n\n;; consider a map with submaps\n{:a {:b 1} :c {:d 2} :e {:f 3}}\n\n\n;; reduce-kv keeps an accumulator that \n;; starts with the value provided in init, \n;; in this case an empty map.\n\n\n;; you can return the original collection via reduce-kv this way\n(reduce-kv\n (fn [acc k v]\n (assoc acc k v))\n {}\n {:a {:b 1} :c {:d 2} :e {:f 3}}))\n\n;; the output is identical to the input.\n=> {:a {:b 1} :c {:d 2} :e {:f 3}}\n\n;; you can insert a new key-value pair into each submap \n;; by using this instead, generalized as a function\n;; that takes a map and a new-key and its new-key-value as inputs:\n\n(defn add-submap [m new-key new-keys-value]\n (reduce-kv\n (fn [acc k v]\n (assoc acc k (assoc v new-key new-keys-value)))\n {}\n m))\n\n;; notice how the value \"v\" of the key \"k\" is actually the submap on each key,\n;; when we visit :a we are looking at the first k-v pair,\n;; the key is :a, \n;; and the value is {:b 1}\n;; \n;; so we assoc a new key into that submap (the value) \n;; for each key-and-submap pairing.\n\n;; so when you run this function \n=> (add-submap {:a {:b 1} \n :c {:d 2} \n :e {:f 3}} :email-verified nil)\n\n;; the result is the original data with the new key and its val in each submap.\n=> {:a {:b 1, :email-verified nil}, \n :c {:d 2, :email-verified nil}, \n :e {:f 3, :email-verified nil}}", :_id "61b6ee58e4b0b1e3652d7588"}], :notes [{:author {:login "KingMob", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/946421?v=4"}, :updated-at 1610241088036, :created-at 1610241088036, :body "Currently broken for subvectors: [CLJ-2065](https://clojure.atlassian.net/browse/CLJ-2065)", :_id "5ffa5440e4b0b1e3652d7428"} {:author {:login "diegonayalazo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/11781279?v=4"}, :updated-at 1649396094971, :created-at 1649396032294, :body "Seems to be fixed for subvectors as of release 1.11. https://clojure.atlassian.net/browse/CLJ-2065", :_id "624fc940e4b0b1e3652d75cd"}], :arglists ["f init coll"], :doc "Reduces an associative collection. f should be a function of 3\n arguments. Returns the result of applying f to init, the first key\n and the first value in coll, then applying f to that result and the\n 2nd key and value, etc. If coll contains no entries, returns init\n and f is not called. Note that reduce-kv is supported on vectors,\n where the keys will be the ordinals.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/reduce-kv"} {:added "1.0", :ns "clojure.core", :name "or", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1300530940000, :author {:login "j1n3l0", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/6db7c6ecdbe97a1e844c88ecf587f61f?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "and", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c42"} {:created-at 1334293978000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "if", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c43"} {:created-at 1582756022836, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "some-fn", :ns "clojure.core"}, :_id "5e56f0b6e4b087629b5a18ad"}], :line 854, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [{:login "purplejacket", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/214093?v=3"}], :body "user> (or true false false)\ntrue\n\nuser> (or true true true)\ntrue\n\nuser> (or false false false)\nfalse\n\nuser> (or nil nil)\nnil\n\nuser> (or false nil)\nnil\n\nuser> (or true nil)\ntrue\n\n;; or doesn't evaluate if the first value is true\nuser> (or true (println \"foo\"))\ntrue\n\n;; order matters\nuser> (or (println \"foo\") true)\nfoo\ntrue\n\n;; does not coerce a given value to a boolean true, returns the value\nuser> (or false 42)\n42\n\nuser> (or false 42 9999)\n42\n\nuser> (or 42 9999)\n42", :created-at 1293673853000, :updated-at 1429754329073, :_id "542692cbc026201cdc326bc3"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; See examples for \"if\" explaining Clojure's idea of logical true\n;; and logical false.", :created-at 1334293981000, :updated-at 1334293981000, :_id "542692d4c026201cdc327022"} {:updated-at 1454687827177, :created-at 1454687827177, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body ";;evaluates last expression for this case\nuser> (or nil false)\nfalse\n\nuser> (or false nil)\nnil", :_id "56b4c653e4b060004fc217bc"} {:updated-at 1581256939913, :created-at 1581256939913, :author {:login "caumond", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11491686?v=4"}, :body ";; Defaulted value\nuser> (or nil \"crazy default value\")\ncrazy default value\n\nuser> (or \"value\" \"not useful default value\")\nvalue", :_id "5e4010ebe4b0ca44402ef82d"} {:updated-at 1596145782717, :created-at 1596145383310, :author {:login "luiszambon", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/41161270?v=4"}, :body ";; It cares about function's return. Example:\n;; println returns 'nil', so the next param will be evaluated.\n(or (println \"Clojure\") true \"Code\" false)\nClojure\n;;=>true\n", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/41161270?v=4", :account-source "github", :login "luiszambon"}], :_id "5f233ee7e4b0b1e3652d732b"} {:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; `or` is a macro, so can't be given where a fn is expected\n(map or [true false] [false false])\n;; => Syntax error compiling at…\n;; => Can't take value of a macro: #'clojure.core/or\n\n;; wrap in a fn instead\n(map #(or %1 %2) [true false] [false false])\n;; => (true false)", :author {:avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4", :account-source "github", :login "tomdl89"}, :created-at 1658141645967, :updated-at 1682634667591, :_id "62d53bcde4b0b1e3652d7627"}], :macro true, :notes nil, :arglists ["" "x" "x & next"], :doc "Evaluates exprs one at a time, from left to right. If a form\n returns a logical true value, or returns that value and doesn't\n evaluate any of the other expressions, otherwise it returns the\n value of the last expression. (or) returns nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/or"} {:added "1.0", :ns "clojure.core", :name "cast", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1434488356659, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:ns "clojure.core", :name "type", :library-url "https://github.com/clojure/clojure"}, :_id "55808e24e4b01ad59b65f4fe"}], :line 346, :examples [{:updated-at 1463934422291, :created-at 1289541716000, :body ";; Cast doesn't change the type of the input - it just throws an exception if it's the wrong type\n;; Since Long is a subclass of Number\nuser=> (cast Number 1) \n1\nuser=> (type (cast Number 1))\njava.lang.Long\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "tirkarthi", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3972343?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/bc41ebab54cc0e0fbe99d753876d45ce?r=PG&default=identicon", :account-source "clojuredocs", :login "Victor"}, :_id "542692cdc026201cdc326ccd"}], :notes nil, :arglists ["c x"], :doc "Throws a ClassCastException if x is not a c, else returns x.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/cast"} {:added "1.0", :ns "clojure.core", :name "reset!", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1324098243000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "swap!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ee4"} {:created-at 1360265917000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "compare-and-set!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ee5"} {:created-at 1360265926000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "atom", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ee6"} {:created-at 1527705044232, :author {:login "agarman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/138454?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "swap-vals!", :ns "clojure.core"}, :_id "5b0eedd4e4b045c27b7fac7e"} {:created-at 1527705380123, :author {:login "agarman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/138454?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reset-vals!", :ns "clojure.core"}, :_id "5b0eef24e4b045c27b7fac85"}], :line 2376, :examples [{:author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :editors [{:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"} {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (def x (atom 10))\n#'user/x\n\nuser=> @x\n10\n\nuser=> (reset! x 20)\n20\n\nuser=> @x\n20", :created-at 1281850260000, :updated-at 1416077324639, :_id "542692ccc026201cdc326cb0"}], :notes nil, :arglists ["atom newval"], :doc "Sets the value of atom to newval without regard for the\n current value. Returns newval.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/reset!"} {:added "1.0", :ns "clojure.core", :name "name", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1385200415000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "namespace", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ca3"}], :line 1589, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:login "egracer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4086884?v=3"}], :body ";; the name of the keyword is without the ':'\n;; \"str\" will retain the ':'.\n(name :x)\n;;=> \"x\"\n\n(name \"x\")\n;;=> \"x\"\n\n;; returns the symbol name as a string without the namespace.\n(name 'x)\n;;=> \"x\"\n\n(name 'user/x)\n;;=> \"x\"\n\n;; throws an error for invalid types, no nil punning\n(name nil)\n;;=> Error: Doesn't support name:\n\n(name 2)\n;;=> Error: Doesn't support name: 2", :created-at 1280319438000, :updated-at 1455058375466, :_id "542692cbc026201cdc326b9a"} {:updated-at 1548517573974, :created-at 1467226948210, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :body ";; Note that for namespaced keywords, `name` only returns the name part.\n(name :my-ns/my-name)\n;;=> \"my-name\"\n\n(name :ns/deep/key)\n;;=> \"deep/key\"\n;; For more info see: `keyword` and `keyword?`...\n(name :'//-,)\n;;=> \"/-\"\n(name :/)\n;;=> \"/\"\n(name ://)\n;;=> RuntimeException Invalid token: :// clojure.lang.Util.runtimeException (Util.java:221)\n;;=> RuntimeException Unmatched delimiter: ) clojure.lang.Util.runtimeException (Util.java:221)\n(name :///)\n;;=> \"//\"\n(namespace :///)\n;;=> \"\"\n\n;; If you want the namespace part, you can use (namespace):\n(namespace :my-ns/my-key)\n;;=> \"my-ns\"\n\n;; Using (str) will give you both parts, but also includes the leading colon.\n(str :my-ns/my-key)\n;;=> \":my-ns/my-key\"", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"}], :_id "57741b44e4b0bafd3e2a0499"} {:updated-at 1548513828805, :created-at 1478905733257, :author {:login "souenzzo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3241703?v=3"}, :body ";; To get full key\n(defn keyname [key] (str (namespace key) \"/\" (name key)))\n\n(keyname :ns/key)\n=> \"ns/key\"\n\n(keyname :ns/deep/key)\n=> \"ns/deep/key\"\n\n;; Just for fun\n(string/replace :key/val #\"^:\" \"\")\n=> \"key/val\"", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"}], :_id "58264f85e4b0782b632278bf"} {:updated-at 1548517913344, :created-at 1548517913344, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :body ";; `name` (and `namespace`) \"knows\" how a keyword was built:\n\n(name (keyword \"a/b\" \"c\"))\n;;=> \"c\"\n\n(name (keyword \"a\" \"b/c\"))\n;;=> \"b/c\"\n", :_id "5c4c8219e4b0ca44402ef636"} {:editors [{:login "green-coder", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4"}], :body ";; To get the fully qualified name of the keyword, we can use symbol.\n\n(str (symbol :a/b))\n;;=> \"a/b\"\n", :author {:avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4", :account-source "github", :login "green-coder"}, :created-at 1577551007249, :updated-at 1577551119811, :_id "5e07849fe4b0ca44402ef7ff"} {:updated-at 1635440614807, :created-at 1635440614807, :author {:login "naxels", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3195443?v=4"}, :body "; Preserves capitals\n\n(name :pageQuery)\n; => \"pageQuery\"", :_id "617ad7e6e4b0b1e3652d7560"}], :notes nil, :tag "java.lang.String", :arglists ["x"], :doc "Returns the name String of a string, symbol or keyword.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/name"} {:added "1.0", :ns "clojure.core", :name "ffirst", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1343067219000, :author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "first", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a7f"} {:created-at 1348637462000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "fnext", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a80"} {:created-at 1348637521000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "nfirst", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a81"} {:created-at 1482183756311, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nnext", :ns "clojure.core"}, :_id "5858544ce4b004d3a355e2bf"} {:created-at 1482183947394, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "next", :ns "clojure.core"}, :_id "5858550be4b004d3a355e2c2"}], :line 98, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (ffirst '([]))\nnil \n\nuser=> (ffirst ['(a b c) '(b a c)])\na \n\nuser=> (ffirst '([a b c] [b a c]))\na", :created-at 1280345631000, :updated-at 1332951869000, :_id "542692cbc026201cdc326bba"} {:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (first {:b 2 :a 1 :c 3})\n[:b 2] \n\nuser=> (ffirst {:b 2 :a 1 :c 3})\n:b", :created-at 1280345657000, :updated-at 1332951883000, :_id "542692cbc026201cdc326bbd"} {:body "user=> (first [1])\n1\n\nuser=> (ffirst [[1]])\n1", :author {:login "divyashravanthi", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6253335?v=3"}, :created-at 1432113125180, :updated-at 1432113125180, :_id "555c4fe5e4b03e2132e7d163"}], :notes nil, :arglists ["x"], :doc "Same as (first (first x))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ffirst"} {:added "1.0", :ns "clojure.core", :name "sorted-set", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1317095643000, :author {:login "pauldoo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5cb916d3c8abc9f45a093209e72489fb?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sorted-set-by", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c6b"} {:created-at 1330671694000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "subseq", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c6c"} {:created-at 1330671698000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rsubseq", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c6d"} {:created-at 1330671734000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sorted-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c6e"} {:created-at 1419807368932, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=3"}, :to-var {:ns "clojure.core", :name "into", :library-url "https://github.com/clojure/clojure"}, :_id "54a08a88e4b09260f767ca80"} {:created-at 1423277153400, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "hash-set", :library-url "https://github.com/clojure/clojure"}, :_id "54d57c61e4b0e2ac61831d1f"} {:created-at 1548553242467, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "compare", :ns "clojure.core"}, :_id "5c4d0c1ae4b0ca44402ef646"}], :line 417, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user=> (sorted-set 3 2 1)\n#{1 2 3}\n\nuser=> (sorted-set 3 2 1 1)\n#{1 2 3}\n\nuser=> #{2 1 3}\n#{1 3 2}\n\nuser=> (apply sorted-set #{2 1 3})\n#{1 2 3}", :created-at 1280319522000, :updated-at 1423277124415, :_id "542692cfc026201cdc326e6f"} {:editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}], :body "(sorted-set :a \"A\" 1)\n\n;;Exception\n;;unable to implement java.lang.String.compareTo\n\n;; This exception occurs because the default comparator, a Clojure function\n;; named `compare`, throws an exception when asked to compare two values of\n;; very dissimilar tpyes, like a keyword and a string, or a keyword and a number.\n;; If you really want a sorted set containing such dissimilar types, you will\n;; need to create your own custom comparator and use sorted-set-by.\n;; See this article for advice on creating custom comparators:\n;; https://clojure.org/guides/comparators", :author {:avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4", :account-source "github", :login "ibercode"}, :created-at 1518777459431, :updated-at 1548624108584, :_id "5a86b473e4b0316c0f44f8c5"} {:editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}], :body ";; (sorted-set ...) is equivalent in behavior to (sorted-set-by compare ...)\n;; where compare is Clojure's default comparator function clojure.core/compare\n;; See the documentation of compare for more details on its behavior.\n\n;; For a set sorted by the order that elements were added,\n;; see ordered-set: https://github.com/clj-commons/ordered\n\n;; If you deal with many large sets of integers, and want a more memory-efficient\n;; data structure for those, see int-set and dense-int-set:\n;; https://github.com/clojure/data.int-map", :author {:avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4", :account-source "github", :login "jafingerhut"}, :created-at 1548553235377, :updated-at 1548618903382, :_id "5c4d0c13e4b0ca44402ef645"}], :notes nil, :arglists ["& keys"], :doc "Returns a new sorted set with supplied keys. Any equal keys are\n handled as if by repeated uses of conj.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/sorted-set"} {:added "1.0", :ns "clojure.core", :name "counted?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1495640676349, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "bounded-count", :ns "clojure.core"}, :_id "5925aa64e4b093ada4d4d72c"}], :line 6262, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [], :body "user=> (counted? [:a :b :c])\ntrue\n\nuser=> (counted? '(:a :b :c))\ntrue\n\nuser=> (counted? {:a 1 :b 2 :c 3})\ntrue\n\nuser=> (counted? #{:a :b :c})\ntrue\n\nuser=> (counted? \"asdf\")\nfalse\n\nuser=> (counted? (into-array Integer/TYPE [1 2 3]))\nfalse", :created-at 1286508818000, :updated-at 1286508818000, :_id "542692cac026201cdc326b0c"} {:updated-at 1467307667667, :created-at 1467307667667, :author {:login "miner", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25400?v=3"}, :body ";; Lazy sequences are not counted?\n(counted? (map inc (range 5)))\n;;=> false", :_id "57755693e4b0bafd3e2a049c"}], :notes nil, :arglists ["coll"], :doc "Returns true if coll implements count in constant time", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/counted_q"} {:added "1.1", :ns "clojure.core", :name "byte-array", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1451898302123, :author {:login "muhuk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/40178?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "bytes", :ns "clojure.core"}, :_id "568a35bee4b0f37b65a3c27d"} {:created-at 1455883026411, :author {:login "guruma", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/534540?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "byte", :ns "clojure.core"}, :_id "56c70312e4b0b41f39d96ccc"}], :line 5293, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}], :body ";; create an array of bytes\n;; and demonstrate that you can use it in the standard Java fill function\n;; note the needed byte coercion in the fill function call\n\nuser=> (def bees (byte-array 10))\n#'user/bees\n\nuser=> (for [i (range 10)](aset-byte bees i (* i i)))\n(0 1 4 9 16 25 36 49 64 81)\n\nuser=> (vec bees)\n[0 1 4 9 16 25 36 49 64 81]\n\nuser=> (java.util.Arrays/fill bees (byte 122))\nnil\nuser=> (vec bees)\n[122 122 122 122 122 122 122 122 122 122]\nuser=>", :created-at 1313959908000, :updated-at 1313962959000, :_id "542692cec026201cdc326d67"} {:editors [{:login "guruma", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/534540?v=3"}], :body ";; copied from the example in clojure.core/byte\nuser=> (def x (byte-array [(byte 0x43) \n (byte 0x6c)\n (byte 0x6f)\n (byte 0x6a)\n (byte 0x75)\n (byte 0x72)\n (byte 0x65)\n (byte 0x21)]))\n#'user/x\n\nuser=> (String. x)\n\"Clojure!\"", :author {:avatar-url "https://avatars.githubusercontent.com/u/534540?v=3", :account-source "github", :login "guruma"}, :created-at 1455883152605, :updated-at 1455883201637, :_id "56c70390e4b0b41f39d96ccd"} {:editors [{:login "nivekuil", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/4633048?v=4"}], :body ";; NOTE: equality uses identity, not value semantics.\nuser=> (= (byte-array 10) (byte-array 10))\nfalse\nuser=> (java.util.Arrays/equals (byte-array 10) (byte-array 10))\ntrue\n\nuser=> (def a (byte-array [(byte 0x43)]))\n#'user/a\nuser=> (def b (byte-array [(byte 0x43)]))\n#'user/b\nuser=> (= a b)\nfalse\nuser=> (java.util.Arrays/equals a b)\ntrue", :author {:avatar-url "https://avatars3.githubusercontent.com/u/4633048?v=4", :account-source "github", :login "nivekuil"}, :created-at 1606705309670, :updated-at 1606705382806, :_id "5fc4609de4b0b1e3652d7412"}], :notes [{:body "The maximum size of a byte-array is Integer/MAX_VALUE, as arrays are int-indexed in Java. However, it is possible to pass a value that is larger than this, resulting in a cast that will wrap around. This incorrect usage will not give any indication of error.", :created-at 1625076336154, :updated-at 1625076620437, :author {:avatar-url "https://avatars.githubusercontent.com/u/1780598?v=4", :account-source "github", :login "dspearson"}, :_id "60dcb270e4b0b1e3652d7510"} {:author {:login "luposlip", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/763627?v=4"}, :updated-at 1631709838369, :created-at 1631709678505, :body "To type hint a byte array, use this non-obvious syntax:\n\n
    (.write ^OutputStream output-stream ^\"[B\" bytearray)
    ", :_id "6141e9eee4b0b1e3652d753b"}], :arglists ["size-or-seq" "size init-val-or-seq"], :doc "Creates an array of bytes", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/byte-array"} {:added "1.7", :ns "clojure.core", :name "tagged-literal", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1661550936046, :author {:login "djblue", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1986211?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "read-string", :ns "clojure.edn"}, :_id "63094158e4b0b1e3652d7656"}], :line 7725, :examples [{:updated-at 1661545330654, :created-at 1661545330654, :author {:login "Quezion", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1403153?v=4"}, :body "(def x (tagged-literal 'user {:name \"Foo\"}))\n\n(:form x) ;; Get the actual codeform\n;; => {:name \"Foo\"}\n\n(:tag x) ;; Get the tagged symbol\n;; => user", :_id "63092b72e4b0b1e3652d7654"} {:updated-at 1661546360936, :created-at 1661546360936, :author {:login "djblue", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1986211?v=4"}, :body "(require '[clojure.edn :as edn])\n(edn/read-string {:default tagged-literal} \"#js [1 2 3]\")\n;; => #js [1 2 3]\n", :_id "63092f78e4b0b1e3652d7655"}], :notes [{:author {:login "miner", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/25400?v=4"}, :updated-at 1610656712993, :created-at 1610656712993, :body "`tagged-literal` is useful as a value fo `clojure.core/*default-data-reader-fn*`", :_id "6000abc8e4b0b1e3652d7431"}], :arglists ["tag form"], :doc "Construct a data representation of a tagged literal from a\n tag symbol and a form.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/tagged-literal"} {:added "1.0", :ns "clojure.core", :name "println", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1290672953000, :author {:login "dale", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a7a1eca257c6cea943fea41e5cc3e9a3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "prn", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ae2"} {:created-at 1302236980000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "print", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ae3"} {:created-at 1374264342000, :author {:login "lbeschastny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/416170465e4045f810f09a9300dda4dd?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "println-str", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ae4"} {:created-at 1518042813319, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pprint", :ns "clojure.pprint"}, :_id "5a7b7ebde4b0316c0f44f8ac"}], :line 3733, :examples [{:author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"} {:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"} {:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"}], :body "user=> (println \"Hello world.\")\nHello world.\nnil\n\nuser=> (def items [ \"hello\" :a 1 (list :b 2) \\c {:d 4} #{5 6 7} ])\n#'user/items\n\n; println is for human-readable output, like a report. Note the lack of quotes around the string \"hello\" and the unescaped letter \"c\". \nuser=> (println items)\n[hello :a 1 (:b 2) c {:d 4} #{5 6 7}]\nnil\n\n; prn outputs items in a machine-readable format, such as in a source\n; file. Note the double-quotes around the string \"hello\" and the escaped letter \"c\".\nuser=> (prn items)\n[\"hello\" :a 1 (:b 2) \\c {:d 4} #{5 6 7}]\nnil\n\n; pr-str produces a string with escaped punctuation, so that println yields the same result as the original prn call.\nuser=> (println (pr-str items))\n[\"hello\" :a 1 (:b 2) \\c {:d 4} #{5 6 7}]\nnil\n\n; Calling println w/o args outputs a newline and nothing else.\nuser=> (println)\n\nnil\n; The newline function does the same.\nuser=> (newline)\n\nnil\nuser=>", :created-at 1280776981000, :updated-at 1402400141000, :_id "542692cec026201cdc326d9a"} {:body "; be careful when using println in functions like map\n; println has nil as its return value\n\nuser=> (map #(println %) (range 1 4))\n\n(1 2 3 nil nil nil)\n\n", :author {:login "rsachdeva", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/232903?v=2"}, :created-at 1413839939176, :updated-at 1413839939176, :_id "54457c43e4b0dc573b892fa1"}], :notes nil, :arglists ["& more"], :doc "Same as print followed by (newline)", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/println"} {:added "1.2", :ns "clojure.core", :name "extend-type", :file "clojure/core_deftype.clj", :type "macro", :column 1, :see-alsos [{:created-at 1336757561000, :author {:login "Cosmi", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10f2eae92de67116fa98d06ec55fcf29?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "extend", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521be8"} {:created-at 1351471424000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "extend-protocol", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521be9"} {:created-at 1351471431000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defprotocol", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bea"}], :line 836, :examples [{:author {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}, :editors [], :body ";;; This is a library for the shopping result.\n\n(defrecord Banana [qty])\n\n;;; 'subtotal' differ from each fruit.\n\n(defprotocol Fruit\n (subtotal [item]))\n\n(extend-type Banana\n Fruit\n (subtotal [item]\n (* 158 (:qty item))))\n\n;;; Please see the term of 'reify'.", :created-at 1315674061000, :updated-at 1315674061000, :_id "542692cbc026201cdc326bc2"}], :macro true, :notes nil, :arglists ["t & specs"], :doc "A macro that expands into an extend call. Useful when you are\n supplying the definitions explicitly inline, extend-type\n automatically creates the maps required by extend. Propagates the\n class as a type hint on the first argument of all fns.\n\n (extend-type MyType \n Countable\n (cnt [c] ...)\n Foo\n (bar [x y] ...)\n (baz ([x] ...) ([x y & zs] ...)))\n\n expands into:\n\n (extend MyType\n Countable\n {:cnt (fn [c] ...)}\n Foo\n {:baz (fn ([x] ...) ([x y & zs] ...))\n :bar (fn [x y] ...)})", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/extend-type"} {:added "1.0", :ns "clojure.core", :name "macroexpand-1", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1284957759000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "macroexpand", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b13"} {:created-at 1289586228000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.walk", :name "macroexpand-all", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b14"}], :line 4018, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [], :body "user=> (macroexpand-1 '(defstruct mystruct[a b]))\n(def mystruct (clojure.core/create-struct [a b]))\n", :created-at 1286272779000, :updated-at 1286272779000, :_id "542692cbc026201cdc326ba7"} {:updated-at 1339248839000, :created-at 1339248839000, :body "user=> (macroexpand-1 '(-> c (+ 3) (* 2)))\n(clojure.core/-> (clojure.core/-> c (+ 3)) (* 2))", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :_id "542692d4c026201cdc326ffa"} {:editors [{:login "lourkeur", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/15657735?v=4"}], :body "; When testing macro expansion in a file instead of at the REPL, \n; please note that it may be necessary to use a backquote\n; instead of a straight quote.\n\n(defmacro iiinc [x]\n `(+ 3 ~x))\n\n(deftest t-stuff\n ; This doesn't work.\n (println (macroexpand-1 '(iiinc 2))) ;=> (iiinc 2)\n\n ; Oddly, we can use the macro itself fine in our tests...\n (println (iiinc 2)) ;=> 5\n (is (= 5 (iiinc 2))) ;=> unit test passes\n\n ; This fixes it by resolving the symbol iiinc at compile-time.\n (println (macroexpand-1 `(iiinc 2)))) ;=> (+ 3 2)\n\n; Also, as the previous examples show, please remember that \n; you must quote the form you are providing to `macroexpand-1`.\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/7083783?v=3", :account-source "github", :login "cloojure"}, :created-at 1494031935843, :updated-at 1522520280321, :_id "590d1e3fe4b01f4add58feaf"}], :notes nil, :arglists ["form"], :doc "If form represents a macro form, returns its expansion,\n else returns form.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/macroexpand-1"} {:added "1.0", :ns "clojure.core", :name "assoc-in", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1291975376000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "assoc", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ac6"} {:created-at 1302248543000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "update-in", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ac7"} {:created-at 1318010528000, :author {:login "jks", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/de50bee3396570d25f900873303c98f1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "get-in", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ac9"} {:created-at 1570520711353, :author {:login "xmo-odoo", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/7571158?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "associative?", :ns "clojure.core"}, :_id "5d9c3e87e4b0ca44402ef7ca"}], :line 6161, :examples [{:author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(def users [{:name \"James\" :age 26} {:name \"John\" :age 43}])\n\n;; update the age of the second (index 1) user \n(assoc-in users [1 :age] 44)\n;;=> [{:name \"James\", :age 26} {:name \"John\", :age 44}]\n\n;; insert the password of the second (index 1) user\n(assoc-in users [1 :password] \"nhoJ\")\n;;=> [{:name \"James\", :age 26} {:password \"nhoJ\", :name \"John\", :age 43}]\n\n;; create a third (index 2) user\n;; Also (assoc m 2 {...}) or (conj m {...})\n(assoc-in users [2] {:name \"Jack\" :age 19}) \n;;=> [{:name \"James\", :age 26} {:name \"John\", :age 43} {:name \"Jack\", :age 19}]\n\n;; From http://clojure-examples.appspot.com/clojure.core/assoc-in", :created-at 1278953901000, :updated-at 1422565766316, :_id "542692cac026201cdc326b38"} {:author {:login "devth", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/70c7535cbb9fea0353250a4edda155be?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/200617?v=3", :account-source "github", :login "bsima"} {:login "elias94", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8095533?v=4"}], :body ";; can be used to update a mutable item.\n(def ppl (atom {\"persons\" {\"joe\" {:age 1}}}))\n(swap! ppl assoc-in [\"persons\" \"bob\"] {:age 2})\n\n@ppl\n;;=> {\"persons\" {\"joe\" {:age 1}, \"bob\" {:age 2}}}", :created-at 1378880124000, :updated-at 1625799501437, :_id "542692d2c026201cdc326f4c"} {:editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "clojureman", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1793303?v=3"}], :updated-at 1495693228091, :created-at 1412006606316, :author {:avatar-url "https://avatars.githubusercontent.com/u/453580?v=2", :account-source "github", :login "pmbauer"}, :body ";; be careful with that empty path sequence, it's seldom what you want\n(assoc-in {} [] {:k :v})\n;;=> {nil {:k :v}}\n\n;; In general, you find that for a non-empty path\n;; (get-in (assoc-in m path v) path) \n;; is equal to v.\n;; Surprisingly this does not hold true in case of an empty path.", :_id "542982cee4b09282a148f203"} {:body ";; another example of updating a mutable item.\n;; this time the first key is to a map and the second to a vector.\n(def foo (atom {:users [{:a \"a\"} {:b \"b\"}]}))\n(swap! foo assoc-in [:users 2] {:c \"c\"})\n;;=> {:users [{:a \"a\"} {:b \"b\"} {:c \"c\"}]}\n\n", :author {:login "saiberz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1022999?v=3"}, :created-at 1418344457312, :updated-at 1422566109388, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :_id "548a3809e4b04e93c519ffa4"} {:editors [{:login "coffeefire", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/14366530?v=3"}], :updated-at 1448358381451, :created-at 1433960090535, :author {:avatar-url "https://avatars.githubusercontent.com/u/571777?v=3", :account-source "github", :login "cthulhu-bot"}, :body ";; assoc-in into a nested map structure\n(def foo {:user {:bar \"baz\"}})\n(assoc-in foo [:user :id] \"some-id\")\n;;=> {:user {:bar \"baz\", :id \"some-id\"}}\n", :_id "55787e9ae4b01ad59b65f4ef"} {:editors [{:login "prudentbot", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3210379?v=3"}], :body "(assoc-in {} [:cookie :monster :vocals] \"Finntroll\")\n; => {:cookie {:monster {:vocals \"Finntroll\"}}}\n\n(get-in {:cookie {:monster {:vocals \"Finntroll\"}}} [:cookie :monster])\n; => {:vocals \"Finntroll\"}\n\n(assoc-in {} [1 :connections 4] 2)\n; => {1 {:connections {4 2}}}\n\n;; from http://www.braveclojure.com/functional-programming/", :author {:avatar-url "https://avatars.githubusercontent.com/u/3210379?v=3", :account-source "github", :login "prudentbot"}, :created-at 1438058284679, :updated-at 1438100741796, :_id "55b7072ce4b06a85937088b7"} {:editors [{:login "amirrajan", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/517055?v=3"}], :body ";; assoc-in can be used on vectors too\n\n(def row 0)\n(def col 0)\n\n(assoc-in [[1 1 1]\n [1 1 1]\n [1 1 1]] [row col] 0)\n; => [[0 1 1][1 1 1][1 1 1]]\n\n(get-in [[0 1 1]\n [1 1 1]\n [1 1 1]] [row col])\n; => 0", :author {:avatar-url "https://avatars.githubusercontent.com/u/517055?v=3", :account-source "github", :login "amirrajan"}, :created-at 1445568749511, :updated-at 1445568838675, :_id "5629a0ede4b04b157a6648d8"} {:editors [{:login "gosukiwi", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/161972?v=3"}], :body "; Playing around with assoc-in\n\n(assoc-in {:person {:name \"Mike\"}} [:person :name] \"Violet\")\n; => {:person {:name \"Violet\"}}\n\n(assoc-in {:person {:name \"Mike\"}} [:person] \"Violet\")\n; => {:person \"Violet\"}\n\n(assoc-in [{:person {:name \"Mike\"}}] [0 :person :name] \"Violet\")\n; => [{:person {:name \"Violet\"}}]\n\n(assoc-in [{:person {:name [\"Mike\"]}}] [0 :person :name 1] \"Smith\")\n; => [{:person {:name [\"Mike\" \"Smith\"]}}]\n\n(assoc-in [{:person {:name [\"Mike\"]}}] [0 :person :name 2] \"Smith\")\n; => IndexOutOfBoundsException", :author {:avatar-url "https://avatars.githubusercontent.com/u/161972?v=3", :account-source "github", :login "gosukiwi"}, :created-at 1470551622806, :updated-at 1470551660418, :_id "57a6d646e4b0bafd3e2a04cc"} {:editors [{:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4"}], :body ";; Note that, unlike `assoc`, `assoc-in` cannot be used with multiple values.\n\n(def my-map {})\n\n;; This works\n(assoc my-map :a 1\n :b 2\n :c 3)\n; => {:a 1, :b 2, :c 3}\n\n;; This doesn’t\n(assoc-in my-map [:a :aa] 1\n [:b :bb] 2\n [:c :cc] 3)\n; ArityException Wrong number of args (7) passed to: core/assoc-in\n\n;; This works\n(-> my-map\n (assoc-in [:a :aa] 1)\n (assoc-in [:b :bb] 2)\n (assoc-in [:c :cc] 3))", :author {:avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4", :account-source "github", :login "bfontaine"}, :created-at 1524054770336, :updated-at 1631275246821, :_id "5ad73af2e4b045c27b7fac3f"}], :notes [{:body "Unlike `assoc`, you can only do one kv at a time:\n\n```\n;; Allowed\n(assoc {} :a \"a\" :b \"b\" :c \"c\")\n;; Not allowed:\n(assoc-in {} [:a :b] \"cya\" [:a :d :e] \"f\" [:b :g] \"wow\")\n```", :created-at 1648401233813, :updated-at 1648401332618, :author {:avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4", :account-source "github", :login "Crowbrammer"}, :_id "62409b51e4b0b1e3652d75c2"}], :arglists ["m [k & ks] v"], :doc "Associates a value in a nested associative structure, where ks is a\n sequence of keys and v is the new value and returns a new nested structure.\n If any levels do not exist, hash-maps will be created.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/assoc-in"} {:added "1.0", :ns "clojure.core", :name "char-name-string", :file "clojure/core_print.clj", :type "var", :column 1, :see-alsos [{:created-at 1375209941000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "char-escape-string", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b76"}], :line 342, :examples [{:author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :editors [], :body "user=> (char-name-string \\newline)\n\"newline\"", :created-at 1375209966000, :updated-at 1375209966000, :_id "542692d2c026201cdc326f5f"} {:updated-at 1592040564496, :created-at 1592040564496, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/8271291?v=4"}, :body "(map char-name-string [\\backspace \\tab \\newline \\formfeed \\return \\space])\n;;=> (\"backspace\" \"tab\" \"newline\" \"formfeed\" \"return\" \"space\")", :_id "5ee49c74e4b0b1e3652d7303"}], :notes nil, :tag "java.lang.String", :arglists [], :doc "Returns name string for char or nil if none", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/char-name-string"} {:added "1.0", :ns "clojure.core", :name "bit-test", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1405720487000, :author {:login "phreed", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a0c739cf289be18be932dc3022e6fd3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bit-set", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cac"} {:created-at 1405720498000, :author {:login "phreed", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a0c739cf289be18be932dc3022e6fd3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bit-shift-left", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cad"} {:created-at 1405720509000, :author {:login "phreed", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a0c739cf289be18be932dc3022e6fd3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bit-xor", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cae"}], :line 1349, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(bit-test 2r1001 0) ;;=> true \n(bit-test 2r1001 1) ;;=> false \n(bit-test 2r1001 7) ;;=> false", :created-at 1280338595000, :updated-at 1421943187268, :_id "542692cfc026201cdc326e7c"} {:updated-at 1550024741651, :created-at 1550024741651, :author {:login "pauloaug", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/804447?v=4"}, :body ";; Note that the index starts from the least significant bit (right to left).\n\n(map #(bit-test 2r10011 %) [0 1 2 3 4])\n;;=> (true true false false true) ", :_id "5c638025e4b0ca44402ef682"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; bit-wise powerset (set of all subsets)\n\n(defn powerset [coll]\n (let [cnt (count coll)\n bits (Math/pow 2 cnt)]\n (for [i (range bits)]\n (for [j (range i)\n :while (< j cnt)\n :when (bit-test i j)]\n (nth coll j)))))\n\n(powerset [1 2 3])\n;; (() (1) (2) (1 2) (3) (1 3) (2 3) (1 2 3))", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1564483500939, :updated-at 1564483573152, :_id "5d401face4b0ca44402ef78b"}], :notes nil, :arglists ["x n"], :doc "Test bit at index n", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bit-test"} {:added "1.0", :ns "clojure.core", :name "defmethod", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1285162546000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defmulti", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b40"} {:created-at 1341270386000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "remove-method", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b41"} {:created-at 1341270389000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "remove-all-methods", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b42"} {:created-at 1341270393000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "prefers", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b43"} {:created-at 1341270396000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "methods", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b44"} {:created-at 1341270398000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "get-method", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b45"}], :line 1783, :examples [{:author {:login "Victor", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc41ebab54cc0e0fbe99d753876d45ce?r=PG&default=identicon"}, :editors [], :body "(defmulti service-charge (fn [acct] [(account-level acct) (:tag acct)]))\n(defmethod service-charge [::acc/Basic ::acc/Checking] [_] 25)\n(defmethod service-charge [::acc/Basic ::acc/Savings] [_] 10)\n(defmethod service-charge [::acc/Premium ::acc/Account] [_] 0)", :created-at 1290489730000, :updated-at 1290489730000, :_id "542692c7c026201cdc3269cb"} {:author {:login "Victor", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc41ebab54cc0e0fbe99d753876d45ce?r=PG&default=identicon"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/104014?v=3", :account-source "github", :login "slester"} {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}], :body ";this example illustrates that the dispatch type\n;does not have to be a symbol, but can be anything (in this case, it's a string)\n\n(defmulti greeting\n (fn [x] (get x \"language\")))\n\n;params is not used, so we could have used [_]\n(defmethod greeting \"English\" [params]\n \"Hello!\")\n\n(defmethod greeting \"French\" [params]\n \"Bonjour!\")\n\n;then can use this like this:\n(def english-map {\"id\" \"1\", \"language\" \"English\"})\n(def french-map {\"id\" \"2\", \"language\" \"French\"})\n\n=>(greeting english-map)\n\"Hello!\"\n=>(greeting french-map)\n\"Bonjour!\"\n", :created-at 1290492873000, :updated-at 1572016935512, :_id "542692c7c026201cdc3269cc"} {:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [], :body ";; Methods can be given a name. Very useful in stack traces.\n(defmethod foo \"a\" name-of-method [params] \"was a\")\n", :created-at 1308205150000, :updated-at 1308205150000, :_id "542692c7c026201cdc3269cd"} {:editors [{:login "gariepyalex", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/6105461?v=4"}], :body "(defmulti ticket-price :customer-status)\n\n(defmethod ticket-price :student\n ;; Everything after the dispatch value is passed to fn.\n student-price\n [customer]\n 10.0)\n\n(defmethod ticket-price :professional\n professional-price\n [customer]\n 650.0)", :author {:avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4", :account-source "github", :login "bfontaine"}, :created-at 1572017355964, :updated-at 1596053774142, :_id "5db314cbe4b0ca44402ef7d4"}], :macro true, :notes nil, :arglists ["multifn dispatch-val & fn-tail"], :doc "Creates and installs a new method of multimethod associated with dispatch-value. ", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/defmethod"} {:added "1.10", :ns "clojure.core", :name "requiring-resolve", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1611863381575, :author {:login "nbaumanGR", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/76698379?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "resolve", :ns "clojure.core"}, :_id "60131555e4b0b1e3652d7441"}], :line 6082, :examples [{:editors [{:login "daemianmack", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/24476?v=4"}], :body ";; Resolve a qualified symbol\n(requiring-resolve 'clojure.java.shell/sh)\n\n;; Resolve and evaluate\n((requiring-resolve 'some-ns/some-fn))\n\n;; In deps.edn, replace all spaces with the \"Corfield\" comma, ;)\n((requiring-resolve,'clojure.java.shell/sh))", :author {:avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4", :account-source "github", :login "Hindol"}, :created-at 1583391908395, :updated-at 1605911520381, :_id "5e60a4a4e4b087629b5a18b7"} {:editors [{:login "Folcon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/123055?v=4"}], :body "(defn debug? [] (= (env :debug?) \"true\"))\n\n;; If you need to do conditional requires such as the one below:\n(if (debug?)\n (do\n (require '[nrepl.cmdline :refer [-main] :rename {-main -nrepl-main}])\n (resolve 'nrepl.cmdline))\n (declare -nrepl-main))\n\n(defn -main [& args]\n (when (debug?)\n (future (apply -nrepl-main args))))\n\n;; This is strictly better!\n(defn -main [& args]\n (when (debug?)\n ;; Swap to require and resolve in one step!\n (future (apply (requiring-resolve 'nrepl.cmdline/-main) args))))", :author {:avatar-url "https://avatars.githubusercontent.com/u/123055?v=4", :account-source "github", :login "Folcon"}, :created-at 1643638396360, :updated-at 1643638468576, :_id "61f7ee7ce4b0b1e3652d75a4"}], :notes nil, :arglists ["sym"], :doc "Resolves namespace-qualified sym per 'resolve'. If initial resolve\nfails, attempts to require sym's namespace and retries.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/requiring-resolve"} {:ns "clojure.core", :name "EMPTY-NODE", :file "clojure/gvec.clj", :type "var", :column 1, :see-alsos nil, :line 19, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/EMPTY-NODE"} {:added "1.0", :ns "clojure.core", :name "time", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos nil, :line 3884, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [], :body "user> (time (Thread/sleep 100))\n\"Elapsed time: 100.284772 msecs\"\nnil", :created-at 1286871374000, :updated-at 1286871374000, :_id "542692c6c026201cdc326908"} {:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [], :body ";when working with lazy seqs\n(time (doall (...)))", :created-at 1289011003000, :updated-at 1289011003000, :_id "542692c6c026201cdc326909"} {:author {:login "Omer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/dae0f434afde5246ccb030cdec81fb71?r=PG&default=identicon"}, :editors [{:login "Omer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/dae0f434afde5246ccb030cdec81fb71?r=PG&default=identicon"}], :body ";; Time how long it takes to write a string to a file 100 times\n(defn time-test []\n (with-open [w (writer \"test.txt\" :append false)]\n (dotimes [_ 100]\n (.write w \"I am being written to a file.\"))))\n\n\nuser=> (time (time-test))\n\"Elapsed time: 19.596371 msecs\"", :created-at 1338273583000, :updated-at 1338273812000, :_id "542692d5c026201cdc3270a6"} {:author {:login "micrub", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c649274329369f1a7a4869e29655e058?r=PG&default=identicon"}, :editors [], :body "user=> (time (Thread/sleep 1000))\n\"Elapsed time: 1000.267483 msecs\"\nnil\nuser=> (with-out-str (time (Thread/sleep 1000)))\n\"\\\"Elapsed time: 1010.12942 msecs\\\"\\n\"\n\n", :created-at 1400389644000, :updated-at 1400389644000, :_id "542692d5c026201cdc3270a8"} {:updated-at 1619013512243, :created-at 1619013512243, :author {:login "sFritsch09", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/58191603?v=4"}, :body ";;get elapsed time in seconds:\n\n(defmacro sectime\n [expr]\n `(let [start# (. System (currentTimeMillis))\n ret# ~expr]\n (prn (str \"Elapsed time: \" (/ (double (- (. System (currentTimeMillis)) start#)) 1000.0) \" secs\"))\n ret#))", :_id "60802f88e4b0b1e3652d74cc"}], :macro true, :notes [{:author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}, :updated-at 1646109474809, :created-at 1646109474809, :body "Because the Java JIT compiler compiles code differently after the code has been running for a bit of time, if you want to use `time` for benchmarking, you should at least \"warm up\" your code by running it several times, using the later `time` outputs as the ones that count. A better strategy is to use a benchmarking library such as [Criterium](https://github.com/hugoduncan/criterium), which will do the warmup for you, and much more.", :_id "621da322e4b0b1e3652d75ae"}], :arglists ["expr"], :doc "Evaluates expr and prints the time it took. Returns the value of\n expr.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/time"} {:added "1.0", :ns "clojure.core", :name "memoize", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1358780692000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "delay", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d2a"}], :line 6343, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; First we define a function that presumably have some expensive computation.\nuser=> (defn myfunc[a] (println \"doing some work\") (+ a 10))\n#'user/myfunc\n\n;; Next we create a memoized version of the function.\nuser=> (def myfunc-memo (memoize myfunc))\n#'user/myfunc-memo\n\n\n;; The first time we call the function with a particular argument the\n;; original function is invoked and the value is returned. The next\n;; time the function is called with the same argument the cached result\n;; is returned and the original function is NOT called.\n\nuser=> (myfunc-memo 1)\ndoing some work\n11\nuser=> (myfunc-memo 1)\n11\nuser=> (myfunc-memo 20)\ndoing some work\n30\nuser=> (myfunc-memo 20)\n30\n", :created-at 1280909609000, :updated-at 1285495306000, :_id "542692ccc026201cdc326c75"} {:body "\n;; Fibonacci number with recursion.\n(defn fib [n]\n (condp = n\n 0 1\n 1 1\n (+ (fib (dec n)) (fib (- n 2)))))\n\n(time (fib 30))\n;; \"Elapsed time: 8179.04028 msecs\"\n\n;; Fibonacci number with recursion and memoize.\n(def m-fib\n (memoize (fn [n]\n (condp = n\n 0 1\n 1 1\n (+ (m-fib (dec n)) (m-fib (- n 2)))))))\n\n(time (m-fib 30))\n;; \"Elapsed time: 1.282557 msecs\"\n ", :author {:login "discoverfly", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1535428?v=3"}, :created-at 1429269742396, :updated-at 1429269742396, :_id "5530eceee4b01bb732af0a83"} {:updated-at 1497303795210, :created-at 1497303795210, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/94482?v=3"}, :body ";; It's possible to memoize a function with multiple arguments:\n(def times (memoize (fn [x y] (* x y))))\n\n(times 1 2) ; => 2\n\n(times 2 0) ; => 0", :_id "593f0af3e4b06e730307db31"} {:updated-at 1532276203982, :created-at 1532276203982, :author {:login "comnik", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1313051?v=4"}, :body ";; Memoize is a simple way to make a mapping deterministic.\n(def attribute->id (memoize (fn [attr] (clojure.lang.RT/nextID))))\n\n(attribute->id :name) ; => 16305\n\n(attribute->id :age) ; => 16306\n\n(attribute->id :name) ; => 16305", :_id "5b54adebe4b00ac801ed9e2a"} {:updated-at 1555579882226, :created-at 1555579882226, :author {:login "harununal", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/36730353?v=4"}, :body "; We can take a rand and use it repeatly \n; (Just with same parameter)\n\n(defn only-first-one-rand\n [n]\n (rand n))\n\n(def ofor-memo (memoize only-first-one-rand))\n\n(ofor-memo 10) ;=> 3.683571228686361 \n\n(ofor-memo 10) ;=> 3.683571228686361\n\n;And we can assign a random value to an integer\n\n(ofor-memo 6) ;=> 2.8058589761445867\n\n(ofor-memo 10) ;=> 3.683571228686361", :_id "5cb843eae4b0ca44402ef70d"} {:updated-at 1555580792896, :created-at 1555580792896, :author {:login "harununal", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/36730353?v=4"}, :body "; When we use memoize, we say to Clojure :\n; \" x function returned with y parameters as z value. \n; No need to repeat this process everytimes. \n; Because you has pure functions. \n; Just keep \"z value\" on your mind. \n; Thank you.\" ", :_id "5cb84778e4b0ca44402ef70e"}], :notes [{:author {:login "rquinlivan", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/485844?v=3"}, :updated-at 1480901638909, :created-at 1480901638909, :body "What is the definition of \"often\" for the purposes of caching? Is there a util like this that allows for different cache eviction strategies?", :_id "5844c406e4b0782b632278d2"} {:author {:login "PetrGlad", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/124476?v=3"}, :updated-at 1483028454253, :created-at 1483028454253, :body "@rquinlivan The implementation of clojure.core/memoize is plain straightforward. It should be obvious that computation_cost times number_of_calls should determine whether to use it or not. If you need more control over caching have a look at [clojure.core.cache](https://github.com/clojure/core.cache)", :_id "586537e6e4b0fd5fb1cc964b"} {:author {:login "l3nz", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1101849?v=4"}, :updated-at 1591252941044, :created-at 1591252896617, :body "`memoize` is nice but it may be tricky to use in production, because it just caches everything. Also, the key under which the value is stored are all the parametres you have as input. \n\nIf you need something more flexible, with user-definable keys (eg because you are passing in a database connection) or a flexible eviction policy, see `clojure.core.memoize` that is a wrapper around `clojure.core.cache`.", :_id "5ed897a0e4b087629b5a1922"}], :arglists ["f"], :doc "Returns a memoized version of a referentially transparent function. The\n memoized version of the function keeps a cache of the mapping from arguments\n to results and, when calls with the same arguments are repeated often, has\n higher performance at the expense of higher memory use.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/memoize"} {:added "1.0", :ns "clojure.core", :name "alter-meta!", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1375212992000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vary-meta", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bd0"} {:created-at 1375213001000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-meta", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bd1"} {:created-at 1456685895947, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "meta", :ns "clojure.core"}, :_id "56d34347e4b02a6769b5a4bc"} {:created-at 1458508939384, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reset-meta!", :ns "clojure.core"}, :_id "56ef148be4b09295d75dbf30"}], :line 2406, :examples [{:updated-at 1456685878779, :created-at 1456685878779, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :body "(def ^{:version 1} document \"This is text\")\n;;=> #'user/document\n\n(meta #'document)\n;;=> {:version 1}\n\n(alter-meta! #'document #(update-in % [:version] inc)) ;increase version\n;;=> {:version 2}\n\n(meta #'document) ;metadata of var was changed\n;;=> {:version 2}\n\n(alter-meta! #'document update-in [:version] inc) ;same as above but shorter\n;;=> {:version 3}\n\n(meta #'document) ;metadata of var was changed again\n;;=> {:version 3}\n", :_id "56d34336e4b0b41f39d96cda"}], :notes nil, :arglists ["iref f & args"], :doc "Atomically sets the metadata for a namespace/var/ref/agent/atom to be:\n\n (apply f its-current-meta args)\n\n f must be free of side-effects", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/alter-meta!"} {:added "1.1", :ns "clojure.core", :name "future?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "future", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1339251269000, :_id "542692ebf6e94c6970521ef5"}], :line 6530, :examples [{:author {:login "BertrandDechoux", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/528360?v=3"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}], :body "user=> (def f (future (inc 0)))\n#'user/f\n\nuser=> (future? f)\ntrue\n\nuser=> (future? 1)\nfalse\n", :created-at 1339251424000, :updated-at 1339251441000, :_id "542692d3c026201cdc326fb9"}], :notes nil, :arglists ["x"], :doc "Returns true if x is a future", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/future_q"} {:added "1.0", :ns "clojure.core", :name "zero?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1400618891000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pos?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dde"} {:created-at 1400618896000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "neg?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ddf"} {:created-at 1605573252870, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "=", :ns "clojure.core"}, :_id "5fb31a84e4b0b1e3652d7406"}], :line 867, :examples [{:updated-at 1423525588057, :created-at 1279075455000, :body "(zero? 0) ;;=> true\n(zero? 0.0) ;;=> true\n(zero? 2r000) ;;=> true\n(zero? 0x0) ;;=> true\n\n(zero? 1) ;;=> false\n(zero? 3.14159265358M) ;;=> false\n(zero? (/ 1 2)) ;;=> false\n\n(zero? nil) ;;=> NullPointerException", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/147981?v=3", :account-source "github", :login "dpritchett"}, :_id "542692c8c026201cdc326a6d"}], :notes [{:author {:login "chbrown", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/360279?v=3"}, :updated-at 1499457802441, :created-at 1499457802441, :body "`(zero? x)` calls `(clojure.lang.Numbers/isZero x)`, which will throw a `ClassCastException ... cannot be cast to java.lang.Number` or `NullPointerException` if `x` is anything but a number.", :_id "595fe90ae4b06e730307db50"}], :arglists ["num"], :doc "Returns true if num is zero, else false", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/zero_q"} {:added "1.9", :ns "clojure.core", :name "simple-keyword?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495715327644, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "keyword?", :ns "clojure.core"}, :_id "5926cdffe4b093ada4d4d764"} {:created-at 1495715337823, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "qualified-keyword?", :ns "clojure.core"}, :_id "5926ce09e4b093ada4d4d765"}], :line 1637, :examples [{:updated-at 1495722311941, :created-at 1495722311941, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body "(simple-keyword? :keyword)\n;;=> true\n\n(simple-keyword? :user/:keyword)\n;;=> false\n(simple-keyword? ::keyword)\n;;=> false\n\n(simple-keyword? \"string\")\n;;=> false\n(simple-keyword? 42)\n;;=> false\n(simple-keyword? nil)\n;;=> false", :_id "5926e947e4b093ada4d4d769"}], :notes nil, :arglists ["x"], :doc "Return true if x is a keyword without a namespace", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/simple-keyword_q"} {:added "1.0", :ns "clojure.core", :name "require", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1281451664000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "remove-ns", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bf3"} {:created-at 1291628612000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "import", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bf4"} {:created-at 1291628619000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "use", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bf5"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "ns", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :created-at 1358655983000, :_id "542692eaf6e94c6970521bf6"} {:created-at 1423094191542, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "refer", :library-url "https://github.com/clojure/clojure"}, :_id "54d2b1afe4b081e022073c60"} {:created-at 1654081012452, :author {:login "PEZ", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/30010?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "requiring-resolve", :ns "clojure.core"}, :_id "629745f4e4b0b1e3652d75f4"} {:created-at 1654081063935, :author {:login "PEZ", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/30010?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "resolve", :ns "clojure.core"}, :_id "62974627e4b0b1e3652d75f6"}], :line 6007, :examples [{:author {:login "scode", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/87b4fd6e7ac86cbf1f1b683f7856057?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:avatar-url "https://avatars.githubusercontent.com/u/8088318?v=3", :account-source "github", :login "jackyfkc"} {:avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3", :account-source "github", :login "svenschoenung"} {:login "jkxyz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10171367?v=4"}], :body ";; Require clojure.set and call its union function:\n\nuser=> (require 'clojure.set)\nnil\nuser=> (clojure.set/union #{1} #{2})\n#{1 2}\n", :created-at 1279160245000, :updated-at 1667391689806, :_id "542692ccc026201cdc326cb8"} {:updated-at 1461731642529, :created-at 1283923768000, :body ";; alias clojure.java.io as io\nuser=> (require '[clojure.java.io :as io])\nnil\n\nuser=> (io/file \"Filename\")\n#\n\n;; alias clojure.java.io as io using prefixes\nuser=> (require '(clojure.java [io :as io2]))\nnil\n\nuser=> (io2/file \"Filename\")\n#", :editors [{:avatar-url "https://www.gravatar.com/avatar/bd6e62afb4881ab0f617611b8b65d003?r=PG&default=identicon", :account-source "clojuredocs", :login "teyc"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/bc41ebab54cc0e0fbe99d753876d45ce?r=PG&default=identicon", :account-source "clojuredocs", :login "Victor"} {:avatar-url "https://www.gravatar.com/avatar/bc41ebab54cc0e0fbe99d753876d45ce?r=PG&default=identicon", :account-source "clojuredocs", :login "Victor"} {:login "jackyfkc", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8088318?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/bd6e62afb4881ab0f617611b8b65d003?r=PG&default=identicon", :account-source "clojuredocs", :login "teyc"}, :_id "542692ccc026201cdc326cbb"} {:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [], :body "(ns rosettacode.24game\n (:require [clojure.string :as str]))\n\n(defn parse-infix-data\n \"input '1+2+3+4'\n output (1 + 2 + 3 + 4)\n where the numbers are clojure numbers, and the symbols are clojure operators\"\n [string] (map read-string (next (str/split string #\"\"))))", :created-at 1289382235000, :updated-at 1289382235000, :_id "542692ccc026201cdc326cc0"} {:author {:login "lambder", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1c0c20072f52de3a6335cae183b865f6?r=PG&default=identicon"}, :editors [], :body "(require '(clojure.contrib [sql :as sql]))", :created-at 1314991093000, :updated-at 1314991093000, :_id "542692ccc026201cdc326cc1"} {:author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :editors [{:login "nickgieschen", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cbfa20635c9269675d54547c080c9b64?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :body "(ns myproject.core\n (:use [clojure.core] :reload)\n (:require [clojure.string :as str :refer [replace]] :reload-all))\n\n(str/replace \"foo\" #\"o\" \"e\")\n\"fee\"\n\n; similar but using a prefix.\n(ns myproject.core\n (:require (clojure [core]\n [string :as str :refer [replace]] ))) \n\n", :created-at 1358655968000, :updated-at 1507304199209, :_id "542692d5c026201cdc327072"} {:updated-at 1482287160163, :created-at 1482284632050, :author {:login "ichisemasashi", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/679549?v=3"}, :body "; rename a function name (thanks for @noisesmith)\n; rename 'clojure.repl/doc' to 'd'\nuser=> (require '[clojure.repl :as r :refer [doc] :rename {doc d}])\nnil\nuser=> (d doc)\n-------------------------\nclojure.repl/doc\n([name])\nMacro\n Prints documentation for a var or special form given its name\nnil\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/679549?v=3", :account-source "github", :login "ichisemasashi"}], :_id "5859de58e4b004d3a355e2cd"} {:updated-at 1608133142354, :created-at 1608133142354, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :body ";; Note that require is known _not_ to be thread safe in Clojure 1.10.x and\n;; earlier, so avoid calling it concurrently from multiple threads.\n\n;; See https://ask.clojure.org/index.php/9893/require-is-not-thread-safe\n;; for some thoughts on approaches to using require from multiple threads\n;; safely, which today boils down to \"use locks to make all calls to require\n;; guaranteed to execute one at a time\".", :_id "5fda2a16e4b0b1e3652d7419"} {:updated-at 1654081970684, :created-at 1654081970684, :author {:login "PEZ", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/30010?v=4"}, :body ";; Watch out for the Gilardi scenario: https://technomancy.us/143\n;; If you need to refer to the required symbols in the same block\n;; of code as it is being defined, that will only work at top level\n;; and in top-level `do`:\n\n(do\n (require '[clojure.set :as c-set])\n (c-set/union #{1} #{2})) ; => #{\"1\" \"2\"}\n\n;; It won't work here, because the compiler does not know about\n;; `c-set` when it tries to compile the form:\n\n(->> [\"1\" \"2\"]\n (reduce (fn [acc v]\n (require '[clojure.set :as c-set])\n (c-set/union acc #{v}))\n #{})) ; => Syntax error compiling at ...\n ; No such namespace: c-set\n\n;; A solution is to move the use of the required symbol to run-time.\n;; E.g. with `resolve`:\n\n(->> [\"1\" \"2\"]\n (reduce (fn [acc v]\n (require '[clojure.set :as c-set])\n ((resolve 'c-set/union) acc #{v}))\n #{})) ; => #{\"1\" \"2\"}\n\n;; At which point `requiring-resolve` might be clearer:\n\n(->> [\"1\" \"2\"]\n (reduce (fn [acc v]\n ((requiring-resolve 'clojure.set/union) acc #{v}))\n #{})) ; => #{\"1\" \"2\"}", :_id "629749b2e4b0b1e3652d75f7"} {:updated-at 1654162737681, :created-at 1654162737681, :author {:login "imrekoszo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1116295?v=4"}, :body ";; As a follow-up to previous examples, one more reason to prefer using\n;; `requiring-resolve` from within runtime functions when possible, is that it\n;; wraps `require` in a thread-safe way (require itself is not thread-safe as of\n;; 1.11.1 as mentioned in an earlier example).\n;; This is done via the private function `clojure.core/serialized-require`\n;; Some more info can be found in the comment at\n;; https://ask.clojure.org/index.php/9893/require-is-not-thread-safe?show=9902#c9902", :_id "62988531e4b0b1e3652d75f8"}], :notes [{:updated-at 1291628629000, :body "Good description of use/require/import here:\r\n\r\nhttp://blog.8thlight.com/articles/2010/12/6/clojure-libs-and-namespaces-require-use-import-and-ns", :created-at 1291628629000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521faa"}], :arglists ["& args"], :doc "Loads libs, skipping any that are already loaded. Each argument is\n either a libspec that identifies a lib, a prefix list that identifies\n multiple libs whose names share a common prefix, or a flag that modifies\n how all the identified libs are loaded. Use :require in the ns macro\n in preference to calling this directly.\n\n Libs\n\n A 'lib' is a named set of resources in classpath whose contents define a\n library of Clojure code. Lib names are symbols and each lib is associated\n with a Clojure namespace and a Java package that share its name. A lib's\n name also locates its root directory within classpath using Java's\n package name to classpath-relative path mapping. All resources in a lib\n should be contained in the directory structure under its root directory.\n All definitions a lib makes should be in its associated namespace.\n\n 'require loads a lib by loading its root resource. The root resource path\n is derived from the lib name in the following manner:\n Consider a lib named by the symbol 'x.y.z; it has the root directory\n /x/y/, and its root resource is /x/y/z.clj, or\n /x/y/z.cljc if /x/y/z.clj does not exist. The\n root resource should contain code to create the lib's\n namespace (usually by using the ns macro) and load any additional\n lib resources.\n\n Libspecs\n\n A libspec is a lib name or a vector containing a lib name followed by\n options expressed as sequential keywords and arguments.\n\n Recognized options:\n :as takes a symbol as its argument and makes that symbol an alias to the\n lib's namespace in the current namespace.\n :refer takes a list of symbols to refer from the namespace or the :all\n keyword to bring in all public vars.\n\n Prefix Lists\n\n It's common for Clojure code to depend on several libs whose names have\n the same prefix. When specifying libs, prefix lists can be used to reduce\n repetition. A prefix list contains the shared prefix followed by libspecs\n with the shared prefix removed from the lib names. After removing the\n prefix, the names that remain must not contain any periods.\n\n Flags\n\n A flag is a keyword.\n Recognized flags: :reload, :reload-all, :verbose\n :reload forces loading of all the identified libs even if they are\n already loaded\n :reload-all implies :reload and also forces loading of all libs that the\n identified libs directly or indirectly load via require or use\n :verbose triggers printing information about each load, alias, and refer\n\n Example:\n\n The following would load the libraries clojure.zip and clojure.set\n abbreviated as 's'.\n\n (require '(clojure zip [set :as s]))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/require"} {:added "1.0", :ns "clojure.core", :name "unchecked-dec-int", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1678034697354, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unchecked-inc-int", :ns "clojure.core"}, :_id "6404c709e4b08cf8563f4b7a"}], :line 1163, :examples [{:updated-at 1658482155693, :created-at 1658482155693, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body "(unchecked-dec-int 42);; => 41\n(unchecked-dec-int 42.2);; => 41\n(unchecked-dec-int Integer/MIN_VALUE);; => 2147483647", :_id "62da6debe4b0b1e3652d762e"}], :notes nil, :arglists ["x"], :doc "Returns a number one less than x, an int.\n Note - uses a primitive operator subject to overflow.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-dec-int"} {:added "1.1", :ns "clojure.core", :name "persistent!", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1286870194000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "transient", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a86"}], :line 3349, :examples [{:author {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}, :editors [], :body "user> (def foo (transient [1 2 3]))\n#'user/foo\nuser> foo\n#\nuser> (persistent! foo)\n[1 2 3]\nuser> foo\n#\nuser> (conj! foo 4)\n→ ERROR:Transient used after persistent! call\nuser> (persistent! foo)\n→ ERROR: Transient used after persistent! call", :created-at 1307739912000, :updated-at 1307739912000, :_id "542692cdc026201cdc326d20"} {:body ";; Use persistent! to evaluate your object,\n;; once the computation is complete\n\n(loop [large-set (transient #{})\n i 0]\n (if (< i 100000)\n (recur (conj! large-set i) (inc i))\n (persistent! large-set)))\n\n;; Returns a large set *much* faster than its\n;; persistent version. While keeping the same\n;; code structure\n", :author {:login "mattvvhat", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/367789?v=3"}, :created-at 1428551188131, :updated-at 1428551188131, :_id "5525f614e4b01bb732af0a7c"}], :notes nil, :arglists ["coll"], :doc "Returns a new, persistent version of the transient collection, in\n constant time. The transient collection cannot be used after this\n call, any such use will throw an exception.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/persistent!"} {:added "1.0", :ns "clojure.core", :name "nnext", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1482183664107, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "next", :ns "clojure.core"}, :_id "585853f0e4b004d3a355e2bb"} {:created-at 1482183673811, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "fnext", :ns "clojure.core"}, :_id "585853f9e4b004d3a355e2bc"} {:created-at 1482183802054, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ffirst", :ns "clojure.core"}, :_id "5858547ae4b004d3a355e2c0"} {:created-at 1482183808882, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nfirst", :ns "clojure.core"}, :_id "58585480e4b004d3a355e2c1"}], :line 119, :examples [{:updated-at 1672789836612, :created-at 1281033362000, :body "user=> (nnext '(1 2 3))\n(3)\n\nuser=> (nnext [])\nnil \n\nuser=> (nnext ['(a b c) '(b a c) '(c b a) '(a c b)])\n((c b a) (a c b)) \n\nuser=> (nnext {:a 1, :b 2, :c 3, :d 4})\n([:c 3] [:d 4]) \n\nuser=> (nnext #{:a :b :c})\n(:c)", :editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon", :account-source "clojuredocs", :login "zmila"}, :_id "542692cbc026201cdc326ba1"}], :notes nil, :arglists ["x"], :doc "Same as (next (next x))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/nnext"} {:added "1.0", :ns "clojure.core", :name "add-watch", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1331138866000, :author {:login "pjlegato", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4ce55cfd8b3ae2f63f5ecbc8fc1c05d4?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "remove-watch", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e04"}], :line 2144, :examples [{:author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :editors [{:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Daniel Brotsky", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/afb394be4b0eb5fc369a2fdbfea0a236?r=PG&default=identicon"}], :body ";; Add useful context to watcher function:\n(defn watch-agent [_agent context]\n (let [watch-fn (fn [_context _key _ref old-value new-value] ;...\n )] \n (add-watch _agent nil (partial watch-fn context))))\n", :created-at 1279390260000, :updated-at 1356749167000, :_id "542692c6c026201cdc326935"} {:updated-at 1507629557002, :created-at 1356749543000, :body "Notice that it is nondeterministic that return happens first\nor the `print` call happens first. (because they are happening in different threads)\n \nuser> (def a (agent 0))\n=> #'user/a\nuser> a\n=> #agent[{:status :ready, :val 0} 0x591e4e8e]\nuser> (add-watch a :key (fn [k r os ns] (print k r os ns)))\n=> #agent[{:status :ready, :val 0} 0x591e4e8e]\nuser> (send a inc)\n=> #agent[{:status :ready, :val 1} 0x591e4e8e]\n:key #agent[{:status :ready, :val 1} 0x591e4e8e] 0 1\nuser> (send a inc)\n:key #agent[{:status :ready, :val 2} 0x591e4e8e] 1 2\n=> #agent[{:status :ready, :val 2} 0x591e4e8e]\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/afb394be4b0eb5fc369a2fdbfea0a236?r=PG&default=identicon", :account-source "clojuredocs", :login "Daniel Brotsky"} {:avatar-url "https://avatars.githubusercontent.com/u/154699?v=3", :account-source "github", :login "avasenin"} {:login "wontheone1", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/11784756?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/afb394be4b0eb5fc369a2fdbfea0a236?r=PG&default=identicon", :account-source "clojuredocs", :login "Daniel Brotsky"}, :_id "542692d1c026201cdc326f45"} {:body "(def a (atom {}))\n\n(add-watch a :watcher\n (fn [key atom old-state new-state]\n (prn \"-- Atom Changed --\")\n (prn \"key\" key)\n (prn \"atom\" atom)\n (prn \"old-state\" old-state)\n (prn \"new-state\" new-state)))\n\n(reset! a {:foo \"bar\"})\n\n;; \"-- Atom Changed --\"\n;; \"key\" :watcher\n;; \"atom\" #\n;; \"old-state\" {}\n;; \"new-state\" {:foo \"bar\"}\n;; {:foo \"bar\"}", :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=3"}, :created-at 1419712448016, :updated-at 1419712448016, :_id "549f17c0e4b09260f767ca7f"} {:body ";; The name of my account can change, and I want to update another atom accordingly.\n;; I just take the fourth argument that contains the new state and I ignore the other arguments.\n\n(let [account (atom {:name \"pending\" \n :funds 100.50 \n :profit-loss 23.45})\n label-account-name (atom \"no-name-yet\")]\n (add-watch account :listener-one #(reset! label-account-name (:name %4)))\n (println \"Before swap:\" @label-account-name)\n (swap! account assoc :name \"CFD\")\n (println \"After swap:\" @label-account-name))\n\n;; Before swap: no-name-yet\n;; After swap: CFD", :author {:login "EfrainBergillos", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/9882960?v=3"}, :created-at 1421365692915, :updated-at 1421365692915, :_id "54b851bce4b081e022073c17"} {:body ";; ClojureScript: Log the new value of the ref to console whenever it changes\n\n(def a (atom nil))\n\n(add-watch a :logger #(-> %4 clj->js js/console.log))\n\n(reset! a (my-app/initial-state))", :author {:login "jkxyz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10171367?v=3"}, :created-at 1434457905527, :updated-at 1434458524720, :editors [{:login "jkxyz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10171367?v=3"}], :_id "55801731e4b01ad59b65f4f7"}], :notes [{:author {:login "hura", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/671872?v=3"}, :updated-at 1438348899904, :created-at 1438348899904, :body "One \"gotcha\" is that atoms `add-watch`es do not always guarantee order semantics. So if you have a watch put `[old-val new-val]` on a channel, and your atom operation is something like `(swap! a inc)`, you may see values in your channel like this:\n\n```\n[0 1]\n[2 3]\n[1 2]\n[3 4]\n[6 7]\n[4 5]\n```\n\nThis is because the watches are dispatched in different threads.\n\n[Source](https://groups.google.com/d/msg/clojure/RI1Pq3E3188/YyqyGq36f1oJ)", :_id "55bb7663e4b03580923b00db"}], :arglists ["reference key fn"], :doc "Adds a watch function to an agent/atom/var/ref reference. The watch\n fn must be a fn of 4 args: a key, the reference, its old-state, its\n new-state. Whenever the reference's state might have been changed,\n any registered watches will have their functions called. The watch fn\n will be called synchronously, on the agent's thread if an agent,\n before any pending sends if agent or ref. Note that an atom's or\n ref's state may have changed again prior to the fn call, so use\n old/new-state rather than derefing the reference. Note also that watch\n fns may be called from multiple threads simultaneously. Var watchers\n are triggered only by root binding changes, not thread-local\n set!s. Keys must be unique per reference, and can be used to remove\n the watch with remove-watch, but are otherwise considered opaque by\n the watch mechanism.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/add-watch"} {:added "1.0", :ns "clojure.core", :name "not-every?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1315793146000, :author {:login "wdkrnls", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/6d08a2f792f289b95fe1d982d4133d71?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "every?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b10"} {:created-at 1315793156000, :author {:login "wdkrnls", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/6d08a2f792f289b95fe1d982d4133d71?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "not-any?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b11"} {:created-at 1315793166000, :author {:login "wdkrnls", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/6d08a2f792f289b95fe1d982d4133d71?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "some", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b12"}], :line 2684, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (not-every? odd? '(1 2 3))\ntrue\nuser=> (not-every? odd? '(1 3))\nfalse", :created-at 1279074566000, :updated-at 1332950344000, :_id "542692ccc026201cdc326c92"}], :notes nil, :tag "java.lang.Boolean", :arglists ["pred coll"], :doc "Returns false if (pred x) is logical true for every x in\n coll, else true.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/not-every_q"} {:added "1.0", :ns "clojure.core", :name "class?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1357883124000, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "class", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f40"}], :line 5443, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [], :body "user=> (class? 1)\nfalse\n\nuser=> (class? java.lang.String)\ntrue\n\nuser=> (class? [])\nfalse", :created-at 1286508711000, :updated-at 1286508711000, :_id "542692cac026201cdc326b16"}], :notes nil, :arglists ["x"], :doc "Returns true if x is an instance of Class", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/class_q"} {:added "1.0", :ns "clojure.core", :name "rem", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1305751179000, :author {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "quot", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521de4"} {:created-at 1305751201000, :author {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "mod", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521de5"}], :line 1269, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (rem 10 9)\n1\nuser=> (rem 2 2)\n0", :created-at 1279071638000, :updated-at 1332952568000, :_id "542692c8c026201cdc3269df"} {:author {:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"}, :editors [{:login "popopome", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f764e6667c2664b9979227fc40be024e?r=PG&default=identicon"} {:login "popopome", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f764e6667c2664b9979227fc40be024e?r=PG&default=identicon"} {:login "zw", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/263299?v=2"} {:login "num1", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/466333?v=3"} {:avatar-url "https://avatars3.githubusercontent.com/u/7660326?v=4", :account-source "github", :login "Shinkenjoe"} {:login "xiechao06", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/2888536?v=4"}], :body ";; rem and mod are commonly used to get the remainder.\n;; mod means Knut's mod (truncating towards negativity). \n;; rem implements ANSI C's % operator\n;; Absolute value stays the same, always the distance\n;; towards zero.\n;; sign depends on dividend. \n\n\nuser=> (rem -10 3)\n-1\nuser=> (rem 10 -3)\n1\nuser=> (rem -10 -3)\n-1\nuser=> (rem 10 3)\n1\n\nuser=> (mod -10 3)\n2\nuser=> (mod 10 -3)\n-2\nuser=> (mod -10 -3)\n-1", :created-at 1314221509000, :updated-at 1562902867081, :_id "542692c8c026201cdc3269e1"}], :notes nil, :arglists ["num div"], :doc "remainder of dividing numerator by denominator.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/rem"} {:added "1.2", :ns "clojure.core", :name "agent-error", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1329375490000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "agent", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e79"} {:created-at 1329375495000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "restart-agent", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e7a"} {:created-at 1329375504000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "set-error-handler!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e7b"}], :line 2169, :examples [{:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [], :body "(def tdate (agent (java.util.Date.)))\n\n@tdate\n=> #\n\n(send tdate inc) ;;this has no meaning, rendering a (silent) error\n\n(agent-error tdate)\n=> #", :created-at 1329375525000, :updated-at 1329375525000, :_id "542692d1c026201cdc326f48"}], :notes nil, :arglists ["a"], :doc "Returns the exception thrown during an asynchronous action of the\n agent if the agent is failed. Returns nil if the agent is not\n failed.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/agent-error"} {:added "1.0", :ns "clojure.core", :name "some", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1302013833000, :author {:login "pauldoo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5cb916d3c8abc9f45a093209e72489fb?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "every?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b19"} {:created-at 1314584649000, :author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "not-any?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b1a"} {:created-at 1333669222000, :author {:login "Radford Smith", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7db5c7bf2289ca4da17da34aef761283?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "keep", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b1b"} {:created-at 1333669233000, :author {:login "Radford Smith", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7db5c7bf2289ca4da17da34aef761283?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "keep-indexed", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b1c"} {:created-at 1374512423000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "some-fn", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b1d"} {:created-at 1436882896023, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "some->", :ns "clojure.core"}, :_id "55a517d0e4b020189d740552"} {:created-at 1550596421868, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "contains?", :ns "clojure.core"}, :_id "5c6c3945e4b0ca44402ef697"} {:created-at 1550597894678, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "some?", :ns "clojure.core"}, :_id "5c6c3f06e4b0ca44402ef698"} {:created-at 1550597965635, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "if-some", :ns "clojure.core"}, :_id "5c6c3f4de4b0ca44402ef699"} {:created-at 1550597978829, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "when-some", :ns "clojure.core"}, :_id "5c6c3f5ae4b0ca44402ef69a"}], :line 2692, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body ";; 2 is even, so `some` stops there, 3 and 4 are never tested\n(some even? '(1 2 3 4))\n;;=> true\n\n;; they are all odd, so not true, i.e. nil\n(some even? '(1 3 5 7))\n;;=> nil", :created-at 1279071879000, :updated-at 1423276722153, :_id "542692c6c026201cdc32693b"} {:author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :body "(some true? [false false false])\n;;=> nil\n\n(some true? [false true false])\n;;=> true\n\n(some true? [true true true])\n;;=> true\n", :created-at 1279402782000, :updated-at 1412977043756, :_id "542692c6c026201cdc32693c"} {:author {:login "MrHus", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"} {:login "Okwori", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/16775439?v=4"}], :body "(some #(= 5 %) [1 2 3 4 5])\n;;=> true\n\n(some #(= 5 %) [6 7 8 9 10])\n;;=> nil\n\n(some #(not= 5 %) [1 2 3 4 5])\n;;=> true\n\n(some #(not= 5 %) [6 7 8 9 10])\n;;=> true", :created-at 1279415908000, :updated-at 1628796580693, :_id "542692c6c026201cdc32693d"} {:author {:login "jamesqiu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc1268deaa7f2e78fe2b5ea76e6481d8?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; the first logical true value is returned, i.e. anything but nil and false\n;; when return nil if its predicate is logical false.\n(some #(when (even? %) %) '(1 2 3 4))\n;;=> 2", :created-at 1297541384000, :updated-at 1421346805315, :_id "542692c6c026201cdc32693e"} {:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:avatar-url "https://avatars1.githubusercontent.com/u/636991?v=4", :account-source "github", :login "edgardini"}], :body ";; a hash acts as a function returning nil when the\n;; key is not present and the key value otherwise.\n(some {2 \"two\" 3 \"three\"} [nil 3 2])\n;;=> \"three\"\n\n;; there is nothing special about the 'nil' in the collection,\n;; it is still being used as a key to find its corresponding value in the hash.\n(some {nil \"nothing\" 2 \"two\" 3 \"three\"} [nil 3 2])\n;;=> \"nothing\"\n\n;; the hash (as function) returns a nil for the key of '3',\n;; therefore 'some' keeps inspecting the collection,\n;; returning the next logical true value.\n(some {2 \"two\" 3 nil} [nil 3 2])\n;;=> \"two\"", :created-at 1310849563000, :updated-at 1587274820037, :_id "542692c6c026201cdc32693f"} {:updated-at 1688285065877, :created-at 1314584832000, :body ";; `some` can be used in place of `(first (filter ...))` in most cases.\n(first (filter even? [1 2 3 4]))\n;;=> 2\n\n;; `some` returns exactly one item or `nil` if nothing is found.\n(some #(when (even? %) %) [1 2 3 4])\n;;=> 2\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "finalfantasia", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2316604?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon", :account-source "clojuredocs", :login "shockbob"}, :_id "542692c6c026201cdc326940"} {:updated-at 1617899114358, :created-at 1314782258000, :body ";; find whether a word is in a list of words.\n(def word \"foo\")\n(def words [\"bar\" \"baz\" \"foo\" \"\"])\n(some (partial = word) words)\n;;=> true", :editors [{:avatar-url "https://www.gravatar.com/avatar/34f159f89cbd1d9beac0276f5a7af552?r=PG&default=identicon", :account-source "clojuredocs", :login "uvtc"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=2", :account-source "github", :login "phreed"} {:login "rsangar1", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10330856?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon", :account-source "clojuredocs", :login "gstamp"}, :_id "542692c6c026201cdc326941"} {:author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:login "rsangar1", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10330856?v=4"}], :body ";; here we see sets being used as a predicate\n;; the first member of the collection that appears in the set is returned\n\n(some #{2} (range 0 10)) ;;=> 2\n(some #{6 2 4} (range 0 10)) ;;=> 2\n(some #{2 4 6} (range 3 10)) ;;=> 4\n(some #{200} (range 0 10)) ;;=> nil\n\n", :created-at 1362705803000, :updated-at 1617899235932, :_id "542692d5c026201cdc32708a"} {:body ";; be careful, 'nil' can occasionally be returned on success.\n(#{nil} nil)\n;;=> nil \n\n;; almost as troublesome is returning a false\n(#{false} false)\n;;=> false", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1421347932889, :updated-at 1421347932889, :_id "54b80c5ce4b0e2ac61831cb9"} {:body ";; if you have a case where the predicate arguments are fixed/known, \n;; but the predicate function isn't:\n;; coll can supply the predicate function instead of the predicate arguments\n\n;; define the function 'not equal' (ne)\n(defn ne [n1 n2] (not= n1 n2))\n;;=> #'user/ne\n\n(some #(% 3 7) (list ne))\n;;=>true\n\n(some #(% 3 3) (list ne))\n;;=>nil\n\n\n", :author {:login "qsys", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2430465?v=3"}, :created-at 1428947077779, :updated-at 1428947719382, :editors [{:login "qsys", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2430465?v=3"}], :_id "552c0085e4b01bb732af0a7d"} {:body ";; extending the previous example: supplying multiple functions.\n(defn ne [n1 n2] (not= n1 n2)) \n;;=> #'user/ne\n\n;; function to check if the sum is less than 'limit'\n(defn sumlt [limit n1 n2] (> limit (+ n1 n2))) \n;;=>'user/sumlt\n\n(some #(% 3 7) (list ne #(sumlt 10 %1 %2))) \n;;=>true\n\n(some #(% 3 3) (list ne #(sumlt 10 %1 %2))) \n;;=>true\n\n(some #(% 7 7) (list ne #(sumlt 10 %1 %2))) \n;;=>nil\n\n;; same, but one of the functions returns a value instead a boolean.\n(some #(% 3 7) (list ne (fn [n1 n2] (+ n1 n2)))) \n;;=>true\n\n(some #(% 7 7) (list ne (fn [n1 n2] (+ n1 n2)))) \n;;=>14\n\n;; the importance of order of the function list.\n(some #(% 7 7) (list ne #(sumlt 10 %1 %2) (fn [n1 n2] (+ n1 n2)))) \n;;=>14\n\n(some #(% 7 7) (list ne (fn [n1 n2] (+ n1 n2)) #(sumlt 10 %1 %2))) \n;;=>14\n\n(some #(% 3 3) (list ne #(sumlt 10 %1 %2) (fn [n1 n2] (+ n1 n2)))) \n;;=>true\n\n(some #(% 3 3) (list ne (fn [n1 n2] (+ n1 n2)) #(sumlt 10 %1 %2))) \n;;=>6\n", :author {:login "qsys", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2430465?v=3"}, :created-at 1428947310117, :updated-at 1428948227036, :editors [{:login "qsys", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2430465?v=3"}], :_id "552c016ee4b033f34014b76d"} {:updated-at 1446612111804, :created-at 1446612111804, :author {:login "Art-B", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1143795?v=3"}, :body ";;if you want to return the element the caused the predicate to return true\n;;use the \"and\" function on the predicate and the argument:\n\n(some #(and (even? %) %) [1 3 5 7 8 2])\n;;=> 8", :_id "56398c8fe4b0290a56055d1b"} {:updated-at 1543509450658, :created-at 1543509450658, :author {:login "aviflax", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/141844?v=4"}, :body ";; As an alternative to the above usage of `and`, I prefer to use `if`\n;; in such cases; I think it’s slightly clearer:\n\n(some #(if (even? %) %) [1 3 5 7 8 2])\n;;=> 8", :_id "5c0015cae4b0ca44402ef5d1"} {:updated-at 1626283719651, :created-at 1626283719651, :author {:login "humorless", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3061798?v=4"}, :body ";; `some` can be an alternative for `apply or`\n(def v [nil false 5 nil 7])\n\n;; (apply or v)\n;; java runtime exception because or is macro\n\n(some identity v)\n;;=> 5\n\n;; Source - lamdaisland episode\n;; https://lambdaisland.com/episodes/clojure-core-some", :_id "60ef1ec7e4b0b1e3652d7517"}], :notes [{:updated-at 1351243602000, :body "Be careful about using sets as predicates if you don't know what is in the set.\r\nIn particular,
    (#{nil} nil)
    is
    nil
    and
    (#{false} false)
    is
    false
    Consider using
    contains?
    instead.", :created-at 1351243602000, :author {:login "Sgeo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bf4e0e4e4f0b1f703b1372a8dd7b0735?r=PG&default=identicon"}, :_id "542692edf6e94c6970521ff3"}], :arglists ["pred coll"], :doc "Returns the first logical true value of (pred x) for any x in coll,\n else nil. One common idiom is to use a set as pred, for example\n this will return :fred if :fred is in the sequence, otherwise nil:\n (some #{:fred} coll)", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/some"} {:added "1.1", :ns "clojure.core", :name "future-cancelled?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "future", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1339251909000, :_id "542692eaf6e94c6970521aa0"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "future?", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1339251915000, :_id "542692eaf6e94c6970521aa1"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "future-cancel", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1339251923000, :_id "542692eaf6e94c6970521aa2"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "future-done?", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1339251931000, :_id "542692eaf6e94c6970521aa3"}], :line 7006, :examples [{:updated-at 1339251900000, :created-at 1339251900000, :body "user=> (def f (future (inc 0))) \n#'user/f\n\nuser=> (future-cancel f) \nfalse\n\nuser=> (future-cancelled? f)\nfalse\n\nuser=> (future-done? f) \ntrue\n\nuser=> @f \n1\n", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :_id "542692d3c026201cdc326fb5"} {:updated-at 1339252110000, :created-at 1339252110000, :body "user=> (def f (future (Thread/sleep 5000) (inc 0)))\n#'user/f\n\nuser=> (future-cancel f) \ntrue\n\nuser=> (future-cancelled? f) \ntrue\n\nuser=> (future-done? f) \ntrue\n\nuser=> @f \njava.util.concurrent.CancellationException (NO_SOURCE_FILE:0)", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :_id "542692d3c026201cdc326fb6"}], :notes nil, :arglists ["f"], :doc "Returns true if future f is cancelled", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/future-cancelled_q"} {:added "1.0", :ns "clojure.core", :name "memfn", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos nil, :line 3871, :examples [{:updated-at 1285500178000, :created-at 1279241437000, :body "user=> (def *files* (file-seq (java.io.File. \"/tmp/\")))\n#'user/*files*\nuser=> (count (filter (memfn isDirectory) *files*))\n68\nuser=> (count (filter #(.isDirectory %) *files*))\n68\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692cac026201cdc326b0d"} {:editors [{:login "bsima", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/200617?v=3"}], :updated-at 1447790514365, :created-at 1434489283413, :author {:avatar-url "https://avatars.githubusercontent.com/u/519370?v=3", :account-source "github", :login "emidln"}, :body "user=> ;; you must pass arguments to your method to add up to the expected arity\n\nuser=> (def starts-with (memfn startsWith prefix))\n#'user/starts-with\nuser=> (starts-with \"pikachu\" \"pika\")\ntrue\nuser=> (starts-with \"pikachu\" \"bulba\")\nfalse", :_id "558091c3e4b03e2132e7d199"} {:updated-at 1532986210979, :created-at 1532986210979, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body "(set! *warn-on-reflection* true)\n\n;; memfn is inherently subject to reflective calls\n\n(time (dotimes [n 100000] (mapv (memfn toLowerCase) [\"A\" \"B\" \"C\"])))\n;; Reflection warning, call to toLowerCase can't be resolved\n;; \"Elapsed time: 794.081758 msecs\"\n\n;; But accepts and propagate type hints to avoid it\n\n(time (dotimes [n 100000] (mapv (memfn ^String toLowerCase) [\"A\" \"B\" \"C\"])))\n;; \"Elapsed time: 33.708462 msecs\"", :_id "5b5f8362e4b00ac801ed9e3d"}], :macro true, :notes nil, :arglists ["name & args"], :doc "Expands into code that creates a fn that expects to be passed an\n object and any args and calls the named instance method on the\n object passing the args. Use when you want to treat a Java method as\n a first-class fn. name may be type-hinted with the method receiver's\n type in order to avoid reflective calls.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/memfn"} {:added "1.9", :ns "clojure.core", :name "neg-int?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495640945095, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pos-int?", :ns "clojure.core"}, :_id "5925ab71e4b093ada4d4d732"} {:created-at 1495640949709, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nat-int?", :ns "clojure.core"}, :_id "5925ab75e4b093ada4d4d733"} {:created-at 1495705357040, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "int?", :ns "clojure.core"}, :_id "5926a70de4b093ada4d4d74f"}], :line 1414, :examples [{:updated-at 1495703597089, :created-at 1495703597089, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body "(neg-int? -1)\n;;=> true\n(neg-int? -9223372036854775808)\n;;=> true\n\n;;;; false for non-negative values\n\n(neg-int? 0)\n;;=> false\n(neg-int? 1)\n;;=> false\n\n;;;; false for decimal values\n\n(neg-int? -1.0)\n;;=> false\n(neg-int? -1/2)\n;;=> false\n\n;;;; false for BigInt values\n\n(neg-int? -1N)\n;;=> false\n(neg-int? -9223372036854775809)\n;;=> false", :_id "5926a02de4b093ada4d4d74a"}], :notes nil, :arglists ["x"], :doc "Return true if x is a negative fixed precision integer", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/neg-int_q"} {:added "1.0", :ns "clojure.core", :name "struct-map", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1283400432000, :author {:login "james", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4b163432c99a124feee4be046a3f9d66?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "struct", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c56"}], :line 4052, :examples [{:author {:login "james", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4b163432c99a124feee4be046a3f9d66?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; create a new struct type\n(defstruct s :1 :2)\n#'user/s\n\nuser=> (type s)\nclojure.lang.PersistentStructMap$Def\n\n;; create an instance of this new struct type\n(def s1 (struct s \"one\" \"two\"))\n#'user/s1\n\nuser=> (println s1)\n{:1 \"one\", :2 \"two\"}\n\nuser=> (type s1)\nclojure.lang.PersistentStructMap\n\n;; create a new struct instance that is based on the previous struct type\n;; with the option of supplying a new key/value pairs\n(def s2 (struct-map s :3 \"three\"))\n#'user/s2\n\nuser=> (println s2)\n{:1 nil, :2 nil, :3 \"three\"}\n\nuser=> (type s2)\nclojure.lang.PersistentStructMap\n", :created-at 1283401838000, :updated-at 1285488890000, :_id "542692ccc026201cdc326c94"} {:updated-at 1473936902003, :created-at 1473936902003, :author {:login "PetrGlad", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/124476?v=3"}, :body ";; Map -> struct\n(defstruct S :db)\n(into (struct-map S) {:db \"db\" :name \"Grut\"})", :_id "57da7e06e4b0709b524f04fa"}], :notes nil, :arglists ["s & inits"], :doc "Returns a new structmap instance with the keys of the\n structure-basis. keyvals may contain all, some or none of the basis\n keys - where values are not supplied they will default to nil.\n keyvals can also contain keys not in the basis.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/struct-map"} {:added "1.0", :ns "clojure.core", :name "drop", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1288872301000, :author {:login "jartur", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8eae7b45fd8d383bc1a49e24bee51c9b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "take", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521c99"} {:created-at 1288872352000, :author {:login "jartur", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8eae7b45fd8d383bc1a49e24bee51c9b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "drop-last", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521c9a"} {:created-at 1288872358000, :author {:login "jartur", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8eae7b45fd8d383bc1a49e24bee51c9b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "drop-while", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521c9b"} {:created-at 1306331554000, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "nthnext", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521c9c"} {:created-at 1356088859000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "nthrest", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521c9d"}], :line 2909, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; although negative (or zero) drop-item-counts are accepted they do nothing\n(drop -1 [1 2 3 4])\n;;=> (1 2 3 4) \n\n(drop 0 [1 2 3 4])\n;;=> (1 2 3 4) \n\n(drop 2 [1 2 3 4])\n;;=> (3 4) \n\n;; dropping more items than are present is allowed, and all items are dropped.\n(drop 5 [1 2 3 4])\n;;=> ()", :created-at 1280344844000, :updated-at 1420736258191, :_id "542692cec026201cdc326da3"} {:body ";; similar to subvec but lazy and with seqs\n(take 3 (drop 5 (range 1 11)))\n;;=> (6 7 8)", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1420736116932, :updated-at 1420736116932, :_id "54aeb674e4b081e022073bf2"}], :notes nil, :arglists ["n" "n coll"], :doc "Returns a lazy sequence of all but the first n items in coll.\n Returns a stateful transducer when no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/drop"} {:added "1.4", :ns "clojure.core", :name "*data-readers*", :file "clojure/core.clj", :type "var", :column 1, :see-alsos [{:created-at 1618154998966, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "print-method", :ns "clojure.core"}, :_id "607315f6e4b0b1e3652d74c2"}], :dynamic true, :line 7758, :examples [{:updated-at 1618154693914, :created-at 1618154693914, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :body "(import '[java.net URL])\n\n;; Teaching Clojure how to read URL objects from a string\n\n(binding [*data-readers* {'url #(URL. %)}] \n (read-string \"#url \\\"file:/etc/hosts\\\"\"))\n\n;; #object[java.net.URL 0x64a8c844 \"file:/etc/hosts\"]", :_id "607314c5e4b0b1e3652d74c1"}], :notes [{:author {:login "rmoehn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/311879?v=3"}, :updated-at 1436316512612, :created-at 1436316512612, :body "`clojure.edn/read` and `clojure.edn/read-string` don't look into\n`*data-readers*` in order to find the reader functions for a reader tag.\nThat's why they won't get the mappings from `data_readers.clj` either.\nSee the [note on `clojure.edn/read`](https://clojuredocs.org/clojure.edn/read)\nfor more information and a warning.", :_id "559c7360e4b00f9508fd66fa"} {:author {:login "raxod502", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6559064?v=3"}, :updated-at 1483727344008, :created-at 1483727344008, :body "Note that if you're using `clojure.reader/read` instead of `clojure.core/read`, you have to bind `clojure.reader/*data-readers*` rather than `clojure.core/*data-readers*`.", :_id "586fe1f0e4b09108c8545a4a"}], :arglists [], :doc "Map from reader tag symbols to data reader Vars.\n\n When Clojure starts, it searches for files named 'data_readers.clj'\n and 'data_readers.cljc' at the root of the classpath. Each such file\n must contain a literal map of symbols, like this:\n\n {foo/bar my.project.foo/bar\n foo/baz my.project/baz}\n\n The first symbol in each pair is a tag that will be recognized by\n the Clojure reader. The second symbol in the pair is the\n fully-qualified name of a Var which will be invoked by the reader to\n parse the form following the tag. For example, given the\n data_readers.clj file above, the Clojure reader would parse this\n form:\n\n #foo/bar [1 2 3]\n\n by invoking the Var #'my.project.foo/bar on the vector [1 2 3]. The\n data reader function is invoked on the form AFTER it has been read\n as a normal Clojure data structure by the reader.\n\n Reader tags without namespace qualifiers are reserved for\n Clojure. Default reader tags are defined in\n clojure.core/default-data-readers but may be overridden in\n data_readers.clj, data_readers.cljc, or by rebinding this Var.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*data-readers*"} {:added "1.0", :ns "clojure.core", :name "nth", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1303125578000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "first", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d83"} {:created-at 1303125582000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "second", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d84"} {:created-at 1303125660000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "nthnext", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d85"} {:created-at 1389744320000, :author {:login "jw0", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ca45063da41a9f3aa9028295d8b66d89?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "get", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d86"} {:created-at 1544035070645, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "take-nth", :ns "clojure.core"}, :_id "5c081afee4b0ca44402ef5dd"} {:created-at 1544035081114, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nthrest", :ns "clojure.core"}, :_id "5c081b09e4b0ca44402ef5de"} {:created-at 1544035090445, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "rand-nth", :ns "clojure.core"}, :_id "5c081b12e4b0ca44402ef5df"}], :line 889, :examples [{:updated-at 1433457696443, :created-at 1279417427000, :body "; Note that nth uses zero-based indexing, so that\n; (first my-seq) <=> (nth my-seq 0)\n(def my-seq [\"a\" \"b\" \"c\" \"d\"])\n(nth my-seq 0)\n; => \"a\"\n(nth my-seq 1)\n; => \"b\"\n(nth [] 0)\n; => IndexOutOfBoundsException ...\n(nth [] 0 \"nothing found\")\n; => \"nothing found\"\n(nth [0 1 2] 77 1337)\n; => 1337", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/3272?v=3", :account-source "github", :login "morty"} {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"} {:avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3", :account-source "github", :login "cloojure"}], :author {:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"}, :_id "542692cbc026201cdc326c10"} {:updated-at 1473696117507, :created-at 1473696117507, :author {:login "st-keller", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/476463?v=3"}, :body "(nth [\"last\"] -1 \"this is not perl\")\n; => \"this is not perl\"", :_id "57d6d175e4b0709b524f04f5"}], :notes [{:author {:login "pesterhazy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/106328?v=3"}, :updated-at 1475067300924, :created-at 1475067300924, :body "Rather than throwing an exception, `(nth nil n)` returns `nil` for any number `n`.", :_id "57ebbda4e4b0709b524f050f"} {:author {:login "beoliver", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1413969?v=4"}, :updated-at 1558362123119, :created-at 1558362123119, :body "Floats are treated as indexes `(nth [0 1] 1.9)` returns the element at index `1`. At first glance it may seem as though they are always rounded down. However due to floating point precision `(nth [0 1] 1.9999999999999999)` will raise an `IndexOutOfBoundsException`.", :_id "5ce2b80be4b0ca44402ef727"}], :arglists ["coll index" "coll index not-found"], :doc "Returns the value at the index. get returns nil if index out of\n bounds, nth throws an exception unless not-found is supplied. nth\n also works for strings, Java arrays, regex Matchers and Lists, and,\n in O(n) time, for sequences.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/nth"} {:added "1.0", :ns "clojure.core", :name "sorted?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1281961844000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sorted-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521af9"} {:created-at 1281961850000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sorted-set", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521afa"}], :line 6256, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (sorted? (sorted-set 5 3 1 2 4))\ntrue\nuser=> (sorted? (sorted-map :a 1 :c 3 :b 2))\ntrue\n\n;; Note you can't just pass in a collection that happens to be sorted.\nuser=> (sorted? [1 2 3 4 5])\nfalse\n", :created-at 1281961832000, :updated-at 1285494525000, :_id "542692c7c026201cdc326985"} {:author {:login "Alexey Tarasevich", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/43e0398b89022d32b43de4c968069312?r=PG&default=identicon"}, :editors [{:login "Alexey Tarasevich", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/43e0398b89022d32b43de4c968069312?r=PG&default=identicon"}], :body "=> (sorted? (sort [1 2]))\nfalse", :created-at 1385847625000, :updated-at 1385847666000, :_id "542692d5c026201cdc327097"}], :notes nil, :arglists ["coll"], :doc "Returns true if coll implements Sorted", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/sorted_q"} {:added "1.0", :ns "clojure.core", :name "nil?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1365638069000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "identity", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c87"} {:created-at 1431460678381, :author {:login "mmavko", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1064539?v=3"}, :to-var {:ns "clojure.core", :name "some?", :library-url "https://github.com/clojure/clojure"}, :_id "55525b46e4b01ad59b65f4ce"}], :line 436, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user=> (nil? nil)\ntrue\nuser=> (nil? 0)\nfalse\nuser=> (nil? false)\nfalse\nuser=> (nil? '())\nfalse", :created-at 1279074467000, :updated-at 1423017086496, :_id "542692c6c026201cdc326943"} {:updated-at 1514329022413, :created-at 1509054633215, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body ";; as nil? is defined as \"Returns true if x is nil, false otherwise.\"\n;; and some? is defined as \"Returns true if x is not nil, false otherwise.\"\n\n;; (some? x) is just shorthand for (not (nil? x))\n;; this also means that nil? is the same as (not (some? x)) as this\n;; just expands into (not (not (nil? x))).\n\n(def nil?? (complement some?))\n;;#'user/nil??\n\n(for [x [nil 0 false [] '()]]\n (= (nil? x) (nil?? x)))\n;;=> (true true true true true)", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/1413969?v=4", :account-source "github", :login "beoliver"} {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :_id "59f258a9e4b0a08026c48c78"}], :notes nil, :tag "java.lang.Boolean", :arglists ["x"], :doc "Returns true if x is nil, false otherwise.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/nil_q"} {:added "1.2", :ns "clojure.core", :name "extend-protocol", :file "clojure/core_deftype.clj", :type "macro", :column 1, :see-alsos [{:created-at 1336670528000, :author {:login "Cosmi", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10f2eae92de67116fa98d06ec55fcf29?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "extend", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b0a"} {:created-at 1336670535000, :author {:login "Cosmi", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10f2eae92de67116fa98d06ec55fcf29?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "extend-type", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b0b"} {:created-at 1351471414000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defprotocol", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b0c"}], :line 868, :examples [{:updated-at 1489086655613, :created-at 1298553541000, :body "(defprotocol XmlNode\n (as-xml [this]))\n\n(defrecord User [^Integer id ^String name ^java.util.Date dob])\n\n;; Protocols can be extended to existing types and user defined types\n(extend-protocol XmlNode\n Integer\n (as-xml [this] (str this))\n String\n (as-xml [this] (identity this))\n java.util.Date\n (as-xml [this] (-> (java.text.SimpleDateFormat. \"yyyy-MM-dd HH:mm:ss\")\n (.format this)))\n User\n (as-xml [this] (str \"\"\n \"\" (as-xml (:id this)) \"\"\n \"\" (as-xml (:name this)) \"\"\n \"\" (as-xml (:dob this)) \"\"\n \"\")))", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/1837?v=2", :account-source "github", :login "bmabey"} {:login "Akeboshiwind", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/8889986?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/696a8f13a7fcf0b4265fe801f18ba7b5?r=PG&default=identicon", :account-source "clojuredocs", :login "kevinjqiu"}, :_id "542692cdc026201cdc326d08"}], :macro true, :notes nil, :arglists ["p & specs"], :doc "Useful when you want to provide several implementations of the same\n protocol all at once. Takes a single protocol and the implementation\n of that protocol for one or more types. Expands into calls to\n extend-type:\n\n (extend-protocol Protocol\n AType\n (foo [x] ...)\n (bar [x y] ...)\n BType\n (foo [x] ...)\n (bar [x y] ...)\n AClass\n (foo [x] ...)\n (bar [x y] ...)\n nil\n (foo [x] ...)\n (bar [x y] ...))\n\n expands into:\n\n (do\n (clojure.core/extend-type AType Protocol \n (foo [x] ...) \n (bar [x y] ...))\n (clojure.core/extend-type BType Protocol \n (foo [x] ...) \n (bar [x y] ...))\n (clojure.core/extend-type AClass Protocol \n (foo [x] ...) \n (bar [x y] ...))\n (clojure.core/extend-type nil Protocol \n (foo [x] ...) \n (bar [x y] ...)))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/extend-protocol"} {:added "1.0", :ns "clojure.core", :name "split-at", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1314290653000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "split-with", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f61"} {:created-at 1314291163000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "split", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f62"} {:created-at 1665533548834, :author {:login "mdave16", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/15642321?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "subvec", :ns "clojure.core"}, :_id "6346066ce4b0b1e3652d7677"}], :line 2985, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user=> (split-at 2 [1 2 3 4 5])\n[(1 2) (3 4 5)]\n\nuser=> (split-at 3 [1 2])\n[(1 2) ()]", :created-at 1281512425000, :updated-at 1423277558140, :_id "542692c9c026201cdc326af7"} {:editors [{:login "calebwebster", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/61309806?v=4"}], :body "user=> (let [[first-half second-half] (split-at 3 [1 2 3 4 5 6])] first-half)\n(1 2 3)", :author {:avatar-url "https://avatars.githubusercontent.com/u/61309806?v=4", :account-source "github", :login "calebwebster"}, :created-at 1682641999924, :updated-at 1682642529546, :_id "644b144fe4b08cf8563f4ba3"} {:updated-at 1689932824742, :created-at 1689932824742, :author {:login "flipsi", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6862899?v=4"}, :body "user=> (split-at 2 [:a :b :c :d])\n[(:a :b) (:c :d)]\n", :_id "64ba5418e4b08cf8563f4bd5"}], :notes nil, :arglists ["n coll"], :doc "Returns a vector of [(take n coll) (drop n coll)]", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/split-at"} {:added "1.0", :ns "clojure.core", :name "*e", :file "clojure/core.clj", :type "var", :column 1, :see-alsos [{:created-at 1334156010000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.repl", :name "pst", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ad3"}], :dynamic true, :line 6294, :examples [{:updated-at 1423525828173, :created-at 1281462019000, :body "user=> (ns-refers) ;;Oops! we missed a namespace (ns-refers 'user)\n; Evaluation aborted.\n\nuser=> *e\n#", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692c9c026201cdc326af2"}], :notes nil, :arglists [], :doc "bound in a repl thread to the most recent exception caught by the repl", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*e"} {:added "1.0", :ns "clojure.core", :name "load-reader", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1350072969000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "load-file", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bb9"}], :line 4082, :examples [{:author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :editors [], :body "(load-reader (java.io.FileReader. \"filename.clj\"))", :created-at 1350072954000, :updated-at 1350072954000, :_id "542692d4c026201cdc326ff5"}], :notes nil, :arglists ["rdr"], :doc "Sequentially read and evaluate the set of forms contained in the\n stream/file", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/load-reader"} {:added "1.7", :ns "clojure.core", :name "random-sample", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1554235214583, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "rand", :ns "clojure.core"}, :_id "5ca3bf4ee4b0ca44402ef6f8"} {:created-at 1554235230102, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "shuffle", :ns "clojure.core"}, :_id "5ca3bf5ee4b0ca44402ef6f9"} {:created-at 1579868288317, :author {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "rand-nth", :ns "clojure.core"}, :_id "5e2ae080e4b0ca44402ef821"} {:created-at 1579868294562, :author {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "rand-int", :ns "clojure.core"}, :_id "5e2ae086e4b0ca44402ef822"}], :line 7673, :examples [{:updated-at 1452115466344, :created-at 1452115466344, :author {:login "DanBurton", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/713692?v=3"}, :body ";; The output of random-sample is a sequence.\n;; Each element of the original collection has probability \"prob\"\n;; of being included in the output sequence.\n\n(random-sample 0.5 [1 2 3 4 5])\n;;=> (1 2 4)\n\n\n;; random-sample can operate on an infinite sequence,\n;; producing an infinite sequence.\n\n(take 10 (random-sample 0.1 (repeat :foo)))\n;;=> (:foo :foo :foo :foo :foo :foo :foo :foo :foo :foo)\n\n(take 10 (random-sample 0.01 (range)))\n;;=> (57 113 281 286 352 497 727 768 957 960)", :_id "568d860ae4b0e0706e05bd9d"}], :notes nil, :arglists ["prob" "prob coll"], :doc "Returns items from coll with random probability of prob (0.0 -\n 1.0). Returns a transducer when no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/random-sample"} {:added "1.5", :ns "clojure.core", :name "cond->", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1411998595433, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "cond->>", :library-url "https://github.com/clojure/clojure"}, :_id "54296383e4b09282a148f1f5"} {:created-at 1411998602440, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "->", :library-url "https://github.com/clojure/clojure"}, :_id "5429638ae4b09282a148f1f6"} {:created-at 1411998615269, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "->>", :library-url "https://github.com/clojure/clojure"}, :_id "54296397e4b09282a148f1f8"} {:created-at 1411998624770, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "as->", :library-url "https://github.com/clojure/clojure"}, :_id "542963a0e4b09282a148f1f9"} {:created-at 1411998631299, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "some->", :library-url "https://github.com/clojure/clojure"}, :_id "542963a7e4b09282a148f1fa"} {:created-at 1411998638842, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "some->>", :library-url "https://github.com/clojure/clojure"}, :_id "542963aee4b09282a148f1fb"} {:created-at 1411998676919, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "cond", :library-url "https://github.com/clojure/clojure"}, :_id "542963d4e4b09282a148f1fc"} {:created-at 1541446172443, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "if", :ns "clojure.core"}, :_id "5be09a1ce4b00ac801ed9eed"}], :line 7538, :examples [{:editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=2", :account-source "github", :login "phreed"} {:login "blue0513", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8979468?v=4"}], :updated-at 1614926804893, :created-at 1413201278329, :author {:avatar-url "https://avatars.githubusercontent.com/u/154699?v=2", :account-source "github", :login "avasenin"}, :body "\n(cond-> 1 ; we start with 1\n true inc ; the condition is true so (inc 1) => 2\n false (* 42) ; the condition is false so the operation is skipped\n (= 2 2) (* 3)) ; (= 2 2) is true so (* 2 3) => 6 \n;;=> 6\n;; notice that the threaded value gets used in \n;; only the form and not the test part of the clause.", :_id "543bbd7ee4b0e1a656a1ce56"} {:editors [{:login "bkovitz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/200617?v=3", :account-source "github", :login "bsima"}], :updated-at 1478639146955, :created-at 1414318380459, :author {:avatar-url "https://avatars.githubusercontent.com/u/1724788?v=2", :account-source "github", :login "arichiardi"}, :body ";; Useful when you want to conditionally evaluate expressions and thread them \n;; together. For instance, the following returns a vector containing the names \n;; (as symbols) of the implementing classes of obj.\n\n=> (defn instance->types\n [obj]\n (cond-> [] \n (instance? java.util.SortedMap obj) (conj 'SortedMap)\n (instance? java.util.AbstractMap obj) (conj 'AbstractMap)))\n#'user/instance->types\n\n=> (def hm (java.util.HashMap.))\n#'user/hm\n\n=> (instance->types hm)\n[AbstractMap]\n\n=> (def tm (java.util.TreeMap.))\n#'user/tm\n\n=> (instance->types tm)\n[SortedMap AbstractMap]", :_id "544cc92ce4b03d20a102427b"} {:updated-at 1460811298414, :created-at 1460416087314, :author {:login "trikitrok", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2502164?v=3"}, :body "=> (defn divisible-by? [divisor number] \n (zero? (mod number divisor)))\n#'user/divisible-by?\n\n=> (defn say [n]\n (cond-> nil\n (divisible-by? 3 n) (str \"Fizz\")\n (divisible-by? 5 n) (str \"Buzz\")\n :always (or (str n))))\n#'user/say\n\n=> (say 1)\n\"1\"\n\n=> (say 3)\n\"Fizz\"\n\n=> (say 5)\n\"Buzz\"\n\n=> (say 15)\n\"FizzBuzz\"", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/5594302?v=3", :account-source "github", :login "jwatki06"}], :_id "570c2e57e4b0fc95a97eab4a"} {:editors [{:login "mhmdsalem1993", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10787314?v=3"}], :body "(let [x 1 y 2]\n (cond-> []\n (odd? x) (conj \"x is odd\")\n (zero? (rem y 3)) (conj \"y is divisible by 3\")\n (even? y) (conj \"y is even\")))\n;=> [\"x is odd\" \"y is even\"]\n\n;;; IS Equivalent to \n\n(let [x 1 y 2]\n (as-> [] <>\n (if (odd? x)\n (conj <> \"x is odd\")\n <>)\n (if (zero? (rem y 3)) \n (conj <> \"y is divisible by 3\") \n <>)\n (if (even? y)\n (conj <> \"y is even\")\n <>)))\n;=> [\"x is odd\" \"y is even\"] ", :author {:avatar-url "https://avatars.githubusercontent.com/u/10787314?v=3", :account-source "github", :login "mhmdsalem1993"}, :created-at 1482844255361, :updated-at 1482844441856, :_id "5862685fe4b0123d4c9dfa36"} {:updated-at 1602284044262, :created-at 1542058214210, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body "; Consider a code snippet that coerces any string to an integer, else noop:\n(let [x \"123\"] \n (if (string? x) \n (Integer. x) \n x))\n\n; We can reduce the repetition of `x` by using `cond->`\n(let [x \"123\"] \n (cond-> x \n (string? x) (Integer.))) ", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/7083783?v=4", :account-source "github", :login "cloojure"}], :_id "5be9f0e6e4b00ac801ed9ef2"} {:updated-at 1658894505969, :created-at 1658894505969, :author {:login "rainbyte", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/749068?v=4"}, :body ";; always returns 1\n(defn f [x] 1)\n\n;; cond-> doesn't short circuit on nil\n(cond-> nil\n true f\n false inc\n true inc)\n;=> 2", :_id "62e0b8a9e4b0b1e3652d7630"} {:editors [{:login "daveliepmann", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/974443?v=4"}], :body ";; If most of a -> is unconditional but one step is conditional, cond-> is useful:\n\n(-> {}\n (assoc :foo \"foo\")\n (cond-> false\n (assoc :truthy true))\n (assoc :bar \"bar\"))\n;; => {:foo \"foo\", :bar \"bar\"}\n\n\n(-> {}\n (assoc :foo \"foo\")\n (cond-> true ; this is the only change from above\n (assoc :truthy true))\n (assoc :bar \"bar\"))\n;; => {:foo \"foo\", :truthy true, :bar \"bar\"}", :author {:avatar-url "https://avatars.githubusercontent.com/u/974443?v=4", :account-source "github", :login "daveliepmann"}, :created-at 1682519506133, :updated-at 1682519612025, :_id "644935d2e4b08cf8563f4b9a"}], :macro true, :notes nil, :arglists ["expr & clauses"], :doc "Takes an expression and a set of test/form pairs. Threads expr (via ->)\n through each form for which the corresponding test\n expression is true. Note that, unlike cond branching, cond-> threading does\n not short circuit after the first true test expression.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/cond->"} {:added "1.0", :ns "clojure.core", :name "dotimes", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1327501844000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "repeat", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c5f"} {:created-at 1338272081000, :author {:login "Omer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/dae0f434afde5246ccb030cdec81fb71?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "for", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c60"} {:created-at 1340037835000, :author {:login "Parijat Mishra", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e3aba44539a78ea92373418456f090e3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "doseq", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c61"}], :line 3313, :examples [{:author {:login "Brian Marick", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (dotimes [n 5] (println \"n is\" n))\nn is 0\nn is 1\nn is 2\nn is 3\nn is 4\nnil", :created-at 1278822115000, :updated-at 1332952709000, :_id "542692c7c026201cdc3269c5"} {:author {:login "GyrosOfWar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8abc292bf5d9e88cfcbcfbe492774a38?r=PG&default=identicon"}, :editors [{:login "GyrosOfWar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8abc292bf5d9e88cfcbcfbe492774a38?r=PG&default=identicon"} {:login "GyrosOfWar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8abc292bf5d9e88cfcbcfbe492774a38?r=PG&default=identicon"} {:login "GyrosOfWar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8abc292bf5d9e88cfcbcfbe492774a38?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (dotimes [n 10] \n (println (map #(* % (inc n)) (range 1 11))))\n\n(1 2 3 4 5 6 7 8 9 10)\n(2 4 6 8 10 12 14 16 18 20)\n(3 6 9 12 15 18 21 24 27 30)\n(4 8 12 16 20 24 28 32 36 40)\n(5 10 15 20 25 30 35 40 45 50)\n(6 12 18 24 30 36 42 48 54 60)\n(7 14 21 28 35 42 49 56 63 70)\n(8 16 24 32 40 48 56 64 72 80)\n(9 18 27 36 45 54 63 72 81 90)\n(10 20 30 40 50 60 70 80 90 100)\nnil", :created-at 1388454361000, :updated-at 1412833684226, :_id "542692d2c026201cdc326f94"} {:updated-at 1546681637583, :created-at 1546679853153, :author {:login "akhuramazda", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/46395055?v=4"}, :body "user=> (dotimes [x 8] (print x) \n (dotimes [y x] (print (get (vec \"Clojure\") y))) \n (newline))\n0\n1C\n2Cl\n3Clo\n4Cloj\n5Cloju\n6Clojur\n7Clojure\nnil\n\n;ranges with dotimes\n\n(dotimes [y 5] \n (println (map #(inc %) (range (inc y)))))\n\n(1)\n(1 2)\n(1 2 3)\n(1 2 3 4)\n(1 2 3 4 5)\nnil\n\n;factorials using ranges by dotimes\n\n(dotimes [y 5] \n (println \"factorial\" (inc y) \" = \" (apply * (map #(inc %) (range (inc y))))))\n\nfactorial 1 = 1\nfactorial 2 = 2\nfactorial 3 = 6\nfactorial 4 = 24\nfactorial 5 = 120\nnil\n", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/46395055?v=4", :account-source "github", :login "akhuramazda"}], :_id "5c30762de4b0ca44402ef60e"}], :macro true, :notes [{:author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}, :updated-at 1653798508777, :created-at 1653798508777, :body "`dotimes` always returns `nil` no matter what is returned by the body the last time through the loop.", :_id "6292f66ce4b0b1e3652d75f3"}], :arglists ["bindings & body"], :doc "bindings => name n\n\n Repeatedly executes body (presumably for side-effects) with name\n bound to integers from 0 through n-1.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/dotimes"} {:added "1.0", :ns "clojure.core", :name "select-keys", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1416824728916, :author {:login "alilee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/16739?v=3"}, :to-var {:ns "clojure.core", :name "get", :library-url "https://github.com/clojure/clojure"}, :_id "54730798e4b0dc573b892fde"} {:created-at 1470768451052, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "keys", :ns "clojure.core"}, :_id "57aa2543e4b0bafd3e2a04d2"} {:created-at 1485972364767, :author {:login "yochannah", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/9271438?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "dissoc", :ns "clojure.core"}, :_id "5892238ce4b01f4add58fe36"} {:created-at 1518043231143, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "hash-map", :ns "clojure.core"}, :_id "5a7b805fe4b0316c0f44f8b0"}], :line 1540, :examples [{:author {:login "Brian Marick", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon"}, :editors [{:login "Brian Marick", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon"} {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"} {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=2"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:avatar-url "https://avatars3.githubusercontent.com/u/11671382?v=4", :account-source "github", :login "dominem"}], :body "(select-keys {:a 1 :b 2} [:a])\n;;=> {:a 1}\n\n(select-keys {:a 1 :b 2} [:a :c])\n;;=> {:a 1}\n\n(select-keys {:a 1 :b 2 :c 3} [:a :c])\n;;=> {:c 3, :a 1}", :created-at 1278823330000, :updated-at 1565345504857, :_id "542692c8c026201cdc326a0a"} {:updated-at 1445936137205, :created-at 1445936137205, :author {:login "nzl-nott", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/458621?v=3"}, :body "user=> (select-keys [1 2 3] [0 0 2])\n{0 1, 2 3}", :_id "562f3c09e4b04b157a6648db"} {:updated-at 1528821523346, :created-at 1528821523346, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Extract letters at even indexes from a word into a map:\n(let [word \"hello\"] \n (select-keys (vec word) (filter even? (range (count word)))))\n;; {0 \\h, 2 \\l, 4 \\o}", :_id "5b1ff713e4b00ac801ed9e11"} {:updated-at 1596746741144, :created-at 1596746741144, :author {:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}, :body ";; select-keys can be useful for grabbing environment variables.\n;; it will not error or set a key to nil if some are missing.\n\n;; in the shell/terminal\nexport HTTP_PORT=8000\nexport HTTP_HOST=localhost\n\n;; in the clojure source code\n(ns myapp.core\n (:require [environ.core :as environ]))\n \n(def config (select-keys environ/env [:http-port\n :http-host\n :http-timeout]))\n\n;; notice http-timeout is omitted from the map\n(println config)\n;;=> {:http-port 8000, :http-host localhost}", :_id "5f2c6bf5e4b0b1e3652d7375"}], :notes [{:body "Why does `select-keys` return a map with keys in reverse order of the keyseq vector?\n\nJay Fields has a [good blog post](http://blog.jayfields.com/2011/01/clojure-select-keys-select-values-and.html) on `select-keys` with implementations of `select-values` (which is what I was really after).", :created-at 1425399933187, :updated-at 1425401550961, :author {:login "gknapp", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/143027?v=3"}, :_id "54f5e07de4b01ed96c93c881"} {:author {:login "TheSeldonPlan", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3837766?v=3"}, :updated-at 1444496540091, :created-at 1444496500482, :body "I think @gknapp is correct. `select-keys` returns a map with keys in the order of the keyseq vector. Perhaps this has changed since his comment, and the documentation needs to be updated. \n \n```clojure\nuser=> (select-keys {:a 1 :b 2 :c 3} [:a :c])\n{:a 1, :c 3}\nuser=> (select-keys {:a 1 :b 2 :c 3} [:c :a])\n{:c 3, :a 1}\n```\n\n", :_id "56194474e4b084e61c76ecc2"} {:author {:login "mlanza", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/39192?v=3"}, :updated-at 1448375423888, :created-at 1448375423888, :body "Wouldn't the following signature be better for partial application? \n\n (select-keys keyseq map)\n\n (def stooges [{:name \"Larry\" :birthday \"Oct 05\"} \n {:name \"Curly\" :birthday \"Jun 19\"} \n {:name \"Moe\" :birthday \"Oct 22\"}])\n\nTacit style is about consistent order (general to specific), not concision:\n\n (map (partial select-keys [:name]) stooges) ;tacit\n (map #(select-keys % [:name]) stooges)", :_id "5654747fe4b0be225c0c479d"} {:body "If you are looking for a `select-vals` or `select-values` alternative of this function, you can do the following:\n\n
    \n(map {:a 1 :b 2 :c 3 :d 4} [:a :d])\n;;=> (1 4)\n
    ", :created-at 1506607739129, :updated-at 1506607752839, :author {:avatar-url "https://avatars2.githubusercontent.com/u/76983?v=4", :account-source "github", :login "raszi"}, :_id "59cd027be4b03026fe14ea4c"} {:author {:login "hkjels", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/339547?v=4"}, :updated-at 1508228053028, :created-at 1508228053028, :body "`select-keys` will return in the order provided for `array-maps`. However, `array-maps` turn into `hash-maps` at a certain threshold, which are un-ordered. So generally, when you need certain ordering, use a sequence instead.", :_id "59e5bbd5e4b03026fe14ea92"} {:body "VERY IMPORTANT!!!\n\n`select-keys` returns a map. Maps DO NOT guarantee ordering of their key/value pairs. If you depend on order, do not rely on `select-keys`.\n\nYou might think the order is preserved, only because maps of 8 elements or less in Clojure are implemented with an `array-map` which preserves insertion order, but maps beyond that will use a `hash-map` which does not guarantee ordering. And this is an implementation details, in future release of Clojure, the threshold or type of implementation for maps could change to any other which could even break the ordering for small maps.", :created-at 1571861481277, :updated-at 1571861546570, :author {:avatar-url "https://avatars3.githubusercontent.com/u/601540?v=4", :account-source "github", :login "didibus"}, :_id "5db0b3e9e4b0ca44402ef7d2"}], :arglists ["map keyseq"], :doc "Returns a map containing only those entries in map whose key is in keys", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/select-keys"} {:added "1.0", :ns "clojure.core", :name "bit-and", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1414514292247, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "bit-or", :library-url "https://github.com/clojure/clojure"}, :_id "544fc674e4b03d20a102428f"}], :line 1293, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :body ";; bits can be entered using radix notation\n;; but they are long integers so by default they\n;; display in decimal.\n(bit-and 2r1100 2r1001)\n;;=> 8\n;; 8 = 2r1000\n\n;; here we see the same bits entered in decimal\n(bit-and 12 9)\n;;=> 8", :created-at 1280337486000, :updated-at 1414514260267, :_id "542692c8c026201cdc326a70"} {:author {:login "Pierre", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/dc0590890ca22fee047f8e2598c2568d?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :body ";; bits can be entered in hexidecimal\n(bit-and 0x08 0xFF)\n;;=> 8\n\n;; bits can be show with Integer/toHexString\n(Integer/toHexString (bit-and 0x0108 0xFFFF))\n;;=> \"108\"", :created-at 1332068603000, :updated-at 1414513918522, :_id "542692d2c026201cdc326f57"} {:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :body ";; bits can also be shown with Integer/toBinaryString\n\n(Integer/toBinaryString 235)\n;;=> \"11101011\"\n\n(Integer/toBinaryString 199)\n;;=> \"11000111\"\n\n(bit-and 235 199)\n;;=> 195\n\n(Integer/toBinaryString 195)\n;;=> \"11000011\"\n\n;; 11101011 = 235\n;;& 11000111 = 199\n;;==========\n;; 11000011 = 195", :created-at 1345828834000, :updated-at 1414513960925, :_id "542692d2c026201cdc326f58"} {:body ";; here is the truth table for AND \n(Integer/toBinaryString (bit-and 2r1100 2r1010) )\n;;=> \"1000\"\n;; or 2r1000", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1414514718289, :updated-at 1414514718289, :_id "544fc81ee4b03d20a1024295"}], :notes nil, :arglists ["x y" "x y & more"], :doc "Bitwise and", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bit-and"} {:added "1.9", :ns "clojure.core", :name "bounded-count", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495640661107, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "counted?", :ns "clojure.core"}, :_id "5925aa55e4b093ada4d4d72b"}], :line 7384, :examples [{:updated-at 1495640638447, :created-at 1495640638447, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body ";;;; Length of a vector can be determined in constant time\n;;;; so this always returns the actual length of the vector\n\n(bounded-count 5 [1 2 3 4])\n;;=> 4\n(bounded-count 5 [1 2 3 4 5])\n;;=> 5\n(bounded-count 5 [1 2 3 4 5 6])\n;;=> 6\n\n;;;; Length of a lazy seq cannot be determined in constant time\n;;;; so this counts at most the first 5 elements\n\n(bounded-count 5 (map identity [1 2 3 4]))\n;;=> 4\n(bounded-count 5 (map identity [1 2 3 4 5]))\n;;=> 5\n(bounded-count 5 (map identity [1 2 3 4 5 6]))\n;;=> 5", :_id "5925aa3ee4b093ada4d4d72a"} {:updated-at 1495640775383, :created-at 1495640775383, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body ";;;; This would run forever\n\n(count (range))\n\n;;;; But this doesn't\n\n(bounded-count 10000 (range))\n;;=> 10000\n", :_id "5925aac7e4b093ada4d4d72d"}], :notes nil, :arglists ["n coll"], :doc "If coll is counted? returns its count, else will count at most the first n\n elements of coll using its seq", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bounded-count"} {:added "1.7", :ns "clojure.core", :name "update", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1441163795513, :author {:login "brunchboy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2228869?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "update-in", :ns "clojure.core"}, :_id "55e66a13e4b0efbd681fbb91"} {:created-at 1441163918027, :author {:login "brunchboy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2228869?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "fnil", :ns "clojure.core"}, :_id "55e66a8ee4b072d7f27980f8"} {:created-at 1449608873882, :author {:login "Chort409", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1062637?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "assoc", :ns "clojure.core"}, :_id "566746a9e4b0f47c7ec61146"} {:created-at 1570520722969, :author {:login "xmo-odoo", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/7571158?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "associative?", :ns "clojure.core"}, :_id "5d9c3e92e4b0ca44402ef7cb"}], :line 6188, :examples [{:editors [{:login "hiteki", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2091138?v=3"} {:avatar-url "https://avatars3.githubusercontent.com/u/11671382?v=4", :account-source "github", :login "dominem"} {:login "dijonkitchen", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4"}], :body "(def p {:name \"James\" :age 26})\n;;=> #'user/p\n\n(update p :age inc)\n;;=> {:name \"James\", :age 27}\n\n;; remember, the value of p hasn't changed because it is immutable!\np\n;; {:name \"James\", :age 26}\n(update p :age + 10)\n;;=> {:name \"James\", :age 36}\n\n;; Here we see that the keyed object is \n;; the first argument in the function call.\n;; i.e. :age (- 26 10) => 16\n(update p :age - 10)\n;;=> {:name \"James\", :age 16}\n\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/2091138?v=3", :account-source "github", :login "hiteki"}, :created-at 1437170219147, :updated-at 1587790479572, :_id "55a97a2be4b0080a1b79cda8"} {:updated-at 1448421903787, :created-at 1448421903787, :author {:login "egracer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4086884?v=3"}, :body ";; the map in update can be nil, and f will still be applied to nil and \n;; return a value\n\n(def empty-map nil)\n#'user/empty-map\n\n(update empty-map :some-key #(str \"foo\" %))\n;;=> {:some-key \"foo\"}\n", :_id "56552a0fe4b053844439827b"} {:updated-at 1476877532228, :created-at 1476877532228, :author {:login "G1enY0ung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/15034155?v=3"}, :body ";; can also use in []\n\nuser=> (update [1 2 3] 0 inc)\n;;=> [2 2 3]\n\nuser=> (update [] 0 #(str \"foo\" %))\n;;=> [\"foo\"]", :_id "58075cdce4b001179b66bdcf"} {:updated-at 1524433722089, :created-at 1524433722089, :author {:login "statcompute", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/4590938?v=4"}, :body "(def ds [{:id 1.0 :name \"name1\"}\n {:id 2.0 :name \"name2\"}\n {:id 3.0 :name \"name3\"}])\n\n(map (fn [x] (update x :name #(if (= \"name2\" %) % \"not 2\"))) ds)\n\n;; ({:id 1.0, :name \"not 2\"} {:id 2.0, :name \"name2\"} {:id 3.0, :name \"not 2\"})", :_id "5add033ae4b045c27b7fac4d"} {:editors [{:login "elken", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2872862?v=4"}], :body ";; From string to boolean\n\n(def answer {:answer \"France\" :correct \"true\" :age 11})\n(update answer :correct #(= % \"true\"))\n\n;; {:answer \"France\", :correct true, :age 11}", :author {:avatar-url "https://avatars1.githubusercontent.com/u/226965?v=4", :account-source "github", :login "aarkerio"}, :created-at 1535749324652, :updated-at 1688394857769, :_id "5b89accce4b00ac801ed9e7c"} {:updated-at 1601184024906, :created-at 1601184024906, :author {:login "gloorfindel", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/49351337?v=4"}, :body ";; Applying a function to the same key in a sequence of arrays\n\n(def dates [{:date \"20200430\",:time \"08:35\"}\n {:date \"20200430\",:time \"09:15\"}]\n\n;; Takes the current time value in the array, and reduces it to the hour by \n;; calling the reduce-to-hour function (not included here)\n\n(map #(update % :time (constantly (reduce-to-hour (:time %)))) dates)\n=> ({:date \"20200430\", :time \"08\"} {:date \"20200430\", :time \"09\"})", :_id "5f702118e4b0b1e3652d73c2"} {:editors [{:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=4"}], :body ";; Very common, update a vector inside a map\n(def little-schemer {:authors [{:birth-year 1944, :name \"Daniel Friedman\"}\n {:name \"Matthias Felleisen\"}]\n :title \"The Little Schemer\"})\n\n(update little-schemer :authors conj {:name \"Gerald J. Sussman\"})\n;;=> \n{:authors [{:birth-year 1944, :name \"Daniel Friedman\"}\n {:name \"Matthias Felleisen\"}\n {:name \"Gerald J. Sussman\"}]\n :title \"The Little Schemer\"}", :author {:avatar-url "https://avatars.githubusercontent.com/u/889685?v=4", :account-source "github", :login "huahaiy"}, :created-at 1613242096574, :updated-at 1613242234272, :_id "60281ef0e4b0b1e3652d744f"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}], :body ";; For a simple change of value we can use constantly\n(def hm {:banana 1, :apple 2, :orange 3})\n\n(update hm :banana (constantly 6))\n;;=> {:banana 6 :apple 2 :orange 3}\n\n;; Which is equivalent to using \"assoc\"\n(assoc hm :banana 6)\n;;=> {:banana 6 :apple 2 :orange 3}", :author {:avatar-url "https://avatars.githubusercontent.com/u/8339935?v=4", :account-source "github", :login "rogefm"}, :created-at 1614089059545, :updated-at 1614426803060, :_id "60350b63e4b0b1e3652d7466"} {:updated-at 1623859525031, :created-at 1623859525031, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}, :body ";; A quirk in use with vectors (tested with 1.10.3)\n;; If you throw away the argument to the function, you can add a value to\n;; the end of the vector: \n\n;; Normal, expected behavior:\n(update [1 2 3] 2 (fn [_] 42))\n;;=> [1 2 42]\n\n;; If the index is just past the end, you can append to the vector:\n(update [1 2 3] 3 (fn [_] 42))\n;;=> [1 2 3 42]\n\n;; More than one past end won't work\n(update [1 2 3] 4 (fn [_] 42))\n;;=> Execution error (IndexOutOfBoundsException) at user/eval2049 (form-init3979469036338260438.clj:1).\n\n;; If you don't throw away the argument, and your index is one past\n;; the end of the vector, you'll still get an error:\n\n;; Normal, expected behavior:\n(update [1 2 3] 2 inc)\n;;=> [1 2 4]\n\n;; Here the trick fails:\n(update [1 2 3] 3 inc)\n;;=> Execution error (NullPointerException) at user/eval1985 (form-init8618353961027343980.clj:1).", :_id "60ca2145e4b0b1e3652d750a"}], :notes [{:author {:login "alper", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/72429?v=4"}, :updated-at 1576842276976, :created-at 1576842276976, :body "But how do you do a pure update idiomatically? So update one value for another?", :_id "5dfcb424e4b0ca44402ef7fc"} {:author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :updated-at 1633061790090, :created-at 1633061790090, :body "To the previous note (alper), you are looking for `assoc`. ", :_id "61568b9ee4b0b1e3652d754d"} {:author {:login "earthfail", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/21296448?v=4"}, :updated-at 1661097969047, :created-at 1661097969047, :body "in clojure 1.11 there is an [update-vals](https://github.com/clojure/clojure/blob/5ffe3833508495ca7c635d47ad7a1c8b820eab76/src/clj/clojure/core.clj#L8061) and [update-keys](https://github.com/clojure/clojure/blob/5ffe3833508495ca7c635d47ad7a1c8b820eab76/src/clj/clojure/core.clj#L8077) to apply function for all values or all keys respectively", :_id "630257f1e4b0b1e3652d7646"}], :arglists ["m k f" "m k f x" "m k f x y" "m k f x y z" "m k f x y z & more"], :doc "'Updates' a value in an associative structure, where k is a\n key and f is a function that will take the old value\n and any supplied args and return the new value, and returns a new\n structure. If the key does not exist, nil is passed as the old value.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/update"} {:added "1.0", :ns "clojure.core", :name "list*", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 648, :examples [{:author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body ";; `list*` function:\nuser=> (list* 1 [2 3])\n(1 2 3)\nuser=> (list* 1 2 [3 4])\n(1 2 3 4)\n\n;; compared to regular `list` function:\nuser=> (list 1 [2 3])\n(1 [2 3])\nuser=> (list 1 2 [3 4])\n(1 2 [3 4])\n\n;; Corner cases:\nuser=> (list* nil [1 2])\n(nil 1 2)\nuser=> (list* 1 nil)\n(1)\nuser=> (list* () [1 2])\n(() 1 2)\nuser=> (list* 1 ())\n(1)\n", :created-at 1280721203000, :updated-at 1306322562000, :_id "542692c6c026201cdc3268d5"} {:updated-at 1474307619700, :created-at 1474307619700, :author {:login "Manishapillai", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20270279?v=3"}, :body ";;Prepend a map to a list\nuser=> (list* {:name \"Anne\"} [{:city \"NJ\"}]) \n({:name \"Anne\"} {:city \"NJ\"})", :_id "57e02623e4b0709b524f0501"} {:updated-at 1541543275442, :created-at 1496358734409, :author {:login "smnplk", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/380618?v=3"}, :body ";; Useful if you want to get all the arguments of a function into a list (actually a seq, but that is not important)\n(defn args-to-list [a b c & args]\n (list* a b c args))\n\nuser=> (args-to-list 1 2 3 4 5 6)\n(1 2 3 4 5 6)\n\n;; same as list, but it expects the last element to be a sequence which is then unpacked \n\n;; Example usage in the wild\n(defn my-max\n ([a] a)\n ([a b] (if (> a b) a b))\n ([a b & args] (reduce my-max (list* a b args))))\n\n", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/380618?v=4", :account-source "github", :login "smnplk"}], :_id "59309f4ee4b06e730307db20"} {:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; `list*` function:\nuser=> (list* 1 '(2 3))\n(1 2 3)\n\nuser=> (list* 1 2 '(3 4))\n(1 2 3 4)", :author {:avatar-url "https://avatars3.githubusercontent.com/u/153773?v=4", :account-source "github", :login "arlicle"}, :created-at 1536069875312, :updated-at 1656675472111, :_id "5b8e90f3e4b00ac801ed9e86"} {:updated-at 1673074886220, :created-at 1673074886220, :author {:login "Chandrama1", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/78619926?v=4"}, :body ";; `list*` function:\n(list* \"Superman\" '(\"Batman\" \"Ironman\"))\n=> (\"Superman\" \"Batman\" \"Ironman\")\n\n(list* '(\"Batman\" \"Ironman\") '(\"Superman\" \"Hulk\"))\n=> ((\"Batman\" \"Ironman\") \"Superman\" \"Hulk\")\n\n(list* '(\"Batman\" \"Ironman\") \"Superman\")\n=> ((\"Batman\" \"Ironman\") \\S \\u \\p \\e \\r \\m \\a \\n)", :_id "63b918c6e4b08cf8563f4b5d"}], :notes [{:body "The doc string mentions returning a new list, but it should say a new sequence. Surprisingly, `list*` typically does not return an actual list. Instead, it usually returns a Cons, which works as a seq, but is not strictly a list. \n\n```\n(list? (list* 1 '(2 3)))\n;=> false\n\n(type (list* 1 '(2 3)))\n;=> clojure.lang.Cons\n\n(first (list* 1 '(2 3)))\n;=> 1\n\n(peek (list* 1 '(2 3)))\nClassCastException clojure.lang.Cons cannot be cast to clojure.lang.IPersistentStack\n\n(list? (list* '(2 3)))\n;=> true\n\n(list? (into () (list* 1 '(2 3))))\n;=> true\n```\n\nI think `seq*` would have been a better name for this function.", :created-at 1425311436162, :updated-at 1425311436162, :author {:login "miner", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25400?v=3"}, :_id "54f486cce4b0b716de7a652e"}], :arglists ["args" "a args" "a b args" "a b c args" "a b c d & more"], :doc "Creates a new seq containing the items prepended to the rest, the\n last of which will be treated as a sequence.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/list*"} {:added "1.2", :ns "clojure.core", :name "reify", :file "clojure/core_deftype.clj", :type "macro", :column 1, :see-alsos [{:created-at 1323993523000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "proxy", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ef4"}], :line 70, :examples [{:updated-at 1458043116563, :created-at 1315673869000, :body "(ns foo)\n\n;;; This is a library for the shopping result.\n\n(defrecord Banana [qty])\n(defrecord Grape [qty])\n(defrecord Orange [qty])\n\n;;; 'subtotal' differs from each fruit.\n\n(defprotocol Fruit\n (subtotal [item]))\n\n(extend-type Banana\n Fruit\n (subtotal [item]\n (* 158 (:qty item))))\n\n(extend-type Grape\n Fruit\n (subtotal [item]\n (* 178 (:qty item))))\n\n(extend-type Orange\n Fruit\n (subtotal [item]\n (* 98 (:qty item))))\n\n;;; 'coupon' is the function returing a 'reify' of subtotal. This is\n;;; when someone uses a coupon ticket, the price of some fruits is \n;;; taken off 25%.\n\n(defn coupon [item]\n (reify Fruit\n (subtotal [_]\n (int (* 0.75 (subtotal item))))))\n\n;;; Example: To compute the total when someone bought 10 oranges,\n;;; 15 bananas and 10 grapes, using a coupon for the grapes.\n(apply + (map subtotal [(Orange. 10) (Banana. 15) (coupon (Grape. 10))]))\n;;; 4685 ; (apply + '(980 2370 1335))", :editors [{:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"} {:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"} {:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"} {:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"} {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"} {:login "antonaut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/513311?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon", :account-source "clojuredocs", :login "yasuto"}, :_id "542692cdc026201cdc326d5d"} {:author {:login "number23", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/89e8dc9231de751fd558d5784406cc5e?r=PG&default=identicon"}, :editors [], :body ";; Using a reified FileFilter implementation to obtain only directory files\n(.listFiles (java.io.File. \".\")\n (reify\n java.io.FileFilter\n (accept [this f]\n (.isDirectory f))))\n", :created-at 1339172939000, :updated-at 1339172939000, :_id "542692d5c026201cdc32706f"} {:author {:login "puredanger", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/89c8afd032c7b3473f67c9b00d3acd5a?r=PG&default=identicon"}, :editors [], :body ";;;; This example shows how to reify a multi-arity protocol function\n;;;; (note the different style in defprotocol vs reify)\n\n;; define a multi-arity protocol function blah\n(defprotocol Foo\n (blah\n [this x]\n [this x y]))\n\n;; define an anonymous extension via reify\n(def r (reify Foo \n (blah [_ x] x)\n (blah [_ x y] y)))\n\n;; invoke blah via the r instance\n(blah r 1) ;; => 1\n(blah r 1 2) ;; => 2\n\n\n", :created-at 1355788930000, :updated-at 1355788930000, :_id "542692d5c026201cdc327070"} {:body ";; Note that nested class is referred via '$' \n;; and 'this' is always present in parameters (see underscore in parameters list):\n(Thread/setDefaultUncaughtExceptionHandler\n (reify java.lang.Thread$UncaughtExceptionHandler\n (uncaughtException [_ thread throwable]\n (println (str throwable)))))", :author {:login "PetrGlad", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/124476?v=3"}, :created-at 1420462447425, :updated-at 1420462470195, :editors [{:login "PetrGlad", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/124476?v=3"}], :_id "54aa896fe4b04e93c519ffb3"} {:updated-at 1440403056415, :created-at 1440377269300, :author {:login "yubrshen", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2638417?v=3"}, :body ";;; This example is inspired by the above one and simplified\n;;; to highlight reify's returning a value/\"object\" \n;;; with protocol realization for just this one piece of value/\"object\".\n\n(ns foo)\n\n(defrecord Grape [qty])\n\n(defprotocol Fruit\n (subtotal [item]))\n\n(extend-type Grape\n Fruit\n (subtotal [item]\n (* 178 (:qty item))))\n\n;;; 'discounted' is the function returning a 'reify' instance of fruit with modified \n;;; implementation of subtotal (with discount). That is, \n;;; when someone uses a discounted coupon, the price of the fruits is taken off 25%.\n\n(defn discounted [item]\n (reify Fruit\n (subtotal [_]\n (println \"modifying subtotal with discount:\")\n (int (* 0.75 (subtotal item))))))\n\n;;; Example:\n;;; There is 10 pieces of Grape, and the subtotal before discount is\n;;; (subtotal (Grape. 10))\n;;; => 1780\n\n;;; With discount, then\n;;; (subtotal (discounted (Grape. 10)))\n;;; => modifying subtotal with discount:\n;;; => 1335\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/2638417?v=3", :account-source "github", :login "yubrshen"}], :_id "55da69b5e4b0831e02cddf1e"} {:editors [{:login "Aljendro", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/7899307?v=3"}], :body "(comment\n \"reify\n\n verb | re·ify | \\\\ˈrā-ə-ˌfī, ˈrē-\\\\\n\n : to regard (something abstract) as a material or concrete thing\")\n\n(defprotocol shape\n \"A geometric shape.\"\n\n (area [this]\n \"Calculates the area of the shape.\n\n The first argument is required and corresponds to the implicit target\n object ('this' in Java parlance).\"))\n\n\n(defn make-circle\n \"Creates a circle (a geometric shape) object.\"\n [radius]\n\n (reify shape\n (area [_]\n (* Math/PI radius radius))))\n\n(. (make-circle 8) area)\n;;=> 201.06192982974676\n\n(def circle (make-circle 8))\n\n(satisfies? shape circle)\n;;=> true\n\n(. circle area)\n;;=> 201.06192982974676\n\n\n(defn make-triangle\n \"Creates a triangle (a geometric shape) object.\"\n [base height]\n\n (reify shape\n (area [_]\n (* 0.5 base height))))\n\n(def triangle (make-triangle 8 8))\n\n(. triangle area)\n;;=> 32.0\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/19507371?v=3", :account-source "github", :login "clojureling"}, :created-at 1463855829138, :updated-at 1493672301532, :_id "5740aad5e4b00a9b70be566c"} {:updated-at 1613046786005, :created-at 1613046786005, :author {:login "RokLenarcic", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3322433?v=4"}, :body ";; Attaching metadata to reify object creates a new instance\n;; Reify call itself attaches metadata of (reify ...) form to the object\n;; so effectively it always creates two objects but return one of them.\n\n;; This matters when you use finalize\n\n(defn create []\n (reify Object\n (finalize [this] (println \"GCing\" this) nil)))\n\n(do (create)\n (System/gc))\n\n;;GCing #object[.$create$reify__7691 0x3b287fd2 .$create$reify__7691@3b287fd2]\n;;GCing #object[.$create$reify__7691 0x38249fdc .$create$reify__7691@38249fdc]\n;;=> nil", :_id "60252402e4b0b1e3652d744c"} {:updated-at 1669428148216, :created-at 1669428148216, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=4"}, :body "(defprotocol Foo (foo-f [this]))\n(defprotocol Bar (bar-f [this]))\n\n;; It is fine to reify multiple protocol/interfaces\n(def foo-bar\n (reify\n Foo\n (foo-f [_] :foo)\n Bar\n (bar-f [_] :bar)))\n\n(foo-f foo-bar) ;;=>:foo\n(bar-f foo-bar) ;;=>:bar\n", :_id "638173b4e4b0b1e3652d7691"}], :macro true, :notes [{:author {:login "ieugen", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1050920?v=4"}, :updated-at 1680326363601, :created-at 1680326363601, :body "reify can implement multiple interfaces:\n\n```clojure\n(let [a (reify\n java.lang.AutoCloseable\n (close [_this]\n (println \"aaa\"))\n java.lang.Runnable\n (run [_this]\n (println \"Run\")))]\n (.close a)\n (.run a))\n```\n\nNote that methods in reify DO NOT accept docstrings like clojure defn's , although they look very similar. You will get compilation error with method not found if you use a docstring. \n\nSomething like this\n```\n; Evaluating file: java_map.clj\n; Syntax error (IllegalArgumentException) compiling reify* at (src/java_map.clj:27:5).\n; Can't define method not in interfaces: close\n; Evaluation of file java_map.clj failed: class clojure.lang.Compiler$CompilerException\n```", :_id "6427bedbe4b08cf8563f4b8b"} {:author {:login "ieugen", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1050920?v=4"}, :updated-at 1684257603676, :created-at 1684257154747, :body "Sometimes you will need to add type hints.\nThis is mandatory if there are overloaded methods. \n\nOne such case is when implementing `java.util.Collection` `toArray` .\n\nWithout type hints, you will get \n\n```\nMismatched return type: toArray, expected: [Ljava.lang.Object;, had: java.lang.Object\n```\n\nA correct way to handle this is like bellow.\n\nNote: when you add one type hint, you need to add for all methods in reify. \nSee docs above.\n```\n(reify java.util.Collection\n (^boolean containsAll [_this ^java.util.Collection c])\n (^objects toArray [_this]\n (throw (UnsupportedOperationException.)))\n (^objects toArray [_this ^objects objects]\n (throw (UnsupportedOperationException.))))\n```\n\nhttps://github.com/clojure/data.avl/commit/03f32144951ab7b50b8a74ea5e8c22629e7fbde0\n", :_id "6463b982e4b08cf8563f4bbc"}], :arglists ["& opts+specs"], :doc "reify is a macro with the following structure:\n\n (reify options* specs*)\n \n Currently there are no options.\n\n Each spec consists of the protocol or interface name followed by zero\n or more method bodies:\n\n protocol-or-interface-or-Object\n (methodName [args+] body)*\n\n Methods should be supplied for all methods of the desired\n protocol(s) and interface(s). You can also define overrides for\n methods of Object. Note that the first parameter must be supplied to\n correspond to the target object ('this' in Java parlance). Thus\n methods for interfaces will take one more argument than do the\n interface declarations. Note also that recur calls to the method\n head should *not* pass the target object, it will be supplied\n automatically and can not be substituted.\n\n The return type can be indicated by a type hint on the method name,\n and arg types can be indicated by a type hint on arg names. If you\n leave out all hints, reify will try to match on same name/arity\n method in the protocol(s)/interface(s) - this is preferred. If you\n supply any hints at all, no inference is done, so all hints (or\n default of Object) must be correct, for both arguments and return\n type. If a method is overloaded in a protocol/interface, multiple\n independent method definitions must be supplied. If overloaded with\n same arity in an interface you must specify complete hints to\n disambiguate - a missing hint implies Object.\n\n recur works to method heads The method bodies of reify are lexical\n closures, and can refer to the surrounding local scope:\n \n (str (let [f \"foo\"] \n (reify Object \n (toString [this] f))))\n == \"foo\"\n\n (seq (let [f \"foo\"] \n (reify clojure.lang.Seqable \n (seq [this] (seq f)))))\n == (\\f \\o \\o))\n \n reify always implements clojure.lang.IObj and transfers meta\n data of the form to the created object.\n \n (meta ^{:k :v} (reify Object (toString [this] \"foo\")))\n == {:k :v}", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/reify"} {:added "1.0", :ns "clojure.core", :name "update-in", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1302248534000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "assoc-in", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c66"} {:created-at 1318010541000, :author {:login "jks", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/de50bee3396570d25f900873303c98f1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "get-in", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c67"} {:created-at 1348895075000, :author {:login "eric", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2b0c9ae6f1da9716451e7c86bc87230b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "fnil", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c68"} {:created-at 1441163870973, :author {:login "brunchboy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2228869?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "update", :ns "clojure.core"}, :_id "55e66a5ee4b072d7f27980f7"} {:created-at 1570520733044, :author {:login "xmo-odoo", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/7571158?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "associative?", :ns "clojure.core"}, :_id "5d9c3e9de4b0ca44402ef7cc"}], :line 6172, :examples [{:updated-at 1565345379991, :created-at 1280322066000, :body "(def users [{:name \"James\" :age 26} {:name \"John\" :age 43}])\n;;=> #'user/users\n\n;; similar to assoc-in but does not simply replace the item.\n;; the specified function is performed on the matching item.\n;; here the age of the second (index 1) user is incremented.\n(update-in users [1 :age] inc)\n;;=> [{:name \"James\", :age 26} {:name \"John\", :age 44}]\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "dominem", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11671382?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon", :account-source "clojuredocs", :login "gstamp"}, :_id "542692c9c026201cdc326a9e"} {:author {:login "gregg-williams", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/58610a64fc8638eec8d2239d80d4046f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Jeff N", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a9dd2ab880632b999aaeff00fc0d8e2?r=PG&default=identicon"} {:login "Jeff N", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a9dd2ab880632b999aaeff00fc0d8e2?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/2091138?v=3", :account-source "github", :login "hiteki"} {:login "dominem", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11671382?v=4"}], :body "(def p {:name \"James\" :age 26})\n;;=> #'user/p\n\n(update-in p [:age] inc)\n;;=> {:name \"James\", :age 27}\n\n;; remember, the value of p hasn't changed!\n(update-in p [:age] + 10)\n;;=> {:name \"James\", :age 36}\n\n;; Here we see that the keyed object is \n;; the first argument in the function call.\n;; i.e. :age (- 26 10) => 16\n(update-in p [:age] - 10)\n;;=> {:name \"James\", :age 16}", :created-at 1283780561000, :updated-at 1565345395993, :_id "542692c9c026201cdc326aa0"} {:updated-at 1447712876892, :created-at 1305018966000, :body "(defn char-cnt [s]\n \"Counts occurence of each character in s\"\n (reduce\n (fn [m k]\n (update-in m [k] (fnil inc 0)))\n {}\n s))\n;; Note use of fnil above \n;; - returns 0 if nil is passed to inc (avoids null pointer exception)\n\n(char-cnt \"foo-bar\")\n;;=> {\\r 1, \\a 1, \\b 1, \\- 1, \\o 2, \\f 1}\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/d1906fc5df2c8ce5b2d58cc6ea855aab?r=PG&default=identicon", :account-source "clojuredocs", :login "shuaybi"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "ghiden", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/17842?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/d1906fc5df2c8ce5b2d58cc6ea855aab?r=PG&default=identicon", :account-source "clojuredocs", :login "shuaybi"}, :_id "542692c9c026201cdc326aa4"} {:author {:login "jamesqiu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc1268deaa7f2e78fe2b5ea76e6481d8?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; f has args\n;; The keyed value is placed as the first argument\n;; :a (/ 3 4 5) => 3/20 \n(update-in {:a 3} [:a] / 4 5)\n;;=> {:a 3/20}", :created-at 1349714558000, :updated-at 1422566857659, :_id "542692d5c026201cdc3270b1"} {:editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "clojureman", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1793303?v=3"}], :updated-at 1495693819157, :created-at 1412006537832, :author {:avatar-url "https://avatars.githubusercontent.com/u/453580?v=2", :account-source "github", :login "pmbauer"}, :body ";; be careful with that empty path sequence, it's seldom what you want\n(update-in {} [] (constantly {:k :v}))\n;;=> {nil {:k :v}}\n\n;; In general, you find that for a non-empty path\n;; (get-in (update-in m path (constantly v)) path) \n;; is equal to v.\n;; Surprisingly this does not hold true in case of an empty path.", :_id "54298289e4b09282a148f202"} {:editors [{:login "bkovitz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3"}], :body ";;You can use update-in in a nested map too, in order to update more than\n;;one value:\n\n(def m {:1 {:value 0, :active false}, :2 {:value 0, :active false}})\n\n(update-in m [:1] assoc :value 1 :active true)\n;;=>{:1 {:value 1, :active true}, :2 {:value 0, :active false}}", :author {:avatar-url "https://avatars.githubusercontent.com/u/50778?v=3", :account-source "github", :login "edipofederle"}, :created-at 1442182854368, :updated-at 1460718796470, :_id "55f5f6c6e4b05246bdf20a90"} {:editors [{:login "gnperdue", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1294053?v=3"}], :body ";; We may dig into multiple levels with `update-in`:\n(def player1 {:name \"Player 1\" :attribs {:str 10 :int 11 :wis 9}})\n\n(update-in player1 [:attribs :str] inc)\n;; {:name \"Player 1\", :attribs {:str 11, :int 11, :wis 9}}\n\n(update-in player1 [:attribs :str] * 2)\n;; {:name \"Player 1\", :attribs {:str 20, :int 11, :wis 9}}\n\n;; We can see one level via `update`...\n\n(update player1 :attribs #(update % :str inc))\n;; {:name \"Player 1\", :attribs {:str 11, :int 11, :wis 9}}", :author {:avatar-url "https://avatars.githubusercontent.com/u/1294053?v=3", :account-source "github", :login "gnperdue"}, :created-at 1451965282908, :updated-at 1451965612224, :_id "568b3b62e4b0e0706e05bd9b"} {:updated-at 1459182480723, :created-at 1459182480723, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body "user=> (update-in {:a {:b 3}} [:a :b] inc)\n\n;;=> {:a {:b 4}}", :_id "56f95b90e4b09295d75dbf42"} {:updated-at 1476877648099, :created-at 1476877648099, :author {:login "G1enY0ung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/15034155?v=3"}, :body ";; can also use in []\n\nuser=> (update-in [1 2 [1 2 3]] [2 0] inc)\n;;=> [1 2 [2 2 3]]", :_id "58075d50e4b001179b66bdd0"} {:updated-at 1514472378082, :created-at 1514472169736, :author {:login "jcburley", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/430319?v=4"}, :body ";; can mix associative types as well\n\nuser=> (update-in [1 {:a 2 :b 3 :c 4}] [1 :c] (fnil inc 5))\n;; => [1 {:a 2, :b 3, :c 5}]\nuser=> (update-in [1 {:a 2 :b 3 :c 4}] [1 :d] (fnil inc 5))\n;; => [1 {:a 2, :b 3, :c 4, :d 6}]\n\n;; but of course vector indices must be appropriate types\n\nuser=> (update-in [1 {:a 2 :b 3 :c 4}] [:b :c] (fnil inc 5))\nIllegalArgumentException Key must be integer clojure.lang.APersistentVector.assoc (APersistentVector.java:345)", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/430319?v=4", :account-source "github", :login "jcburley"}], :_id "5a4502e9e4b0a08026c48ce4"} {:updated-at 1524434442870, :created-at 1524434442870, :author {:login "statcompute", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/4590938?v=4"}, :body "(def ds [{:id 1.0 :name \"name1\"}\n {:id 2.0 :name \"name2\"}\n {:id 3.0 :name \"name3\"}])\n\n(map (fn [x] (update-in x [:name] #(if (= \"name2\" %) % \"not 2\"))) ds)\n\n;; | :id | :name |\n;; |-----+-------|\n;; | 1.0 | not 2 |\n;; | 2.0 | name2 |\n;; | 3.0 | not 2 |\n", :_id "5add060ae4b045c27b7fac4e"}], :notes nil, :arglists ["m ks f & args"], :doc "'Updates' a value in a nested associative structure, where ks is a\n sequence of keys and f is a function that will take the old value\n and any supplied args and return the new value, and returns a new\n nested structure. If any levels do not exist, hash-maps will be\n created.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/update-in"} {:added "1.0", :ns "clojure.core", :name "prefer-method", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1337584953000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "prefers", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e0f"} {:created-at 1337584964000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "get-method", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e10"} {:created-at 1337584977000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "methods", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e11"}], :line 1803, :examples [{:editors [{:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}], :body "(def m {:os ::osx})\n\n(defmulti ex :os)\n\n(defmethod ex ::unix\n [_]\n \"unix\")\n\n(derive ::osx ::unix)\n\n(ex m)\n;;=> \"unix\"\n\n(defmethod ex ::bsd\n [_]\n \"bsd\")\n\n(derive ::osx ::bsd)\n\n;; which one to choose ::unix or ::bsd ?? -> Conflict!!!\n(ex m)\n;;=> IllegalArgumentException Multiple methods in multimethod 'ex' match...\n\n(prefer-method ex ::unix ::bsd)\n\n(ex m)\n;;=> \"unix\"\n\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3", :account-source "github", :login "ertugrulcetin"}, :created-at 1475488456319, :updated-at 1475488811909, :_id "57f22ac8e4b0709b524f0514"}], :notes nil, :arglists ["multifn dispatch-val-x dispatch-val-y"], :doc "Causes the multimethod to prefer matches of dispatch-val-x over dispatch-val-y \n when there is a conflict", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/prefer-method"} {:added "1.0", :ns "clojure.core", :name "aset-int", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 3946, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; create an array of 10 ints and set one of the values to 31415\n\nuser=> (def is (int-array 10))\n#'user/is\nuser=> (vec is)\n[0 0 0 0 0 0 0 0 0 0]\nuser=> (aset-int is 3 31415)\n31415\nuser=> (vec is)\n[0 0 0 31415 0 0 0 0 0 0]\nuser=>", :created-at 1313915065000, :updated-at 1313915065000, :_id "542692cdc026201cdc326d37"}], :notes [{:body "See [aset](http://clojuredocs.org/clojure.core/aset) for illustrations of multi-dimensional syntax.", :created-at 1432829144129, :updated-at 1432829144129, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :_id "55673cd8e4b03e2132e7d173"}], :arglists ["array idx val" "array idx idx2 & idxv"], :doc "Sets the value at the index/indices. Works on arrays of int. Returns val.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/aset-int"} {:added "1.0", :ns "clojure.core", :name "*clojure-version*", :file "clojure/core.clj", :type "var", :column 3, :see-alsos [{:created-at 1328398023000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "clojure-version", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aa6"}], :dynamic true, :line 7069, :examples [{:updated-at 1493242329065, :created-at 1280322760000, :body "user=> *clojure-version*\n{:interim true, :major 1, :minor 2, :incremental 0, :qualifier \"master\"}", :editors [{:login "chbrown", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/360279?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/ee24aacb65359196b0a1bad050f9a62f?r=PG&default=identicon", :account-source "clojuredocs", :login "mattdw"}, :_id "542692cac026201cdc326b62"}], :notes nil, :arglists [], :doc "The version info for Clojure core, as a map containing :major :minor \n :incremental and :qualifier keys. Feature releases may increment \n :minor and/or :major, bugfix releases will increment :incremental. \n Possible values of :qualifier include \"GA\", \"SNAPSHOT\", \"RC-x\" \"BETA-x\"", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*clojure-version*"} {:added "1.7", :ns "clojure.core", :name "ensure-reduced", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1464286337203, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reduced", :ns "clojure.core"}, :_id "57473c81e4b0af2c9436d1ef"} {:created-at 1464286352101, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reduced?", :ns "clojure.core"}, :_id "57473c90e4b0bafd3e2a045d"} {:created-at 1464286361977, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unreduced", :ns "clojure.core"}, :_id "57473c99e4b0af2c9436d1f0"} {:created-at 1464286386482, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reduce", :ns "clojure.core"}, :_id "57473cb2e4b0af2c9436d1f1"}], :line 2849, :examples [{:updated-at 1464286295227, :created-at 1464286295227, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :body "(ensure-reduced :foo)\n;;=> object[clojure.lang.Reduced 0x7dc19a70 {:status :ready, :val :foo}]\n\n(ensure-reduced (reduced :foo))\n;;=> object[clojure.lang.Reduced 0x45385f75 {:status :ready, :val :foo}]", :_id "57473c57e4b0bafd3e2a045c"} {:updated-at 1682279619055, :created-at 1682279619055, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; If our reducing function's short-circuit coincides with our transducer's\n;; short-circuit, `reduced` could lead to the reduction returning a Reduced:\n\n(defn conj-till-neg\n ([coll] coll)\n ([coll x] (cond-> (conj coll x) (neg? x) reduced)))\n\n(defn take-till-odd [rf]\n (fn new-rf\n ([result] (rf result))\n ([result x] (cond-> (rf result x) (odd? x) reduced))))\n\n(transduce take-till-odd conj-till-neg [] [6 4 2 -1 -2])\n;; => #\n\n;; So we can change `reduced` to `ensure-reduced` to avoid doubling up:\n(defn take-till-odd [rf]\n (fn new-rf\n ([result] (rf result))\n ([result x] (cond-> (rf result x) (odd? x) ensure-reduced))))\n\n(transduce take-till-odd conj-till-neg [] [6 4 2 -1 -2])\n;; => [6 4 2 -1]\n", :_id "64458cc3e4b08cf8563f4b95"}], :notes nil, :arglists ["x"], :doc "If x is already reduced?, returns it, else returns (reduced x)", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ensure-reduced"} {:added "1.0", :ns "clojure.core", :name "*'", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1412880795489, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "*", :library-url "https://github.com/clojure/clojure"}, :_id "5436d99be4b0ae7956031574"}], :line 996, :examples [{:body ";; there is an implicit 1\n(*')\n;;=> 1 \n\n;; the implicit 1 comes into play\n(*' 6)\n;;=> 6\n\n(*' 2 3)\n;;=> 6\n\n(*' 2 3 4)\n;;=> 24\n\n(*' 0.5 200)\n;;=> 100.0\n\n;; great so it gives the same results as *.\n;; not quite check this out\n(* 1234567890 9876543210)\n;; ArithmeticException integer overflow\n(*' 1234567890 9876543210)\n;;=> 12193263111263526900N", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1412880775853, :updated-at 1412880775853, :_id "5436d987e4b0ae7956031573"}], :notes nil, :arglists ["" "x" "x y" "x y & more"], :doc "Returns the product of nums. (*') returns 1. Supports arbitrary precision.\n See also: *", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*'"} {:added "1.0", :ns "clojure.core", :name "instance?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1285513897000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "type", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e9d"} {:created-at 1285513925000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "supers", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e9e"} {:created-at 1341631058000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "doto", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e9f"} {:created-at 1341631065000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "class", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ea0"} {:created-at 1432578737325, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "satisfies?", :library-url "https://github.com/clojure/clojure"}, :_id "55636ab1e4b03e2132e7d16d"} {:created-at 1482897919586, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "isa?", :ns "clojure.core"}, :_id "586339ffe4b0fd5fb1cc9642"}], :line 139, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"} {:login "steloflute", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fc0969cd0910a427052f0f6281967392?r=PG&default=identicon"} {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"} {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"} {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"} {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"} {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"} {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"}], :body "user=> (instance? Long 1)\ntrue\nuser=> (instance? Integer 1)\nfalse\nuser=> (instance? Number 1)\ntrue\nuser=> (instance? String 1)\nfalse\nuser=> (instance? String \"1\")\ntrue\n", :created-at 1282289726000, :updated-at 1358905451000, :_id "542692c6c026201cdc3268e1"} {:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"} {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"} {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"}], :body "user=> (def al (new java.util.ArrayList))\n#'user/al\nuser=> (instance? java.util.Collection al)\ntrue\nuser=> (instance? java.util.RandomAccess al)\ntrue\nuser=> (instance? java.lang.String al)\nfalse", :created-at 1313989675000, :updated-at 1358543212000, :_id "542692c6c026201cdc3268eb"} {:author {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"}, :editors [{:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"}], :body ";; Some things are more than what they seem to be at first glance\nuser=> (instance? clojure.lang.IFn +)\ntrue\nuser=> (instance? clojure.lang.Keyword :a)\ntrue\nuser=> (instance? clojure.lang.IFn :a)\ntrue\nuser=> (instance? clojure.lang.IFn {:a 1})\ntrue\n", :created-at 1358905444000, :updated-at 1358905610000, :_id "542692d3c026201cdc326fcf"} {:editors [{:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}], :body ";; If `c` is specified with a literal class name, this is a Java\n;; class name. If any of the namespace components of the class\n;; include dashes, the dashes have to be replaced with underscores:\n\n(ns foo-bar)\n(defrecord Box [x])\n(def box (Box. 42))\n\n(instance? foo-bar.Box box)\n;=> CompilerException java.lang.ClassNotFoundException: foo-bar.Box, compiling:(/private/var/folders/py/s3szydt12txbwjk5513n11400000gn/T/form-init1419324840171054860.clj:1:1)\n(instance? foo_bar.Box box)\n;=> true\n\n;; This rule doesn't apply to the last component of the class name:\n\n(defrecord My-Box [x]) ; not an idiomatic choice\n(def mybox (My-Box. 42))\n\n(instance? foo_bar.My-Box mybox)\n;=> true\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3", :account-source "github", :login "mars0i"}, :created-at 1482898746157, :updated-at 1482898800493, :_id "58633d3ae4b0fd5fb1cc9643"}], :notes nil, :arglists ["c x"], :doc "Evaluates x and tests if it is an instance of the class\n c. Returns true or false", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/instance_q"} {:added "1.0", :ns "clojure.core", :name "with-open", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1496906064866, :author {:login "fhur", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/6452323?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "slurp", :ns "clojure.core"}, :_id "5938f950e4b06e730307db30"} {:created-at 1507926365257, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "input-stream", :ns "clojure.java.io"}, :_id "59e1215de4b03026fe14ea7f"}], :line 3831, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "benmoss", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/239754?v=3"} {:login "PetrGlad", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/124476?v=3"}], :body ";; Opens the file 'myfile.txt' and prints out the contents. The \n;; 'with-open' ensures that the reader is closed at the end of the \n;; form. \n;; \n;; Please note that reading a file a character at a time is not \n;; very efficient.\n\nuser=> (with-open [r (clojure.java.io/input-stream \"myfile.txt\")] \n (loop [c (.read r)] \n (if (not= c -1)\n (do \n (print (char c)) \n (recur (.read r))))))\n", :created-at 1281949367000, :updated-at 1420810336807, :_id "542692c7c026201cdc32699a"} {:author {:login "octopusgrabbus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon"}, :editors [], :body "(defn write-csv-file\n \"Writes a csv file using a key and an s-o-s (sequence of sequences)\"\n [out-sos out-file]\n\n (spit out-file \"\" :append false)\n (with-open [out-data (io/writer out-file)]\n (csv/write-csv out-data out-sos)))\n\n", :created-at 1352321815000, :updated-at 1352321815000, :_id "542692d6c026201cdc3270bb"} {:updated-at 1522741647810, :created-at 1522741647810, :author {:login "jcburley", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/430319?v=4"}, :body ";; Try to read 3 lines of text from a test file and return them (to the REPL)\n;; as a list:\n(with-open [r (clojure.java.io/reader \"test-0.txt\")]\n (binding [*in* r] (repeatedly 3 read-line)))\n\n;; The above returns a lazy seq without reading any lines while *in* is bound\n;; to the file, resulting in the original *in* (usually stdin) being read.\n;; To fix, wrap the body within the *in* binding in (doall ...):\n(with-open [r (clojure.java.io/reader \"test-0.txt\")]\n (binding [*in* r] (doall (repeatedly 3 read-line))))\n\n;; That ensures the sequence will be fully realized with the binding of *in*\n;; still in effect, thus reading all 3 lines from the test file.", :_id "5ac3318fe4b045c27b7fac2f"} {:editors [{:login "NielsvanKlaveren", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/43436964?v=4"}], :body ";Process multiple files with a transducer as if it's one file\n;Not lazy, but processes a line at a time\n\n(defn process-file\n [t file]\n (with-open [rdr (io/reader file)]\n (into []\n t\n (line-seq rdr))))\n\n(defn process-files\n [t files]\n (into []\n (comp (mapcat (fn [file] (process-file t file))))\n files))\n\n(apply + (process-files (comp (map count))\n [\"test-0.txt\" \"test-1.txt\" \"test-2.txt\"]))", :author {:avatar-url "https://avatars0.githubusercontent.com/u/43436964?v=4", :account-source "github", :login "NielsvanKlaveren"}, :created-at 1544177851915, :updated-at 1544184780984, :_id "5c0a48bbe4b0ca44402ef5e2"}], :macro true, :notes nil, :arglists ["bindings & body"], :doc "bindings => [name init ...]\n\n Evaluates body in a try expression with names bound to the values\n of the inits, and a finally clause that calls (.close name) on each\n name in reverse order.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/with-open"} {:added "1.6", :ns "clojure.core", :name "mix-collection-hash", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 5175, :examples nil, :notes nil, :arglists ["hash-basis count"], :doc "Mix final collection hash for ordered or unordered collections.\n hash-basis is the combined collection hash, count is the number\n of elements included in the basis. Note this is the hash code\n consistent with =, different from .hashCode.\n See http://clojure.org/data_structures#hash for full algorithms.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/mix-collection-hash"} {:added "1.0", :ns "clojure.core", :name "re-find", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1282039272000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "re-groups", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bfe"} {:created-at 1282039314000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "re-matcher", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bff"} {:created-at 1282039324000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "re-pattern", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c00"} {:created-at 1282039359000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "re-seq", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c01"} {:created-at 1324028214000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "re-matches", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c02"} {:created-at 1379040124000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "subs", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c03"} {:created-at 1412843259867, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.string", :name "replace", :library-url "https://github.com/clojure/clojure"}, :_id "543646fbe4b0ae795603156f"}], :line 4898, :examples [{:author {:login "nipra", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/142529?v=3"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jwatki06", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5594302?v=3"}], :body "user=> (def matcher (re-matcher #\"\\d+\" \"abc12345def\"))\n#'user/matcher\n\nuser=> (re-find matcher)\n\"12345\"\n\n;; If you only want the first match, it is shorter to call re-find with the\n;; pattern and the string to search, rather than explicitly creating a matcher\n;; as above.\nuser=> (re-find #\"\\d+\" \"abc12345def\")\n\"12345\"\n\n;; If you want all matches as a sequence, use re-seq. Creating a matcher\n;; explicitly with re-matcher and passing it to re-find is only the best way\n;; if you want to write a loop that iterates through all matches, and do not\n;; want to use re-seq for some reason.\n", :created-at 1279049854000, :updated-at 1465229780990, :_id "542692cac026201cdc326b4c"} {:author {:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"}, :editors [], :body ";; re-find can be used to iterate through re matches in the string\n\nuser=> (def phone-number \"672-345-456-3212\")\n#'user/phone-number\n\nuser=> (def matcher (re-matcher #\"\\d+\" phone-number))\n#'user/matcher\n\nuser=> (re-find matcher)\n\"672\"\n\nuser=> (re-find matcher)\n\"345\"\n\nuser=> (re-find matcher)\n\"456\"\n\nuser=> (re-find matcher)\n\"3212\"\n\n;; when there's no more valid matches, nil is returned\nuser=> (re-find matcher)\nnil", :created-at 1312373129000, :updated-at 1312373129000, :_id "542692cac026201cdc326b4f"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; When there are parenthesized groups in the pattern and re-find\n;; finds a match, it returns a vector. The first item is the part of\n;; the string that matches the entire pattern, and each successive\n;; item are the parts of the string that matched the 1st, 2nd,\n;; etc. parenthesized groups. Groups are numbered by the order in\n;; which their left parenthesis occurs in the string, from left to\n;; right.\nuser=> (def line \" RX packets:1871074138 errors:5 dropped:48 overruns:9\")\n#'user/line\n\nuser=> (re-find #\"(\\S+):(\\d+)\" line)\n[\"packets:1871074138\" \"packets\" \"1871074138\"]\n\n;; groups can nest\nuser=> (re-find #\"(\\S+:(\\d+)) \\S+:\\d+\" line)\n[\"packets:1871074138 errors:5\" \"packets:1871074138\" \"1871074138\"]\n\n;; If there is no match, re-find always returns nil, whether there are\n;; parenthesized groups or not.\nuser=> (re-find #\"(\\S+):(\\d+)\" \":2 numbers but not 1 word-and-colon: before\")\nnil\n\n;; A parenthesized group can have nil as its result if it is part of\n;; an 'or' (separated by | in the regex), and another alternative is\n;; the one that matches.\nuser=> (re-find #\"(\\D+)|(\\d+)\" \"word then number 57\")\n[\"word then number \" \"word then number \" nil]\n\nuser=> (re-find #\"(\\D+)|(\\d+)\" \"57 number then word\")\n[\"57\" nil \"57\"]\n\n;; It is also possible for a group to match the empty string.\nuser=> (re-find #\"(\\d*)(\\S)\\S+\" \"lots o' digits 123456789\")\n[\"lots\" \"\" \"l\"]\n\n;; If you want to use parentheses to group a part of the regex, but\n;; have no interest in capturing the string it matches, you can follow\n;; the left paren with ?: to prevent capturing.\nuser=> (re-find #\"(?:\\S+):(\\d+)\" line)\n[\"packets:1871074138\" \"1871074138\"]\n\n;; re-matches also behaves this way, and re-seq returns a sequence of\n;; matches, where each one can be a vector like re-find returns.\n", :created-at 1324028180000, :updated-at 1324028180000, :_id "542692d4c026201cdc32704a"} {:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [], :body ";;It's possible to get variables out of your string with regexp\n\nuser=> (re-find #\"(\\d\\d\\d) (USD)\" \"450 USD\")\n[\"450 USD\" \"450\" \"USD\"]\nuser=> (nth *1 1)\n\"450\"\n\n;;thanks kotarak @ stackoverflow.com for this one", :created-at 1326426979000, :updated-at 1326426979000, :_id "542692d4c026201cdc32704b"} {:author {:login "Pete Mancini", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/19c72d50850490b8dea594fe3eb04437?r=PG&default=identicon"}, :editors [{:login "Pete Mancini", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/19c72d50850490b8dea594fe3eb04437?r=PG&default=identicon"}], :body ";; If your input has line delimiters you can switch on multiline with (?m)\n\nuser=> (def testcase \"Line 1\\nLine 2\\nTarget Line\\nLine 4\\nNot a target line\")\nuser=>(re-find #\"(?im)^target.*$\" testcase)\n\"Target Line\"", :created-at 1369872025000, :updated-at 1369872064000, :_id "542692d4c026201cdc32704c"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; Note: See clojure.core/subs for discussion of behavior of substrings\n;; holding onto references of the original strings, which can\n;; significantly affect your memory usage in some cases.", :created-at 1379040119000, :updated-at 1379040119000, :_id "542692d4c026201cdc32704e"} {:updated-at 1598128246429, :created-at 1598128036322, :author {:login "jgomo3", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1125678?v=4"}, :body ";; Use it as a simple predicate based on regexp,\n;; since it returns nil if `re` and `s` do not match.\n\nuser=> (def text-with-blank-lines [\"En un lugar de la Mancha,\"\n \"\"\n \" \"\n \"de cuyo nombre no quiero acordarme\"\n \" \"])\n\n;; Let's count how many non-blank lines are there:\nuser=> (count (filter #(re-find #\"\\S\" %) text-with-blank-lines))\n2\n\n;; Example inspired in 'Programming Clojure 3rd Ed.' 'Seq-in Stream'.", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/1125678?v=4", :account-source "github", :login "jgomo3"}], :_id "5f417fa4e4b0b1e3652d7386"}], :notes [{:body "the regex can't be a var?\n\n```clojure\n(let [regex \"abc\"] (re-find #a \"abc\"))\n```\nthis will get an error!", :created-at 1419230605090, :updated-at 1419230605090, :author {:login "paomian", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2999156?v=3"}, :_id "5497bd8de4b09260f767ca7d"} {:author {:login "blx", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/887504?v=3"}, :updated-at 1447600673577, :created-at 1447600673577, :body "@paomian: The regex *can* be a variable, but the variable needs to be a regex.\n\nThis works fine:\n
    \n(let [regex #\"abc\"] (re-find regex \"abc\"))\n
    \n\nbecause the **#** reader macro for declaring regexes applies to the string right after it -- without doing any kind of substitution.\n\nYou could also do\n
    \n(let [regex \"abc\"] (re-find (re-pattern regex) \"abc\"))\n
    ", :_id "5648a221e4b053844439826f"}], :arglists ["m" "re s"], :doc "Returns the next regex match, if any, of string to pattern, using\n java.util.regex.Matcher.find(). Uses re-groups to return the\n groups.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/re-find"} {:added "1.7", :ns "clojure.core", :name "run!", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1502125415874, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "doseq", :ns "clojure.core"}, :_id "59889d67e4b0d19c2ce9d70d"} {:created-at 1502125443214, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "map", :ns "clojure.core"}, :_id "59889d83e4b0d19c2ce9d70e"} {:created-at 1502125454691, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "mapv", :ns "clojure.core"}, :_id "59889d8ee4b0d19c2ce9d70f"}], :line 7710, :examples [{:updated-at 1451663711803, :created-at 1451663490717, :author {:login "s-mage", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2388396?v=3"}, :body "(run! prn (range 5))\n; 0\n; 1\n; 2\n; 3\n; 4\n; returns nil\n\n; compared to mapv\n(mapv prn (range 5))\n; 0 \n; 1 \n; 2 \n; 3 \n; 4 \n; returns [nil nil nil nil nil] ", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/2388396?v=3", :account-source "github", :login "s-mage"}], :_id "5686a082e4b0e0706e05bd96"} {:editors [{:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}], :body "(run! #(http-out-create-person! %) [{:name \"alex\" :country :peru} \n {:name \"eddu\" :country :peru}])\n\n; (http-out-create-person! {:name \"alex\" :country :peru})\n; (http-out-create-person! {:name \"eddu\" :country :peru})\n; nil", :author {:avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4", :account-source "github", :login "berczeck"}, :created-at 1598157184683, :updated-at 1598157582001, :_id "5f41f180e4b0b1e3652d7394"}], :notes nil, :arglists ["proc coll"], :doc "Runs the supplied procedure (via reduce), for purposes of side\n effects, on successive items in the collection. Returns nil", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/run!"} {:added "1.0", :ns "clojure.core", :name "val", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1318590007000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vals", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521efb"} {:created-at 1423522665421, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "key", :library-url "https://github.com/clojure/clojure"}, :_id "54d93b69e4b0e2ac61831d35"} {:created-at 1423522670342, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "keys", :library-url "https://github.com/clojure/clojure"}, :_id "54d93b6ee4b0e2ac61831d36"}], :line 1574, :examples [{:updated-at 1434396569392, :created-at 1280777702000, :body ";; emulate 'vals'\n(map val {:a 1 :b 2})\n;;=> (1 2)\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692c6c026201cdc3268cd"} {:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(val (first {:one :two}))\n;;=> :two", :created-at 1288970694000, :updated-at 1434396586900, :_id "542692c6c026201cdc3268cf"} {:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [], :body ";syntactic sugar for (val)\n(:doc (meta #'meta))", :created-at 1288970885000, :updated-at 1288970885000, :_id "542692c6c026201cdc3268d0"} {:body ";; extracts the key of a map entry\n(val (clojure.lang.MapEntry. :a :b))\n;;=> :b", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1434396268230, :updated-at 1434396268230, :_id "557f266ce4b03e2132e7d193"}], :notes [{:updated-at 1345454203000, :body "This is my first attempt at using this site to gain an understanding of a closure function. Two of the examples above seem incorrect. \r\n\r\nExample 3(?) seems to have nothing to do with val \r\n\r\n(notice the lack of example identifiers)\r\n", :created-at 1344320583000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fe6"}], :arglists ["e"], :doc "Returns the value in the map entry.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/val"} {:added "1.0", :ns "clojure.core", :name "defonce", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1421928745226, :author {:login "Gitward", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8510849?v=3"}, :to-var {:ns "clojure.core", :name "def", :library-url "https://github.com/clojure/clojure"}, :_id "54c0e929e4b081e022073c21"}], :line 5828, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [], :body "user> (defonce foo 5)\n#'user/foo\n\nuser> foo\n5\n\n;; defonce does nothing the second time\nuser> (defonce foo 10)\nnil\n\nuser> foo\n5", :created-at 1293672804000, :updated-at 1293672804000, :_id "542692cec026201cdc326dba"} {:updated-at 1468533299702, :created-at 1468533299702, :author {:login "DanBurton", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/713692?v=3"}, :body ";; Supports ^:private\nuser=> (defonce ^:private foo 3)\n#'user/foo\nuser=> foo\n3\nuser=> (in-ns 'user2)\nuser2=> user/foo\n java.lang.IllegalStateException: var: user/foo is not public\n", :_id "57880a33e4b0bafd3e2a04a1"} {:updated-at 1599762924778, :created-at 1599762924778, :author {:login "luiszambon", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/41161270?v=4"}, :body "user> (def code {:clojure \"Yes\"})\n#'user/code\n\nuser> code\n{:clojure \"Yes\"}\n\n;; defonce will not be evaluated\nuser> (defonce code (+ 10 10))\nnil\n\nuser> code\n{:clojure \"Yes\"}", :_id "5f5a71ece4b0b1e3652d73b7"}], :macro true, :notes [{:updated-at 1385014731000, :body "Note that this isn't thread safe. I.e. EXPR for the same NAME can be evaluated more than once.", :created-at 1385014731000, :author {:login "lnostdal", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a539e214c9980ff4b53ad5ca9347aa91?r=PG&default=identicon"}, :_id "542692edf6e94c697052200d"}], :arglists ["name expr"], :doc "defs name to have the root value of the expr iff the named var has no root value,\n else expr is unevaluated", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/defonce"} {:added "1.0", :ns "clojure.core", :name "unchecked-add", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1289215695000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-dec", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b8a"} {:created-at 1289215703000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-inc", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b8b"} {:created-at 1289215708000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-negate", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b8c"} {:created-at 1289215717000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-divide", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b8d"} {:created-at 1289215722000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-subtract", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b8e"} {:created-at 1289215736000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-multiply", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b8f"} {:created-at 1289215741000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-remainder", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b90"} {:created-at 1423522050658, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "+", :library-url "https://github.com/clojure/clojure"}, :_id "54d93902e4b0e2ac61831d2b"} {:created-at 1423522057832, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "+'", :library-url "https://github.com/clojure/clojure"}, :_id "54d93909e4b0e2ac61831d2c"}], :line 1198, :examples [{:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; can't interchange INTs with LONGs, only F(int, int) or F(long, long)\n;; F is a function, not an operator.\n;; overflow very easily as shown below.\n\nuser=> (unchecked-add Integer/MAX_VALUE 0)\n2147483647\n\nuser=> (unchecked-add Integer/MAX_VALUE 1)\n-2147483648\n\nuser=> (unchecked-add Integer/MAX_VALUE Integer/MAX_VALUE)\n-2\n\nuser=> (unchecked-add Integer/MAX_VALUE Long/MAX_VALUE)\njava.lang.IllegalArgumentException: No matching method found: unchecked_add (NO_SOURCE_FILE:0)\n\nuser=> (unchecked-add Integer/MAX_VALUE Long/MAX_VALUE)\njava.lang.IllegalArgumentException: No matching method found: unchecked_add (NO_SOURCE_FILE:0)\n\nuser=> (unchecked-add Long/MAX_VALUE Long/MAX_VALUE)\n-2\n\nuser=> (unchecked-add 5 Long/MAX_VALUE)\njava.lang.IllegalArgumentException: No matching method found: unchecked_add (NO_SOURCE_FILE:0)\n\nuser=> (unchecked-add 5555555555 Long/MAX_VALUE)\n-9223372031299220254", :created-at 1289215507000, :updated-at 1289267828000, :_id "542692c9c026201cdc326ac9"}], :notes nil, :arglists ["x y"], :doc "Returns the sum of x and y, both long.\n Note - uses a primitive operator subject to overflow.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-add"} {:added "1.0", :ns "clojure.core", :name "loaded-libs", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 6104, :examples [{:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; Show the list of loaded libs (files named after the \"ns\"\n;; declaration they contain) and created namespaces (\"ns\" only). \n;; \"ns\" side effects into loaded-libs, \"create-ns\" (or \"in-ns\") does not:\n\n(ns a)\n(ns b) \n(every? (loaded-libs) ['a 'b])\n;; true\n\n(create-ns 'x)\n(create-ns 'y)\n(not-every? (loaded-libs) ['x 'y])\n;; true", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1546097021308, :updated-at 1546097304134, :_id "5c27917de4b0ca44402ef604"}], :notes [{:author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :updated-at 1546099777305, :created-at 1546099777305, :body "Trivia: the concept of \"library\" goes all the way back to Clojure contrib and was initially inspired by other packaging systems (it was even named \"Jewels\" at some point, possibly inspired by Ruby Gems). Check the following:\n\n* https://groups.google.com/d/msg/clojure/fjDJfAsxwRo/-5hE4yDMVTQJ\n* https://github.com/clojure/clojure-contrib/blob/da367723d33b20cb89e4aac7dc4221a0138c2f8f/jewel.clj", :_id "5c279c41e4b0ca44402ef606"}], :arglists [""], :doc "Returns a sorted set of symbols naming the currently loaded libs", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/loaded-libs"} {:ns "clojure.core", :name "->Vec", :file "clojure/gvec.clj", :type "function", :column 1, :see-alsos nil, :line 131, :examples nil, :notes nil, :arglists ["am cnt shift root tail _meta"], :doc "Positional factory function for class clojure.core.Vec.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/->Vec"} {:added "1.9", :ns "clojure.core", :name "bytes?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495728541051, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "byte-array", :ns "clojure.core"}, :_id "5927019de4b093ada4d4d76d"} {:created-at 1495728555435, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "bytes", :ns "clojure.core"}, :_id "592701abe4b093ada4d4d76e"}], :line 5388, :examples [{:updated-at 1495728500906, :created-at 1495728500906, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body ";;;; Returns true for byte[] arrays:\n\n(bytes? (.getBytes \"foo\"))\n;;=> true\n(bytes? (byte-array [102 111 111]))\n;;=> true\n\n;;;; Returns false for Byte[] arrays:\n\n(bytes? (to-array (map byte [102 111 111])))\n;;=> false", :_id "59270174e4b093ada4d4d76c"}], :notes nil, :arglists ["x"], :doc "Return true if x is a byte array", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bytes_q"} {:added "1.0", :ns "clojure.core", :name "not", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1301366612000, :author {:login "pauldoo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5cb916d3c8abc9f45a093209e72489fb?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "complement", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dd8"} {:created-at 1375213332000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "false?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dd9"}], :line 524, :examples [{:author {:login "mattdw", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ee24aacb65359196b0a1bad050f9a62f?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user=> (not true)\nfalse\nuser=> (not false)\ntrue\nuser=> (not nil)\ntrue\n\n;; acts as complement of `boolean`\nuser=> (boolean \"a string\")\ntrue\nuser=> (not \"a string\")\nfalse\nuser=> (boolean 1)\ntrue\nuser=> (not 1)\nfalse", :created-at 1280323469000, :updated-at 1422932403041, :_id "542692cfc026201cdc326e64"} {:updated-at 1475631952638, :created-at 1475631952638, :author {:login "aakoch", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/137713?v=3"}, :body "user=> (not (= \"a\" \"b\"))\ntrue", :_id "57f45b50e4b0709b524f0520"}], :notes nil, :tag "java.lang.Boolean", :arglists ["x"], :doc "Returns true if x is logical false, false otherwise.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/not"} {:added "1.0", :ns "clojure.core", :name "with-meta", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1301486163000, :author {:login "ninjudd", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7ced25585a7556e9b9b975c1f9e136e3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vary-meta", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d5e"} {:created-at 1341551175000, :author {:login "jgauthier", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e8668403f9cac4041a106e57e8037dff?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "meta", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d5f"} {:created-at 1374315863000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "alter-meta!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d60"}], :line 211, :examples [{:updated-at 1285495834000, :created-at 1280776037000, :body "user=> (with-meta [1 2 3] {:my \"meta\"})\n[1 2 3]\n\nuser=> (meta (with-meta [1 2 3] {:my \"meta\"}))\n{:my \"meta\"}\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692c8c026201cdc326a41"} {:author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :editors [], :body ";; the same example above in a simplified way\nuser=> (def wm (with-meta [1 2 3] {:my \"meta\"}))\n#'user/wm\n\nuser=> wm\n[1 2 3]\n\nuser=> (meta wm)\n{:my \"meta\"}", :created-at 1359717828000, :updated-at 1359717828000, :_id "542692d6c026201cdc3270ba"} {:editors [{:login "Rovanion", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/632775?v=4"}], :body ";; Trying to attach meta data to nil with throw an exception\n(with-meta nil {:my \"meta\"})\n;; Unhandled java.lang.NullPointerException\n\n;; It also only works for Clojure data types implementing clojure.lang.IObj\n(require '[clojure.java.io :as io])\n(with-meta (io/file \".\") {:my \"meta\"})\n;; Unhandled java.lang.ClassCastException\n;; java.io.File cannot be cast to clojure.lang.IObj\n", :author {:avatar-url "https://avatars2.githubusercontent.com/u/632775?v=4", :account-source "github", :login "Rovanion"}, :created-at 1546960387304, :updated-at 1546960610725, :_id "5c34be03e4b0ca44402ef616"} {:updated-at 1603447088199, :created-at 1603446774741, :author {:login "jimka2001", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/6414129?v=4"}, :body ";; The meta data notation `^:dynamic` can be used to force a variable to be dynamic.\n\n(def ^:dynamic *my-dynamic-variable* \"my doc string\" the-initial-value)\n\n;; However, using this notation within a macro does not have the same semantics.\n;; For example the following macro *will not* expand to a definition of a \n;; dynamic variable whose value is a function.\n\n(defmacro dyn-fun [name lambda-list & body] ;; WRONG\n `(def ^:dynamic ~name (fn ~lambda-list ~@body)))\n\n;; The macro should be written something like the following.\n\n(defmacro dyn-fun [name lambda-list & body]\n `(def ~(with-meta name {:dynamic true}) (fn ~lambda-list ~@body)))\n", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/6414129?v=4", :account-source "github", :login "jimka2001"}], :_id "5f92a7f6e4b0b1e3652d73e7"}], :notes [{:author {:login "beoliver", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1413969?v=4"}, :updated-at 1558365596405, :created-at 1558365596405, :body "The Clojure documentation states that \"metadata does not impact equality (or hash codes). Two objects that differ only in metadata are equal.\" One should be aware that while a function can be compared to itself:\n```\n(defn foo [x] (+ x x))\n```\ntesting equality\n```\n> (= foo foo)\ntrue\n> (= (with-meta foo {:hello :world}) foo)\nfalse\n> (= (with-meta foo {}) foo)\nfalse\n```\n", :_id "5ce2c59ce4b0ca44402ef728"}], :arglists ["obj m"], :doc "Returns an object of the same type and value as obj, with\n map m as its metadata.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/with-meta"} {:added "1.7", :ns "clojure.core", :name "unreduced", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1456683860012, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reduced?", :ns "clojure.core"}, :_id "56d33b54e4b02a6769b5a4b7"} {:created-at 1456683872206, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reduced", :ns "clojure.core"}, :_id "56d33b60e4b02a6769b5a4b8"} {:created-at 1456683877778, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reduce", :ns "clojure.core"}, :_id "56d33b65e4b02a6769b5a4b9"} {:created-at 1464286441935, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ensure-reduced", :ns "clojure.core"}, :_id "57473ce9e4b0bafd3e2a045e"}], :line 2855, :examples [{:updated-at 1456683816266, :created-at 1456683816266, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :body "(unreduced :foo)\n;;=> :foo\n\n(unreduced (reduced :foo))\n;;=> :foo\n\n(unreduced (clojure.lang.Reduced. :foo))\n;;=> :foo", :_id "56d33b28e4b0b41f39d96cd8"} {:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; Transducers have a \"completing arity\" which is called at the end of the\n;; reduction to finalize the output. This is done outside of the normal\n;; reduction loop, so there is nothing to unwrap a reduced return value, should\n;; the reducing function be called from the completing arity and happen to wrap\n;; the return in a Reduced:\n\n(defn conj-till-odd\n ([coll] coll)\n ([coll x] (cond-> (conj coll x) (odd? x) reduced)))\n\n(defn inc-nums+7 [rf]\n (fn new-rf\n ([result] (rf result 7)) ; A bit contrived, but makes the point\n ([result x] (rf result (inc x)))))\n\n(transduce inc-nums+7 conj-till-odd [] [1 3 5 7 9])\n;; => #\n\n;; So we can wrap the return of the completing arity in `unreduced` to make sure\n;; we don't return a Reduced. After all, it's the end of the reduction anyway:\n\n(defn inc-nums+7 [rf]\n (fn new-rf\n ([result] (unreduced (rf result 7)))\n ([result x] (rf result (inc x)))))\n\n(transduce inc-nums+7 conj-till-odd [] [1 3 5 7 9])\n;; => [2 4 6 8 10 7]", :author {:avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4", :account-source "github", :login "tomdl89"}, :created-at 1682279892453, :updated-at 1682326266615, :_id "64458dd4e4b08cf8563f4b96"}], :notes nil, :arglists ["x"], :doc "If x is reduced?, returns (deref x), else returns x", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unreduced"} {:added "1.0", :ns "clojure.core", :name "the-ns", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1416003694964, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:ns "clojure.core", :name "ns-name", :library-url "https://github.com/clojure/clojure"}, :_id "5466806ee4b03d20a10242a2"} {:created-at 1524168245582, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/10404?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "create-ns", :ns "clojure.core"}, :_id "5ad8f635e4b045c27b7fac46"}], :line 4153, :examples [{:author {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"}, :editors [{:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; Let's play with a namespace by its name and by its symbol \n(def for-later-use (create-ns 'my-namespace))\n;;=> #'user/for-later-use\n\n(the-ns for-later-use)\n;;=> #\n\n(the-ns 'my-namespace)\n;;=> #\n\n;; not going to find anything this way because we just asked the repl\n;; not to perform an evaluate on it and there is not such \n;; namespace with the name \"for-later-use\"\n(the-ns 'for-later-use)\n;; java.lang.Exception: No namespace: for-later-use found (NO_SOURCE_FILE:0)\n\n;; not going to work either because \"my-namespace\" is the name of a namespace\n;; and not a symbol that points to something\n(the-ns my-namespace)\n;; java.lang.Exception: Unable to resolve symbol: my-namespace in this context (NO_SOURCE_FILE:12)\n", :created-at 1285114597000, :updated-at 1416003645892, :_id "542692c6c026201cdc3268d9"}], :notes nil, :arglists ["x"], :doc "If passed a namespace, returns it. Else, when passed a symbol,\n returns the namespace named by it, throwing an exception if not\n found.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/the-ns"} {:added "1.6", :ns "clojure.core", :name "record?", :file "clojure/core_deftype.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 405, :examples [{:body ";; Define a record R\nuser=> (defrecord R [x])\nuser.R\n\n;; Create an instance of R called r\nuser=> (def r (->R 1))\n#'user/r\n\n;; Look at r\nuser=> r\n#user.R{:x 1}\n\n;; Is r a record?\nuser=> (record? r)\ntrue\n\n;; Interestingly adding \"fields\" not defined in R keeps it a record\nuser=> (def r2 (assoc r :y 2))\n#'user/r2\n\nuser=> r2\n#user.R{:x 1, :y 2}\n\n;; r2 is still a record\nuser=> (record? r2)\ntrue\n\n;; But regular map is not a record\nuser=> (record? {:x 1})\nfalse", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423042551694, :updated-at 1423042594636, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :_id "54d1e7f7e4b0e2ac61831d0d"}], :notes nil, :arglists ["x"], :doc "Returns true if x is a record", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/record_q"} {:added "1.0", :ns "clojure.core", :name "type", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1281949423000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "class", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521acb"} {:created-at 1285511147000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "supers", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521acc"} {:created-at 1285513879000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "instance?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521acd"}], :line 3466, :examples [{:author {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "ampleyfly", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d1f7428e063b5d881a2366ee5fd526fd?r=PG&default=identicon"} {:login "categorics", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3de94aa23c7d475ed00b9d32bc35877a?r=PG&default=identicon"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:avatar-url "https://avatars2.githubusercontent.com/u/1665744?v=4", :account-source "github", :login "rleppink"} {:login "seancorfield", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/43875?v=4"}], :body ";; Checking numbers\nuser=> (type 10)\njava.lang.Long\n\nuser=> (type 10.0)\njava.lang.Double\n\nuser=> (type nil)\nnil\n\n;; Checking collections\nuser=> (type [10 20])\nclojure.lang.PersistentVector\n\nuser=> (type '(10 20))\nclojure.lang.PersistentList\n\n\n;; Checking other, but somewhat intuitive, forms\nuser=> (type \"A string\")\njava.lang.String\n\nuser=> (type :a)\nclojure.lang.Keyword\n\nuser=> (type Thread)\njava.lang.Class\n\n\n;; Checking a symbol\nuser=> (type 'whatever)\nclojure.lang.Symbol\n\n;; A surprise attack yields\nuser=> (type clojure.lang.Symbol)\n;; not such a surprising response\njava.lang.Class\n\n\n;; Checking a function\nuser=> (defn foo [] (\"any string\"))\n#'user/foo\nuser=> (type foo)\nuser$foo\n\n\n;; Checking a macro\nuser=> (type clojure.core/fn)\njava.lang.Exception: Can't take value of a macro: #'clojure.core/fn (NO_SOURCE_FILE:94)\n\n", :created-at 1284412202000, :updated-at 1537559961680, :_id "542692cfc026201cdc326e29"} {:updated-at 1551950967539, :created-at 1305510021000, :body ";This example demonstrates how to add type information to regular clojure maps\n(defn purchase-order [id date amount]\n ^{:type ::PurchaseOrder} ;metadata\n {:id id :date date :amount amount})\n\n(def my-order (purchase-order 10 (java.util.Date.) 100.0))\n\nmy-order\n=> {:id 10, :date #, :amount 100.0}\n\n(type my-order)\n=> PurchaseOrder", :editors [{:avatar-url "https://www.gravatar.com/avatar/d1906fc5df2c8ce5b2d58cc6ea855aab?r=PG&default=identicon", :account-source "clojuredocs", :login "shuaybi"} {:login "borkdude", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/284934?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/d1906fc5df2c8ce5b2d58cc6ea855aab?r=PG&default=identicon", :account-source "clojuredocs", :login "shuaybi"}, :_id "542692cfc026201cdc326e2d"}], :notes nil, :arglists ["x"], :doc "Returns the :type metadata of x, or its Class if none", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/type"} {:added "1.0", :ns "clojure.core", :name "identical?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1343319790000, :author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "=", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cc5"} {:created-at 1343319794000, :author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "==", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cc6"}], :line 775, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"} {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}], :body "user=> (def x 1)\n#'user/x\nuser=> (identical? x x)\ntrue\nuser=> (identical? x 1)\ntrue\nuser=> (identical? x 2)\nfalse\nuser=> (identical? x ((constantly 1) 8))\ntrue\nuser=> (identical? 'a 'a)\nfalse", :created-at 1279074018000, :updated-at 1343322315000, :_id "542692c8c026201cdc326a61"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body "user=> (def x {:foo 1, :bar -3})\n#'user/x\nuser=> (def y {:foo 1, :bar -3})\n#'user/y\n;; Values are equal, but different objects were constructed\nuser=> (= x y)\ntrue\nuser=> (identical? x y)\nfalse\n", :created-at 1329874849000, :updated-at 1329874849000, :_id "542692d3c026201cdc326fca"} {:body "; Java wrapper class caching\n; details at: https://www.owasp.org/index.php/Java_gotchas#Immutable_Objects_.2F_Wrapper_Class_Caching\nuser=> (identical? 128 128)\nfalse\nuser=> (identical? 127 127)\ntrue\nuser=> (identical? -127 -127)\ntrue\nuser=> (identical? -128 -128)\ntrue\nuser=> (identical? -130 -130)\nfalse", :author {:login "MPechorin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3315568?v=3"}, :created-at 1431147344205, :updated-at 1431147344205, :_id "554d9350e4b03e2132e7d15e"} {:editors [{:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}], :body "user=> (def a (String. \"abc\"))\n;;=> #'user/a\n\nuser=> (def b (String. \"abc\"))\n;;=> #'user/b\n\n=> (identical? a b)\n;;=> false\n;; initialised 2 new objects\n\nuser=> (def a \"abc\")\n;;=> #'user/a\n\nuser=> (def b \"abc\")\n;;=> #'user/b\n\n=> (identical? a b)\n;;=> true\n;; refers same objects(address), look String pooling\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3", :account-source "github", :login "ertugrulcetin"}, :created-at 1470912975934, :updated-at 1470913004034, :_id "57ac59cfe4b0bafd3e2a04e3"} {:editors [{:login "wontheone1", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/11784756?v=4"}], :body ";; two keywords with the same value are the same object\n\n(= :abc :abc)\n=> true\n\n(identical? :abc :abc)\n=> true\n\n;; two symbols with the same name are different objects\n(= 'abc 'abc)\n=> true\n\n(identical? 'abc 'abc)\n=> false\n\n;; Strings are interned. see https://en.wikipedia.org/wiki/String_interning\n(= \"abc\" \"abc\")\n=> true\n(identical? \"abc\" \"abc\")\n=> true", :author {:avatar-url "https://avatars1.githubusercontent.com/u/11784756?v=4", :account-source "github", :login "wontheone1"}, :created-at 1556561354455, :updated-at 1556562044316, :_id "5cc73dcae4b0ca44402ef714"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; When there is no interning (1000 is outside long range\n;; of automatically interned numbers), autoboxing plays\n;; interesting tricks:\n\n(let [x 1000 y x]\n (identical? x y))\n;; false\n\n;; This is practically equivalent to the following, \n;; which explains what is going on during Clojure evaluation:\n(let [x 1000 y x]\n (identical? (Long/valueOf x) (Long/valueOf y)))\n;; false", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1578397898483, :updated-at 1578426767152, :_id "5e1470cae4b0ca44402ef80f"} {:updated-at 1603680840719, :created-at 1603680840719, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :body ";; In general, other examples where `identical?` returns true are\n;; often implementation-specific optimizations that can change from one\n;; JDK version to another, or one version of Clojure to another.\n;; You should think _very_ carefully before writing code that relies on\n;; `identical?` returning true.\n\n;; One scenario where it is safe to use `identical?` can be seen in the\n;; implementation of Clojure's function `get-in`, where a sentinel object\n;; is freshly constructed, and thus guaranteed to be not identical? to any\n;; other object that existed before the function was called. This new\n;; object is used as a default value in case a lookup of a key in a map fails\n;; to find a matching key. Regardless of what values the map contains, it is\n;; guaranteed that if the return value is `identical?` to this freshly allocated\n;; sentinel object, it could not have been found in the map.", :_id "5f963a48e4b0b1e3652d73f5"}], :notes nil, :arglists ["x y"], :doc "Tests if 2 arguments are the same object", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/identical_q"} {:added "1.0", :ns "clojure.core", :name "unchecked-divide-int", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1435174878967, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:ns "clojure.core", :name "quot", :library-url "https://github.com/clojure/clojure"}, :_id "558b07dee4b0fad27b85f924"}], :line 1233, :examples [{:updated-at 1599829194677, :created-at 1599829194677, :author {:login "fhightower", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/3599813?v=4"}, :body ";; like http://clojuredocs.org/clojure.core/quot, (unchecked-divide-int m n) is the value of m/n, rounded down to the nearest integer.\n\n(unchecked-divide-int 3 2)\n;; => 1\n\n(unchecked-divide-int 2 4)\n;; => 0\n\n(unchecked-divide-int 4 2)\n;; => 2\n\n(unchecked-divide-int 0 4)\n;; => 0\n\n(unchecked-divide-int 1 0)\n;; => ArithmeticException / by zero clojure.lang.Numbers.unchecked_int_divide (Numbers.java:1698)", :_id "5f5b74cae4b0b1e3652d73bb"}], :notes nil, :arglists ["x y"], :doc "Returns the division of x by y, both int.\n Note - uses a primitive operator subject to truncation.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-divide-int"} {:added "1.0", :ns "clojure.core", :name "ns-name", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1416003383632, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:ns "clojure.core", :name "the-ns", :library-url "https://github.com/clojure/clojure"}, :_id "54667f37e4b0dc573b892fc7"}], :line 4164, :examples [{:author {:login "sunng", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4cc03baa6fbb880e246ce5c9c8e247ce?r=PG&default=identicon"}, :editors [{:login "sunng", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4cc03baa6fbb880e246ce5c9c8e247ce?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; get the namespace name as a symbol\n(ns-name (the-ns 'user))\n;;=> user\n\n\n", :created-at 1327579554000, :updated-at 1416003810277, :_id "542692d4c026201cdc32701b"}], :notes nil, :arglists ["ns"], :doc "Returns the name of the namespace, a symbol.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ns-name"} {:added "1.0", :ns "clojure.core", :name "max-key", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1350408889000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "max", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e60"} {:created-at 1371841171000, :author {:login "adereth", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5ad11b4e208a6cdb3bd45fe01dea59b7?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "min-key", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e61"} {:created-at 1459931910164, :author {:login "mhmdsalem1993", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10787314?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "min", :ns "clojure.core"}, :_id "5704cb06e4b0fc95a97eab2d"}], :line 4989, :examples [{:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (max-key count \"asd\" \"bsd\" \"dsd\" \"long word\")\n\"long word\"", :created-at 1282324042000, :updated-at 1332951974000, :_id "542692c6c026201cdc3268d3"} {:body "; find the key that has the highest value in a map\nuser=> (key (apply max-key val {:a 3 :b 7 :c 9}))\n:c", :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=3"}, :created-at 1418724141005, :updated-at 1418724141005, :_id "5490032de4b09260f767ca79"} {:updated-at 1590259945797, :created-at 1590259945797, :author {:login "garaud", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/98194?v=4"}, :body ";; find the index of the highest value. Equivalent to an 'argmax' function\nuser=> (first (apply max-key second (map-indexed vector '(2 1 6 5 4))))\n2", :_id "5ec970e9e4b087629b5a1915"} {:updated-at 1619610212721, :created-at 1617247307182, :author {:login "sova", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/451489?v=4"}, :body ";; find the max :timestamp in a collection of maps.\nuser=> (def mmm [\n {:timestamp 1 :name \"v\"} \n {:timestamp 2 :name \"q\"} \n {:timestamp 3 :name \"r\"}])\n\nuser=> (apply max-key :timestamp mmm)\n{:timestamp 3, :name \"r\"}\n\nuser=> (:timestamp (apply max-key :timestamp mmm))\n3\n\n;;if the map is indexed by item-id, use an anonymous function where the key goes.\n\nuser=> (def map-with-index {\n \"gary\" {:timestamp 1 :name \"v\"} \n \"carl\" {:timestamp 2 :name \"q\"} \n \"lola\" {:timestamp 3 :name \"r\"}})\n\nuser=> (apply max-key #(:timestamp (val %)) map-with-index)\n[\"lola\" {:timestamp 3, :name \"r\"}]\n\n;notice how we replaced :timestamp with #(:timestamp (val %)) \n;to get the inner value [and not the (key %)] of the indexed version.", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/451489?v=4", :account-source "github", :login "sova"} {:avatar-url "https://avatars.githubusercontent.com/u/16775439?v=4", :account-source "github", :login "Okwori"}], :_id "60653c4be4b0b1e3652d74ad"}], :notes nil, :arglists ["k x" "k x y" "k x y & more"], :doc "Returns the x for which (k x), a number, is greatest.\n\n If there are multiple such xs, the last one is returned.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/max-key"} {:added "1.3", :ns "clojure.core", :name "*unchecked-math*", :type "var", :see-alsos [{:created-at 1441815099356, :author {:login "miner", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25400?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "*warn-on-reflection*", :ns "clojure.core"}, :_id "55f05a3be4b05246bdf20a8a"}], :examples [{:body "user=> (unchecked-add Long/MAX_VALUE 1)\n-9223372036854775808\n\nuser=> (+ Long/MAX_VALUE 1)\nArithmeticException integer overflow clojure.lang.Numbers.throwIntOverflow\n\nuser=> (set! *unchecked-math* true)\ntrue\n\nuser=> (+ Long/MAX_VALUE 1)\n-9223372036854775808", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423526557905, :updated-at 1423526557905, :_id "54d94a9de4b081e022073c80"}], :notes [{:updated-at 1339147124000, :body "Note that, even if `*unchecked-math*` is true when compiling, the unchecked operations are used only when both operands are primitive; if either operand is boxed, normal Clojure arithmetic is used (see [this message](http://groups.google.com/group/clojure/msg/532b32950db75f56) from Stuart Sierra on the Clojure Google group). This can be worked around by adding type hints (e.g. `^long`) where necessary.", :created-at 1339147124000, :author {:login "glchapman", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a5176d5d971ba68c15f4afe376aeaf18?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fe3"}], :arglists [], :doc "While bound to true, compilations of +, -, *, inc, dec and the\n coercions will be done without overflow checks. While bound\n to :warn-on-boxed, same behavior as true, and a warning is emitted\n when compilation uses boxed math. Default: false.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*unchecked-math*"} {:added "1.0", :ns "clojure.core", :name "defn-", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1358128693000, :author {:login "juan.facorro", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d6f59d93cc17c698f16e550034a2d1ad?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defn", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d56"}], :line 4925, :examples [{:updated-at 1285500672000, :created-at 1279162183000, :body "\nuser=> (ns test)\nnil\n\ntest=> (defn- foo []\n \"World!\")\n#'test/foo\n\ntest=> (defn bar []\n (str \"Hello \" (foo)))\n#'test/bar\n\ntest=> (foo)\n\"World!\"\ntest=> (bar)\n\"Hello World!\"\ntest=> (ns playground)\nnil\nplayground=> (test/bar)\n\"Hello World!\"\n\n;; Error will be thrown\n;; var: #'test/foo is not public\nplayground=> (test/foo)\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692cac026201cdc326b4a"} {:updated-at 1601478908333, :created-at 1601478908333, :author {:login "jimka2001", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/6414129?v=4"}, :body ";;It is sometimes useful to call a private function from within a test case\n(defn- my-private-fun [x] (+ x 42))\n\n;; in test case file\n(deftest t-testing-my-private-fun\n (testing \"my-private-fun\")\n (is (= 45 (#'my-private-fun 3)) \"didn't get 45 as expected\")))", :_id "5f74a0fce4b0b1e3652d73c7"}], :macro true, :notes nil, :arglists ["name & decls"], :doc "same as defn, yielding non-public def", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/defn-"} {:added "1.0", :ns "clojure.core", :name "*out*", :type "var", :see-alsos [{:created-at 1302912138000, :author {:login "hoornet", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5834f829a9def19620d4014c46642172?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "*in*", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c2b"}], :examples [{:editors [{:login "owenRiddy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8080718?v=4"}], :body ";; One approach to silence printing\n\n(def noop-writer\n ;; *out* needs to be bound to a java.io.writer, so proxy a writer\n ;; https://docs.oracle.com/javase/7/docs/api/java/io/Writer.html\n (proxy [java.io.Writer] []\n (close [] nil)\n (flush [] nil)\n (write\n ;; ... which politely ignores any calls.\n ([cbuf] nil)\n ([cbuf off len] nil))))\n=> #'user/noop-writer\n\n;; Now if we bind *out* to the no-op writer println won't do anything\n(do\n (println \"Hello?\")\n (binding [*out* noop-writer]\n ;; (.write noop-writer) will be used to print this, so nothing will happen.\n (println \"world\")))\n=> Hello?\nnil", :author {:avatar-url "https://avatars.githubusercontent.com/u/8080718?v=4", :account-source "github", :login "owenRiddy"}, :created-at 1645240924505, :updated-at 1645240999533, :_id "6210625ce4b0b1e3652d75a9"}], :notes nil, :tag "java.io.Writer", :arglists [], :doc "A java.io.Writer object representing standard output for print operations.\n\n Defaults to System/out, wrapped in an OutputStreamWriter", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*out*"} {:added "1.0", :ns "clojure.core", :name "file-seq", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1329988618000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "file", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b05"} {:created-at 1329988623000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "delete-file", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b06"}], :line 4948, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"} {:login "KlayKla", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/40676441?v=4"}], :body ";; first create a Java File object using the file function in\n;; the clojure.java.io package and use that object to create a file-seq\n;; then show the first 10 members of that seq\n\n(def f (clojure.java.io/file \"c:\\\\clojure-1.2.0\"))\n;;=> #'user/f\n(def fs (file-seq f))\n;;=> #'user/fs\n(first fs)\n;;=> #\n(clojure.pprint/pprint (take 10 fs))\n;; (#\n;; #\n;; #\n;; #\n;; #\n;; #\n;; #\n;; #\n;; #\n;; #)\n;;=>", :created-at 1313961191000, :updated-at 1625184652730, :_id "542692cbc026201cdc326bf2"} {:updated-at 1509141653447, :created-at 1509135502851, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body ";; Fill an array with the file names in a directory.\n;; Put them in an array.\n(mapv str (filter #(.isFile %) (file-seq (clojure.java.io/file \".\"))))\n\n;; Use the Path utilities to do glob filtering.\n(let [grammar-matcher (.getPathMatcher \n (java.nio.file.FileSystems/getDefault)\n \"glob:*.{g4,md}\")]\n (->> \".\"\n clojure.java.io/file\n file-seq\n (filter #(.isFile %))\n (filter #(.matches grammar-matcher (.getFileName (.toPath %))))\n (mapv #(.getAbsolutePath %))))\n\n;; At that point it may be better to just use the java.nio.file classes.\n;; https://github.com/ajoberstar/ike.cljj has some ideas", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}], :_id "59f3948ee4b0a08026c48c79"}], :notes [{:author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :updated-at 1509135556587, :created-at 1509135556587, :body "The file operations from java are https://docs.oracle.com/javase/8/docs/api/java/io/File.html", :_id "59f394c4e4b0a08026c48c7a"}], :arglists ["dir"], :doc "A tree seq on java.io.Files", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/file-seq"} {:added "1.0", :ns "clojure.core", :name "agent", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1287220581000, :author {:login "hugoduncan", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/80fa2a15219b987664e4d6f5c78b4c27?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "set-error-handler!", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b66"} {:created-at 1332037921000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "send", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b67"} {:created-at 1332037925000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "send-off", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b68"} {:created-at 1332038024000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "release-pending-sends", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b69"} {:created-at 1332038048000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "agent-error", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b6a"} {:created-at 1332038056000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "restart-agent", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b6b"} {:created-at 1349393706000, :author {:login "eric", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2b0c9ae6f1da9716451e7c86bc87230b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "add-watch", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b6c"} {:created-at 1358869462000, :author {:login "avasenin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/154699?v=3"}, :to-var {:ns "clojure.core", :name "set-error-mode!", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b6d"} {:created-at 1364873755000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "set-validator!", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b6e"} {:created-at 1568811536981, :author {:login "witek", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/209520?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "await", :ns "clojure.core"}, :_id "5d822a10e4b0ca44402ef7b7"}], :line 2054, :examples [{:author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :editors [{:login "srid", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd3a68d670372cd09876c26270a4299a?r=PG&default=identicon"} {:login "srid", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd3a68d670372cd09876c26270a4299a?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; Agents provide shared access to mutable state. \n;; They allow non-blocking (asynchronous as opposed \n;; to synchronous atoms) and independent change of \n;; individual locations (unlike coordinated change \n;; of multiple locations through refs).\n\n;; agent creates one:\n(def counter (agent 0))\n;; #'user/counter\n\n;; send requests a change to its value:\n(send counter inc)\n\n; @ or deref provides a snapshot of the current state:\n@counter\n;;=> 1\n\n;; agents can reference any data structure:\n\n(def pulp-fiction (agent {}))\n;; #'user/pulp-fiction\n\n(send pulp-fiction assoc :act-one \"PROLOGUE\")\n@pulp-fiction\n;;=> {:act-one \"PROLOGUE\"}\n\n(send pulp-fiction assoc :act-two \"VINCENT VEGA & MARSELLUS WALLACE'S WIFE\")\n@pulp-fiction\n;;=> {:act-two \"VINCENT VEGA & MARSELLUS WALLACE'S WIFE\", :act-one \"PROLOGUE\"}\n\n; From http://clojure-examples.appspot.com/clojure.core/agent with permission.", :created-at 1278720383000, :updated-at 1434143400277, :_id "542692cfc026201cdc326e6c"}], :notes nil, :arglists ["state & options"], :doc "Creates and returns an agent with an initial value of state and\n zero or more options (in any order):\n\n :meta metadata-map\n\n :validator validate-fn\n\n :error-handler handler-fn\n\n :error-mode mode-keyword\n\n If metadata-map is supplied, it will become the metadata on the\n agent. validate-fn must be nil or a side-effect-free fn of one\n argument, which will be passed the intended new state on any state\n change. If the new state is unacceptable, the validate-fn should\n return false or throw an exception. handler-fn is called if an\n action throws an exception or if validate-fn rejects a new state --\n see set-error-handler! for details. The mode-keyword may be either\n :continue (the default if an error-handler is given) or :fail (the\n default if no error-handler is given) -- see set-error-mode! for\n details.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/agent"} {:added "1.0", :ns "clojure.core", :name "ns-map", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1288055092000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "ns-interns", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bc2"} {:created-at 1288055096000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "ns-publics", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bc3"} {:created-at 1288055105000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "ns-refers", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bc4"} {:created-at 1288055110000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "ns-imports", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bc5"}], :line 4171, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [], :body "(ns-map 'clojure.core)\n{sorted-map #'clojure.core/sorted-map, read-line #'clojure.core/read-line, re-pattern #'clojure.core/re-pattern, keyword? #'clojure.core/keyword?, ClassVisitor clojure.asm.ClassVisitor, asm-type #'clojure.core/asm-type, val #'clojure.core/val, ...chop...}", :created-at 1288074955000, :updated-at 1288074955000, :_id "542692cec026201cdc326d75"} {:author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :editors [], :body ";; See also http://clojure.org/namespaces for information on namespaces in Clojure and how to inspect and manipulate them", :created-at 1348479374000, :updated-at 1348479374000, :_id "542692d4c026201cdc327019"} {:author {:login "xiepan", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c278acb4a5a933c93a68f87cbe95e16c?r=PG&default=identicon"}, :editors [], :body ";; ns-map = ns-refers + ns-interns + ns-imports\nuser=> (count (ns-imports *ns*))\n;;=> 96\n\nuser=> (count (ns-interns *ns*))\n;;=> 2\n\nuser=> (count (ns-refers *ns*))\n;;=> 590\n\nuser=> (+ *1 *2 *3)\n;;=> 688\n\nuser=> (count (ns-map *ns*))\n;;=> 688", :created-at 1356702864000, :updated-at 1356702864000, :_id "542692d4c026201cdc32701a"}], :notes nil, :arglists ["ns"], :doc "Returns a map of all the mappings for the namespace.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ns-map"} {:added "1.0", :ns "clojure.core", :name "set-validator!", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1364873765000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "atom", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ea4"} {:created-at 1364873772000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "agent", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ea5"} {:created-at 1364873776000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ea6"}], :line 2389, :examples [{:updated-at 1575082178619, :created-at 1326874022000, :body "user=> (def atm (atom [2]))\n#'user/atm\n\nuser=> (set-validator! atm #(every? even? %))\nnil\n\nuser=> (swap! atm into [5])\n#\n\nuser=> (set-validator! atm nil)\nnil\n\nuser=> (swap! atm into [5]))\n[2 5]", :editors [{:avatar-url "https://www.gravatar.com/avatar/4b9f5878e727c1bc92648eef74b99c85?r=PG&default=identicon", :account-source "clojuredocs", :login "nickbauman"} {:avatar-url "https://avatars.githubusercontent.com/u/69976?v=2", :account-source "github", :login "abrooks"} {:login "eggsyntax", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1233514?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/4b9f5878e727c1bc92648eef74b99c85?r=PG&default=identicon", :account-source "clojuredocs", :login "nickbauman"}, :_id "542692d5c026201cdc327081"} {:editors [{:login "beoliver", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1413969?v=4"}], :body "user=> (def a 1)\n#'user/a\n\nuser=> (set-validator! (var a) (fn [update-result] (< update-result 3)))\nnil\n\nuser=> (alter-var-root (var a) inc)\n2\n\nuser=> (alter-var-root (var a) inc)\nIllegalStateException Invalid reference state clojure.lang.ARef.validate (ARef.java:33)\n\nuser=> a\n2", :author {:avatar-url "https://avatars2.githubusercontent.com/u/1413969?v=4", :account-source "github", :login "beoliver"}, :created-at 1509261847201, :updated-at 1509262058025, :_id "59f58217e4b0a08026c48c7e"}], :notes [{:updated-at 1330569448000, :body "If you want your validator to throw an exception with a useful message, make sure it is a RuntimeException (or subclass), otherwise ARef#validate will throw an IllegalStateException with a generic message.", :created-at 1330569448000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fd9"}], :arglists ["iref validator-fn"], :doc "Sets the validator-fn for a var/ref/agent/atom. validator-fn must be nil or a\n side-effect-free fn of one argument, which will be passed the intended\n new state on any state change. If the new state is unacceptable, the\n validator-fn should return false or throw an exception. If the current state (root\n value if var) is not acceptable to the new validator, an exception\n will be thrown and the validator will not be changed.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/set-validator!"} {:added "1.9", :ns "clojure.core", :name "ident?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495714949645, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "simple-ident?", :ns "clojure.core"}, :_id "5926cc85e4b093ada4d4d757"} {:created-at 1495714961458, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "qualified-ident?", :ns "clojure.core"}, :_id "5926cc91e4b093ada4d4d758"} {:created-at 1596594971704, :author {:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "keyword?", :ns "clojure.core"}, :_id "5f2a1b1be4b0b1e3652d7369"} {:created-at 1596594982016, :author {:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "symbol?", :ns "clojure.core"}, :_id "5f2a1b26e4b0b1e3652d736a"}], :line 1612, :examples [{:updated-at 1596591509304, :created-at 1596591509304, :author {:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}, :body "(ident? :hello)\n;;=> true\n\n(ident? 'abc)\n;;=> true\n\n(ident? \"hi\")\n;;=> false\n\n(ident? 123)\n;;=> false", :_id "5f2a0d95e4b0b1e3652d7368"}], :notes nil, :arglists ["x"], :doc "Return true if x is a symbol or keyword", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ident_q"} {:added "1.2", :ns "clojure.core", :name "defprotocol", :file "clojure/core_deftype.clj", :type "macro", :column 1, :see-alsos [{:created-at 1289830442000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "reify", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bbd"} {:created-at 1289830461000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "extend-type", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bbe"} {:created-at 1289830466000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "extend-protocol", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bbf"} {:created-at 1302045794000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "extends?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bc0"} {:created-at 1345918777000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "satisfies?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bc1"} {:created-at 1432923297245, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :to-var {:ns "clojure.core", :name "definterface", :library-url "https://github.com/clojure/clojure"}, :_id "5568aca1e4b01ad59b65f4e7"} {:created-at 1432923360775, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :to-var {:ns "clojure.core", :name "gen-interface", :library-url "https://github.com/clojure/clojure"}, :_id "5568ace0e4b03e2132e7d17c"} {:created-at 1432923510740, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :to-var {:ns "clojure.core", :name "defrecord", :library-url "https://github.com/clojure/clojure"}, :_id "5568ad76e4b03e2132e7d17e"} {:created-at 1432923517065, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :to-var {:ns "clojure.core", :name "deftype", :library-url "https://github.com/clojure/clojure"}, :_id "5568ad7de4b03e2132e7d17f"}], :line 704, :examples [{:author {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"}, :editors [{:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"} {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"} {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"} {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"} {:login "maacl", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8ff89765136c38707e0f57cf48679a13?r=PG&default=identicon"} {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"} {:login "pjlegato", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4ce55cfd8b3ae2f63f5ecbc8fc1c05d4?r=PG&default=identicon"}], :body "(defprotocol Fly\n \"A simple protocol for flying\"\n (fly [this] \"Method to fly\"))\n\n(defrecord Bird [name species]\n Fly\n (fly [this] (str (:name this) \" flies...\")))\n\n(extends? Fly Bird)\n-> true\n\n(def crow (Bird. \"Crow\" \"Corvus corax\"))\n\n(fly crow)\n-> \"Crow flies...\"", :created-at 1286490281000, :updated-at 1348996644000, :_id "542692cfc026201cdc326e14"} {:author {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"}, :editors [{:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}], :body ";; from Stuart Halloway's examples:\n\n(defprotocol Player\n (choose [p])\n (update-strategy [p me you]))\n\n(defrecord Stubborn [choice]\n Player\n (choose [_] choice)\n (update-strategy [this _ _] this))\n\n(defrecord Mean [last-winner]\n Player\n (choose [_]\n (if last-winner\n last-winner\n (random-choice)))\n (update-strategy [_ me you]\n (->Mean (when (iwon? me you) me))))\n", :created-at 1286490493000, :updated-at 1358536428000, :_id "542692cfc026201cdc326e1c"} {:author {:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"}, :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4", :account-source "github", :login "huahaiy"}], :body ";; defprotocol does NOT support interfaces with variable argument lists, \n;; like [this & args]\n;; (this is not documented anywhere... )\n\n;; The error message encountered will be something like \"No single method: \n;; x_y_z of interface: ns.Foo found for function: x-y-z of protocol: Foo\"\n\n;; The workaround is to define the interface with the variable arg list in a fn\n;; separately outside of the protocol, which then calls the protocol interface\n;; with a slightly different name and an array in place of the variable list,\n;; like:\n\n(defprotocol MyProtocol\n (-my-fn [this args]))\n\n(defn my-fn [this & args] (-my-fn this args))", :created-at 1358608093000, :updated-at 1593221853032, :_id "542692d2c026201cdc326f80"} {:author {:login "bmabey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b966e0fe46246f9a0641fa2e322fec38?r=PG&default=identicon"}, :editors [], :body ";; Protocols allow you to add new abstractions to existing types in a clean way.\n;; Polymorphic functions are created in namespaces as opposed to\n;; having the polymorphism live on Classes as typically done in OO.\n\n;; example from: \n;; https://speakerdeck.com/bmabey/clojure-plain-and-simple?slide=230\n(ns abstraction-a)\n\n(defprotocol AbstractionA\n (foo [obj]))\n\n(extend-protocol AbstractionA\n nil\n (foo [s] (str \"foo-A!\"))\n String\n (foo [s] (str \"foo-A-\" (.toUpperCase s))))\n\n(ns abstraction-b)\n\n(defprotocol AbstractionB\n (foo [obj]))\n\n(extend-protocol AbstractionB\n nil\n (foo [s] (str \"foo-B!\"))\n String\n (foo [s] (str \"foo-B-\" (.toLowerCase s))))\n\n\nuser=> (require '[abstraction-a :as a])\n\nuser=> (require '[abstraction-b :as b])\n\nuser=> (a/foo \"Bar\")\n\"foo-A-BAR\"\n\nuser=> (b/foo \"Bar\")\n\"foo-B-bar\"\n\nuser=> (a/foo nil)\n\"foo-A!\"\n\nuser=> (b/foo nil)\n\"foo-B!\"\n", :created-at 1380075979000, :updated-at 1380075979000, :_id "542692d2c026201cdc326f81"} {:body ";; Note these differences between defprotocol and definterface:\n\n;; defprotocol requires that methods specify a first parameter, which \n;; will be the record object, while definterface requires that this\n;; parameter be left out:\n(definterface I (fooey []))\n;=> user.I\n(defprotocol P (fooey []))\n;=> IllegalArgumentException Definition of function fooey in protocol P must take at least one arg. clojure.core/emit-protocol/fn--5964 (core_deftype.clj:612)\n(defprotocol P (fooey [this]))\n;=> P\n\n;; However, defrecord requires that a parameter for the record object\n;; be used, even with interfaces. (A similar point applies to deftype.)\n(defrecord Irec [stuff] I (fooey [] \"foo\"))\n;=> CompilerException java.lang.IllegalArgumentException: Must supply at least one argument for 'this' in: fooey, compiling:(NO_SOURCE_PATH:1:1) \n(defrecord Irec [stuff] I (fooey [this] \"foo\"))\n;=> user.Irec\n(defrecord Prec [stuff] P (fooey [this] \"foo\"))\n;=> user.Prec\n\n;; Using an interface, only the dot form of the method is available with \n;; defrecord, while the protocol also allows use of normal Clojure function\n;; syntax. (Similar points apply to deftype.)\n(.fooey (Irec. 42))\n;=> \"foo\"\n(fooey (Irec. 42))\n;=> IllegalArgumentException No implementation of method: :fooey of protocol: #'user/P found for class: user.Irec clojure.core/-cache-protocol-fn (core_deftype.clj:544)\n(.fooey (Prec. 42))\n;=> \"foo\"\n(fooey (Prec. 42))\n;=> \"foo\"\n", :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :created-at 1432923158804, :updated-at 1432923158804, :_id "5568ac16e4b03e2132e7d17a"}], :macro true, :notes nil, :arglists ["name & opts+sigs"], :doc "A protocol is a named set of named methods and their signatures:\n (defprotocol AProtocolName\n\n ;optional doc string\n \"A doc string for AProtocol abstraction\"\n\n ;options\n :extend-via-metadata true\n\n ;method signatures\n (bar [this a b] \"bar docs\")\n (baz [this a] [this a b] [this a b c] \"baz docs\"))\n\n No implementations are provided. Docs can be specified for the\n protocol overall and for each method. The above yields a set of\n polymorphic functions and a protocol object. All are\n namespace-qualified by the ns enclosing the definition The resulting\n functions dispatch on the type of their first argument, which is\n required and corresponds to the implicit target object ('this' in \n Java parlance). defprotocol is dynamic, has no special compile-time \n effect, and defines no new types or classes. Implementations of \n the protocol methods can be provided using extend.\n\n When :extend-via-metadata is true, values can extend protocols by\n adding metadata where keys are fully-qualified protocol function\n symbols and values are function implementations. Protocol\n implementations are checked first for direct definitions (defrecord,\n deftype, reify), then metadata definitions, then external\n extensions (extend, extend-type, extend-protocol)\n\n defprotocol will automatically generate a corresponding interface,\n with the same name as the protocol, i.e. given a protocol:\n my.ns/Protocol, an interface: my.ns.Protocol. The interface will\n have methods corresponding to the protocol functions, and the\n protocol will automatically work with instances of the interface.\n\n Note that you should not use this interface with deftype or\n reify, as they support the protocol directly:\n\n (defprotocol P \n (foo [this]) \n (bar-me [this] [this y]))\n\n (deftype Foo [a b c] \n P\n (foo [this] a)\n (bar-me [this] b)\n (bar-me [this y] (+ c y)))\n \n (bar-me (Foo. 1 2 3) 42)\n => 45\n\n (foo \n (let [x 42]\n (reify P \n (foo [this] 17)\n (bar-me [this] x)\n (bar-me [this y] x))))\n => 17", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/defprotocol"} {:added "1.0", :ns "clojure.core", :name "swap!", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1285759338000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "atom", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e05"} {:created-at 1289908501000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "reset!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e06"} {:created-at 1416850487272, :author {:login "kumarshantanu", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109792?v=3"}, :to-var {:ns "clojure.core", :name "compare-and-set!", :library-url "https://github.com/clojure/clojure"}, :_id "54736c37e4b03d20a10242b4"} {:created-at 1527704983219, :author {:login "agarman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/138454?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "swap-vals!", :ns "clojure.core"}, :_id "5b0eed97e4b045c27b7fac7c"}], :line 2345, :examples [{:author {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"}, :editors [{:login "jamieorc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ad647269ea91f1d48b3e76624d89f1d0?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; make an atomic list\n(def players (atom ()))\n;; #'user/players\n\n;; conjoin a keyword into that list\n(swap! players conj :player1)\n;;=> (:player1)\n\n;; conjoin a second keyword into the list\n(swap! players conj :player2)\n;;=> (:player2 :player1)\n\n;; take a look at what is in the list\n(deref players)\n;;=> (:player2 :player1)", :created-at 1286491687000, :updated-at 1420734256040, :_id "542692cdc026201cdc326d54"} {:author {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"}, :editors [{:login "jamieorc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ad647269ea91f1d48b3e76624d89f1d0?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; how to: atomic counter \n(def counter (atom 0))\n;; #'user/counter\n\n(swap! counter inc)\n;;=> 1\n\n(swap! counter inc)\n;;=> 2", :created-at 1286491725000, :updated-at 1420734313570, :_id "542692cdc026201cdc326d56"} {:author {:login "esumitra", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d3df4ff6342ed6fba898021bf2d19a6d?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; swap map values\n(def m1 (atom {:a \"A\" :b \"B\"}))\n;; atom\n\n;; dereference the atom\n@m1\n;;=> {:a \"A\", :b \"B\"}\n\n;; notice that the value swapped in, is part of the returned value\n(swap! m1 assoc :a \"Aaay\")\n;;=> {:a \"Aaay\", :b \"B\"}", :created-at 1408514586000, :updated-at 1420734414461, :_id "542692d5c026201cdc32709f"} {:editors [{:login "sj4", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8431449?v=3"}], :body ";; increment a map value\n(def m1 (atom {:a \"A\" :b \"B\" :n 0}))\n;; atom\n\n;; dereference the atom\n@m1\n;;=> {:a \"A\", :b \"B\", :n 0}\n\n;; notice that the value swapped in, is part of the returned value\n(swap! m1 update-in [:n] inc)\n;;=> {:a \"A\", :b \"B\", :n 1}", :author {:avatar-url "https://avatars.githubusercontent.com/u/17842?v=3", :account-source "github", :login "ghiden"}, :created-at 1447720194998, :updated-at 1477140034391, :_id "564a7502e4b0be225c0c4794"} {:updated-at 1518531750651, :created-at 1518531750651, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body "(def car\n (atom {:make \"Audi\"\n :model \"Q3\"}))\n\n@car\n;;{:make \"Audi\", :model \"Q3\"}\n\n(swap!\n car\n assoc :model \"Q5\")\n;;{:make \"Audi\", :model \"Q5\"}\n\n(swap!\n car\n update-in [:model] str \" Sport\")\n;;{:make \"Audi\", :model \"Q5 Sport\"}", :_id "5a82f4a6e4b0316c0f44f8bb"} {:updated-at 1648892616887, :created-at 1648892539184, :author {:login "Kaspazza", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/36607370?v=4"}, :body ";; Update vector inside map\n(def data (atom {:name \"hello\" :nums []}))\n\n@data\n;; {:name \"hello\" :nums []}\n\n(swap! data update :nums conj {:first 1 :second 2})\n;; {:name \"hello\" :nums [{:first 1 :second 2}]}\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/36607370?v=4", :account-source "github", :login "Kaspazza"}], :_id "62481a7be4b0b1e3652d75c7"}], :notes [{:author {:login "amirrajan", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/517055?v=3"}, :updated-at 1466249130785, :created-at 1466249130785, :body "If you want to swap the entire atom, user `reset!`.", :_id "57652faae4b0bafd3e2a0489"} {:author {:login "KyleErhabor", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/40676441?v=4"}, :updated-at 1655085693891, :created-at 1655085693891, :body "When using `swap!`, it's important you're *only* taking into consideration the\nvalue of the atom *inside* `f`. See https://ericnormand.me/mini-guide/atom-code-explanation for more information.", :_id "62a69a7de4b0b1e3652d75fe"}], :arglists ["atom f" "atom f x" "atom f x y" "atom f x y & args"], :doc "Atomically swaps the value of atom to be:\n (apply f current-value-of-atom args). Note that f may be called\n multiple times, and thus should be free of side effects. Returns\n the value that was swapped in.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/swap!"} {:added "1.0", :ns "clojure.core", :name "vals", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1318590020000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "val", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aa9"} {:created-at 1359517156000, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "keys", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aaa"} {:created-at 1423522691570, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "key", :library-url "https://github.com/clojure/clojure"}, :_id "54d93b83e4b0e2ac61831d37"} {:created-at 1517623064066, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "hash-map", :ns "clojure.core"}, :_id "5a751718e4b0e2d9c35f7415"}], :line 1561, :examples [{:updated-at 1431626759785, :created-at 1280776235000, :body "(vals {:a \"foo\", :b \"bar\"})\n;;=> (\"foo\" \"bar\")\n\n(vals {})\n;;=> nil\n\n(vals nil)\n;;=> nil", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=2", :account-source "github", :login "phreed"} {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"} {:avatar-url "https://avatars.githubusercontent.com/u/6926?v=3", :account-source "github", :login "aleksandersumowski"} {:avatar-url "https://avatars.githubusercontent.com/u/1033604?v=3", :account-source "github", :login "fourq"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692c8c026201cdc326a08"} {:updated-at 1471129931147, :created-at 1471129931147, :author {:login "sleyzerzon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/528932?v=3"}, :body "(defn flatten-a-map [dpdnts-map]\n (apply set/union (vals dpdnts-map)))\n\n(flatten-a-map {:e #{:m :f}, :c #{:f}, :b #{:c :f}, :d #{:m :f}, :a #{:c :f}}\n\n;;=> #{:m :c :f}", :_id "57afa94be4b02d8da95c26f7"}], :notes [{:updated-at 1385457081000, :body "Functions keys and vals return sequences such that\r\n
    \r\n(= (zipmap (keys m) (vals m)) m)\r\n
    ", :created-at 1385457081000, :author {:login "akhudek", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/aaf21f137b69cc5154c8afb29b793e18?r=PG&default=identicon"}, :_id "542692edf6e94c6970522011"}], :arglists ["map"], :doc "Returns a sequence of the map's values, in the same order as (seq map).", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/vals"} {:added "1.0", :ns "clojure.core", :name "unchecked-subtract", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1289216526000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-add", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b98"} {:created-at 1289216530000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-dec", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b99"} {:created-at 1289216535000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-inc", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b9a"} {:created-at 1289216540000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-negate", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b9b"} {:created-at 1289216544000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-divide", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b9c"} {:created-at 1289216549000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-subtract", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b9d"} {:created-at 1289216555000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-multiply", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b9e"} {:created-at 1289216559000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-remainder", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b9f"} {:created-at 1423522496433, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "-", :library-url "https://github.com/clojure/clojure"}, :_id "54d93ac0e4b0e2ac61831d33"} {:created-at 1423522501593, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "-'", :library-url "https://github.com/clojure/clojure"}, :_id "54d93ac5e4b081e022073c77"}], :line 1212, :examples [{:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=3"}], :body ";; can't interchange INTs with LONGs, only F(int, int) or F(long, long)\n;; F is a function, not an\n;; overflow very easily as shown below.\n\n(unchecked-subtract Long/MIN_VALUE 5555555554)\nuser=> 9223372031299220254\n\n;; it promotes to long\n(unchecked-subtract Long/MIN_VALUE (int 1))\nuser=> 9223372036854775807\n\n(unchecked-subtract Integer/MIN_VALUE Long/MIN_VALUE)\nuser=> 9223372034707292160\n\n(unchecked-subtract Long/MIN_VALUE Long/MIN_VALUE)\nuser=> 0\n\n(unchecked-subtract Integer/MIN_VALUE Integer/MIN_VALUE)\nuser=> 0\n\n(unchecked-subtract Integer/MIN_VALUE 0)\nuser=> -2147483648\n\n;; Again, promote to long\n(unchecked-subtract Integer/MIN_VALUE 1)\nuser=> -2147483649\n\n;; To prevent long promotion, see unchecked-subtract-int ", :created-at 1289216520000, :updated-at 1418679203559, :_id "542692cac026201cdc326b46"}], :notes nil, :arglists ["x y"], :doc "Returns the difference of x and y, both long.\n Note - uses a primitive operator subject to overflow.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-subtract"} {:added "1.10", :ns "clojure.core", :name "tap>", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1590688347515, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "add-tap", :ns "clojure.core"}, :_id "5ecffa5be4b087629b5a1917"} {:created-at 1590688354528, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "remove-tap", :ns "clojure.core"}, :_id "5ecffa62e4b087629b5a1918"}], :line 7886, :examples [{:updated-at 1590688330192, :created-at 1590688330192, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :body ";; For a bit more documentation, see Clojure 1.10.0 release notes regarding\n;; tap> here:\n\n;; https://github.com/clojure/clojure/blob/master/changes.md#23-tap", :_id "5ecffa4ae4b087629b5a1916"} {:editors [{:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=4"}], :body ";; Register a tap handler\n\n(add-tap (bound-fn* clojure.pprint/pprint))\n\n;; Log using the above handler\n\n(tap> \"Hello world\")", :author {:avatar-url "https://avatars.githubusercontent.com/u/1250807?v=4", :account-source "github", :login "maxthoursie"}, :created-at 1630499566267, :updated-at 1638836325268, :_id "612f72eee4b0b1e3652d7538"} {:updated-at 1685388563826, :created-at 1685388468155, :author {:login "cloped", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25209410?v=4"}, :body ";; Using tap but returning initial content\n(defn major-champs [] [{:team-name \"SK\"}\n {:team-name \"LG\"}])\n\n(doto (major-champs)\n (tap>))\n;;=> [{:team-name \"SK\"} {:team-name \"LG\"}]", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/25209410?v=4", :account-source "github", :login "cloped"}], :_id "6474fcb4e4b08cf8563f4bc4"}], :notes [{:author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :updated-at 1651676980432, :created-at 1651676980432, :body "`tap>` is a primary tool in the [Portal](https://github.com/djblue/portal) library. ", :_id "62729734e4b0b1e3652d75e6"}], :arglists ["x"], :doc "sends x to any taps. Will not block. Returns true if there was room in the queue,\n false if not (dropped).", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/tap>"} {:added "1.0", :ns "clojure.core", :name "*warn-on-reflection*", :type "var", :see-alsos [{:created-at 1441815046413, :author {:login "miner", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25400?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "*unchecked-math*", :ns "clojure.core"}, :_id "55f05a06e4b06a9ffaad4fb9"}], :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body ";; define two variables then set *warn-on-reflection* to true and try to call\n;; one of their Java methods. Warnings are generated in both cases\n;; set *warn-on-reflection* to false and note that you can call both functions\n;; without a warning\n\nuser=> (def i 23)\n#'user/i\nuser=> (def s \"123\")\n#'user/s\nuser=> (set! *warn-on-reflection* true)\ntrue\nuser=> (.toString i)\nReflection warning, NO_SOURCE_PATH:4 - reference to field toString can't be resolved.\n\"23\"\nuser=> (.toString s)\nReflection warning, NO_SOURCE_PATH:5 - reference to field toString can't be resolved.\n\"123\"\n\n;; Reflection (and hence reflection warnings) could be removed by giving type hints:\nuser=> (.toString ^String s)\n\"123\"\n\nuser=> (set! *warn-on-reflection* false)\nfalse\nuser=> (.toString i)\n\"23\"\nuser=> (.toString s)\n\"123\"\nuser=>", :created-at 1313969775000, :updated-at 1423526770411, :_id "542692c9c026201cdc326a80"} {:updated-at 1672450302873, :created-at 1672450302873, :author {:login "randomizedthinking", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5283430?v=4"}, :body "(set! *warn-on-reflection* true) ;; turn on *warn-on-reflection*\n(def s \"abc\") ;; define s\n(.toString s) ;; => \"abc\"; WARN: type of s is unknown\n(.toString ^String s) ;; => \"abc\"; no warn given the type hint\n(let [s \"abc\"] (.toString s)) ;; => \"abc\"; no warn since Clojure can infer\n ;; type for the local binding\n(set! *warn-on-reflection* false) ;; turn off *warn-on-reflection*\n", :_id "63af90fee4b08cf8563f4b57"} {:updated-at 1672450954887, :created-at 1672450954887, :author {:login "randomizedthinking", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5283430?v=4"}, :body ";; Important to note *warn-on-reflection* take its effect at compile time,\n;; so binding the option won't work... even with a set! inside.\n;; - binding creates a new env to evaluate subsequent statements\n;; - yet, compiler still lives in the current env, so it won't see the value\n\n(binding [*warn-on-reflection* true]\n (set! *warn-on-reflection* true)\n (def s \"abc\")\n (.toString s)) ;; => \"abc\", no warning\n(println *warn-on-reflection*) ;; => false\n", :_id "63af938ae4b08cf8563f4b58"}], :notes nil, :arglists [], :doc "When set to true, the compiler will emit warnings when reflection is\n needed to resolve Java method calls or field accesses.\n\n Defaults to false.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*warn-on-reflection*"} {:added "1.1", :ns "clojure.core", :name "sorted-set-by", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1317095652000, :author {:login "pauldoo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5cb916d3c8abc9f45a093209e72489fb?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sorted-set", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e50"} {:created-at 1353458232000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "sorted-map-by", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e51"} {:created-at 1353822010000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "compare", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e52"}], :line 425, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [], :body "user> (sorted-set-by > 3 5 8 2 1)\n#{8 5 3 2 1}", :created-at 1286955847000, :updated-at 1286955847000, :_id "542692cdc026201cdc326ccc"} {:updated-at 1548548862480, :created-at 1353462397000, :body ";; Be cautious about comparison functions that only compare part of\n;; the objects:\nuser=> (defn second-< [x y]\n (< (second x) (second y)))\nuser=> (sorted-set-by second-< [:a 1] [:b 1] [:c 1])\n#{[:a 1]}\n\n;; Where did the other elements go?\n\n;; Replacing < with <= might look like a fix, but doesn't work,\n;; either:\nuser=> (defn second-<= [x y]\n (<= (second x) (second y)))\nuser=> (def s2 (sorted-set-by second-<= [:a 1] [:b 1] [:c 1]))\n#'user/s2\nuser=> s2\n#{[:c 1] [:b 1] [:a 1]}\n;; So far, so good, but set membership tests can't find the elements.\nuser=> (contains? s2 [:b 1])\nfalse\nuser=> (s2 [:c 1])\nnil\n\n;; Here is one way to write a good comparison function. When the two\n;; objects are equal in the parts we care about, use the tie-breaker\n;; 'compare' on the whole values to give them a consistent order that\n;; is only equal if the entire values are equal.\nuser=> (defn second-<-with-tie-break [x y]\n (let [c (compare (second x) (second y))]\n (if (not= c 0)\n c\n ;; Otherwise we don't care as long as ties are broken\n ;; consistently.\n (compare x y))))\nuser=> (def s3 (sorted-set-by second-<-with-tie-break [:a 1] [:b 1] [:c 1]))\n#'user/s3\nuser=> s3\n#{[:a 1] [:b 1] [:c 1]}\nuser=> (contains? s3 [:b 1])\ntrue\nuser=> (s3 [:c 1])\n[:c 1]\n;; All good now!\n\n;; See this article for more details: https://clojure.org/guides/comparators", :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}, :_id "542692d5c026201cdc327096"} {:updated-at 1533310624576, :created-at 1533310624576, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Another custom comparator example.\n;; sorted-set of colls by size descending, then normal coll equality:\n\n(sorted-set-by \n (fn [x y] (compare [(count y) x] [(count x) y]))\n [3 :a] [:b] [1 :c] [:v] [:a])\n\n;; #{[1 :c] [3 :a] [:a] [:b] [:v]}", :_id "5b6476a0e4b00ac801ed9e47"}], :notes nil, :arglists ["comparator & keys"], :doc "Returns a new sorted set with supplied keys, using the supplied\n comparator. Any equal keys are handled as if by repeated uses of\n conj.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/sorted-set-by"} {:added "1.0", :ns "clojure.core", :name "sync", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1285922313000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "dosync", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c4a"}], :line 2498, :examples nil, :macro true, :notes [{:updated-at 1285922372000, :body "Same as dosync but allows for extra options (which are not currently supported). Probably best to use dosync instead at the moment.", :created-at 1285922372000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f97"}], :arglists ["flags-ignored-for-now & body"], :doc "transaction-flags => TBD, pass nil for now\n\n Runs the exprs (in an implicit do) in a transaction that encompasses\n exprs and any nested calls. Starts a transaction if none is already\n running on this thread. Any uncaught exception will abort the\n transaction and flow out of sync. The exprs may be run more than\n once, but any effects on Refs will be atomic.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/sync"} {:added "1.9", :ns "clojure.core", :name "qualified-ident?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495714973950, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ident?", :ns "clojure.core"}, :_id "5926cc9de4b093ada4d4d759"} {:created-at 1495714979401, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "simple-ident?", :ns "clojure.core"}, :_id "5926cca3e4b093ada4d4d75a"} {:created-at 1596595698804, :author {:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "qualified-symbol?", :ns "clojure.core"}, :_id "5f2a1df2e4b0b1e3652d736e"} {:created-at 1596595706676, :author {:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "qualified-keyword?", :ns "clojure.core"}, :_id "5f2a1dfae4b0b1e3652d736f"}], :line 1622, :examples [{:updated-at 1596596073730, :created-at 1596596073730, :author {:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}, :body "(qualified-ident? 'clojure.core/asymbol)\n;;=> true\n\n(qualified-ident? ::akeyword)\n;;=> true\n\n(qualified-ident? 'asymbol)\n;;=> false\n\n(qualified-ident? :akeyword)\n;;=> false\n\n(qualified-ident? \"hello\")\n;;=> false\n\n(qualified-ident? 7)\n;;=> false\n\n(qualified-ident? nil)\n;;=> false", :_id "5f2a1f69e4b0b1e3652d7370"}], :notes nil, :arglists ["x"], :doc "Return true if x is a symbol or keyword with a namespace", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/qualified-ident_q"} {:added "1.0", :ns "clojure.core", :name "assert", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1538056745370, :author {:login "witek", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/209520?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "assert", :ns "clojure.spec.alpha"}, :_id "5bace229e4b00ac801ed9eaa"}], :line 4816, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (assert true)\nnil\n\nuser=> (assert false)\njava.lang.AssertionError: Assert failed: false (NO_SOURCE_FILE:0)\n\nuser=> (assert nil)\njava.lang.AssertionError: Assert failed: nil (NO_SOURCE_FILE:0)\n\nuser=> (assert 0)\nnil\n\nuser=> (assert [1 2 3])\nnil\n\nuser=> (assert \"foo\")\nnil", :created-at 1280547946000, :updated-at 1285496150000, :_id "542692cac026201cdc326aff"} {:body ";; Messages can help you track down what went wrong.\nuser=> (assert (= 5 (+ 2 2)) \"There are four lights!\")\n\nAssertionError Assert failed: There are four lights!", :author {:login "jakebasile", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/766907?v=2"}, :created-at 1412964928037, :updated-at 1412964928037, :_id "54382240e4b0ae7956031582"}], :macro true, :notes [{:updated-at 1372297439000, :body "The documentation (\"... and throws an exception if ...\") is incorrect. It throws AssertionError which an Error and not an Exception. They both extend Throwable but Error is not an Exception.", :created-at 1372297439000, :author {:login "Steve Kuo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/160d6580f280b5e9e5a1188b32c4ef2d?r=PG&default=identicon"}, :_id "542692edf6e94c6970522007"} {:body "By default, assertions are turned on, since the value of `*assert*` defaults to true in Clojure.", :created-at 1571604965857, :updated-at 1571606716980, :author {:avatar-url "https://avatars3.githubusercontent.com/u/601540?v=4", :account-source "github", :login "didibus"}, :_id "5dacc9e5e4b0ca44402ef7cf"}], :arglists ["x" "x message"], :doc "Evaluates expr and throws an exception if it does not evaluate to\n logical true.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/assert"} {:added "1.0", :ns "clojure.core", :name "*compile-path*", :type "var", :see-alsos nil, :examples [{:updated-at 1615140201244, :created-at 1613936568196, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :body ";; Assuming \"mypath\" exists on disk, the following AOT-compiles any form\n;; inside \"eval\" into the folder specified by \"*compile-path*\".\n\n(binding [*compile-files* true \n *compile-path* \"mypath\"]\n (eval '(+ 1 1)))\n;; 2", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "6032b7b8e4b0b1e3652d7461"}], :notes nil, :arglists [], :doc "Specifies the directory where 'compile' will write out .class\n files. This directory must be in the classpath for 'compile' to\n work.\n\n Defaults to \"classes\"", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*compile-path*"} {:added "1.0", :ns "clojure.core", :name "true?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1303250769000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "false?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521da5"} {:created-at 1420558589659, :author {:login "kappa", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/47310?v=3"}, :to-var {:ns "clojure.core", :name "boolean", :library-url "https://github.com/clojure/clojure"}, :_id "54ac00fde4b04e93c519ffb5"}], :line 512, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (true? true)\ntrue\nuser=> (true? 1)\nfalse\nuser=> (true? (= 1 1))\ntrue", :created-at 1279075280000, :updated-at 1332951307000, :_id "542692c7c026201cdc32699f"} {:updated-at 1651781147567, :created-at 1651781147567, :author {:login "starain31", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6347630?v=4"}, :body "user=> (true? false)\nfalse", :_id "62742e1be4b0b1e3652d75e7"}], :notes nil, :tag "java.lang.Boolean", :arglists ["x"], :doc "Returns true if x is the value true, false otherwise.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/true_q"} {:added "1.0", :ns "clojure.core", :name "release-pending-sends", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 2133, :examples [{:updated-at 1553649905128, :created-at 1553649905128, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; release-pending-sends makes sense when an agent produces\n;; additional actions and there is no need to wait for the update\n;; of the current agent's state.\n\n(require '[clojure.string :refer [split]])\n(def alpha (mapv agent (repeat 26 0))) ; one for each letter of the alphabet\n(def others (agent 0))\n(def words (agent {}))\n\n(def war-and-peace \"http://www.gutenberg.org/files/2600/2600-0.txt\")\n(def book (slurp war-and-peace)) ; a large book\n\n(send-off words\n (fn [state]\n (doseq [letter book\n :let [l (Character/toLowerCase letter)\n idx (- (int l) (int \\a))]] ; get the index of the correct agent\n (send (get alpha idx others) inc)) ; send an increment for each letter\n (release-pending-sends) ; release those sends\n (merge-with + state ; move on to calculate word frequencies\n (frequencies (split book #\"\\s+\")))))\n\n(apply await alpha) ; give it some time\n(map deref alpha) ; see each letter frequency in the book\n;; (202719 34657 61621 118297 313572\n;; 54901 51327 167415 172257 2575 20432\n;; 96530 61648 184185 190083 45533 2331\n;; 148431 162897 226414 64400 27087\n;; 59209 4384 46236 2388)\n", :_id "5c9ad0f1e4b0ca44402ef6e0"}], :notes nil, :arglists [""], :doc "Normally, actions sent directly or indirectly during another action\n are held until the action completes (changes the agent's\n state). This function can be used to dispatch any pending sent\n actions immediately. This has no impact on actions sent during a\n transaction, which are still held until commit. If no action is\n occurring, does nothing. Returns the number of actions dispatched.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/release-pending-sends"} {:added "1.0", :ns "clojure.core", :name "print", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1290672979000, :author {:login "dale", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a7a1eca257c6cea943fea41e5cc3e9a3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pr", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ca4"} {:created-at 1374264324000, :author {:login "lbeschastny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/416170465e4045f810f09a9300dda4dd?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "println", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ca5"} {:created-at 1374264330000, :author {:login "lbeschastny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/416170465e4045f810f09a9300dda4dd?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "print-str", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ca6"} {:created-at 1518042801277, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pprint", :ns "clojure.pprint"}, :_id "5a7b7eb1e4b0316c0f44f8ab"} {:created-at 1565163732742, :author {:login "bbatsov", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/103882?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "printf", :ns "clojure.core"}, :_id "5d4a80d4e4b0ca44402ef792"} {:created-at 1565163762897, :author {:login "bbatsov", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/103882?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "println-str", :ns "clojure.core"}, :_id "5d4a80f2e4b0ca44402ef793"}], :line 3724, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [], :body ";; same as println, but without a newline\nuser> (print \"foo\") (print \"foo\")\nfoofoo", :created-at 1293674014000, :updated-at 1293674014000, :_id "542692c8c026201cdc326a67"} {:updated-at 1638001638376, :created-at 1638001638376, :author {:login "owenRiddy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8080718?v=4"}, :body ";; Output only flushes when there is a newline. It is likely that (print)\n;; will be seen in the company of (flush).\n\n;; Buggy case. Wants to print a prompt character, but it doesn't appear.\n(print \"> \") ;; This doesn't work,\n(readline)\n\n;; Working case. The output can be flushed this way.\n(print \"> \")\n(flush)\n(readline)", :_id "61a1ebe6e4b0b1e3652d757b"} {:updated-at 1668538912352, :created-at 1668538912352, :author {:login "slk500", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/13615024?v=4"}, :body "(print \"foo\" \"foo\")\n;; => foo foo", :_id "6373e220e4b0b1e3652d7682"}], :notes [{:author {:login "jcburley", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/430319?v=4"}, :updated-at 1514410810601, :created-at 1514410810601, :body "\"Human consumption\" means, for example, that a string is printed as-is -- without surrounding double quotes and without nonprinting characters being escaped.", :_id "5a44133ae4b0a08026c48ce1"}], :arglists ["& more"], :doc "Prints the object(s) to the output stream that is the current value\n of *out*. print and println produce output for human consumption.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/print"} {:added "1.0", :ns "clojure.core", :name "empty", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1311798862000, :author {:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "not-empty", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521caf"} {:created-at 1435246081050, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:ns "clojure.core", :name "empty?", :library-url "https://github.com/clojure/clojure"}, :_id "558c1e01e4b0fad27b85f925"}], :line 5241, :examples [{:updated-at 1422931647361, :created-at 1280319600000, :body "(empty '(1 2)) ;; => ()\n(empty [1 2]) ;; => []\n(empty {1 2}) ;; => {}\n(empty #{1 2}) ;; => #{}\n\n;; Works for PersistentQueue as well, which is slightly harder to see\n(def q (conj clojure.lang.PersistentQueue/EMPTY 1))\n;; => #'user/q\nq\n;; => #\n(seq q)\n;; => (1)\n\n(def empty-q (empty q))\n;; => #'user/empty-q\nempty-q\n;; => #\n(seq empty-q)\n;; => nil\n\n;; returns nil when input is not supported or not a collection\n(empty (int-array [1 2])) ;; => nil\n(empty 1) ;; => nil\n\n(map empty [[\\a \\b] {1 2} (range 4)])\n;; => ([] {} ())\n\n(swap! (atom (range 10)) empty) \n;; => ()\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon", :account-source "clojuredocs", :login "OnesimusUnbound"} {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:avatar-url "https://www.gravatar.com/avatar/fc0969cd0910a427052f0f6281967392?r=PG&default=identicon", :account-source "clojuredocs", :login "steloflute"} {:avatar-url "https://www.gravatar.com/avatar/65f765955a0a25d112d33528ae6f811b?r=PG&default=identicon", :account-source "clojuredocs", :login "pmbauer"} {:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"} {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"}], :author {:avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon", :account-source "clojuredocs", :login "gstamp"}, :_id "542692c6c026201cdc326901"} {:updated-at 1406096618000, :created-at 1349755361000, :body ";; The output will not necessarily be of the same JVM class as the input\nuser=> (class (seq [1]))\nclojure.lang.PersistentVector$ChunkedSeq\n\nuser=> (class (empty (seq [1])))\nclojure.lang.PersistentList$EmptyList\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"}], :author {:avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon", :account-source "clojuredocs", :login "TimMc"}, :_id "542692d2c026201cdc326f9a"} {:updated-at 1438729355156, :created-at 1438729355156, :author {:login "kwladyka", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3903726?v=3"}, :body ";; Create the same data structure with the same metadata, but empty\n(def foo (with-meta #{1 2 3} {:some-meta 1}))\nfoo ;; => #{1 2 3}\n(meta foo) ;; => {:some-meta 1}\n\n(def empty-foo (empty foo))\nempty-foo ;; => #{}\n(meta empty-foo) ;; => {:some-meta 1}", :_id "55c1448be4b0080a1b79cdb6"}], :notes nil, :arglists ["coll"], :doc "Returns an empty collection of the same category as coll, or nil", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/empty"} {:added "1.0", :ns "clojure.core", :name "remove-method", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1337585035000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "get-method", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521abc"} {:created-at 1337585038000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "methods", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521abd"} {:created-at 1337585113000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "remove-all-methods", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521abe"} {:created-at 1341270408000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "prefers", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521abf"} {:created-at 1341270413000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defmulti", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ac0"} {:created-at 1341270415000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defmethod", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ac1"}], :line 1796, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; long example showing setting up a multi-method, then removing one of the \n;; methods, showing the multi-method has been removed\n\nuser=> (defmulti tos :Ob)\nnil\nuser=> (defn line [p1 p2] {:Ob :line :p1 p1 :p2 p2})\n#'user/line\nuser=> (defn circle [cent rad] {:Ob :circle :cent cent :rad rad})\n#'user/circle\nuser=> (defmethod tos :line [l] (str \"Line:\" (l :p1) (l :p2)))\n#\nuser=> (defmethod tos :circle [c] (str \"Circle:\" (c :cent) (c :rad)))\n#\nuser=> (def cc (circle [2 3] 3.3))\n#'user/cc\nuser=> (def ll (line [1 1][0 0]))\n#'user/ll\nuser=> (tos cc)\n\"Circle:[2 3]3.3\"\nuser=> (tos ll)\n\"Line:[1 1][0 0]\"\nuser=> (remove-method tos :line)\n#\nuser=> (tos ll)\njava.lang.IllegalArgumentException: No method in multimethod 'tos' for dispatch\nvalue: :line (NO_SOURCE_FILE:0)\nuser=>\n", :created-at 1313919038000, :updated-at 1313919038000, :_id "542692c6c026201cdc32690a"}], :notes nil, :arglists ["multifn dispatch-val"], :doc "Removes the method of multimethod associated with dispatch-value.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/remove-method"} {:added "1.0", :ns "clojure.core", :name "*in*", :type "var", :see-alsos [{:created-at 1302912160000, :author {:login "hoornet", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5834f829a9def19620d4014c46642172?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "*out*", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f55"}], :examples nil, :notes nil, :arglists [], :doc "A java.io.Reader object representing standard input for read operations.\n\n Defaults to System/in, wrapped in a LineNumberingPushbackReader", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*in*"} {:ns "clojure.core", :name "print-ctor", :file "clojure/core_print.clj", :type "function", :column 1, :see-alsos [{:created-at 1536529682606, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "print-dup", :ns "clojure.core"}, :_id "5b959512e4b00ac801ed9e91"} {:created-at 1536529703992, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "read-string", :ns "clojure.core"}, :_id "5b959527e4b00ac801ed9e92"}], :line 97, :examples [{:updated-at 1536529666220, :created-at 1536529666220, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; print-ctor assembles print-dup suitable constructors.\n;; The construction syntax is later used to initialize the same object type with \n;; read-string. Warning: there are security implications when evaluating untrusted\n;; sources with read-string. Be sure serialized data can't be tampered with.\n\n(defrecord Point [x y])\n;; user.Point\n\n(defmethod print-dup user.Point [o w]\n (print-ctor o (fn [o w] (print-dup (vals o) w)) w))\n;; #object[clojure.lang.MultiFn 0x2409c5d]\n\n(binding [*print-dup* true] (pr-str (Point. 1 2)))\n;; \"#=(user.Point. (1 2))\"\n\n(read-string \"#=(user.Point. (1 2))\")\n;; #user.Point{:x 1, :y 2}", :_id "5b959502e4b00ac801ed9e90"}], :notes nil, :arglists ["o print-args w"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/print-ctor"} {:added "1.0", :ns "clojure.core", :name "letfn", :special-form true, :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1290671346000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "let", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d4f"} {:created-at 1550262321823, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "fn", :ns "clojure.core"}, :_id "5c672031e4b0ca44402ef685"} {:created-at 1593366479574, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "loop", :ns "clojure.core"}, :_id "5ef8d7cfe4b0b1e3652d7318"}], :line 6543, :examples [{:updated-at 1421879657394, :created-at 1279163187000, :body "(letfn [(twice [x]\n (* x 2))\n (six-times [y]\n (* (twice y) 3))]\n (println \"Twice 15 =\" (twice 15))\n (println \"Six times 15 =\" (six-times 15)))\n;; Twice 15 = 30\n;; Six times 15 = 90\n;;=> nil\n\n;; Unable to resolve symbol: twice in this context\n(twice 4)\n;; Evaluation aborted.\n\n;; Unable to resolve symbol: six-times in this context\n(six-times 100)\n;; Evaluation aborted.\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/44d451ffa4fe640f2a0f6ec05bf5d962?r=PG&default=identicon", :account-source "clojuredocs", :login "maciek"} {:avatar-url "https://www.gravatar.com/avatar/44d451ffa4fe640f2a0f6ec05bf5d962?r=PG&default=identicon", :account-source "clojuredocs", :login "maciek"} {:avatar-url "https://www.gravatar.com/avatar/44d451ffa4fe640f2a0f6ec05bf5d962?r=PG&default=identicon", :account-source "clojuredocs", :login "maciek"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692c7c026201cdc32694c"} {:updated-at 1442001785037, :created-at 1442001785037, :author {:login "miner", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25400?v=3"}, :body ";; A contrived example of mutual recursion\n(defn even2? [n]\n (letfn [(neven? [n] (if (zero? n) true (nodd? (dec n))))\n (nodd? [n] (if (zero? n) false (neven? (dec n))))]\n (neven? n)))\n", :_id "55f33379e4b05246bdf20a8b"} {:updated-at 1465311455163, :created-at 1465311354216, :author {:login "sleyzerzon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/528932?v=3"}, :body ";;using to create comparator\n\n(defn compartr [s1 s2]\n (letfn [ (inner-author [author] ((juxt :lname :fname) author))] \n (compare (inner-author s1) (inner-author s2))))\n=> #'user/compartr\n\n(sorted-set-by compartr\n {:fname \"Steve\" :lname \"Smith\"}\n {:fname \"David\" :lname \"Smith\"})\n\n=> #{{:fname \"David\", :lname \"Smith\"} {:fname \"Steve\", :lname \"Smith\"}}", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/528932?v=3", :account-source "github", :login "sleyzerzon"}], :_id "5756e07ae4b0bafd3e2a047c"} {:updated-at 1621331030069, :created-at 1621330967298, :author {:login "green-coder", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/598193?v=4"}, :body ";; letfn can be replaced with let for recursive functions\n;; which are not mutually recursive.\n\n(letfn [(mul-2 [n]\n (if (zero? n)\n 0\n (+ 2 (mul-2 (dec n)))))]\n (mul-2 5))\n=> 10\n\n(let [mul-2 (fn mul-2 [n]\n (if (zero? n)\n 0\n (+ 2 (mul-2 (dec n)))))]\n (mul-2 5))\n=> 10", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/598193?v=4", :account-source "github", :login "green-coder"}], :_id "60a38c17e4b0b1e3652d74fe"}], :macro true, :notes [{:updated-at 1315519060000, :body "Using `letfn` allows you to create local functions that reference each other whereas `(let myfunc #(...)]...)` wouldn't because it executes its bindings serially.", :created-at 1315519060000, :author {:login "Justinus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1d9575e413b2eb108a35552b7cc0b54f?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fca"} {:body "To be more precise (about the note above), letfn allows ahead-of-definition use of functions. The following is ok:\n
    \n(defn testme [] \n  (let [twice (fn [x] (* x 2))\n        six-times (fn [y] (* (twice y) 3))] \n  (println \"15x6=\" (six-times 15))))\n
    \n\nBut this one for instance doesn't compile (and would be ok with letfn):\n\n
    \n(defn testme [] \n  (let [twelve-times (fn [x] (* (six-times x) 2)) \n        six-times (fn [y] (* y 6))] \n  (println \"2x12=\" (twelve-times 2))))\n
    \n", :created-at 1428350072457, :updated-at 1428350719864, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=3"}, :_id "5522e478e4b033f34014b766"} {:body "
    \n(letfn [(six-times [y]\n           (* (twice y) 3))\n        (twice [x]\n           (* x 2))]\n  (println \"Twice 15 =\" (twice 15))\n  (println \"Six times 15 =\" (six-times 15)))\n;; Twice 15 = 30\n;; Six times 15 = 90\n;;=> nil\n
    ", :created-at 1434901354547, :updated-at 1434901354547, :author {:login "muhuk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/40178?v=3"}, :_id "5586db6ae4b0fad27b85f91b"} {:author {:login "mars0i", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1836941?v=4"}, :updated-at 1592847494238, :created-at 1592847494238, :body "And just to clarify further what is already implicit in other remarks, `letfn` allows a definition to refer to itself recursively: \n```\n(letfn [(my-range [n]\n (when (pos? n)\n (cons n (my-range (dec n)))))]\n (my-range 5))\n;;=> (5 4 3 2 1)\n```\nbut `let` doesn't:\n```\n(let [my-range (fn [n]\n (when (pos? n)\n (cons n (my-range (dec n)))))]\n (my-range 5))\nSyntax error compiling at ...\nUnable to resolve symbol: my-range in this context\n```\n", :_id "5ef0ec86e4b0b1e3652d730c"}], :url nil, :arglists ["fnspecs & body"], :doc "fnspec ==> (fname [params*] exprs) or (fname ([params*] exprs)+)\n\n Takes a vector of function specs and a body, and generates a set of\n bindings of functions to their names. All of the names are available\n in all of the definitions of the functions, as well as the body.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/letfn", :forms ["(letfn [fnspecs*] exprs*)"]} {:added "1.7", :ns "clojure.core", :name "volatile!", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1437144380666, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "vswap!", :ns "clojure.core"}, :_id "55a9153ce4b0080a1b79cda2"} {:created-at 1437144392165, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "vreset!", :ns "clojure.core"}, :_id "55a91548e4b0080a1b79cda3"} {:created-at 1437144401502, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "volatile?", :ns "clojure.core"}, :_id "55a91551e4b06a85937088ad"} {:created-at 1437146220915, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "atom", :ns "clojure.core"}, :_id "55a91c6ce4b06a85937088af"}], :line 2525, :examples [{:updated-at 1437146196403, :created-at 1437146196403, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=3"}, :body "(def val (volatile! 0))\n\n@val\n;;=> 0\n\n(vswap! val inc)\n;;=> 1\n\n(vreset! val \"nothing\")\n;;=> \"nothing\"\n\n@val\n;;=> \"nothing\"", :_id "55a91c54e4b06a85937088ae"}], :notes [{:author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=3"}, :updated-at 1437144350368, :created-at 1437144350368, :body "An exhaustive StackOverflow question about volatile!\n\nhttp://stackoverflow.com/questions/31288608/what-is-clojure-volatile#comment50623688_31288608", :_id "55a9151ee4b06a85937088ab"} {:author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=3"}, :updated-at 1437145076111, :created-at 1437144891888, :body "Volatiles are meant to hold state in stateful transducers, since they are more performant (and less capable) than atoms.\n\nVolatiles are just a wrapped Java `volatile Object` reference. The Java `volatile`\nkeyword implies that reading and writing from this variable will not be reordered by JIT or the CPU. It does *not* imply atomicity.\n\nChanges to references made `volatile` are always \"written through\" CPU caches all the way to main memory (which is somewhat expensive), this means changes are guaranteed to propagate to other threads (nescessary in stateful transducers).", :_id "55a9173be4b0080a1b79cda4"}], :tag "clojure.lang.Volatile", :arglists ["val"], :doc "Creates and returns a Volatile with an initial value of val.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/volatile!"} {:added "1.0", :ns "clojure.core", :name "/", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1330259296000, :author {:login "frangio", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/646001f0ba2b7df47a16c0a1d5b62225?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "quot", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dc8"} {:created-at 1423528033194, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "unchecked-divide-int", :library-url "https://github.com/clojure/clojure"}, :_id "54d95061e4b0e2ac61831d45"}], :line 1020, :examples [{:updated-at 1467677691841, :created-at 1279992021000, :body "user=> (/ 6 3)\n2\n\nuser=> (/ 6 3 2)\n1\n\nuser=> (/ 10)\n1/10\n\nuser=> (/ 1 3)\n1/3\n\nuser=> (/)\nArityException Wrong number of args (0) passed to: core$-SLASH-\n\nuser=> (/ 1 0)\njava.lang.ArithmeticException\n\nuser=> (/ 0)\njava.lang.ArithmeticException\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/e7869fe1a48cb1814c657eaca6bea3eb?r=PG&default=identicon", :account-source "clojuredocs", :login "replore"} {:avatar-url "https://www.gravatar.com/avatar/e7869fe1a48cb1814c657eaca6bea3eb?r=PG&default=identicon", :account-source "clojuredocs", :login "replore"} {:avatar-url "https://www.gravatar.com/avatar/67e9a6f766dc4b30bd5e9ff3e77c1777?r=PG&default=identicon", :account-source "clojuredocs", :login "jmglov"} {:login "bkovitz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}, :_id "542692c9c026201cdc326ac5"} {:author {:login "rebcabin", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/880b0bb3a4be9237326dd69565444dee?r=PG&default=identicon"}, :editors [], :body ";;; Automatically handles floating point:\n\nuser=> (/ 43.0 2)\n21.5", :created-at 1387152003000, :updated-at 1387152003000, :_id "542692d1c026201cdc326f44"} {:updated-at 1639061278628, :created-at 1639061278628, :author {:login "idrozd", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/870478?v=4"}, :body "user=> (.numerator (/ 2 6)) \n1\nuser=> (.denominator (/ 2 6)) \n3", :_id "61b2171ee4b0b1e3652d7586"}], :notes nil, :arglists ["x" "x y" "x y & more"], :doc "If no denominators are supplied, returns 1/numerator,\n else returns numerator divided by all of the denominators.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/_fs"} {:added "1.0", :ns "clojure.core", :name "read-line", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1425998580860, :author {:login "kimtg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7685905?v=3"}, :to-var {:ns "clojure.core", :name "flush", :library-url "https://github.com/clojure/clojure"}, :_id "54ff02f4e4b01ed96c93c888"}], :line 3796, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (read-line)\nline to be read ;Type text into console\n\"line to be read\"\n", :created-at 1282634673000, :updated-at 1285494406000, :_id "542692c6c026201cdc3268c5"} {:body ";; (flush) is needed to display print values.\n;; Otherwise the print value stays buffered until you hit enter.\nuser=> (do (print \"What's your name? \") \n (flush) \n (read-line))\nWhat's your name? Clojure\n\"Clojure\"", :author {:login "kimtg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7685905?v=3"}, :created-at 1425998545713, :updated-at 1587658953937, :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/24317401?v=4", :account-source "github", :login "loeschzwerg"} {:login "dijonkitchen", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4"}], :_id "54ff02d1e4b01ed96c93c887"} {:updated-at 1475631664273, :created-at 1475631664273, :author {:login "aakoch", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/137713?v=3"}, :body "(println \"Enter something> \")\n(def x (read-line))\n(println (str \"You typed \\\"\" x \"\\\"\"))", :_id "57f45a30e4b0709b524f051f"} {:editors [{:login "stathissideris", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/162007?v=4"}], :body ";; Example of a tiny menu system. Usage:\n\n(menu {:prompt \"Which database\" \n :options [\"Localhost\" \"Remote\" {:id \"o\" :text \"Other\"}]})\n\n;; Implementation\n(require '[clojure.string :as str])\n\n(defn menu [{:keys [prompt options]}]\n (let [options (map (fn [o idx]\n (if (string? o)\n {:id (str (inc idx)) :text o}\n o)) options (range))\n valid-options (set (map :id options))]\n (loop []\n (when prompt\n (println)\n (println prompt)\n (println))\n (doseq [{:keys [id text]} options]\n (println (str \" [\" id \"]\") text))\n (println)\n (println \"or press to cancel\")\n\n (let [in (str/trim (read-line))]\n (cond (= in \"\")\n :cancelled\n\n (not (valid-options in))\n (do\n (println (format \"\\n-- Invalid option '%s'!\" in))\n (recur))\n\n :else\n (first (filter #(= in (:id %)) options)))))))", :author {:avatar-url "https://avatars2.githubusercontent.com/u/162007?v=4", :account-source "github", :login "stathissideris"}, :created-at 1598028614337, :updated-at 1598028647399, :_id "5f3ffb46e4b0b1e3652d7382"}], :notes [{:author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :updated-at 1506413349250, :created-at 1506413349250, :body "Be aware that `read-line` uses Java’s `BufferedReader`’s `.readLine` method that itself uses an internal buffer of either 4k or 8k. That causes `(read-line)` to return a truncated string if you try to read a large line.", :_id "59ca0b25e4b03026fe14ea4a"}], :arglists [""], :doc "Reads the next line from stream that is the current value of *in* .", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/read-line"} {:added "1.7", :ns "clojure.core", :name "reader-conditional?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495964626662, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reader-conditional", :ns "clojure.core"}, :_id "592a9bd2e4b093ada4d4d77b"} {:created-at 1495964632155, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "read", :ns "clojure.core"}, :_id "592a9bd8e4b093ada4d4d77c"} {:created-at 1495964638029, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "read-string", :ns "clojure.core"}, :_id "592a9bdee4b093ada4d4d77d"}], :line 7732, :examples [{:updated-at 1495963975752, :created-at 1495963975752, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body "(reader-conditional? (read-string {:read-cond :preserve} \"#?(:clj (Math/exp 1))\"))\n;;=> true\n(reader-conditional? (reader-conditional '(:clj (Math/exp 1)) false))\n;;=> true\n\n(reader-conditional? \"#?(:clj (Math/exp 1))\")\n;;=> false\n(reader-conditional? '#?(:clj (Math/exp 1)))\n;;=> false", :_id "592a9947e4b093ada4d4d779"} {:updated-at 1495964618275, :created-at 1495964618275, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body ";;;; Let's say we have the source code for a Clojure program:\n\n(def source-code\n \"(defn str-to [type s]\n (case type\n :int #?(:clj (Integer/parseInt s) :cljs (js/parseInt s))\n #?@(:clj [:long (Long/parseLong s)])\n :float #?(:clj (Float/parseFloat s) :cljs (js/parseFloat s))\n #?@(:clj [:double (Double/parseDouble s)])))\")\n\n;;;; Here's a function that finds all the reader conditionals\n;;;; in a given source code which contain a specific platform tag:\n\n(defn find-reader-conditionals [code tag]\n (->> code\n (read-string {:read-cond :preserve}) ;; read into Clojure data structures\n (tree-seq seqable? identity) ;; lazy seq of all forms\n (filter reader-conditional?) ;; keep only reader conditionals\n (filter #(some #{tag} (:form %))))) ;; keep only reader conds with tag\n\n(pprint (find-reader-conditionals source-code :clj))\n;;=> (#?(:clj (Integer/parseInt s) :cljs (js/parseInt s))\n;; #?@(:clj [:long (Long/parseLong s)])\n;; #?(:clj (Float/parseFloat s) :cljs (js/parseFloat s))\n;; #?@(:clj [:double (Double/parseDouble s)]))\n\n(pprint (find-reader-conditionals source-code :cljs))\n;;=> (#?(:clj (Integer/parseInt s) :cljs (js/parseInt s))\n;; #?(:clj (Float/parseFloat s) :cljs (js/parseFloat s)))", :_id "592a9bcae4b093ada4d4d77a"}], :notes nil, :arglists ["value"], :doc "Return true if the value is the data representation of a reader conditional", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/reader-conditional_q"} {:added "1.0", :ns "clojure.core", :name "bit-or", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1414514313045, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "bit-and", :library-url "https://github.com/clojure/clojure"}, :_id "544fc689e4b03d20a1024290"} {:created-at 1414514340059, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "bit-xor", :library-url "https://github.com/clojure/clojure"}, :_id "544fc6a4e4b03d20a1024291"}], :line 1302, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"} {:login "adeel", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd14b215b86d93682addd69690ece881?r=PG&default=identicon"}], :body "user=> (bit-or 2r1100 2r1001)\n13\n;; 13 = 2r1101\n\n;; the same in decimal\nuser=> (bit-or 12 9)\n13\n", :created-at 1280337691000, :updated-at 1303117577000, :_id "542692c6c026201cdc326929"} {:body ";; here is the truth table for OR\n(Integer/toBinaryString (bit-or 2r1100 2r1010) )\n;;=> \"1110\"\n;; or 2r1110", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1414514761650, :updated-at 1414514761650, :_id "544fc849e4b0dc573b892fb2"}], :notes nil, :arglists ["x y" "x y & more"], :doc "Bitwise or", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bit-or"} {:added "1.0", :ns "clojure.core", :name "clear-agent-errors", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1282643269000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "restart-agent", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f32"}], :line 2246, :examples nil, :deprecated "1.2", :notes nil, :arglists ["a"], :doc "DEPRECATED: Use 'restart-agent' instead.\n Clears any exceptions thrown during asynchronous actions of the\n agent, allowing subsequent actions to occur.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/clear-agent-errors"} {:added "1.0", :ns "clojure.core", :name "vector", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1291953313000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vec", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d25"} {:created-at 1291953319000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vector?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d26"} {:created-at 1291953324000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vector-of", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d27"} {:created-at 1291953354000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pop", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d28"} {:created-at 1343081413000, :author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "into", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d29"}], :line 353, :examples [{:updated-at 1340285477000, :created-at 1281948660000, :body ";; create an empty vector the long way\nuser=> (vector)\n[]\n\n;; create an empty vector the short way\nuser=> []\n[]\n\n;; you can even create vectors with nil values\nuser=> (vector nil)\n[nil]\n\n;; create a vector the long way\nuser=> (vector 1 2 3)\n[1 2 3]\n\n;; create a vector the short way\nuser=> [1 2 3]\n[1 2 3]\n\n;; checking for the 2 results above\nuser=> (class (vector 1 2 3))\nclojure.lang.PersistentVector\n\nuser=> (class [1 2 3])\nclojure.lang.PersistentVector\n\nuser=> (= (vector 1 2 3) [1 2 3])\ntrue\n\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon", :account-source "clojuredocs", :login "belun"} {:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"}], :author {:avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon", :account-source "clojuredocs", :login "gstamp"}, :_id "542692c9c026201cdc326aa6"} {:author {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"}, :editors [{:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Destructuring with a vector, inside a \"let\" form, a simple case (a symbol\n;; for each element):\n\n;; destructuring with an inline vector\nuser=> (let [[first-element second-element third-element fourth-element] \n [10 20 30 40]] \n (str \"first=\" first-element \" second=\" second-element \n \" third=\" third-element \" fourth=\" fourth-element))\n\"first=10 second=20 third=30 fourth=40\"\n;; notice how 4 symbols were created pointing to the scalars 10, 20, 30 and 40\n\n\n;; destructuring with a symbol to a vector\nuser=> (def my-vector [1 2 3 4])\n#'user/my-vector\n\nuser=> (let [[first-element second-element third-element fourth-element] my-vector] \n (str \"first=\" first-element \" second=\" second-element \n \" third=\" third-element \" fourth=\" fourth-element))\n\"first=1 second=2 third=3 fourth=4\"", :created-at 1285529828000, :updated-at 1285725388000, :_id "542692c9c026201cdc326aaa"} {:author {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"}, :editors [{:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; Destructuring with a vector, inside a \"let\" form, more complex cases:\n\nuser=> (let [[first-element second-element & the-rest] my-vector] \n (str \"first=\" first-element \" second=\" second-element \" \n the-rest=\" the-rest))\n\"first=1 second=2 the-rest=(3 4)\"\n;; notice how \"the-rest\" is a sequence\n\nuser=> (let [[first-element second-element third-element fourth-element \n :as everything] \n my-vector] \n (str \"first=\" first-element \" second=\" second-element \" \n third=\" third-element \" fourth=\" fourth-element \" \n everything=\" everything))\n\"first=1 second=2 third=3 fourth=4 everything=[1 2 3 4]\"\n;; notice how \"everything\" is the whole vector", :created-at 1285529834000, :updated-at 1331682689000, :_id "542692c9c026201cdc326ab3"} {:editors [{:login "alvarogarcia7", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4199136?v=3"}], :body ";; Create pairs from a seq\n;; (1 2 3 4) -> ([1 2] [2 3] [3 4])\n\n\n(def inp (list 1 2 3 4))\n;; (1 2 3 4)\n(map vector inp (drop 1 inp))\n;; ([1 2] [2 3] [3 4])", :author {:avatar-url "https://avatars.githubusercontent.com/u/4199136?v=3", :account-source "github", :login "alvarogarcia7"}, :created-at 1456569943409, :updated-at 1456570207244, :_id "56d17e57e4b02a6769b5a4b2"} {:updated-at 1546245875727, :created-at 1546245875727, :author {:login "abhishekamralkar", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/868407?v=4"}, :body ";; Vectors in Clojure are heterogeneous\nuser=> (def my-vector [1 \"a\" :b])\n\nuser=> my-vector\n[1 \"a\" :b]\n", :_id "5c29d6f3e4b0ca44402ef609"} {:updated-at 1587681648212, :created-at 1587681648212, :author {:login "dijonkitchen", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4"}, :body "user=> (vector {:a 1 :b 2 :c 3})\n;; [{:a 1, :b 2, :c 3}]\n\nuser=> (vec {:a 1 :b 2 :c 3})\n;; [[:a 1] [:b 2] [:c 3]]", :_id "5ea21970e4b087629b5a18e2"}], :notes nil, :arglists ["" "a" "a b" "a b c" "a b c d" "a b c d e" "a b c d e f" "a b c d e f & args"], :doc "Creates a new vector containing the args.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/vector"} {:added "1.0", :ns "clojure.core", :name "proxy-super", :file "clojure/core_proxy.clj", :type "macro", :column 1, :see-alsos [{:created-at 1354011410000, :author {:login "juan.facorro", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d6f59d93cc17c698f16e550034a2d1ad?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "proxy", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d30"}], :line 391, :examples [{:author {:login "juan.facorro", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d6f59d93cc17c698f16e550034a2d1ad?r=PG&default=identicon"}, :editors [{:login "juan.facorro", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d6f59d93cc17c698f16e550034a2d1ad?r=PG&default=identicon"} {:login "juan.facorro", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d6f59d93cc17c698f16e550034a2d1ad?r=PG&default=identicon"} {:login "juan.facorro", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d6f59d93cc17c698f16e550034a2d1ad?r=PG&default=identicon"}], :body ";; Create a proxy for java.util.ArrayList that overrides the add() \n;; method and calls the super class implementation using proxy-super.\n(def lst (proxy [java.util.ArrayList] []\n (add [x]\n (println \"Adding some stuff:\" x)\n (proxy-super add x))))\n\nuser=> (.add lst 1)\nAdding some stuff: 1\ntrue\n\nuser=> (.add lst 2)\nAdding some stuff: 2\ntrue\n\nuser=> (.add lst [:this :is :some :other :stuff])\nAdding some stuff: [:this :is :some :other :stuff]\ntrue\n\nuser=> (.size lst)\n3\n\n\n ", :created-at 1354011876000, :updated-at 1354012030000, :_id "542692d4c026201cdc327042"} {:updated-at 1601464064060, :created-at 1601464064060, :author {:login "BrunoBonacci", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1639862?v=4"}, :body ";; WARNING ON REFLECTION:\n;; because `proxy-super` expansion captures 'this without type hint,\n;; it generates a reflection warning\nuser=> (set! *warn-on-reflection* true)\ntrue\n\n(def lst (proxy [java.util.ArrayList] []\n (add [x]\n (println \"Adding some stuff:\" x)\n (proxy-super add x))))\nReflection warning, NO_SOURCE_PATH:4:14 - call to method add can't be resolved (target class is unknown).\n#'user/lst\n\nuser=> (.add lst 1)\nReflection warning, NO_SOURCE_PATH:1:1 - call to method add can't be resolved (target class is unknown).\nAdding some stuff: 1\ntrue\n\n;; In order to avoid the reflection add the type hint to 'this\n;; in the following way. Note no reflection warnings.\n;; add type to the proxy, add let binding on 'this with type\n(def ^java.util.ArrayList lst (proxy [java.util.ArrayList] []\n (add [x]\n (println \"Adding some stuff:\" x)\n (let [^java.util.ArrayList this this] ;; add explicit type to 'this\n (proxy-super add x)))))\n#'user/lst\n\nuser> (.add lst 1)\nAdding some stuff: 1\ntrue", :_id "5f746700e4b0b1e3652d73c5"}], :macro true, :notes [{:updated-at 1401348603000, :body "Note that proxy-super calls are not reentrant. If calling the base method results in another call to the virtual method you are overriding (before the proxy-super call has returned), your proxy's code will not be invoked. Instead, the call will go directly to the base class's method.\r\n", :created-at 1401348603000, :author {:login "glchapman", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a5176d5d971ba68c15f4afe376aeaf18?r=PG&default=identicon"}, :_id "542692edf6e94c6970522027"}], :arglists ["meth & args"], :doc "Use to call a superclass method in the body of a proxy method. \n Note, expansion captures 'this", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/proxy-super"} {:added "1.0", :ns "clojure.core", :name ">=", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1451249634940, :author {:login "justCxx", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6506296?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "<=", :ns "clojure.core"}, :_id "56804fe2e4b0e0706e05bd8f"} {:created-at 1588958557112, :author {:login "alexandreaquiles", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/258331?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name ">", :ns "clojure.core"}, :_id "5eb5955de4b087629b5a1905"} {:created-at 1588958562611, :author {:login "alexandreaquiles", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/258331?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "=", :ns "clojure.core"}, :_id "5eb59562e4b087629b5a1906"}], :line 1085, :examples [{:author {:login "mattdw", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ee24aacb65359196b0a1bad050f9a62f?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (>= 2 1)\ntrue\nuser=> (>= 2 2)\ntrue\nuser=> (>= 1 2)\nfalse\nuser=> (>= 6 5 4 3 2)\ntrue", :created-at 1280321990000, :updated-at 1332950567000, :_id "542692ccc026201cdc326cae"} {:updated-at 1598156842291, :created-at 1598156542824, :author {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}, :body "user=> (>= 1/2 1/3 1/4)\ntrue\n\nuser=> (<= 1/4 1/3 1/4)\nfalse\n\nuser=> (>= 1/2 0.5)\ntrue", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4", :account-source "github", :login "berczeck"}], :_id "5f41eefee4b0b1e3652d7390"}], :notes nil, :arglists ["x" "x y" "x y & more"], :doc "Returns non-nil if nums are in monotonically non-increasing order,\n otherwise false.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/>="} {:added "1.0", :ns "clojure.core", :name "drop-last", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1298747615000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "drop", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f41"} {:created-at 1298747622000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "drop-while", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f42"} {:created-at 1524421874890, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "butlast", :ns "clojure.core"}, :_id "5adcd4f2e4b045c27b7fac4a"} {:created-at 1615942867695, :author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pop", :ns "clojure.core"}, :_id "605154d3e4b0b1e3652d74a0"}], :line 2934, :examples [{:updated-at 1508194130933, :created-at 1280344984000, :body "\n(drop-last [1 2 3 4])\n;=> (1 2 3) \n\n(drop-last -1 [1 2 3 4])\n;=> (1 2 3 4) \n\n(drop-last 0 [1 2 3 4])\n;=> (1 2 3 4) \n\n(drop-last 5 [1 2 3 4])\n;=> ()\n\n;; works differently with any seq.\n;; but with some the last items become ambiguous.\n(drop-last 2 (vector 1 2 3 4))\n;=> (1 2)\n(drop-last 2 (list 1 2 3 4 ))\n;=> (1 2)\n(drop-last 2 {:a 1 :b 2 :c 3 :d 4})\n;=> ([:a 1] [:b 2])", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon", :account-source "clojuredocs", :login "zmila"}, :_id "542692cbc026201cdc326bc8"} {:updated-at 1615942982457, :created-at 1615234915525, :author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :body ";; Using `drop-last` vs. using `butlast`\n\n(def v [1 2 3 4])\n\n(butlast v) ;;=> (1 2 3)\n(drop-last v) ;;=> (1 2 3)\n(drop-last 2 v) ;;=> (1 2) butlast can't do this\n(butlast 2 v) ;;=> ArityException\n(drop-last 0 v) ;;=> (1 2 3 4) \n(drop-last -1 v) ;;=> (1 2 3 4)\n\n;; Performance differences:\n;; - `butlast`, linear time\n;; - `drop-last`, lazy, efficient, more flexible, constant time(?) \n;; - `pop`, constant but requires a vector\n\n(def r (range 10000))\n\n(time (butlast r)) ;;=> \"Elapsed time: 6.379 msecs\"\n(time (drop-last r)) ;;=> \"Elapsed time: 0.0475 msecs\"\n(time (drop-last 2 r)) ;;=> \"Elapsed time: 0.0569 msecs\"\n(time (drop-last 0 r)) ;;=> \"Elapsed time: 0.098 msecs\"\n(time (drop-last -1 r)) ;;=> \"Elapsed time: 0.0615 msecs\"\n\n(def r-vec (vec r)) ;; to work like `butlast` pop needs a vector \n(time (pop r-vec)) ;;=> \"Elapsed time: 0.062 msecs\"", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4", :account-source "github", :login "Crowbrammer"}], :_id "60468763e4b0b1e3652d7474"}], :notes [{:author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :updated-at 1524422027867, :created-at 1524422027867, :body "`drop-last` is lazy and implemented with `map`, whereas `butlast` is not lazy and implemented with `loop` and `recur`. ", :_id "5adcd58be4b045c27b7fac4b"}], :arglists ["coll" "n coll"], :doc "Return a lazy sequence of all but the last n (default 1) items in coll", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/drop-last"} {:added "1.0", :ns "clojure.core", :name "not-empty", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1311798738000, :author {:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "empty", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d87"} {:created-at 1441028012851, :author {:login "BernhardBln", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4759839?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "empty?", :ns "clojure.core"}, :_id "55e457ace4b072d7f27980f4"} {:created-at 1479824393862, :author {:login "jswalens", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/12746328?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "seq", :ns "clojure.core"}, :_id "58345409e4b0782b632278c5"}], :line 5537, :examples [{:updated-at 1484346990250, :created-at 1311798802000, :body "user=> (not-empty [1])\n[1]\nuser=> (not-empty [1 3 5])\n[1 3 5]\nuser=> (not-empty [])\nnil\nuser=> (not-empty '())\nnil\nuser=> (not-empty {})\nnil\nuser=> (not-empty nil)\nnil", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"} {:login "tkocmathla", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/183459?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon", :account-source "clojuredocs", :login "OnesimusUnbound"}, :_id "542692cfc026201cdc326e48"} {:updated-at 1480975247792, :created-at 1480975247792, :author {:login "joshdegagne", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3721599?v=3"}, :body ";; Same behaviour for strings\n\nuser> (not-empty \"hello\")\n\"hello\"\n\nuser> (not-empty \"\")\nnil", :_id "5845e38fe4b0782b632278d6"} {:editors [{:login "kopos", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/655969?v=4"}], :body ";; if-let can now work with colls also, not being limited to scalar values alone\nuser> (if-let [valid (not-empty (filter even? [2 4 6]))] valid)\n(2 4 6)\n\n;; if-let helps avoid another nested if check\nuser> (if-let [valid (not-empty (filter even? [1 3 5]))] valid)\nnil\n\n;; without not-empty we would have to work with another if conditional\nuser> (if-let [valid (filter even? [1 3 5])] valid)\n()", :author {:avatar-url "https://avatars0.githubusercontent.com/u/655969?v=4", :account-source "github", :login "kopos"}, :created-at 1586364994600, :updated-at 1586365117971, :_id "5e8e0242e4b087629b5a18d0"}], :notes nil, :arglists ["coll"], :doc "If coll is empty, returns nil, else coll", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/not-empty"} {:added "1.0", :ns "clojure.core", :name "distinct", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1396938593000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "distinct?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c04"} {:created-at 1440188357188, :author {:login "blx", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/887504?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "dedupe", :ns "clojure.core"}, :_id "55d787c5e4b0831e02cddf19"} {:created-at 1440188421908, :author {:login "blx", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/887504?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "set", :ns "clojure.core"}, :_id "55d78805e4b072d7f27980eb"}], :line 5029, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (distinct [1 2 1 3 1 4 1 5])\n(1 2 3 4 5)", :created-at 1280343931000, :updated-at 1332949923000, :_id "542692c7c026201cdc3269aa"} {:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (def fractions \n (for [n (range 1 100) d (range (inc n) 100)] \n (let [gcd (clojure.contrib.math/gcd n d)] \n (/ (/ n gcd) (/ d gcd)))))\n;; all irreducible fractions with denominator < 100\n;; (1/2 1/3 ... 1/99 2/3 1/2 2/5 1/3 ...)\n\nuser=> (count fractions)\n4851\n\nuser=> (count (distinct fractions))\n3003\n", :created-at 1280343971000, :updated-at 1285496532000, :_id "542692c7c026201cdc3269ad"} {:updated-at 1607179413496, :created-at 1607179413496, :author {:login "siddharthjain-in", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/6537820?v=4"}, :body "user=> (distinct [1/2 2/4])\n(1/2)\n\nuser=> (distinct [1/2 0.5])\n(1/2 0.5)", :_id "5fcb9c95e4b0b1e3652d7415"} {:updated-at 1654971641960, :created-at 1654971641960, :author {:login "clojer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/107184681?v=4"}, :body "user=> (apply str (distinct \"tattoo\"))\n\"tao\"", :_id "62a4dcf9e4b0b1e3652d75fc"}], :notes [{:updated-at 1285266859000, :body "If you do not need the lazyness of distinct, set can be faster. Like: (count (set some-coll)).", :created-at 1285266859000, :author {:login "morphling", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/90ffa70a579c3e0c398b7523ecdc6a87?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f96"} {:updated-at 1389130101000, :body "Use this function if you want to remove only consequtive duplicates\r\n\r\n (defn distinct-consequtive [sequence] (map first (partition-by identity sequence)))\r\n\r\n (distinct-consequtive [1 1 2 3 3 2 2 3])\r\n ;=> (1 2 3 2 3)", :created-at 1389130101000, :author {:login "vshatsky", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/20b6441a990cf524f4ce73f67f3a56d8?r=PG&default=identicon"}, :_id "542692edf6e94c6970522018"} {:author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1334295?v=3"}, :updated-at 1463670462203, :created-at 1463670462203, :body "Use [`dedupe`](https://clojuredocs.org/clojure.core/dedupe) if you want to remove consecutive duplicates, available since Clojure 1.7.", :_id "573dd6bee4b05c05173143fd"}], :arglists ["" "coll"], :doc "Returns a lazy sequence of the elements of coll with duplicates removed.\n Returns a stateful transducer when no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/distinct"} {:added "1.0", :ns "clojure.core", :name "partition", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1297761042000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "partition-all", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521da0"} {:created-at 1314290633000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "split-at", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521da1"} {:created-at 1324097144000, :author {:login "rjack", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a561494c10e6fd3367f7a0bbc18da27?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "partition-by", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521da2"} {:created-at 1526479435653, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "cycle", :ns "clojure.core"}, :_id "5afc3a4be4b045c27b7fac68"}], :line 3184, :examples [{:updated-at 1421743255734, :created-at 1279644356000, :body ";; partition a list of 20 items into 5 (20/4) lists of 4 items\n(partition 4 (range 20))\n;;=> ((0 1 2 3) (4 5 6 7) (8 9 10 11) (12 13 14 15) (16 17 18 19))\n\n;; partition a list of 22 items into 5 (20/4) lists of 4 items \n;; the last two items do not make a complete partition and are dropped.\n(partition 4 (range 22))\n;;=> ((0 1 2 3) (4 5 6 7) (8 9 10 11) (12 13 14 15) (16 17 18 19))\n\n;; uses the step to select the starting point for each partition\n(partition 4 6 (range 20))\n;;=> ((0 1 2 3) (6 7 8 9) (12 13 14 15))\n\n;; if the step is smaller than the partition size, items will be reused\n(partition 4 3 (range 20))\n;;=> ((0 1 2 3) (3 4 5 6) (6 7 8 9) (9 10 11 12) (12 13 14 15) (15 16 17 18))\n\n;; when there are not enough items to fill the last partition, a pad can be supplied.\n(partition 3 6 [\"a\"] (range 20))\n;;=> ((0 1 2) (6 7 8) (12 13 14) (18 19 \"a\"))\n\n;; when a pad is supplied, the last partition may not be of the same size as the rest\n(partition 4 6 [\"a\"] (range 20))\n;;=> ((0 1 2 3) (6 7 8 9) (12 13 14 15) (18 19 \"a\"))\n\n;; but only as many pad elements are used as necessary to fill the final partition.\n(partition 4 6 [\"a\" \"b\" \"c\" \"d\"] (range 20))\n;;=> ((0 1 2 3) (6 7 8 9) (12 13 14 15) (18 19 \"a\" \"b\"))\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:avatar-url "https://avatars.githubusercontent.com/u/59250?v=3", :account-source "github", :login "jayp"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692cdc026201cdc326d23"} {:author {:login "uvtc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/34f159f89cbd1d9beac0276f5a7af552?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; a step smaller than the partition-size results in reuse.\n(partition 3 1 [:a :b :c :d :e :f])\n;;=> ((:a :b :c) (:b :c :d) (:c :d :e) (:d :e :f))\n", :created-at 1340078697000, :updated-at 1420738171371, :_id "542692d4c026201cdc327027"} {:author {:login "Parijat Mishra", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e3aba44539a78ea92373418456f090e3?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; When there are less than n items in the coll, partition's behaviour\n;; depends on whether there is a pad or not\n\n;; without pad\n(partition 10 [1 2 3 4])\n;;=> ()\n\n;; again, without pad\n(partition 10 10 [1 2 3 4])\n;;=> ()\n\n;; with a pad this time (note: the pad is an empty sequence)\n(partition 10 10 nil [1 2 3 4])\n;;=> ((1 2 3 4))\n\n;; or, explicit empty sequence instead of nil\n(partition 10 10 [] [1 2 3 4])\n;;=> ((1 2 3 4))\n", :created-at 1340625444000, :updated-at 1420738216041, :_id "542692d4c026201cdc327028"} {:updated-at 1470789114426, :created-at 1470789114426, :author {:login "porglezomp", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1690225?v=3"}, :body ";; Partitioning 0 elements will produce an infinite seq of empty sequences\n(partition 0 [1 2 3])\n;; *hangs*\n\n(take 5 (partition 0 [1 2 3]))\n;; => (() () () () ())", :_id "57aa75fae4b0bafd3e2a04d3"} {:updated-at 1651461824771, :created-at 1520841935104, :author {:login "luciancrasovan", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/6660425?v=4"}, :body ";; Using nil as a pad will let the incomplete partition in the result\n;; Here we use it to drop every fourth emlement in an array\n(partition 3 4 nil [1 2 3 4 5 6 7 8 9])\n;;((1 2 3) (5 6 7) (9))", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/6660425?v=4", :account-source "github", :login "luciancrasovan"} {:login "siddharthjain-in", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6537820?v=4"}], :_id "5aa634cfe4b0316c0f44f91f"} {:updated-at 1526479384489, :created-at 1525990704985, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body ";; Here is a nice little trick to make a ring.\n(def foo [5 6 7 8])\n\n(partition 2 1 foo foo)\n;;=> ((5 6) (6 7) (7 8) (8 5))\n\n;; This will produce a part for each element of foo.\n;; Without the pad stops sooner.\n(partition 2 1 foo)\n;;=> ((5 6) (6 7) (7 8))\n\n;; Just how crazy can this get?\n(partition 4 1 foo foo)\n;;=> ((5 6 7 8) (6 7 8 5))\n;; Not too crazy, this illustrates the \n;; fact that the first use of the pad halts the partitioning.\n;; To my way of thinking this is not what I expected.\n\n;; The following alternative implementation continues \n;; until the coll has been consumed once completely.\n(defn spiral\n ([n step coll]\n (spiral n step coll coll))\n ([n step pad coll]\n (lazy-seq\n (when-let [s (seq coll)]\n (let [p (doall (take n s))\n item (take n (apply concat p (repeat pad)))]\n (if (< 1 (count p))\n (cons item (spiral n step pad (nthrest s step)))\n (list item)))))))\n(spiral 4 1 foo)\n;;=> ((5 6 7 8) (6 7 8 5) (7 8 5 6) (8 5 6 7))\n\n(spiral 4 2 foo)\n;;=> ((5 6 7 8) (7 8 5 6))\n\n(spiral 6 1 foo)\n;;=> ((5 6 7 8 5 6) (6 7 8 5 6 7) (7 8 5 6 7 8) (8 5 6 7 8 5))\n\n(def bar [:a :b :c])\n(spiral 6 2 bar foo)\n;;=> ((5 6 7 8 :a :b) (7 8 :a :b :c :a))\n\n;; Note that if you don’t need the padding, the function above can be\n;; simplified a lot by using cycle:\n(defn spiral\n [n offset coll]\n (take (/ (count coll) offset) (partition n offset (cycle coll))))", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"} {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}], :_id "5af4c530e4b045c27b7fac60"} {:updated-at 1545833930836, :created-at 1533240763986, :author {:login "anpr", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1492772?v=4"}, :body ";; In case you want behaviour similar to Ruby's each_slice, \n;; where the last sequence doesn't necessarily have the same \n;; size as the others, you can just provide an empty or nil pad value.\n(partition 3 3 nil (range 11))\n;;=> ((0 1 2) (3 4 5) (6 7 8) (9 10)))\n\n;; This is the default behavior of partition-all\n(partition-all 3 3 (range 11))\n;;=> ((0 1 2) (3 4 5) (6 7 8) (9 10))) \n", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/1492772?v=4", :account-source "github", :login "anpr"} {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}], :_id "5b6365bbe4b00ac801ed9e44"} {:updated-at 1566230801010, :created-at 1566230801010, :author {:login "malloryerik", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10395849?v=4"}, :body "user=> (partition 5 \"superfragilistic\")\n((\\s \\u \\p \\e \\r) (\\f \\r \\a \\g \\i) (\\l \\i \\s \\t \\i))", :_id "5d5ac911e4b0ca44402ef7a7"} {:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; There's no transducer arity for partition, but there is for partition-all\n;; To enforce full partitions only, we can provide our own reducing function…\n(let [rf (completing (fn [acc x] (cond-> acc (= 3 (count x)) (conj x))))]\n (transduce (partition-all 3) rf [] '[a b c d e f g]))\n;; => [[a b c] [d e f]]\n\n;; Or we can add a take-while transducer…\n(into [] (comp (partition-all 3) (take-while #(= 3 (count %)))) '[a b c d e f g])\n;; => [[a b c] [d e f]]", :author {:avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4", :account-source "github", :login "tomdl89"}, :created-at 1678019636162, :updated-at 1678019921400, :_id "64048c34e4b08cf8563f4b76"}], :notes nil, :arglists ["n coll" "n step coll" "n step pad coll"], :doc "Returns a lazy sequence of lists of n items each, at offsets step\n apart. If step is not supplied, defaults to n, i.e. the partitions\n do not overlap. If a pad collection is supplied, use its elements as\n necessary to complete last partition upto n items. In case there are\n not enough padding elements, return a partition with less than n items.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/partition"} {:added "1.0", :ns "clojure.core", :name "loop", :special-form true, :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1289617722000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "recur", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d7a"} {:created-at 1289618043000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "trampoline", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d7b"} {:created-at 1342652485000, :author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "when", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d7c"} {:created-at 1360216647000, :author {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "while", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d7d"} {:created-at 1551989726895, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "for", :ns "clojure.core"}, :_id "5c817bdee4b0ca44402ef6ae"} {:created-at 1551989770924, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "doseq", :ns "clojure.core"}, :_id "5c817c0ae4b0ca44402ef6af"} {:created-at 1551989783076, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reduce", :ns "clojure.core"}, :_id "5c817c17e4b0ca44402ef6b0"} {:created-at 1551989793853, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "dotimes", :ns "clojure.core"}, :_id "5c817c21e4b0ca44402ef6b1"}], :line 4575, :examples [{:author {:login "nipra", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/142529?v=3"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}], :body ";; looping is recursive in Clojure, the loop construct is a hack so that\n;; something like tail-recursive-optimization works in clojure.\n\nuser=> (defn my-re-seq [re string]\n \"Something like re-seq\"\n (let [matcher (re-matcher re string)]\n\n (loop [match (re-find matcher) ;loop starts with 2 set arguments\n result []]\n (if-not match\n result\n (recur (re-find matcher) ;loop with 2 new arguments\n (conj result match))))))\n\n#'user/my-re-seq\n\nuser=> (my-re-seq #\"\\d\" \"0123456789\")\n[\"0\" \"1\" \"2\" \"3\" \"4\" \"5\" \"6\" \"7\" \"8\" \"9\"]\n\n", :created-at 1279054191000, :updated-at 1412840234228, :_id "542692c8c026201cdc3269f4"} {:author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :editors [{:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Read decoded MP3 data in loop (requires mp3plugin.jar on class path)\n;; http://java.sun.com/javase/technologies/desktop/media/jmf/mp3/download.html \n\n(import '(javax.sound.sampled AudioSystem AudioFormat$Encoding))\n\n(let [mp3-file (java.io.File. \"tryout.mp3\")\n audio-in (AudioSystem/getAudioInputStream mp3-file)\n audio-decoded-in (AudioSystem/getAudioInputStream AudioFormat$Encoding/PCM_SIGNED audio-in)\n buffer (make-array Byte/TYPE 1024)]\n (loop []\n (let [size (.read audio-decoded-in buffer)]\n (when (> size 0)\n ;do something with PCM data\n\t(recur)))))\n", :created-at 1279556129000, :updated-at 1285499929000, :_id "542692c8c026201cdc3269f8"} {:updated-at 1436709203928, :created-at 1342652380000, :body "(loop [x 10]\n (when (> x 1)\n (println x)\n (recur (- x 2))))\n\n;;=> 10 8 6 4 2", :editors [{:login "Miloas", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/11530682?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon", :account-source "clojuredocs", :login "john.r.woodward"}, :_id "542692d4c026201cdc326ff6"} {:author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :editors [], :body "(defn find-needle [needle haystack]\n ;loop binds initial values once,\n ;then binds values from each recursion call\n (loop [needle needle\n maybe-here haystack\n not-here '()]\n\n (let [needle? (first maybe-here)]\n\n ;test for return or recur\n (if (or (= (str needle?) (str needle))\n (empty? maybe-here))\n\n ;return results\n [needle? maybe-here not-here]\n\n ;recur calls loop with new values\n (recur needle\n (rest maybe-here)\n (concat not-here (list (first maybe-here))))))))\n\nuser=>(find-needle \"|\" \"hay|stack\")\n[\\| (\\| \\s \\t \\a \\c \\k) (\\h \\a \\y)]", :created-at 1345453816000, :updated-at 1345453816000, :_id "542692d4c026201cdc326ff7"} {:author {:login "bartq", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b434a6540e72bcb335a026eb370da200?r=PG&default=identicon"}, :editors [], :body "; makes a simple template function that can be used in mustache way: http://mustache.github.com/\n(defn template [tpl env]\n (loop [tpl tpl\n env env]\n (cond (empty? env)\n tpl\n :else\n (let [[key value] (first env)]\n (recur (try (clojure.string/replace tpl \n (re-pattern (str \"\\\\{\\\\{\" (name key) \"\\\\}\\\\}\")) \n value)\n (catch Exception e tpl)) \n (rest env))))))", :created-at 1363378523000, :updated-at 1363378523000, :_id "542692d4c026201cdc326ff8"} {:updated-at 1436760791903, :created-at 1436760791903, :author {:login "Miloas", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/11530682?v=3"}, :body "(loop [iter 1\n acc 0]\n (if (> iter 10)\n (println acc)\n (recur (inc iter) (+ acc iter))))\n\n;; => 55\n;; sum from 1 to 10", :_id "55a33ad7e4b020189d740551"} {:editors [{:login "rauhs", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/11081351?v=3"}], :body ";; loop is the recursion point for recur. The symbols in loop's \n;; binding-forms are bound to their respective init-exprs and \n;; rebound to the values of recur's exprs before the next execution \n;; of loop's body.\n\n;; calculate the factorial of n\n\n(loop [n (bigint 5), accumulator 1]\n (if (zero? n)\n accumulator ; we're done\n (recur (dec n) (* accumulator n))))\n\n;;=> 120N\n\n\n;; square each number in the vector\n\n(loop [xs (seq [1 2 3 4 5])\n result []]\n (if xs\n (let [x (first xs)]\n (recur (next xs) (conj result (* x x))))\n result))\n\n;; => [1 4 9 16 25]", :author {:avatar-url "https://avatars.githubusercontent.com/u/19415437?v=3", :account-source "github", :login "clojurianix"}, :created-at 1463831813152, :updated-at 1511862332210, :_id "57404d05e4b0a1a06bdee497"} {:editors [{:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}], :body ";; A loop that sums the numbers 10 + 9 + 8 + ...\n\n;; Set initial values count (cnt) from 10 and down\n(loop [sum 0 cnt 10]\n ;; If count reaches 0 then exit the loop and return sum\n (if (= cnt 0)\n sum\n ;; Otherwise add count to sum, decrease count and \n ;; use recur to feed the new values back into the loop\n (recur (+ cnt sum) (dec cnt))))", :author {:avatar-url "https://avatars3.githubusercontent.com/u/745748?v=4", :account-source "github", :login "RobinNagpal"}, :created-at 1501353444891, :updated-at 1608672429068, :_id "597cd5e4e4b0d19c2ce9d703"} {:editors [{:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}], :body "(loop [i 0] \n (when (< i 5) \n (println i) \n (recur (inc i)))) ; loop i will take this value", :author {:avatar-url "https://avatars3.githubusercontent.com/u/745748?v=4", :account-source "github", :login "RobinNagpal"}, :created-at 1501353818637, :updated-at 1608672449492, :_id "597cd75ae4b0d19c2ce9d704"} {:updated-at 1511910753719, :created-at 1511908503199, :author {:login "phronmophobic", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/156241?v=4"}, :body ";; Iterating over a collection using loop\n\n;; 1. First call (seq xs) on the given argument and then check for nil \n;; 2. Then call next/first and use these.\n\n(loop [xs (seq [1 2 3 4 5])\n result []]\n (if xs\n (let [x (first xs)]\n (recur (next xs) (conj result (* x x))))\n result))\n\n;; the same loop can be written using destructing,\n;; but the compiler will generate two consecutive\n;; seq calls and is slightly less efficient.\n\n(loop [[x & r :as xs] (seq [])\n result []]\n (if xs\n (recur r (conj result (* x x)))\n result))", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/156241?v=4", :account-source "github", :login "phronmophobic"}], :_id "5a1de497e4b0a08026c48cc4"} {:editors [{:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}], :body ";;basic loop example #1\n\n(loop [x 0\n result []]\n (if (< x 10)\n (recur\n (inc x)\n (conj result x)) result))\n;;[0 1 2 3 4 5 6 7 8 9]\n\n;;basic loop example #2\n(def citrus-list [\"lemon\" \"orange\" \"grapefruit\"])\n\n(defn display-citrus [citruses]\n (loop [[citrus & citruses] citruses]\n (println citrus)\n (if citrus (recur citruses))))\n\n(display-citrus citrus-list)", :author {:avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4", :account-source "github", :login "ibercode"}, :created-at 1513260380816, :updated-at 1513946984454, :_id "5a32855ce4b0a08026c48cd6"} {:editors [{:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}], :body ";;loop general strategy\n;;given a collection of numbers [1 2 3 4 5],\n;;return a new collection [10 20 30 40 50]\n\n\n(def my-vector [1 2 3 4 5])\n\n(defn my-new-vector\n [coll]\n (loop [remain coll\n final-vec []]\n (if (empty? remain)\n final-vec\n (let [[unit & remaining] remain]\n (recur remaining\n (into final-vec [(* 10 unit)]))))))\n\n(my-new-vector my-vector)\n;;[10 20 30 40 50]\n\n;;to sum all the elements from the newly created collection:\n\n(reduce + (my-new-vector my-vector))\n;;150", :author {:avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4", :account-source "github", :login "ibercode"}, :created-at 1515925474334, :updated-at 1515927057530, :_id "5a5b2fe2e4b0a08026c48cf3"} {:updated-at 1542302761051, :created-at 1542302489864, :author {:login "jiro4989", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/13825004?v=4"}, :body ";; loop -> recur sample with fizzbuzz code.\n\n(defn fizzbuzz\n [n]\n (loop [f []\n i 1]\n (if (< n i)\n f\n (recur (conj f (cond\n (zero? (mod i 15)) \"fizzbuzz\"\n (zero? (mod i 3)) \"fizz\"\n (zero? (mod i 5)) \"buzz\"\n :else i))\n (inc i)))))\n\n(println (fizzbuzz 100))\n;; output is \n;; [1 2 fizz 4 buzz fizz 7 8 fizz buzz 11 fizz 13 14 fizzbuzz 16 17 fizz 19 buzz fizz 22 23 fizz buzz 26 fizz 28 29 fizzbuzz 31 32 fizz 34 buzz fizz 37 38 fizz buzz 41 fizz 43 44 fizzbuzz 46 47 fizz 49 buzz fizz 52 53 fizz buzz 56 fizz 58 59 fizzbuzz 61 62 fizz 64 buzz fizz 67 68 fizz buzz 71 fizz 73 74 fizzbuzz 76 77 fizz 79 buzz fizz 82 83 fizz buzz 86 fizz 88 89 fizzbuzz 91 92 fizz 94 buzz fizz 97 98 fizz buzz]\n", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/13825004?v=4", :account-source "github", :login "jiro4989"}], :_id "5bedab19e4b00ac801ed9efb"}], :macro true, :notes [{:updated-at 1279842159000, :body "\"Acts as a recur target.\"\r\n\r\nWhat's a recur target? A recurring target? A recursive target? I'm not a big fan of abbreviations or ambiguous terms.\r\n\r\nWouldn't it be awesome if a script could annotate all occurrences of glossary terms? Or automatically wrap glossary terms in anchor tags linking to their definition?", :created-at 1279842116000, :author {:login "Jacolyte", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon"}, :_id "542692ebf6e94c6970521f83"} {:updated-at 1279870294000, :body "The problem `loop` is trying to solve is that recursively calling the same function on the JVM is expensive and doesn't scale. It might work if your data structure is a thousand levels deep but it will fail badly with a depth of millions of levels.\r\n\r\nWhat is not possible on the JVM is what is called \"tail-call optimization\". `loop` is like a `while` loop in java, except that if you don't call `recur` (with the correct number of arguments) the loop will exit. In while-loop terms, `recur` avoids that a `break` statement is executed.\r\n\r\n
    int counter = 0;\r\nwhile (true) {\r\n   if (counter < 10) {\r\n      // recur\r\n      counter = inc(counter);\r\n   } else {\r\n      break;\r\n   }\r\n}\r\n
    \r\n\r\nIn that sense `loop` is a recur target as in \"target for recursion\".", :created-at 1279847110000, :author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :_id "542692ebf6e94c6970521f84"} {:updated-at 1279866045000, :body "I wish the word recur in this document linked to the recur function. That'd be... awesome.", :created-at 1279866045000, :author {:login "Jacolyte", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon"}, :_id "542692ebf6e94c6970521f85"} {:updated-at 1279892164000, :body "It really should (and will) show up in the 'vars in' section. \r\n\r\nThe problem is that recur is a special form, and is not parsed out correctly like other vars. This will be fixed in the future.", :created-at 1279892142000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :_id "542692ebf6e94c6970521f86"} {:body "Majority of `loop`s that novices write can be expressed more elegantly using 3 fundamental functions `map`, `filter` and `reduce`. Or using list comprehension `for`.", :created-at 1423042890947, :updated-at 1423043065278, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :_id "54d1e94ae4b0e2ac61831d0e"} {:body "To be clear, there's no *technical* reason the JVM can't support tail recursion (despite some complications to do with call stacks and security) - it just doesn't happen to support them currently.\n\nPeople have been requesting this enhancement for at least a decade - [here's one proposal](https://blogs.oracle.com/jrose/entry/tail_calls_in_the_vm), for example.", :created-at 1430499038628, :updated-at 1430499038628, :author {:login "pmonks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/54865?v=3"}, :_id "5543aedee4b06eaacc9cda86"}], :arglists ["bindings & body"], :doc "Evaluates the exprs in a lexical context in which the symbols in\n the binding-forms are bound to their respective init-exprs or parts\n therein. Acts as a recur target.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/loop", :forms ["(loop [bindings*] exprs*)"]} {:added "1.0", :ns "clojure.core", :name "add-classpath", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 5152, :examples [{:updated-at 1507317464731, :created-at 1507317464731, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body ";; There are alternatives\n\n;; https://github.com/cemerick/pomegranate\n\n;; http://grokbase.com/p/gg/clojure/12bnhbvmpy/how-to-add-an-url-into-the-classpath\n", :_id "59d7d6d8e4b03026fe14ea57"}], :deprecated "1.1", :notes nil, :arglists ["url"], :doc "DEPRECATED \n\n Adds the url (String or URL object) to the classpath per\n URLClassLoader.addURL", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/add-classpath"} {:added "1.0", :ns "clojure.core", :name "bit-flip", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 1343, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (bit-flip 2r1011 2)\n15 \n;; 15 = 2r1111\n\n(bit-flip 2r1111 2)\n11 \n;; 11 = 2r1011", :created-at 1280339556000, :updated-at 1332952408000, :_id "542692c8c026201cdc326a6b"}], :notes nil, :arglists ["x n"], :doc "Flip bit at index n", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bit-flip"} {:added "1.0", :ns "clojure.core", :name "long-array", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "longs", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917397000, :_id "542692ebf6e94c6970521ea2"} {:created-at 1581624427170, :author {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "int-array", :ns "clojure.core"}, :_id "5e45ac6be4b0ca44402ef834"} {:created-at 1581624433858, :author {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "float-array", :ns "clojure.core"}, :_id "5e45ac71e4b0ca44402ef835"} {:created-at 1581624442586, :author {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "double-array", :ns "clojure.core"}, :_id "5e45ac7ae4b0ca44402ef836"} {:created-at 1581624451957, :author {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "boolean-array", :ns "clojure.core"}, :_id "5e45ac83e4b0ca44402ef837"}], :line 5340, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"} {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"} {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}], :body ";; create a long array using long-array and show it can be used\n;; with the standard Java Arrays functions binarySearch and fill\n;; note the needed coercions\n\nuser=> (def is (long-array (range 3 20)))\n#'user/is\nuser=> (vec is)\n[3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]\nuser=> (java.util.Arrays/binarySearch is (long 10))\n7\nuser=> (java.util.Arrays/fill is 3 8 (long 99))\nnil\nuser=> (vec is)\n[3 4 5 99 99 99 99 99 11 12 13 14 15 16 17 18 19]\nuser=>", :created-at 1313907019000, :updated-at 1313963219000, :_id "542692c7c026201cdc326962"}], :notes nil, :arglists ["size-or-seq" "size init-val-or-seq"], :doc "Creates an array of longs", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/long-array"} {:added "1.0", :ns "clojure.core", :name "descendants", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1400492134000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ancestors", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ead"}], :line 5614, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; simple example a toy poodle is a poodle is a dog is an animal\n\nuser=> (derive ::dog ::animal)\nnil\nuser=> (derive ::poodle ::dog)\nnil\nuser=> (derive ::toy_poodle ::poodle)\nnil\nuser=> (descendants ::animal)\n#{:user/toy_poodle :user/poodle :user/dog}\nuser=>", :created-at 1313968073000, :updated-at 1313968073000, :_id "542692c8c026201cdc326a24"} {:updated-at 1597842188323, :created-at 1597842188323, :author {:login "uosl", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/3865590?v=4"}, :body ";; You can combine `descendants` with `parents` to only get the immediate children.\n\n(filter #(contains? (parents h %) tag)\n (descendants h tag))", :_id "5f3d230ce4b0b1e3652d7381"}], :notes nil, :arglists ["tag" "h tag"], :doc "Returns the immediate and indirect children of tag, through a\n relationship established via derive. h must be a hierarchy obtained\n from make-hierarchy, if not supplied defaults to the global\n hierarchy. Note: does not work on Java type inheritance\n relationships.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/descendants"} {:added "1.0", :ns "clojure.core", :name "merge", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1294676416000, :author {:login "Nebulus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/61aa4140c24b0cded6b20d88200e7f16?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "merge-with", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ad7"} {:created-at 1317787765000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "hash-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ad8"} {:created-at 1536776434976, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "assoc", :ns "clojure.core"}, :_id "5b9958f2e4b00ac801ed9e95"}], :line 3041, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "srid", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd3a68d670372cd09876c26270a4299a?r=PG&default=identicon"} {:login "srid", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd3a68d670372cd09876c26270a4299a?r=PG&default=identicon"} {:login "srid", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd3a68d670372cd09876c26270a4299a?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(merge {:a 1 :b 2 :c 3} {:b 9 :d 4})\n;;=> {:d 4, :a 1, :b 9, :c 3}", :created-at 1279071769000, :updated-at 1422374016946, :_id "542692cfc026201cdc326e73"} {:author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :editors [{:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"} {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(merge {:a 1} nil) ;=> {:a 1}\n(merge nil {:a 1}) ;=> {:a 1}\n(merge nil nil) ;=> nil\n", :created-at 1401310493000, :updated-at 1422374049474, :_id "542692d4c026201cdc32700c"} {:body ";; `merge` can be used to support the setting of default values\n(merge {:foo \"foo-default\" :bar \"bar-default\"} \n {:foo \"custom-value\"})\n;;=> {:foo \"custom-value\" :bar \"bar-default\"}\n\n;; This is useful when a function has a number of options\n;; with default values.\n(defn baz [& options]\n (let [options (merge {:opt1 \"default-1\" :opt2 \"default-2\"} \n (first options))]\n options))\n\n(baz {:opt1 \"custom-1\" :opt3 \"custom-3\"})\n;;=> {:opt3 \"custom-3\" :opt1 \"custom-1 :opt2 \"default-2\"}\n", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1422375001817, :updated-at 1422375001817, :_id "54c7b859e4b0e2ac61831cdf"} {:editors [{:login "dijonkitchen", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4"}], :body ";; For recursively merging deeply-nested maps:\n\n(defn deep-merge [v & vs]\n (letfn [(rec-merge [v1 v2]\n (if (and (map? v1) (map? v2))\n (merge-with deep-merge v1 v2)\n v2))]\n (if (some identity vs)\n (reduce #(rec-merge %1 %2) v vs)\n (last vs))))\n\n(deep-merge {:a {:b true}} {:a {:b false}} {:a {:b nil}})\n;; {:a {:b nil}}\n\n(deep-merge {:a 1} nil)\n;; nil ;; note that this isn't consistent with the regular merge function\n\n;; Source: https://gist.github.com/danielpcox/c70a8aa2c36766200a95#gistcomment-2677502", :author {:avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4", :account-source "github", :login "dijonkitchen"}, :created-at 1535149214818, :updated-at 1536856542156, :_id "5b80849ee4b00ac801ed9e75"} {:updated-at 1548252366101, :created-at 1548252366101, :author {:login "genmeblog", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/38646601?v=4"}, :body ";; latest comment under above gist provides another\n;; simpler and more consistent version of deep-merge\n;; Source: https://gist.github.com/danielpcox/c70a8aa2c36766200a95#gistcomment-2759497\n\n(defn deep-merge [a & maps]\n (if (map? a)\n (apply merge-with deep-merge a maps)\n (apply merge-with deep-merge maps)))\n\n(deep-merge {:a {:b true}} {:a {:b false}} {:a {:b nil}})\n;; => {:a {:b nil}}\n\n(deep-merge {:a 1} nil)\n;; => {:a 1}\n", :_id "5c4874cee4b0ca44402ef622"} {:updated-at 1566278942641, :created-at 1566278942641, :author {:login "liuchong", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/236058?v=4"}, :body "(merge {:x 1 :y 2} {:y 3 :z 4})\n;; => {:x 1, :y 3, :z 4}", :_id "5d5b851ee4b0ca44402ef7a8"} {:editors [{:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/19522656?v=4"}], :body ";; Looking at the source code, merge starts with the \n;; original collection and uses conj which adds elements \n;; as is into the collection, so merge can be used\n;; with more than just maps--i.e. using a vector returns a vector.\n\n(merge [:a \"Whoa\"] [:c \"Crash Bandicoot\"])\n;; => [:a \"Whoa\" [:c \"Crash Bandicoot\"]]\n(merge [:a \"Whoa\"] \"Crash Bandicoot\")\n;; => [:a \"Whoa\" \"Crash Bandicoot\"]", :author {:avatar-url "https://avatars0.githubusercontent.com/u/19522656?v=4", :account-source "github", :login "Crowbrammer"}, :created-at 1610333321854, :updated-at 1610333698491, :_id "5ffbbc89e4b0b1e3652d7429"}], :notes [{:body "### When to use assoc, conj, merge\n\n`assoc`, `conj` & `merge` behave very differently for different data structures\n\nIf you are writing a function that can handle multiple kinds of collections, then your choice will make a big difference.\n\nTreat merge as a maps-only function (its similar to conj for other collections).\n\nMy opinion:\n\n* `assoc` - use when you are 'changing' existing key/value pairs\n* `conj` - use when you are 'adding' new key/value pairs\n* `merge` - use when you are combining two or more maps\n\nRef : https://stackoverflow.com/a/3204346", :created-at 1620798989281, :updated-at 1620799011530, :author {:avatar-url "https://avatars.githubusercontent.com/u/1042312?v=4", :account-source "github", :login "udkl"}, :_id "609b6e0de4b0b1e3652d74f9"}], :arglists ["& maps"], :doc "Returns a map that consists of the rest of the maps conj-ed onto\n the first. If a key occurs in more than one map, the mapping from\n the latter (left-to-right) will be the mapping in the result.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/merge"} {:added "1.0", :ns "clojure.core", :name "accessor", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1412886553460, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "get", :library-url "https://github.com/clojure/clojure"}, :_id "5436f019e4b0ae795603157e"}], :line 4071, :examples [{:author {:login "tormaroe", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8bc7bb10bee96efb190053fe92ffd250?r=PG&default=identicon"}, :editors [], :body "(defstruct car-struct :make :model :year :color)\n\n(def car (struct car-struct \"Toyota\" \"Prius\" 2010))\n\n(def make (accessor car-struct :make))\n\nuser=> (make car) ; Same as both (car :make) and (:make car)\n\"Toyota\" \n\n", :created-at 1289603045000, :updated-at 1289603045000, :_id "542692cac026201cdc326b11"}], :notes nil, :arglists ["s key"], :doc "Returns a fn that, given an instance of a structmap with the basis,\n returns the value at the key. The key must be in the basis. The\n returned function should be (slightly) more efficient than using\n get, but such use of accessors should be limited to known\n performance-critical areas.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/accessor"} {:added "1.0", :ns "clojure.core", :name "integer?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1440146014714, :author {:login "muhuk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/40178?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "number?", :ns "clojure.core"}, :_id "55d6e25ee4b0831e02cddf15"} {:created-at 1495654427514, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "int?", :ns "clojure.core"}, :_id "5925e01be4b093ada4d4d73b"}], :line 1374, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (integer? 1)\ntrue\nuser=> (integer? 1.0)\nfalse", :created-at 1279074074000, :updated-at 1332950732000, :_id "542692c8c026201cdc326a30"} {:updated-at 1487037245803, :created-at 1487037245803, :author {:login "jungziege", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/405465?v=3"}, :body ";; Note: tests if it's a math integer, not a Java Integer\nuser=> (integer? (inc Integer/MAX_VALUE))\ntrue", :_id "58a2633de4b01f4add58fe53"} {:updated-at 1495656170180, :created-at 1495656170180, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :body ";; integer? returns true for BigInts. If you don't want this behavior, you can \n;; use the int? predicate instead in Clojure 1.9 or later:\n\n(integer? 13N)\n;; => true\n\n(int? 13N)\n;; => false", :_id "5925e6eae4b093ada4d4d742"}], :notes nil, :arglists ["n"], :doc "Returns true if n is an integer", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/integer_q"} {:added "1.4", :ns "clojure.core", :name "mapv", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1413326056085, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "map", :library-url "https://github.com/clojure/clojure"}, :_id "543da4e8e4b02688d208b1b8"} {:created-at 1507137288794, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "vec", :ns "clojure.core"}, :_id "59d51708e4b03026fe14ea4f"} {:created-at 1516208408133, :author {:login "jcburley", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/430319?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reduce", :ns "clojure.core"}, :_id "5a5f8118e4b0a08026c48cfa"} {:created-at 1516208418039, :author {:login "jcburley", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/430319?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pmap", :ns "clojure.core"}, :_id "5a5f8122e4b0a08026c48cfb"}], :line 6903, :examples [{:editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "totorigolo", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1183296?v=4"}], :updated-at 1542244482242, :created-at 1421096939041, :author {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}, :body "(mapv inc [1 2 3 4 5])\n;;=> [2 3 4 5 6]\n\n\n;; mapv can be used with multiple collections. Collections will be consumed\n;; and passed to the mapping function in parallel:\n(mapv + [1 2 3] [4 5 6])\n;;=> [5 7 9]\n\n\n;; When mapv is passed more than one collection, the mapping function will\n;; be applied until one of the collections runs out:\n(mapv + [1 2 3] (iterate inc 1))\n;;=> [2 4 6]\n\n\n\n;; mapv is often used in conjunction with the # reader macro:\n(mapv #(str \"Hello \" % \"!\" ) [\"Ford\" \"Arthur\" \"Tricia\"])\n;;=> [\"Hello Ford!\" \"Hello Arthur!\" \"Hello Tricia!\"]\n\n;; A useful idiom to pull \"columns\" out of a collection of collections. \n;; Note, it is equivalent to:\n;; (mapv vector [:a :b :c] [:d :e :f] [:g :h :i])\n\n(apply mapv vector [[:a :b :c]\n [:d :e :f]\n [:g :h :i]])\n;;=> [[:a :d :g] [:b :e :h] [:c :f :i]]", :_id "54b437ebe4b081e022073c02"} {:updated-at 1584701507565, :created-at 1573719104514, :author {:login "kangbb", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/15232085?v=4"}, :body ";; The difference between `map` and `mapv` is that:\n;; `map` return a lazy sequence,\n;; `mapv` return a sequence.\n(def result (map println [1 2 3]))\n;;=> #'user/result\nresult\n;;=> 1\n;; 2\n;; 3\n;; (nil nil nil)\n\n(def result (mapv println [1 2 3]))\n;;=> 1\n;; 2\n;; 3\n;; #'user/result\nresult\n;;=> [nil nil nil]\n\n;; So, we can use it when we want to get a side effect immediately.\n", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/15232085?v=4", :account-source "github", :login "kangbb"} {:login "graycodes", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1530754?v=4"}], :_id "5dcd0c40e4b0ca44402ef7de"} {:updated-at 1619002206128, :created-at 1619001516133, :author {:login "sFritsch09", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/58191603?v=4"}, :body ";; convert number to vector:\n; numb = 210\n\n((fn [numb] (mapv #(Character/digit % 10) (str numb))) 210)\n;;=> [2 1 0]\n\n;; and the other way around:\n\n(read-string (reduce str [2 1 0]))\n;;=> 210", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/58191603?v=4", :account-source "github", :login "sFritsch09"}], :_id "608000ace4b0b1e3652d74c9"}], :notes [{:body "Like `map` but returns a vector. In most cases equivalent to calling `(into [] (map f c1 c2 ...))`. Is much faster than map (but is not lazy!) in the `(mapv f coll)` case.", :created-at 1430433040188, :updated-at 1430433049879, :author {:login "num1", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/466333?v=3"}, :_id "5542ad10e4b06eaacc9cda82"} {:author {:login "KingMob", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/946421?v=4"}, :updated-at 1596048409289, :created-at 1596048409289, :body "It's not necessarily true at all that `mapv` will be faster than `map`. `mapv` (and related fns like `filterv`) have increased memory needs (creating unused values, realizing intermediate sequences, etc) that hurt it.\n\nHere's a simple example showing how `mapv`/`filterv` can be slower. (Benchmarked with criterium.)\n\n```\n(let [nums (range 10000000)]\n (bench\n (reduce +' 0 (filter even? (map #(* % %) nums))))\n\n (bench\n (reduce +' 0 (filterv even? (mapv #(* % %) nums)))))\n```\nand the results, showing `map` is actually a little faster than `mapv`:\n\n```\nEvaluation count : 120 in 60 samples of 2 calls.\n Execution time mean : 768.870217 ms\n Execution time std-deviation : 21.043586 ms\n Execution time lower quantile : 756.049838 ms ( 2.5%)\n Execution time upper quantile : 835.719808 ms (97.5%)\n Overhead used : 1.805367 ns\n\nFound 9 outliers in 60 samples (15.0000 %)\n\tlow-severe\t 3 (5.0000 %)\n\tlow-mild\t 6 (10.0000 %)\n Variance from outliers : 14.2178 % Variance is moderately inflated by outliers\n\n\n\nEvaluation count : 120 in 60 samples of 2 calls.\n Execution time mean : 800.356084 ms\n Execution time std-deviation : 49.667013 ms\n Execution time lower quantile : 756.382597 ms ( 2.5%)\n Execution time upper quantile : 883.471627 ms (97.5%)\n Overhead used : 1.805367 ns\n\nFound 12 outliers in 60 samples (20.0000 %)\n\tlow-severe\t 5 (8.3333 %)\n\tlow-mild\t 1 (1.6667 %)\n\thigh-mild\t 6 (10.0000 %)\n Variance from outliers : 46.7536 % Variance is moderately inflated by outliers\n```\n\nThe takeaway is, don't pick `mapv` just for speed reasons.", :_id "5f21c419e4b0b1e3652d7327"}], :arglists ["f coll" "f c1 c2" "f c1 c2 c3" "f c1 c2 c3 & colls"], :doc "Returns a vector consisting of the result of applying f to the\n set of first items of each coll, followed by applying f to the set\n of second items in each coll, until any one of the colls is\n exhausted. Any remaining items in other colls are ignored. Function\n f should accept number-of-colls arguments.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/mapv"} {:added "1.2", :ns "clojure.core", :name "partition-all", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1313710375000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "partition", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c74"} {:created-at 1313710383000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "partition-by", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c75"}], :line 7240, :examples [{:updated-at 1420742107199, :created-at 1279643883000, :body "(partition 4 [0 1 2 3 4 5 6 7 8 9])\n;;=> ((0 1 2 3) (4 5 6 7))\n\n(partition-all 4 [0 1 2 3 4 5 6 7 8 9])\n;;=> ((0 1 2 3) (4 5 6 7) (8 9))\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692ccc026201cdc326c8e"} {:author {:login "Tap", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/925c5d43b739098e6f16f804f5dc4868?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(partition-all 2 4 [0 1 2 3 4 5 6 7 8 9])\n;;=> ((0 1) (4 5) (8 9))", :created-at 1349617127000, :updated-at 1420742136613, :_id "542692d4c026201cdc327029"} {:updated-at 1599548333018, :created-at 1373311985000, :body ";; Caution: Partitioning lazy sequence code freeze\n;; Edit: Only because (rdr l) is buggy and returns an infinite sequence!\n\n(def l [1 2 3 4 5])\n;create a simple lazy sequence function testing only\n;(rdr l) returns a lazy sequence from l\n(def rdr (fn reader[x] (cons (first x) (lazy-seq (reader (rest x))))))\n\n;the line below will freeze\n(doall (partition-all 2 (rdr l)) )\n\n;add-in a take-while statement do exit the lazy sequence on nil\n(doall (partition-all 2 (take-while (complement nil?) (rdr l))))", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "rbuchmann", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/611792?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/ee33873c26c4a6b7e1daa3ebb777d58c?r=PG&default=identicon", :account-source "clojuredocs", :login "gerritjvv"}, :_id "542692d4c026201cdc32702a"} {:updated-at 1561100812644, :created-at 1561100482422, :author {:login "ningDr", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/38251752?v=4"}, :body ";; When the step parameter is provided, the starting index value of the first item in the \n;; next group steps relative to the current index value\n;; 提供step参数时,下一个分组的第一项的起始索引值相对于当前索引值的步进(+ pre-index step)\n(println (partition-all 2 3 '(0 1 2 3 4 5 6 7 8 9)))\n;; => ((0 1) (3 4) (6 7) (9))\n(println (partition-all 4 3 '(0 1 2 3 4 5 6 7 8 9)))\n;; => ((0 1 2 3) (3 4 5 6) (6 7 8 9) (9))\n;; When n is equal to step, it is equivalent to no step parameter\n;; 当n与step相等,相当于无step参数\n(println (partition-all 3 3 '(0 1 2 3 4 5 6 7 8 9)))\n;; => ((0 1 2) (3 4 5) (6 7 8) (9))", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/38251752?v=4", :account-source "github", :login "ningDr"}], :_id "5d0c80c2e4b0ca44402ef75b"}], :notes nil, :arglists ["n" "n coll" "n step coll"], :doc "Returns a lazy sequence of lists like partition, but may include\n partitions with fewer than n items at the end. Returns a stateful\n transducer when no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/partition-all"} {:added "1.2", :ns "clojure.core", :name "partition-by", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1313710412000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "partition", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ee1"} {:created-at 1313710420000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "partition-all", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ee2"} {:created-at 1331014947000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "group-by", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ee3"} {:created-at 1496446489487, :author {:login "stellingsimon", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/7038847?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "dedupe", :ns "clojure.core"}, :_id "5931f619e4b06e730307db21"} {:created-at 1553712274503, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "sort", :ns "clojure.core"}, :_id "5c9bc492e4b0ca44402ef6ea"} {:created-at 1659193765852, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "split-with", :ns "clojure.core"}, :_id "62e549a5e4b0b1e3652d7634"}], :line 7160, :examples [{:author {:login "wilkes", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/20a7eb5b792999d37386ddf622543c71?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (partition-by #(= 3 %) [1 2 3 4 5])\n((1 2) (3) (4 5))", :created-at 1279936678000, :updated-at 1332949621000, :_id "542692c7c026201cdc3269da"} {:author {:login "wilkes", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/20a7eb5b792999d37386ddf622543c71?r=PG&default=identicon"}, :editors [{:login "wilkes", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/20a7eb5b792999d37386ddf622543c71?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (partition-by odd? [1 1 1 2 2 3 3])\n((1 1 1) (2 2) (3 3))\n\nuser=> (partition-by even? [1 1 1 2 2 3 3])\n((1 1 1) (2 2) (3 3))\n", :created-at 1279936736000, :updated-at 1285497469000, :_id "542692c7c026201cdc3269dc"} {:updated-at 1597775773722, :created-at 1318525613000, :body ";; (this is part of a solution from 4clojure.com/problem 30)\nuser=> (partition-by identity \"Leeeeeerrroyyy\")\n((\\L) (\\e \\e \\e \\e \\e \\e) (\\r \\r \\r) (\\o) (\\y \\y \\y))", :editors [{:avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon", :account-source "clojuredocs", :login "belun"} {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "rfemygdio", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/26044589?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon", :account-source "clojuredocs", :login "belun"}, :_id "542692d4c026201cdc32702b"} {:editors [{:login "smnplk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/380618?v=3"}], :updated-at 1466670505123, :created-at 1412082807145, :author {:avatar-url "https://avatars.githubusercontent.com/u/1698238?v=2", :account-source "github", :login "martinhynar"}, :body ";; Note that previously created 'bins' are not used when same value is seen again\nuser=> (partition-by identity \"ABBA\")\n((\\A) (\\B \\B) (\\A))\n\n;; That is why you use group-by function if you want all the the same values in the same 'bins' :) \n;; Which gives you a hash, but you can extract values from that if you need.\n\n(group-by identity \"ABBA\")\n=> {\\A [\\A \\A], \\B [\\B \\B]}", :_id "542aac77e4b0df9bb778a599"} {:body ";; Arbitrary partitioning\n(let [seen (atom true)]\n (partition-by #(cond\n (#{1} %) (reset! seen (not @seen))\n (or (and (string? %)\n (< (count %) 2))\n (char? %)) \"letter\"\n (string? %) \"string\"\n (#{0} %) 0\n (vector? %) (count %)\n :else \"rest\")\n [1 1 1 2 3 nil \"a\" \\l 0 4 5 {:a 1} \"bc\" \"aa\" \"k\" [0] [1 1] [2 2]]))\n;;=> ((1) (1) (1) (2 3 nil) (\"a\" \\l) (0) (4 5 {:a 1}) (\"bc\" \"aa\") (\"k\") ([0]) ([1 1] [2 2]))", :author {:login "vede1", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8151095?v=2"}, :created-at 1414773403982, :updated-at 1415348351870, :editors [{:login "vede1", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8151095?v=2"}], :_id "5453ba9be4b0dc573b892fb5"} {:updated-at 1458482052841, :created-at 1458482052841, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body "user=> (partition-by count [\"a\" \"b\" \"ab\" \"ac\" \"c\"])\n\n;;=> ((\"a\" \"b\") (\"ab\" \"ac\") (\"c\"))", :_id "56eeab84e4b0b41f39d96cea"} {:updated-at 1557411490030, :created-at 1557411490030, :author {:login "artemiy312", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/13870342?v=4"}, :body "user=> (partition-by identity [1 1 1 1 2 2 3])\n;;=> ((1 1 1 1) (2 2) (3))\n", :_id "5cd436a2e4b0ca44402ef71e"} {:editors [{:login "johanatan", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/583903?v=4"}], :body "I think this is a better (more agnostic & more declarative/functional)\narbitrary partitioning. The ratio of true:false can be tweaked for longer\naverage sequence length.\n\n(defn arbitrarily-partition [coll]\n (let [signals (take (count coll) (cycle [true false]))\n shuffled (shuffle signals)\n zipped (map vector shuffled coll)\n partitioned (partition-by first zipped)]\n (for [c partitioned]\n (map second c))))\n\n;;=> (arbitrarily-partition (range 100))\n((0 1) (2) (3) (4 5) (6 7) (8 9 10) (11) (12) (13 14 15) (16) (17 18) (19) (20) (21) (22 23 24 25 26) (27 28) (29) (30 31) (32) (33 34 35 36 37 38) (39 40 41) (42) (43 44 45 46 47) (48 49) (50) (51 52 53) (54) (55 56) (57 58) (59 60 61) (62) (63) (64) (65 66) (67 68) (69) (70) (71) (72 73 74 75) (76) (77 78) (79) (80) (81 82) (83 84 85) (86) (87 88) (89 90 91 92 93) (94) (95 96 97) (98) (99))", :author {:avatar-url "https://avatars3.githubusercontent.com/u/583903?v=4", :account-source "github", :login "johanatan"}, :created-at 1597704699181, :updated-at 1597724481351, :_id "5f3b09fbe4b0b1e3652d737a"}], :notes [{:updated-at 1338786617000, :body "It's worth mentioning that `(partition-by identity …)` is equivalent to the `Data.List.group` function in Haskell:\r\n\r\n
     \r\n(defn group [coll]\r\n  (partition-by identity coll))\r\n
    \r\n\r\nWhich proves to be an interesting idiom:\r\n\r\n
    user=> (apply str \r\n         (for [ch (group \"fffffffuuuuuuuuuuuu\")] \r\n           (str (first ch) (count ch))))\r\n⇒ \"f7u12\"\r\n
    ", :created-at 1338782914000, :author {:login "Iceland_jack", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c889e0a95a3bb07f90ab28ad442f1127?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fe1"} {:author {:login "rauhs", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/11081351?v=3"}, :updated-at 1511875643591, :created-at 1511875643591, :body "Many other programming languages like Kotlin or Haskell define `partition` slightly different. They partition the given collection into two collections, the first containing all truthy values and the second elements all falsy elements. This function does it:\n\n```\n(defn partition-2\n \"Partitions the collection into exactly two [[all-truthy] [all-falsy]]\n collection.\"\n [pred coll]\n (mapv persistent!\n (reduce\n (fn [[t f] x]\n (if (pred x)\n [(conj! t x) f]\n [t (conj! f x)]))\n [(transient []) (transient [])]\n coll)))\n(partition-2 odd? (range 5))\n\n```", :_id "5a1d643be4b0a08026c48cc3"} {:author {:login "jcburley", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/430319?v=4"}, :updated-at 1516207930627, :created-at 1516207930627, :body "I tried this implementation of your Kotlin/Haskell `partition`, which is simpler but somewhat slower (less than 2x):\n\n```\n(defn partition-3\n \"Partitions the collection into exactly two [[all-truthy] [all-falsy]]\n collection.\"\n [pred coll]\n (let [m (group-by pred coll)]\n [(m true) (m false)]))\n```", :_id "5a5f7f3ae4b0a08026c48cf9"} {:body "A third implementation which in my limited testing in cljs is the fastest so far:\n```\n(defn split-by\n \"Effectively though non-lazily splits the `coll`ection using `pred`,\n essentially like `[(filter coll pred) (remove coll pred)]`\"\n [pred coll]\n (let [match (transient [])\n no-match (transient [])]\n (doseq [v coll]\n (if (pred v)\n (conj! match v)\n (conj! no-match v)))\n [(persistent! match) (persistent! no-match)]))\n```\n\nUsing `simple-benchmark` in cljs, these are the results:\n```\n[r (range 1000)], (partition-2 odd? r), 1000 runs, 167 msecs\n[r (range 1000)], (partition-3 odd? r), 1000 runs, 364 msecs\n[r (range 1000)], (split-by odd? r), 1000 runs, 60 msecs\n```\n\nIt's worth noting that all implementations of the java-esque `partition` in this thread are non-lazy.\n\nOn big collections where you don't want to realize the whole list, this is the fastest:\n```\n[(filter odd? r) (filter (complement odd?) r)]\n```\n\nCan also be written as:\n\n```\n((juxt filter remove) odd? r)\n```\n\n(taken from: http://blog.jayfields.com/2011/08/clojure-partition-by-split-with-group.html)", :created-at 1576139342503, :updated-at 1576139618518, :author {:avatar-url "https://avatars0.githubusercontent.com/u/2477927?v=4", :account-source "github", :login "Saikyun"}, :_id "5df1fa4ee4b0ca44402ef7f6"} {:author {:login "zackteo", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/7510179?v=4"}, :updated-at 1620302811324, :created-at 1620302811324, :body "Perhaps this will be of help someone trying to find the regions denoted by partitions\n```\n(defn partition-at\n \"Like partition-by but will start a new run when f returns true\"\n [f coll]\n (lazy-seq\n (when-let [s (seq coll)]\n (let [run (cons (first s) (take-while #(not (f %)) (rest s)))]\n (cons run (partition-at f (drop (count run) s)))))))\n```\n(taken from: http://cninja.blogspot.com/2011/02/clojure-partition-at.html#comments)", :_id "6093dbdbe4b0b1e3652d74f4"}], :arglists ["f" "f coll"], :doc "Applies f to each value in coll, splitting it each time f returns a\n new value. Returns a lazy seq of partitions. Returns a stateful\n transducer when no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/partition-by"} {:added "1.2", :ns "clojure.core", :name "numerator", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1314000040000, :author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "denominator", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c62"}], :line 3582, :examples [{:updated-at 1596571068249, :created-at 1313999955000, :body ";; note that the function always returns the numerator of the reduced fraction\n\n(numerator (/ 2 3))\n;;=> 2\n\nuser=> (map numerator [(/ 2 4) (/ 4 6) (/ 6 8)])\n(1 2 3)\n", :editors [{:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon", :account-source "clojuredocs", :login "shockbob"}, :_id "542692cbc026201cdc326be1"}], :notes nil, :tag "java.math.BigInteger", :arglists ["r"], :doc "Returns the numerator part of a Ratio.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/numerator"} {:added "1.2", :ns "clojure.core", :name "object-array", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 5325, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; create an array of Java Objects using object-array\n;; and demonstrate that it can be used with the Java fill function\n\nuser=> (def os (object-array [nil 23.2 \"abc\" 33]))\n#'user/os\nuser=> (vec os)\n[nil 23.2 \"abc\" 33]\nuser=> (java.util.Arrays/fill os 31415)\nnil\nuser=> (vec os)\n[31415 31415 31415 31415]\nuser=>", :created-at 1313961890000, :updated-at 1313961890000, :_id "542692c6c026201cdc3268d2"}], :notes nil, :arglists ["size-or-seq"], :doc "Creates an array of objects", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/object-array"} {:added "1.0", :ns "clojure.core", :name "with-out-str", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1398723561000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-in-str", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e63"}], :line 4716, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3", :account-source "github", :login "bkovitz"}], :body ";; Instead of printing, the following will place the output normally\n;; sent to stdout into a string.\n\nuser=> (with-out-str (println \"this should return as a string\"))\n\"this should return as a string\\n\"\n", :created-at 1280928491000, :updated-at 1461945233822, :_id "542692c8c026201cdc326a43"} {:editors [{:login "viebel", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/955710?v=3"} {:login "bkovitz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3"}], :body ";; `time` prints the elapsed time. `with-out-str` can put it into a variable.\n\n(def elapsed\n (with-out-str\n (time (last (range 10000)))))\n\nelapsed\n;=> \"\\\"Elapsed time: 49.363055 msecs\\\"\\n\"\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/955710?v=3", :account-source "github", :login "viebel"}, :created-at 1458892903287, :updated-at 1461945165867, :_id "56f4f067e4b07ac9eeceed16"} {:updated-at 1493591261548, :created-at 1493591261548, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/8271291?v=3"}, :body "(defmacro with-out-str-data-map\n [& body]\n `(let [s# (new java.io.StringWriter)]\n (binding [*out* s#]\n (let [r# ~@body]\n {:result r#\n :str (str s#)}))))\n\n(with-out-str-data-map (do\n (println \"Clojure is the best!\")\n 2))\n\n;;=> {:str \"Clojure is the best!\\n\", :result 2}", :_id "590664dde4b01f4add58fe9f"} {:updated-at 1504610437254, :created-at 1504610437254, :author {:login "yogsototh", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/93899?v=4"}, :body "(defn pp-str [x]\n (with-out-str (clojure.pprint/pprint x))\n\n\n(pp-str {:foo \"foo\" :bar \"bar\"})\n;;=> \"{:foo \\\"foo\\\", :bar \\\"bar\\\"}\\n\"\n", :_id "59ae8885e4b09f63b945ac5f"}], :macro true, :notes nil, :arglists ["& body"], :doc "Evaluates exprs in a context in which *out* is bound to a fresh\n StringWriter. Returns the string created by any nested printing\n calls.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/with-out-str"} {:added "1.0", :ns "clojure.core", :name "condp", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1289183336000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "cond", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b46"} {:created-at 1334294023000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "if", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b47"} {:created-at 1470961020992, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "case", :ns "clojure.core"}, :_id "57ad157ce4b0bafd3e2a04e5"}], :line 6359, :examples [{:author {:login "jneira", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2c8ecc24181d171df85a26458b9cd5f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:login "kimtg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7685905?v=3"}], :body ";; Taken from the excellent clojure tutorial:\n;; http://java.ociweb.com/mark/clojure/article.html\n\n(print \"Enter a number: \")\n(flush) ; stays in a buffer otherwise\n(let [line (read-line)\n value (try\n (Integer/parseInt line)\n (catch NumberFormatException e line))] ; use string val if not int\n (println\n (condp = value\n 1 \"one\"\n 2 \"two\"\n 3 \"three\"\n (str \"unexpected value, \\\"\" value \\\")))\n (println\n (condp instance? value\n Number (* value 2)\n String (* (count value) 2))))\n", :created-at 1278989834000, :updated-at 1425998195013, :_id "542692cbc026201cdc326be2"} {:updated-at 1494204573950, :created-at 1279027225000, :body ";; (some #{4 5 9} [1 2 3 4]) \n;; is the first matching clause, \n;; the match value is 4 which is decremented\n(condp some [1 2 3 4]\n #{0 6 7} :>> inc\n #{4 5 9} :>> dec\n #{1 2 3} :>> #(+ % 3))\n;;=> 3", :editors [{:avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon", :account-source "clojuredocs", :login "kotarak"} {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "adamdavislee", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/8780347?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon", :account-source "clojuredocs", :login "kotarak"}, :_id "542692cbc026201cdc326be4"} {:author {:login "kotarak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon"}, :editors [{:login "kotarak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; in this case there is no matching clause\n;; so an exception is raised.\n(condp some [1 2 3 4]\n #{0 6 7} :>> inc\n #{5 9} :>> dec)\n\n;; java.lang.IllegalArgumentException: No matching clause: [1 2 3 4]", :created-at 1279027251000, :updated-at 1421191702604, :_id "542692cbc026201cdc326be7"} {:author {:login "kotarak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; a composite predicate which parses a string with \"re-seq\" \n;; producing a list which is made into a \"seq\".\n(condp (comp seq re-seq) \"foo=bar\"\n #\"[+](\\w+)\" :>> #(vector (-> % first (nth 1) keyword) true)\n #\"[-](\\w+)\" :>> #(vector (-> % first (nth 1) keyword) false)\n #\"(\\w+)=(\\S+)\" :>> #(let [x (first %)]\n [(keyword (nth x 1)) (nth x 2)]))\n;;=> [:foo \"bar\"]", :created-at 1279027512000, :updated-at 1421192246892, :_id "542692cbc026201cdc326bea"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; See examples for \"if\" explaining Clojure's idea of logical true\n;; and logical false.", :created-at 1334294027000, :updated-at 1334294027000, :_id "542692d2c026201cdc326f69"} {:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [], :body ";;this is with liberator\n;;branching on request method\n(defresource my-resource\n :exists? (fn [{:keys [db] {query-params :query-params \n body :body \n method :request-method} \n :request}]\n \n (condp = method\n :get (my-get-exists-fn)\n :post (my-post-exists-fn))))", :created-at 1367366404000, :updated-at 1367366404000, :_id "542692d2c026201cdc326f6a"} {:author {:login "leesper", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f150e0f851c74d1b9c001b901b29a287?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; a recursive function to calculate length\n;; same as 'count'\n(defn length [lst]\n (condp = lst\n (list) 0 ; if empty list result 0\n (+ 1 (length (rest lst))))) ; default expression\n\n(length '(1 2 3))\n;;=> 3", :created-at 1375971960000, :updated-at 1421192464881, :_id "542692d2c026201cdc326f6b"} {:updated-at 1598097023549, :created-at 1402793361000, :body ";; test arguments against various binary predicates\n(condp apply [2 3]\n = \"eq\"\n < \"lt\"\n > \"gt\")\n;;=> \"lt\"\n\n;; test argument against various unary predicates\n(condp apply [:foo]\n string? \"it's a string\"\n keyword? \"it's a keyword\"\n symbol? \"it's a symbol\"\n fn? \"it's a function\"\n \"something else!\")\n;;=> \"it's a keyword\"", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:avatar-url "https://avatars.githubusercontent.com/u/1195619?v=3", :account-source "github", :login "jeffi"} {:login "titogarcia", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/699549?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/f2fad9c9c81cfdf191f10265371f1d72?r=PG&default=identicon", :account-source "clojuredocs", :login "vee"}, :_id "542692d2c026201cdc326f6c"} {:body "; This function is part of a great solution to the \"fizzbuzz\" interview question.\n; Let's review \n; Players take turns to count incrementally, \n; replacing any number divisible by three with the word \"fizz\", \n; any number divisible by five with the word \"buzz\", and \n; any number divisible by both three and five with the word \"fizzbuzz\".\n(defn fizz-buzz [n]\n (condp #(zero? (mod %2 %1)) n\n 15 \"fizzbuzz\"\n 3 \"fizz\"\n 5 \"buzz\"\n n))\n\n(into [] (map fizz-buzz) (range 1 20))\n;;=> [1 2 \"fizz\" 4 \"buzz\" \"fizz\" 7 8 \"fizz\" \"buzz\" \n;; 11 \"fizz\" 13 14 \"fizzbuzz\" 16 17 \"fizz\" 19]", :author {:login "dfletcher", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/189317?v=3"}, :created-at 1433388096371, :updated-at 1510263672104, :editors [{:login "dfletcher", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/189317?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/200617?v=3", :account-source "github", :login "bsima"} {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :_id "556fc440e4b03e2132e7d185"} {:updated-at 1506692074248, :created-at 1506692074248, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :body ";; Test a string against multiple regexps, and do something different\n;; with the match each time. \n(condp re-matches \"17->42\"\n #\"(\\w+)->(\\w+)\" :>> (fn [[_ p1 p2]]\n {:start p1 :end p2})\n\n #\"(\\w+)->$\" :>> (fn [[_ p1]]\n {:start p1})\n\n #\"\\w+\" :>> (fn [[p]]\n {:fixed p})\n\n nil)\n; => {:start \"17\" :end \"42\"}", :_id "59ce4beae4b03026fe14ea4d"} {:updated-at 1534346599711, :created-at 1534346599711, :author {:login "ernstroux", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/20518350?v=4"}, :body ";if you are using the function literal already and can't nest\n\n(#(condp (fn [clause expr] (clojure.string/includes? expr clause)) \"transaction-result-kafka\"\n \"transaction-result\" 1\n \"transaction-failure\" 4\n (do\n (str \"got message with nil topic\")\n nil)))\n;=> 1", :_id "5b744567e4b00ac801ed9e5b"} {:editors [{:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}], :body ";; We can use symbols in the test-expression; this isn't possible with 'case'\n(defn id-resolver\n [id]\n (let [id-a \"a\"\n id-b \"b\"\n\t id-c \"c\"]\n (condp = id\n\t id-a {:response-a \"id-a\"}\n\t id-b {:response-b \"id-b\"}\n\t id-c {:response-c \"id-c\"})))\n\n(id-resolver \"a\")\n;; => {:response-a \"id-a\"}", :author {:avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4", :account-source "github", :login "berczeck"}, :created-at 1598155978713, :updated-at 1598156087855, :_id "5f41eccae4b0b1e3652d738d"} {:editors [{:login "Rovanion", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/632775?v=4"}], :body ";; Want to apply multiple predicates to the same expr? \n;; Not saying you should, but here is how you could.\n\n(def events [{:timestamp \"2021-01-01\" :source nil :destination 1 :litres 1 :price-per-litres 1}\n {:timestamp \"2021-01-02\" :source 1 :destination 2 :litres 0.5 :price-per-litres nil}\n {:timestamp \"2021-01-02\" :source nil :destination 1 :litres 1 :price-per-litres 2}\n {:timestamp \"2021-01-02\" :source 2 :destination nil :litres 0.25 :price-per-litres nil}])\n\n(map (fn [event]\n (condp (fn [preds e] ((apply every-pred preds) e)) event\n [:price-per-litres :destination] :insert\n [:source :destination] :transfer\n [:source (complement :destination)] :withdrawal))\n events)\n;; => (:insert :transfer :insert :withdrawal)\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/632775?v=4", :account-source "github", :login "Rovanion"}, :created-at 1655813285477, :updated-at 1655813318085, :_id "62b1b4a5e4b0b1e3652d760c"}], :macro true, :notes [{:author {:login "bsima", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/200617?v=3"}, :updated-at 1470339463090, :created-at 1470339463090, :body "A lot of these examples show the pattern:\n\n```\n(condp = value\n :a \"a\"\n :b \"b\"\n ...)\n```\n\nWhich is the same as:\n\n```\n(case value\n :a \"a\"\n :b \"b\"\n ...)\n```", :_id "57a39987e4b0bafd3e2a04c7"}], :arglists ["pred expr & clauses"], :doc "Takes a binary predicate, an expression, and a set of clauses.\n Each clause can take the form of either:\n\n test-expr result-expr\n\n test-expr :>> result-fn\n\n Note :>> is an ordinary keyword.\n\n For each clause, (pred test-expr expr) is evaluated. If it returns\n logical true, the clause is a match. If a binary clause matches, the\n result-expr is returned, if a ternary clause matches, its result-fn,\n which must be a unary function, is called with the result of the\n predicate as its argument, the result of that call being the return\n value of condp. A single default expression can follow the clauses,\n and its value will be returned if no clause matches. If no default\n expression is provided and no clause matches, an\n IllegalArgumentException is thrown.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/condp"} {:added "1.0", :ns "clojure.core", :name "derive", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1308310489000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "parents", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c78"} {:created-at 1308310496000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ancestors", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c79"} {:created-at 1308310502000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "descendants", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c7a"} {:created-at 1308310508000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "isa?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c7b"} {:created-at 1332885397000, :author {:login "luskwater", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f3b2650c3d4aa47c9e22bf9ba5596a9f?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "make-hierarchy", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c7c"} {:created-at 1341101591000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "underive", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c7d"}], :line 5626, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [], :body ";; derive let you build a hierarchy but parents/ancestors/descendants and isa? let you query the hierarchy\n(derive ::rect ::shape)\n(derive ::square ::rect)\n", :created-at 1308310469000, :updated-at 1308310469000, :_id "542692c7c026201cdc3269d0"} {:author {:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"}, :editors [], :body "user=> (derive ::Cat ::Feline)\nnil\n\nuser=> (derive ::Lion ::Feline)\nnil\n\nuser=> (isa? ::Lion ::Feline)\ntrue\n\nuser=> (isa? ::Tuna ::Feline)\nfalse", :created-at 1313009794000, :updated-at 1313009794000, :_id "542692c7c026201cdc3269d1"} {:updated-at 1503164433228, :created-at 1503164433228, :author {:login "mhmdsalem1993", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10787314?v=4"}, :body "(derive java.util.Map ::collection)\n(derive java.util.Collection ::collection)\n\n(isa? java.util.HashMap ::collection)\n-> true", :_id "59987811e4b09f63b945ac51"} {:editors [{:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}], :body ";; (derive) can be handy in multimethods that switch on field values:\n\n(def data [{:record/type :types/integer :record/number 123}\n {:record/type :types/float :record/number 123.45}\n {:record/type :types/text :record/text \"hello\"}])\n\n(derive :types/float ::number)\n(derive :types/integer ::number)\n(derive :types/text ::text)\n\n(defmulti record-str :record/type)\n\n(defmethod record-str ::number [r] (str \"Number: \" (:record/number r)))\n(defmethod record-str ::text [r] (str \"Text: \" (:record/text r)))\n\n(map record-str data)\n;; => (\"Number: 123\" \"Number: 123.45\" \"Text: hello\")\n", :author {:avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4", :account-source "github", :login "timgilbert"}, :created-at 1551112001815, :updated-at 1551112172422, :_id "5c741741e4b0ca44402ef6a3"}], :notes nil, :arglists ["tag parent" "h tag parent"], :doc "Establishes a parent/child relationship between parent and\n tag. Parent must be a namespace-qualified symbol or keyword and\n child can be either a namespace-qualified symbol or keyword or a\n class. h must be a hierarchy obtained from make-hierarchy, if not\n supplied defaults to, and modifies, the global hierarchy.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/derive"} {:added "1.0", :ns "clojure.core", :name "load-string", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1334883949000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "read-string", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f04"} {:created-at 1519290621337, :author {:login "witek", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/209520?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "load-file", :ns "clojure.core"}, :_id "5a8e88fde4b0316c0f44f8e7"} {:created-at 1519290634633, :author {:login "witek", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/209520?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "load", :ns "clojure.core"}, :_id "5a8e890ae4b0316c0f44f8e8"}], :line 4089, :examples [{:body "(load-string \"(def x 1)\")\n;; => #'user/x\nx\n;; => 1", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423012385897, :updated-at 1423012385897, :_id "54d17221e4b0e2ac61831d00"} {:updated-at 1522768122029, :created-at 1522768122029, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :body ";; Don’t use this function on untrusted input; it can have unpleasant\n;; side-effects.\n(load-string \"(clojure.java.io/delete-file \\\"my-important-file\\\")\")\n;; => true", :_id "5ac398fae4b045c27b7fac35"} {:updated-at 1546454837037, :created-at 1546454837037, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Differently from the equivalent \"(eval (read-string x))\", \"load-string\" keeps\n;; track of line numbers:\n\n(def s \"\\n\\n\\n(def c :line4)\")\n(:line (meta (load-string s)))\n;; 4\n(:line (meta (eval (read-string s))))\n;; 1", :_id "5c2d0735e4b0ca44402ef60c"}], :notes nil, :arglists ["s"], :doc "Sequentially read and evaluate the set of forms contained in the\n string", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/load-string"} {:added "1.0", :ns "clojure.core", :name "special-symbol?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 4968, :examples [{:author {:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"}, :editors [{:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"}], :body "user=> (clojure-version)\n\"1.4.0\"\n;; the set of special symbols for this clojure-version are the following:\nuser=> (keys (. clojure.lang.Compiler specials))\n(deftype* new quote & var set! monitor-enter recur . case* clojure.core/import* reify* do fn* throw monitor-exit letfn* finally let* loop* try catch if def)\n\n;; for example, \"def\" is not a function, not a macro, not even a var, but a special form:\nuser=> (fn? 'def)\nfalse\nuser=> (:macro (meta (find-var 'clojure.core/def)))\nnil\nuser=> (find-var 'clojure.core/def)\nnil\nuser=> (special-symbol? 'def)\ntrue\n\n;; while \"defn\" is not a special form but a macro:\nuser=> (special-symbol? 'defn)\nfalse\nuser=> (:macro (meta (find-var 'clojure.core/defn)))\ntrue\n", :created-at 1353815386000, :updated-at 1353815535000, :_id "542692d5c026201cdc327099"}], :notes nil, :arglists ["s"], :doc "Returns true if s names a special form", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/special-symbol_q"} {:added "1.0", :ns "clojure.core", :name "ancestors", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1341101490000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "parents", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cd2"} {:created-at 1341101493000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "derive", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cd3"} {:created-at 1341101496000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "underive", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cd4"} {:created-at 1341101502000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "descendants", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cd5"} {:created-at 1341101507000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "make-hierarchy", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cd6"} {:created-at 1341101672000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "isa?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cd7"} {:created-at 1374150921000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "supers", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cd8"}], :line 5598, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}], :body ";; make up a hierarchy a beagle is a sporting breed is a dog is a quadraped is an \n;; animal\n\nuser=> (derive ::quadruped ::animal)\nnil\nuser=> (derive ::dog ::quadruped)\nnil\nuser=> (derive ::sporting_breed ::dog)\nnil\nuser=> (derive ::beagle ::sporting_breed)\nnil\nuser=> (ancestors ::beagle)\n#{:user/dog :user/sporting_breed :user/animal :user/quadruped}\nuser=>", :created-at 1313896987000, :updated-at 1313968195000, :_id "542692cdc026201cdc326d1b"} {:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; use ancestors to show which classes ArrayList derives from and which\n;; interfaces it implements\n\nuser=> (ancestors java.util.ArrayList)\n#{java.util.Collection java.util.AbstractList java.io.Serializable java.lang.Cloneable java.util.List java.lang.Object java.util.AbstractCollection java.util.RandomAccess java.lang.Iterable}\nuser=>", :created-at 1313968946000, :updated-at 1313968946000, :_id "542692cdc026201cdc326d1d"} {:updated-at 1598158917882, :created-at 1598158880926, :author {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}, :body ";; use ancestors in defrecords to show which defprotocols implements\nuser=> (defprotocol Fly\n (fly [this]))\n\nuser=> (defrecord Bird [name] Fly\n (fly [this] (str (:name this) \" flies....\")))\n\nuser=> (ancestors Bird)\n;; #{clojure.lang.IPersistentCollection \n;; user.Fly \n;; clojure.lang.IHashEq clojure.lang.ILookup \n;; java.util.Map java.lang.Iterable \n;; java.io.Serializable \n;; java.lang.Object \n;; clojure.lang.IMeta \n;; clojure.lang.Seqable \n;; clojure.lang.IRecord \n;; clojure.lang.IObj \n;; clojure.lang.Associative \n;; clojure.lang.Counted \n;; clojure.lang.IKeywordLookup \n;; clojure.lang.IPersistentMap}", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4", :account-source "github", :login "berczeck"}], :_id "5f41f820e4b0b1e3652d7398"}], :notes nil, :arglists ["tag" "h tag"], :doc "Returns the immediate and indirect parents of tag, either via a Java type\n inheritance relationship or a relationship established via derive. h\n must be a hierarchy obtained from make-hierarchy, if not supplied\n defaults to the global hierarchy", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ancestors"} {:added "1.0", :ns "clojure.core", :name "subseq", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1330671591000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rsubseq", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e25"} {:created-at 1330671627000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "sorted-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e26"} {:created-at 1330671638000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "sorted-set", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e27"} {:created-at 1330671646000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "sorted-map-by", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e28"} {:created-at 1330671652000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "sorted-set-by", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e29"} {:created-at 1423278345112, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "subvec", :library-url "https://github.com/clojure/clojure"}, :_id "54d58109e4b0e2ac61831d29"}], :line 5109, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Note, that collection passed to subseq must implement Sorted. \n;; Just passing a collection that has been sorted is not enough.\n\nuser=> (subseq [1 2 3 4] > 2)\njava.lang.ClassCastException: clojure.lang.PersistentVector cannot be cast to clojure.lang.Sorted (NO_SOURCE_FILE:0)\n\nuser=> (subseq (sorted-set 1 2 3 4) > 2)\n(3 4)\n", :created-at 1281618432000, :updated-at 1285494695000, :_id "542692cfc026201cdc326e78"} {:body ";; Example of getting a subsequence of hashmaps sorted by key :a and\n;; secondarily :b.\n\n(defn compare-ab [x y]\n (compare [(get x :a) (get x :b)]\n [(get y :a) (get y :b)]))\n \n(def ss-ab (apply sorted-set-by compare-ab\n [{:a 42 :b 5000}\n {:a 1 :b 2}\n {:a 99 :b -1000}\n {:a -1 :b 7}]))\nuser=> ss-ab\n#{{:a -1, :b 7} {:a 1, :b 2} {:a 42, :b 5000} {:a 99, :b -1000}}\n\n;; Select all maps whose key :a is greater than 5. \nuser=> (subseq ss-ab > {:a 5})\n({:a 42, :b 5000} {:a 99, :b -1000})\n\n\n", :author {:login "thirdreplicator", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/90335?v=2"}, :created-at 1413610885024, :updated-at 1413610885024, :_id "5441fd85e4b049fc676849cd"} {:updated-at 1463327979493, :created-at 1463327979493, :author {:login "TradeIdeasPhilip", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/18409827?v=3"}, :body ";; If you use the 6 input form of this function, start-test should be > or\n;; >= and the end-test should be < or <=. The other forms don't give you\n;; an error, but don't give you what you expect, either. This is all based\n;; on experimentation. I don't see this documented.\n\n;; This suggests that there are no items in my set between 9 and 2.\nuser=> (subseq (sorted-set 1 2 3 4 5 6 7 8 9 0) < 9 > 2)\n;; => ()\n\n;; This correctly lists all items in my set between 2 and 9.\nuser=> (subseq (sorted-set 1 2 3 4 5 6 7 8 9 0) > 2 < 9)\n;; => (3 4 5 6 7 8)\n\n;; Again, this is not just the \"and\" of the two conditions. Lots of items\n;; in my set are #(and (% > 2) (% > 6)) but this returns nothing. \"> 2\"\n;; means skip to the first item that is #(% > 2). So we jump directly to 3.\n;; \"> 6\" means to stop looking as soon as we find an item where #(% > 6) is\n;; false. 3 <= 6, so we get the empty sequence.\nuser=> (subseq (sorted-set 1 2 3 4 5 6 7 8 9 0) > 2 > 6)\n;; => ()\n\n;; This works as expected, returning everything where #(and (% >= 2) (% <= 4)).\n;; That is to say it returns everything between 2 and 4, inclusive.\nuser=> (subseq (sorted-set 1 2 3 4 5 6 7 8 9 0) >= 2 <= 4)\n;; => (2 3 4)\n\n;; Naïvely you might expect this to give you the same results as the previous\n;; statement. Clearly the result is not the same. I'm not sure what's going\n;; on under the hood here. It's jumping directly to 4 as if I'd said \">= 4\"\n;; rather than \"<= 4\". (Looks like a bug in Clojure to me!) Then it\n;; continued to the end because all of the remaining items were #(% >= 2).\nuser=> (subseq (sorted-set 1 2 3 4 5 6 7 8 9 0) <= 4 >= 2)\n;; => (4 5 6 7 8 9)\nuser=> *clojure-version*\n;; => {:major 1, :minor 8, :incremental 0, :qualifier nil}\n\n;; This one at least makes sense. It jumps directly to the first item that\n;; satisfies the first test and continues until the second item is false.\nuser=> (subseq (sorted-set 1 2 3 4 5 6 7 8 9 0) >= 4 >= 2)\n;; => (4 5 6 7 8 9)\n", :_id "57389cebe4b071da7d6cfd0a"} {:updated-at 1522434900617, :created-at 1522434900617, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Autocomplete using local Unix dictionary.\n(require '[clojure.string :refer [split]])\n\n(def dict\n (into (sorted-set)\n (split (slurp \"/usr/share/dict/words\") #\"\\s+\")))\n\n;; The vector contains a few simulated keystrokes.\n(map #(take 4 (subseq dict >= %)) [\"c\" \"cl\" \"clo\" \"clos\" \"closu\"])\n;; ((\"c\" \"ca\" \"caam\" \"caama\")\n;; (\"clabber\" \"clabbery\" \"clachan\" \"clack\")\n;; (\"cloaca\" \"cloacal\" \"cloacaline\" \"cloacean\")\n;; (\"closable\" \"close\" \"closecross\" \"closed\")\n;; (\"closure\" \"clot\" \"clotbur\" \"clote\"))", :_id "5abe8354e4b045c27b7fac2a"}], :notes nil, :arglists ["sc test key" "sc start-test start-key end-test end-key"], :doc "sc must be a sorted collection, test(s) one of <, <=, > or\n >=. Returns a seq of those entries with keys ek for\n which (test (.. sc comparator (compare ek key)) 0) is true", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/subseq"} {:added "1.2", :ns "clojure.core", :name "error-handler", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1443938208744, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "set-error-handler!", :ns "clojure.core"}, :_id "5610bfa0e4b0686557fcbd54"} {:created-at 1443938218045, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "agent", :ns "clojure.core"}, :_id "5610bfaae4b08e404b6c1ca5"}], :line 2204, :examples [{:editors [{:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}], :body "(def error-atom (atom []))\n\n(def a (agent \"\"\n :validator string?\n :error-handler (fn [agnt ex]\n (swap! error-atom\n conj\n {:agent agnt\n :exception (.getMessage ex)}))))\n\n(send a 1) ;; will fail validation\n\n@error-atom\n[{:agent #,\n :exception \"java.lang.Long cannot be cast to clojure.lang.IFn\"}]\n\n(error-handler a)\n#", :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :created-at 1443938199376, :updated-at 1443938238017, :_id "5610bf97e4b0686557fcbd53"}], :notes nil, :arglists ["a"], :doc "Returns the error-handler of agent a, or nil if there is none.\n See set-error-handler!", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/error-handler"} {:added "1.0", :ns "clojure.core", :name "gensym", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 604, :examples [{:updated-at 1285495689000, :created-at 1280776789000, :body "user=> (gensym \"foo\")\nfoo2020\n\nuser=> (gensym \"foo\")\nfoo2027\n\nuser=> (gensym \"foo\")\n;; ...\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692c6c026201cdc32690b"} {:updated-at 1285495715000, :created-at 1280776909000, :body "user=> (gensym)\nG__2034\n\nuser=> (let [my-unique-sym (gensym)]\n my-unique-sym)\nG__2075\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692c6c026201cdc32690d"} {:author {:login "gdavis", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ae253eacd4cab9fb2580b8192351b641?r=PG&default=identicon"}, :editors [], :body ";; syntax-reader uses gensym for non-namespace-qualified symbols ending with '#'\n;; http://clojure.org/reader\n\nuser=> `(name0#) ; gensym, form is useful in defmacro\n(name0__1206__auto__)\n\nuser=> `(user/name1#) ; no gensym, namespace-qualified\n(user/name1#)\n\nuser=> `(:key0#) ; no gensym, keyword\n(:key0#)\n\nuser=> `(::key1#) ; no gensym, keyword\n(:user/key1#)\n", :created-at 1394152357000, :updated-at 1394152357000, :_id "542692d3c026201cdc326fbc"} {:updated-at 1656609206311, :created-at 1656609206311, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; syntax-reader gensyms are only generated once, at read time\n;; so recursive macros get the same generated symbol for all levels of recursion\n\n(defmacro reader-gensym-macro [[x & more :as xs] acc]\n (if (seq xs)\n `(let [x# ~x]\n (reader-gensym-macro ~more (conj ~acc x#)))\n acc))\n\n(reader-gensym-macro [1 2] []) ;; => [2 2]\n\n;; using the function `gensym` can overcome this problem\n;; so recursive macros get a different generated symbol for each level of recursion\n\n(defmacro function-gensym-macro [[x & more :as xs] acc]\n (if (seq xs)\n (let [gx (gensym 'x)]\n `(let [~gx ~x]\n (function-gensym-macro ~more (conj ~acc ~gx))))\n acc))\n\n(function-gensym-macro [1 2] []) ;; => [1 2]", :_id "62bdd9b6e4b0b1e3652d760f"}], :notes [{:updated-at 1383198787000, :body "The
    (. clojure.lang.RT (nextID))
    present gensym's source code (https://github.com/clojure/clojure/blob/clojure-1.5.1/src/jvm/clojure/lang/RT.java#L468) uses java.util.concurrent.atomic.AtomicInteger (and has for the past 6 years, if you trust the Git history).", :created-at 1383198787000, :author {:login "mlb", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/11104d872c2bae6e0e98b7533818530a?r=PG&default=identicon"}, :_id "542692edf6e94c697052200c"}], :arglists ["" "prefix-string"], :doc "Returns a new symbol with a unique name. If a prefix string is\n supplied, the name is prefix# where # is some unique number. If\n prefix is not supplied, the prefix is 'G__'.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/gensym"} {:added "1.0", :ns "clojure.core", :name "cond", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1289183323000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "condp", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ee8"} {:created-at 1290574959000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "case", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ee9"} {:created-at 1302510857000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "if", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eea"} {:created-at 1459890885195, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "cond->", :ns "clojure.core"}, :_id "57042ac5e4b075f5b2c864ce"}], :line 574, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"} {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"} {:login "bhenry", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4bc423f6653d93f9185a5cdc9f5cd84f?r=PG&default=identicon"} {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "(defn pos-neg-or-zero\n \"Determines whether or not n is positive, negative, or zero\"\n [n]\n (cond\n (< n 0) \"negative\"\n (> n 0) \"positive\"\n :else \"zero\"))\n\nuser=> (pos-neg-or-zero 5)\n\"positive\"\nuser=> (pos-neg-or-zero -1)\n\"negative\"\nuser=> (pos-neg-or-zero 0)\n\"zero\"\n", :created-at 1279070736000, :updated-at 1285501471000, :_id "542692c7c026201cdc326966"} {:author {:login "bhenry", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4bc423f6653d93f9185a5cdc9f5cd84f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "TheJoe", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2789ff7d993fbf621e86768b3cce19d4?r=PG&default=identicon"}], :body "user=> (let [grade 85]\n (cond\n (>= grade 90) \"A\"\n (>= grade 80) \"B\"\n (>= grade 70) \"C\"\n (>= grade 60) \"D\"\n :else \"F\"))\n\"B\"", :created-at 1279071870000, :updated-at 1365525514000, :_id "542692c7c026201cdc32696c"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; See examples for \"if\" explaining Clojure's idea of logical true\n;; and logical false.", :created-at 1334293315000, :updated-at 1334293315000, :_id "542692d2c026201cdc326f67"} {:author {:login "Omer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/dae0f434afde5246ccb030cdec81fb71?r=PG&default=identicon"}, :editors [], :body ";; Generates a random number compares it to user input\n(let [rnd (rand-int 10)\n guess (Integer/parseInt (read-line))]\n (cond\n (= rnd guess) (println \"You got my guess right!\")\n :else (println \"Sorry... guess again!\")))", :created-at 1338273335000, :updated-at 1338273335000, :_id "542692d2c026201cdc326f68"} {:updated-at 1459931468351, :created-at 1459931468351, :author {:login "mhmdsalem1993", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10787314?v=3"}, :body ";; Simple Condition Example \n\n(defn test-x [x]\n\t(cond\n\t\t(< x 10) \"less than\"\n\t\t(> x 20) \"greater than\"\n\t)\n)\n\n============test============\n(test-x 9)\n\n=> \"less than\"", :_id "5704c94ce4b0fc95a97eab2c"} {:updated-at 1502632735612, :created-at 1502632735612, :author {:login "RobinNagpal", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/745748?v=4"}, :body "(defn print-cond [xx] \n (cond \n (< xx 6) \"less than 6\"\n (< xx 8) \"less than 8\"\n :else \"Greater than 8\"))\n=> #'aurora.system/print-cond\n(print-cond 5)\n=> \"less than 6\"\n(print-cond 7)\n=> \"less than 8\"\n(print-cond 8)\n=> \"Greater than 8\"\n(print-cond 10)\n=> \"Greater than 8\"\n", :_id "59905b1fe4b0d19c2ce9d716"} {:updated-at 1504194292107, :created-at 1504194292107, :author {:login "chrismurrph", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/10278575?v=4"}, :body ";; If a condition is not matched `nil` will be returned\n(cond\n false \"sumfin\")\n;;=> nil", :_id "59a82ef4e4b09f63b945ac5b"} {:updated-at 1598227713206, :created-at 1598227713206, :author {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}, :body ";; Instead of use the :else keyword as the default path you can use \n;; whatever that gives meaning to the code\n\nuser=> (cond \n :whatever \"You can use any default keyword\")\n;; You can use any default keyword", :_id "5f430501e4b0b1e3652d73a9"} {:updated-at 1613750506091, :created-at 1613750506091, :author {:login "digash", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/30662?v=4"}, :body ";; cond is a macro the easiest way to understand how it works is to macroexpand it\nuser=> (clojure.walk/macroexpand-all\n '(let [n 3] \n (cond\n (odd? n) \"odd\"\n (even? n) \"even\"\n (< n 0) \"negitive\"\n (< 0 n) \"positive\"\n :else \"zero\")))\n\n(let [n 3]\n (if (odd? n)\n \"odd\"\n (if (even? n)\n \"even\"\n (if (< n 0)\n \"negitive\"\n (if (< 0 n)\n \"positive\"\n (if :else\n \"zero\"\n nil))))))", :_id "602fe0eae4b0b1e3652d745e"}], :macro true, :notes [{:updated-at 1288294778000, :body "We should add a comment in the docstring for the final usage of :else.", :created-at 1288294778000, :author {:login "blais", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9142fc3ffa18ebeddbb03fe575199742?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fa0"} {:author {:login "kimtg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7685905?v=3"}, :updated-at 1441172051574, :created-at 1441172051574, :body "`:else` is not special. Any keyword will do.", :_id "55e68a53e4b072d7f27980f9"} {:author {:login "seltzer1717", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1911117?v=3"}, :updated-at 1445308247668, :created-at 1445308247668, :body "Actually any non-nil or true will work. I prefer to use :default. :else implies truthiness in evaluation rather what it really is which is a 'default' value.", :_id "5625a757e4b04b157a6648d7"} {:author {:login "yubrshen", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/2638417?v=3"}, :updated-at 1494713707387, :created-at 1494713707387, :body "It seems the documentation is not accurate. From my experiment, it seems the function decscription should be like the following:\n\nTakes a set of test/expr pairs. It evaluates each test one at a time. \nIf a test returns logical true, cond evaluates the corresponding expr and\ncontinue to evaluate the next test/expr, until a test fails or \nno more pair of test(:else)/expr to evaluate,\nand returns the last evaluation value of the expr \nthat its corresponding test evaluated to truthy.\nIf there is no test evaluated to truthy, \nreturn the evaluation of :else clause.\nIf there is no :else clause return nil.\n\nThe above description can be supported by the following example:\n\n
    \n(defn pos-neg-or-zero\n  \"Determines whether or not n is positive, negative, or zero\"\n  [n]\n  (cond\n    (odd? n) \"odd\"\n    (even? n) \"even\"\n    (< n 0) \"negitive\"\n    (< 0 n) \"positive\"\n    :else \"zero\"))\n\n(odd? 3)                                ; => true\n(pos-neg-or-zero 3)                     ;=> \"positive\"\n(even? 0)                               ; => true\n(pos-neg-or-zero 0)                     ;=> \"zero\"\n(even? 4)                               ; => true\n(pos-neg-or-zero 4)                     ;=> \"positive\"\n\n", :_id "5917856be4b01920063ee05d"} {:author {:login "maruks", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/433989?v=3"}, :updated-at 1499359558730, :created-at 1499359558730, :body "yubrshen,   \n\n(pos-neg-or-zero 3) => \"odd\"", :_id "595e6946e4b06e730307db4f"} {:author {:login "dan-mcdonald", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/8184051?v=4"}, :updated-at 1592425332445, :created-at 1592425332445, :body "`:else` is just a convention. It works because\n\n
    \n=> (boolean :else)\ntrue\n
    \n\nIn fact anything except for `false` and `nil` will evaluate to `true` (see [boolean](https://clojuredocs.org/clojure.core/boolean)).", :_id "5eea7b74e4b0b1e3652d7306"}], :arglists ["& clauses"], :doc "Takes a set of test/expr pairs. It evaluates each test one at a\n time. If a test returns logical true, cond evaluates and returns\n the value of the corresponding expr and doesn't evaluate any of the\n other tests or exprs. (cond) returns nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/cond"} {:added "1.0", :ns "clojure.core", :name "ratio?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 3576, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "(ratio? 22/7)\n;; => true\n\n(ratio? 22)\n;; => false\n\n(ratio? 2.2)\n;; => false\n", :created-at 1279074828000, :updated-at 1423040912016, :_id "542692c9c026201cdc326a96"} {:updated-at 1463237750174, :created-at 1463237750174, :author {:login "TradeIdeasPhilip", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/18409827?v=3"}, :body ";; Both True\nuser=> (ratio? 22/7) \n;; => true\nuser=> (rational? 22/7)\n;; => true\n\n;; Different\nuser=> (ratio? 22)\n;; => false\nuser=> (rational? 22)\n;; => true\n\n;; Both False\nuser=> (ratio? 0.5)\n;; => false\nuser=> (rational? 0.5)\n;; => false", :_id "57373c76e4b05449374f52ee"}], :notes nil, :arglists ["n"], :doc "Returns true if n is a Ratio", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ratio_q"} {:added "1.0", :ns "clojure.core", :name "delay?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1325375628000, :author {:login "moumar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8fae5b9c9ffd332a24ff71a339fa6310?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "delay", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ca7"}], :line 755, :examples [{:author {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}, :editors [{:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}], :body "user=> (def v (delay (do (println \"start sleeping\") \n (Thread/sleep 1000) \n 10)))\n#'user/v\nuser=> (delay? v)\ntrue\nuser=> (force v)\nstart sleeping\n10\nuser=> (delay? v)\ntrue\nuser=> (force v)\n10\nuser=> ", :created-at 1308628940000, :updated-at 1308629066000, :_id "542692cec026201cdc326dc1"}], :notes nil, :arglists ["x"], :doc "returns true if x is a Delay created with delay", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/delay_q"} {:added "1.0", :ns "clojure.core", :name "intern", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1360641943000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "alter-var-root", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b72"} {:created-at 1484214992310, :author {:login "rauhs", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/11081351?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ns-unmap", :ns "clojure.core"}, :_id "587752d0e4b09108c8545a56"} {:created-at 1649576842844, :author {:login "jungwookim", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/50188177?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "create-ns", :ns "clojure.core"}, :_id "62528b8ae4b0b1e3652d75cf"}], :line 6317, :examples [{:author {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}], :body "user=> (intern 'user 'x \"Foobar\")\n#'user/x\n\nuser=> x\n\"Foobar\"\n", :created-at 1283820694000, :updated-at 1287791800000, :_id "542692cac026201cdc326b56"} {:updated-at 1649576567141, :created-at 1649576567141, :author {:login "jungwookim", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/50188177?v=4"}, :body ";; being able to define fn as a val\nuser=> (intern 'user 'sum (fn [a b c]\n (+ a b c)))\n#'user/sum\n\nuser=> (sum 1 2 3)\n6", :_id "62528a77e4b0b1e3652d75ce"} {:updated-at 1649578114784, :created-at 1649577871265, :author {:login "jungwookim", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/50188177?v=4"}, :body ";; you can defind defmethod as well by using intern.\n;; firstly, define defmulti so that upper-case can convert string and keyword into upper-case, respectively.\nuser=> (defmulti upper-case [this]\n (type this))\n\n;; defmethods can be created as a var by clojure.core/intern\nuser=> (intern 'user 'upper-case (defmethod upper-case java.lang.String [this]\n (clojure.string/upper-case this)))\n\nuser=> (intern 'user 'upper-case (defmethod upper-case clojure.lang.Keyword [this]\n (-> this name clojure.string/upper-case keyword)))\n\nuser=> (upper-case \"abc\")\n\"ABC\"\n\nuser=> (upper-case :abc)\n:ABC", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/50188177?v=4", :account-source "github", :login "jungwookim"}], :_id "62528f8fe4b0b1e3652d75d0"}], :notes [{:author {:login "phreed", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/211644?v=3"}, :updated-at 1490886217995, :created-at 1490886217995, :body "\"The Namespace system maintains global maps of symbols to Var objects (see Namespaces). If a def expression does not find an interned entry in the current namespace for the symbol being def-ed, it creates one, otherwise it uses the existing Var. This find-or-create process is called interning. This means that, unless they have been unmap-ed, Var objects are stable references and need not be looked up every time. It also means that namespaces constitute a global environment in which, as described in Evaluation, the compiler attempts to resolve all free symbols as Vars.\n\n\"The var special form or the #' reader macro (see Reader) can be used to get an interned Var object instead of its current value.\"\n\n-- [https://clojure.org/reference/vars]", :_id "58dd1e49e4b01f4add58fe81"}], :arglists ["ns name" "ns name val"], :doc "Finds or creates a var named by the symbol name in the namespace\n ns (which can be a symbol or a namespace), setting its root binding\n to val if supplied. The namespace must exist. The var will adopt any\n metadata from the name symbol. Returns the var.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/intern"} {:ns "clojure.core", :name "print-simple", :file "clojure/core_print.clj", :type "function", :column 1, :see-alsos nil, :line 83, :examples [{:updated-at 1656622812157, :created-at 1656622812157, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; where o is an object to be printed, and w is a java.io.Writer\n;; prints metadata if *print-dup* or *print-meta* & *print-readably* are truthy\n;; stringifies and writes the object to the writer\n\n;; We can bind *out* to a writer and return that\n(let [s (java.io.StringWriter.)]\n (binding [*out* s]\n (print \"Hello!\")\n (str s)))\n;; => \"Hello!\"\n\n;; Or we can use print-simple with no binding necessary\n(let [s (java.io.StringWriter.)]\n (print-simple \"Hello!\" s)\n (str s))\n;; => \"Hello!\"\n", :_id "62be0edce4b0b1e3652d7610"}], :notes nil, :arglists ["o w"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/print-simple"} {:added "1.2", :ns "clojure.core", :name "flatten", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1489089374653, :author {:login "miner", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/25400?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "flatten", :ns "clojure.core.reducers"}, :_id "58c1b35ee4b01f4add58fe74"} {:created-at 1519124274538, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "tree-seq", :ns "clojure.core"}, :_id "5a8bff32e4b0316c0f44f8d6"} {:created-at 1550854184577, :author {:login "finalfantasia", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/2316604?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "sequential?", :ns "clojure.core"}, :_id "5c702828e4b0ca44402ef69f"} {:created-at 1580338242571, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "mapcat", :ns "clojure.core"}, :_id "5e320c42e4b0ca44402ef826"}], :line 7136, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [{:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"} {:login "tonsky", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4188c62c28a196e3e82363217c56fca5?r=PG&default=identicon"}], :body "user=> (flatten [1 [2 3]])\n(1 2 3)\n\nuser=> (flatten '(1 2 3))\n(1 2 3)\n\nuser=> (flatten '(1 2 [3 (4 5)])) \n(1 2 3 4 5)\n\nuser=> (flatten nil)\n()\n\n; Attention with stuff which is not a sequence\n\nuser=> (flatten 5)\n()\n\nuser=> (flatten {:name \"Hubert\" :age 23})\n()\n\n; Workaround for maps\n\nuser=> (flatten (seq {:name \"Hubert\" :age 23}))\n(:name \"Hubert\" :age 23)", :created-at 1279274687000, :updated-at 1341327489000, :_id "542692cfc026201cdc326e49"} {:editors [{:login "bsima", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/200617?v=3"}], :body ";; Useful snippet: \"merge\" two or more vectors with `(comp vec flatten vector)`\n(let [a [{:a \"hi\"} {:b \"hey\"}]\n b [{:c \"yo\"} {:d \"hiya\"}]\n c {:e [\"hola\" \"bonjour\"]}]\n ((comp vec flatten vector) a b c))\n;;=> [{:a \"hi\"} {:b \"hey\"} {:c \"yo\"} {:d \"hiya\"} {:e [\"hola\" \"bonjour\"]}]", :author {:avatar-url "https://avatars.githubusercontent.com/u/200617?v=3", :account-source "github", :login "bsima"}, :created-at 1453767790696, :updated-at 1453767826738, :_id "56a6bc6ee4b015010896bd6e"}], :notes [{:updated-at 1335141716000, :body "(flatten nil) actually returns an empty sequence, not nil. The doc string is fixed in 1.4.", :created-at 1335141716000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fde"} {:updated-at 1336946114000, :body "As shown in the example, flatten will return an empty sequence when given any non-sequential thing. That can sometimes hide a bug. \r\n\r\nHere's another version that doesn't have that problem, and is faster as well.\r\n\r\n\r\n (defn flatten2\r\n \"Like `clojure.core/flatten` but better, stronger, faster.\r\n Takes any nested combination of sequential things (lists, vectors,\r\n etc.) and returns their contents as a single, flat, lazy sequence.\r\n If the argument is non-sequential (numbers, maps, strings, nil, \r\n etc.), returns the original argument.\"\r\n {:static true}\r\n [x]\r\n (letfn [(flat [coll] \r\n (lazy-seq \r\n (when-let [c (seq coll)] \r\n (let [x (first c)] \r\n (if (sequential? x) \r\n (concat (flat x) (flat (rest c))) \r\n (cons x (flat (rest c))))))))]\r\n (if (sequential? x) (flat x) x)))\r\n", :created-at 1335142077000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fdf"} {:updated-at 1341327474000, :body "Actually, flatten on a vector returns list, not a collection:\r\n\r\n user=> (flatten [1 [2 3]])\r\n (1 2 3)\r\n", :created-at 1341327474000, :author {:login "tonsky", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4188c62c28a196e3e82363217c56fca5?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fe4"} {:updated-at 1398620003000, :body "lazy version is much slower than this one:\r\n\r\n
    (defn my-flatten [l] \r\n  \"free of StackOverflow problem, not lazy and much faster version of flatten.\"\r\n(loop [l1 l, l2 `()]\r\n  (cond\r\n    (sequential? (first l1)) (recur (concat (first l1) (rest l1)) l2)\r\n    (empty? l1) (reverse l2)\r\n    :else (recur (rest l1) (cons (first l1) l2)))))\r\n
    \r\n\r\nfor complicated construction genereted by:\r\n
    (defn gen-list-wird [c] (reduce (fn [a b] (list a b)) (map vector (range c) (map str (range c (* 2 c))))))
    \r\ntimes are:\r\ncore/flatten (260 msec)\r\nsteveminer/flatten (135 msec)\r\nmy-flatten (2 msec). This version is slower than steveminder`s version for flat and very nested structures with small number of items.", :created-at 1398617756000, :author {:login "slovic", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b39b58f117a52d4f8ef3f388afb4554a?r=PG&default=identicon"}, :_id "542692edf6e94c6970522025"} {:author {:login "miner", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25400?v=3"}, :updated-at 1442172372482, :created-at 1442172372482, :body "For a much faster implementation, use `clojure.core.reducers/flatten` (introduced in Clojure 1.5).", :_id "55f5cdd4e4b06a9ffaad4fc0"} {:author {:login "afhammad", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147120?v=3"}, :updated-at 1459255941235, :created-at 1459255941235, :body "To only flatten one level, you can use (mapcat identity coll)\n\nWith flatten:\n
    \nuser=> (flatten [[[1]] [[2 3]]])\n(1 2 3)\n
    \n\nWith mapcat identity:\n
    \nuser=> (mapcat identity [[[1]] [[2 3]]])\n([1] [2 3])\n
    \n", :_id "56fa7a85e4b09295d75dbf43"} {:body "afhammad, i think to flatten one level it may be useful
    (apply concat coll)
    ", :created-at 1470329093649, :updated-at 1470329117379, :author {:avatar-url "https://avatars.githubusercontent.com/u/834990?v=3", :account-source "github", :login "moskvo"}, :_id "57a37105e4b0bafd3e2a04c6"} {:author {:login "beluchin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6383047?v=4"}, :updated-at 1613909662567, :created-at 1613909662567, :body "does not flatten sets:\n\n user=> (flatten [#{1}])\n (#{1})", :_id "60324e9ee4b0b1e3652d7460"}], :arglists ["x"], :doc "Takes any nested combination of sequential things (lists, vectors,\n etc.) and returns their contents as a single, flat lazy sequence.\n (flatten nil) returns an empty sequence.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/flatten"} {:added "1.0", :ns "clojure.core", :name "doubles", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1656679496626, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "double-array", :ns "clojure.core"}, :_id "62beec48e4b0b1e3652d761b"}], :line 5378, :examples [{:updated-at 1656673535693, :created-at 1656673535693, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; double-array will convert where possible\n(double-array [1 2 3]);; => [1.0, 2.0, 3.0]\n\n;; doubles will not\n(try (doubles [1 2 3])\n (catch ClassCastException e (ex-message e)))\n;; => \"clojure.lang.PersistentVector cannot be cast to [D\"", :_id "62bed4ffe4b0b1e3652d7616"} {:updated-at 1682271447230, :created-at 1682271447230, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; Casting avoids expensive reflection, so to see the benefit, enable warning:\n(set! *warn-on-reflection* true)\n\n;; We'll def a double-array but won't type-hint the var:\n(def my-array (double-array [10.0 20.0 30.0 40.0 50.0 60.0]))\n\n;; and try to amap over it without using `doubles` or type hinting amap's args:\n(amap my-array i _ (unchecked-inc ^double (aget my-array i)))\n;; Reflection warning… call to static method alength on clojure.lang.RT can't be resolved (argument types: unknown).\n;; Reflection warning… call to static method aclone on clojure.lang.RT can't be resolved (argument types: unknown).\n;; Reflection warning… call to static method aget on clojure.lang.RT can't be resolved (argument types: unknown, int).\n;; Reflection warning… call to static method aset on clojure.lang.RT can't be resolved (argument types: unknown, int, double).\n;; => [11.0, 21.0, 31.0, 41.0, 51.0, 61.0]\n\n;; We can use `doubles` to avoid reflection:\n(amap (doubles my-array) i _ (unchecked-inc ^double (aget (doubles my-array) i)))\n;; => [11.0, 21.0, 31.0, 41.0, 51.0, 61.0]\n\n;; Just as we can type hint in place:\n(amap ^doubles my-array i _ (unchecked-inc ^double (aget ^doubles my-array i)))\n;; => [11.0, 21.0, 31.0, 41.0, 51.0, 61.0]\n\n;; Or type hint the var:\n(def ^\"[D\" my-array (double-array [10 20 30 40 50 60]))\n(amap my-array i _ (unchecked-inc ^double (aget my-array i)))\n;; => [11.0, 21.0, 31.0, 41.0, 51.0, 61.0]\n", :_id "64456cd7e4b08cf8563f4b92"}], :notes [{:updated-at 1313877730000, :body "Anybody know what this is used for?\r\nAll I could find is that you can cast an existing double-array to another \r\ndouble-array???\r\n\r\n
    user=> (doubles [1 2 3 4 5])\r\njava.lang.ClassCastException: clojure.lang.PersistentVector cannot be cast to [D (NO_SOURCE_FILE:0)\r\nuser=> (doubles (int-array [2 3 2]))\r\njava.lang.ClassCastException: [I cannot be cast to [D (NO_SOURCE_FILE:0)\r\nuser=> (doubles (float-array [2 3 2]))\r\njava.lang.ClassCastException: [F cannot be cast to [D (NO_SOURCE_FILE:0)\r\nuser=> (doubles (double-array [2 3 2]))\r\n#\r\nuser=> (type (double-array [2 3 2]))\r\n[D\r\nuser=> (type (doubles (double-array [2 3 2])))\r\n[D\r\nuser=>\r\n
    \r\n", :created-at 1313877675000, :author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fc6"}], :arglists ["xs"], :doc "Casts to double[]", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/doubles"} {:added "1.9", :ns "clojure.core", :name "halt-when", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1658332219541, :author {:login "crimeminister", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/29072?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "transduce", :ns "clojure.core"}, :_id "62d8243be4b0b1e3652d762a"}], :line 7631, :examples [{:updated-at 1520773717746, :created-at 1520773717746, :author {:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}, :body "(def letters (set \"abcdefghijklmnopqrstuvwxyz\"))\n(def vowels (set \"aeiou\"))\n\n;; Remove the vowels from a string.\n(transduce (remove vowels) str \"hello\")\n;;=> \"hll\"\n\n;; Same, but halt when seeing a non-letter (and return that non-letter).\n(transduce (comp (remove vowels) (halt-when (complement letters)))\n str \"hello\")\n;;=> \"hll\"\n(transduce (comp (remove vowels) (halt-when (complement letters)))\n str \"hello world\")\n;;=> \\space\n", :_id "5aa52a55e4b0316c0f44f91c"} {:editors [{:login "seancorfield", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/43875?v=4"}], :body ";; \"halt-when\" can only really be used with \"transduce\", but not with other\n;; functions that support transducers like \"into\" or \"sequence\".\n\n(def v (vec (concat (range 5) [:x])))\n(def xf (comp (take 10) (halt-when keyword?) (map inc)))\n\n(transduce xf conj [] v)\n;;=> :x\n\n(into [] xf v)\n;;=> ClassCastException!\n;; Clojure 1.11.0 Alpha 4 updates \"into\" so that this works and produces:\n;;=> :x\n\n(sequence xf v)\n;;=> (1 2 3 4 5), wrong result!\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4", :account-source "github", :login "glts"}, :created-at 1520774510308, :updated-at 1642119482857, :_id "5aa52d6ee4b0316c0f44f91d"} {:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; Using the second argument in halt-when\n\n(transduce\n (comp (halt-when #{30} ;; stop at 30th item\n (fn [acc itm] acc))) ;; return all items so far\n (completing conj #(reduce + %)) ;; sums items on exit\n (range))\n;; 435", :author {:avatar-url "https://avatars.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1642611299179, :updated-at 1656671302936, :_id "61e84263e4b0b1e3652d75a0"} {:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; Like `take-while`'s complement when we return the completed result so far\n(transduce (take-while #(< % 10)) + (range));; => 45\n(transduce (halt-when #(>= % 10) (fn [acc _] acc)) + (range));; => 45\n\n;; So it's similar to medley's `take-upto` when `retf` = transduce's `f`\n(transduce (medley.core/take-upto #(>= % 10)) conj (range))\n;; => [0 1 2 3 4 5 6 7 8 9 10]\n(transduce (halt-when #(>= % 10) conj) conj (range))\n;; => [0 1 2 3 4 5 6 7 8 9 10]", :author {:avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4", :account-source "github", :login "tomdl89"}, :created-at 1658423818398, :updated-at 1658425450347, :_id "62d98a0ae4b0b1e3652d762b"} {:updated-at 1685471418885, :created-at 1685471418885, :author {:login "holyjak", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/624958?v=4"}, :body ";; Since Clojure 1.11 we can also use this with e.g. into:\n(into {}\n (comp\n (map (juxt :l :n))\n (halt-when (comp (complement number?) second) \n (constantly ::invalid)))\n [{:l \"A\" :n 1}\n {:l \"B\" :n \"not a number!\"}\n {:l \"C\" :n 3}])\n;; => ::invalid\n;; (remove the B entry to get `=> {\"A\" 1, \"C\" 3}`)", :_id "647640bae4b08cf8563f4bc7"}], :notes [{:author {:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}, :updated-at 1520774998468, :created-at 1520774998468, :body "`halt-when` is an odd transducer in that it is supposed to be used with `transduce`, but not in other transducible contexts like `sequence` or `into`.\n\nSays Alex Miller at https://dev.clojure.org/jira/browse/CLJ-1451: ‘Yeah, halt-when is a little tricky to use in transducible contexts other than transduce.’ Some more discussion at https://groups.google.com/d/msg/clojure/6HvmJIUsXKk/gLqUsfcnAwAJ.\n", :_id "5aa52f56e4b0316c0f44f91e"} {:author {:login "holyjak", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/624958?v=4"}, :updated-at 1685471806059, :created-at 1685471806059, :body "Not anymore, as pointed out above, at least `into` works fine under Clojure 1.11", :_id "6476423ee4b08cf8563f4bc8"}], :arglists ["pred" "pred retf"], :doc "Returns a transducer that ends transduction when pred returns true\n for an input. When retf is supplied it must be a fn of 2 arguments -\n it will be passed the (completed) result so far and the input that\n triggered the predicate, and its return value (if it does not throw\n an exception) will be the return value of the transducer. If retf\n is not supplied, the input that triggered the predicate will be\n returned. If the predicate never returns true the transduction is\n unaffected.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/halt-when"} {:added "1.0", :ns "clojure.core", :name "with-in-str", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1398723552000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-out-str", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f33"}], :line 4727, :examples [{:author {:login "tormaroe", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8bc7bb10bee96efb190053fe92ffd250?r=PG&default=identicon"}, :editors [{:login "tormaroe", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8bc7bb10bee96efb190053fe92ffd250?r=PG&default=identicon"}], :body ";; Given you have a function that will read from *in*\n(defn prompt [question]\n (println question)\n (read-line))\n\nuser=> (prompt \"How old are you?\")\nHow old are you?\n34 ; <== This is what you enter\n\"34\" ; <== This is returned by the function\n\n;; You can now simulate entering your age at the prompt by using with-in-str\n\nuser=> (with-in-str \"34\" (prompt \"How old are you?\"))\nHow old are you?\n\"34\" ; <== The function now returns immediately \n", :created-at 1289600189000, :updated-at 1289600648000, :_id "542692c7c026201cdc3269d8"}], :macro true, :notes nil, :arglists ["s & body"], :doc "Evaluates body in a context in which *in* is bound to a fresh\n StringReader initialized with the string s.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/with-in-str"} {:added "1.0", :ns "clojure.core", :name "remove-watch", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1331136355000, :author {:login "pjlegato", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4ce55cfd8b3ae2f63f5ecbc8fc1c05d4?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "add-watch", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c2f"} {:created-at 1498791146039, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/10404?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "atom", :ns "clojure.core"}, :_id "5955bceae4b06e730307db49"} {:created-at 1498791163420, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/10404?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "var", :ns "clojure.core"}, :_id "5955bcfbe4b06e730307db4a"} {:created-at 1498791180171, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/10404?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ref", :ns "clojure.core"}, :_id "5955bd0ce4b06e730307db4b"} {:created-at 1661778678117, :author {:login "wactbprot", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/113518?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "agent", :ns "clojure.core"}, :_id "630cbaf6e4b0b1e3652d765e"}], :line 2162, :examples [{:body "(def a (atom nil))\n\n;; The key of the watch is `:logger`\n(add-watch a :logger #(println %4))\n\n(reset! a [1 2 3])\n\n;; Deactivate the watch by its assigned key\n(remove-watch a :logger)", :author {:login "jkxyz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10171367?v=3"}, :created-at 1434458463428, :updated-at 1434458576224, :editors [{:login "jkxyz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10171367?v=3"}], :_id "5580195fe4b03e2132e7d197"}], :notes nil, :arglists ["reference key"], :doc "Removes a watch (set by add-watch) from a reference", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/remove-watch"} {:added "1.4", :ns "clojure.core", :name "ex-info", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1414982233911, :author {:login "also", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/15624?v=2"}, :to-var {:ns "clojure.core", :name "ex-data", :library-url "https://github.com/clojure/clojure"}, :_id "5456ea59e4b03d20a102429b"} {:created-at 1504289816491, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "throw", :ns "clojure.core"}, :_id "59a9a418e4b09f63b945ac5e"} {:created-at 1517620449117, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "try", :ns "clojure.core"}, :_id "5a750ce1e4b0e2d9c35f7407"} {:created-at 1517620458546, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "catch", :ns "clojure.core"}, :_id "5a750ceae4b0e2d9c35f7408"} {:created-at 1517620910204, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "finally", :ns "clojure.core"}, :_id "5a750eaee4b0e2d9c35f740f"} {:created-at 1518042214699, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "print-stack-trace", :ns "clojure.stacktrace"}, :_id "5a7b7c66e4b0316c0f44f8a4"}], :line 4783, :examples [{:body "(try\n (throw \n (ex-info \"The ice cream has melted!\" \n {:causes #{:fridge-door-open :dangerously-high-temperature} \n :current-temperature {:value 25 :unit :celsius}}))\n (catch Exception e (ex-data e)))\n\n;;=> {:causes #{:fridge-door-open :dangerously-high-temperature} \n;; :current-temperature {:value 25 :unit :celsius}}))\n\n", :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=3"}, :created-at 1424029233597, :updated-at 1457501094130, :editors [{:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/5733420?v=3", :account-source "github", :login "trimtab613"} {:login "snufkon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/490414?v=3"}], :_id "54e0f631e4b01ed96c93c87a"} {:updated-at 1561362532798, :created-at 1561362532798, :author {:login "humorless", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/3061798?v=4"}, :body ";; From https://stackoverflow.com/questions/25211457/\n;; Catching ExceptionInfo will only catch throwables created with ex-info:\n(try\n (throw (ex-info \"bad\" {:a 1 :b 2}))\n (catch clojure.lang.ExceptionInfo e\n (prn \"caught\" e)))\n;; => \"caught\" #", :_id "5d108064e4b0ca44402ef761"} {:updated-at 1680871851550, :created-at 1580222636013, :author {:login "daemianmack", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/24476?v=4"}, :body ";; The 3-arg arity is for linking exceptions in accordance with Java convention.\n;; For example you could write an exception wrapper:\n\n(ns clojure.example)\n\n(defn exception-wrapper\n \"Wrap exceptions to embed `:event` information from the `request` such\n that we preserve the `Caused by` convention.\"\n [request exception]\n (let [event (:event request)\n exc (ex-info (.getMessage ^Throwable exception)\n {:event event}\n exception)]\n (throw exc)))\n\nclojure.example> (exception-wrapper {:event \"some-event-info\"}\n (ex-info \"Dang.\" {:trilobites :everywhere}))\n\n;; => Execution error (ExceptionInfo) at clojure.example/eval5596 (REPL:26).\n;; => Dang.\n\nclojure.example> (clojure.repl/pst *e)\n;; => ExceptionInfo Dang. {:event \"some-event-info\"}\n;; => \tclojure.example/exception-wrapper (NO_SOURCE_FILE:7)\n;; => [...]\n;; => \tclojure.main/repl (main.clj:458)\n;; => Caused by:\n;; => ExceptionInfo Dang. {:trilobites :everywhere}\n\n\n\n;; Like in Java, you should chain exceptions (ex-cause). \n;; This lets you rank the exception in context.\n;; An exception chain is like an interrogation \n;; -> Who are you? (type e) => clojure.lang.ExceptionInfo\n;; -> What is your meaning? (ex-message e) => Divide by Zero\n;; -> Why did you behave badly? (ex-data e) => :divisor was 0\n;; -> Who else was involved? (ex-cause e) => #ArithmeticException{}\n;; --> Who are you? (-> e ex-cause type) => ArithmeticException\n;; ---> Who are you? (-> e ex-cause ex-cause type) => ...\n(def a 1)\n(def b 0)\n\n(try (/ a b)\n (catch ArithmeticException ae ;; <-- \"defuse\" Throwable\n (throw ;; <-- re-throw exception\n (ex-info ;; <-- contextualize ae\n (ex-message ae) ;; <-- chain exception message\n {:divisor b :dividend a} ;; <-- give your new ex-info context\n ae)))) ;; <-- chain ae as cause\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4", :account-source "github", :login "loeschzwerg"} {:login "daemianmack", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/24476?v=4"}], :_id "5e3048ace4b0ca44402ef823"} {:editors [{:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4"}], :body ";; Be careful that when thrown in a future\n;; exceptions are cast into an ExecutionException\n(ns clojure.example)\n\n(try\n @(future \n (throw \n (ex-info \"This exception is not caught\" \n {:useless :data})))\n (catch clojure.lang.ExceptionInfo e \n (println \"Is not executed\"))\n (catch java.util.concurrent.ExecutionException e \n (println \"This one is executed\")))\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/11491686?v=4", :account-source "github", :login "caumond"}, :created-at 1590830551261, :updated-at 1636722156357, :_id "5ed225d7e4b087629b5a1920"}], :notes nil, :arglists ["msg map" "msg map cause"], :doc "Create an instance of ExceptionInfo, a RuntimeException subclass\n that carries a map of additional data.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ex-info"} {:added "1.0", :ns "clojure.core", :name "ifn?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1321052090000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "fn?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c09"}], :line 6230, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; An anonymous function is a function as you'd expect\nuser=> (ifn? #(\"my anonymous function\"))\ntrue\n\n;; Is a vector a function?\nuser=> (ifn? [1 2 3])\ntrue\n\n;; Sure is, lets call it.\nuser=> ([1 2 3] 0)\n1\n\n;; Maps and sets are functions, too.\n\n;; a number is definitely not a function\nuser=> (ifn? 1)\nfalse\n\n;; but a symbol is\nuser=> (ifn? 'foo)\ntrue\n\n;; and so is a keyword\nuser=> (ifn? :foo)\ntrue", :created-at 1281077011000, :updated-at 1329991142000, :_id "542692cdc026201cdc326d38"}], :notes nil, :arglists ["x"], :doc "Returns true if x implements IFn. Note that many data structures\n (e.g. sets and maps) implement IFn", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ifn_q"} {:added "1.5", :ns "clojure.core", :name "some->", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1412083935441, :author {:login "jw-00000", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2936?v=2"}, :to-var {:ns "clojure.core", :name "some->>", :library-url "https://github.com/clojure/clojure"}, :_id "542ab0dfe4b0df9bb778a59b"} {:created-at 1412083945874, :author {:login "jw-00000", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2936?v=2"}, :to-var {:ns "clojure.core", :name "->", :library-url "https://github.com/clojure/clojure"}, :_id "542ab0e9e4b0df9bb778a59c"} {:created-at 1412268640070, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "cond->", :library-url "https://github.com/clojure/clojure"}, :_id "542d8260e4b05f4d257a298e"} {:created-at 1412268648681, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "cond->>", :library-url "https://github.com/clojure/clojure"}, :_id "542d8268e4b05f4d257a298f"} {:created-at 1412268658944, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "as->", :library-url "https://github.com/clojure/clojure"}, :_id "542d8272e4b05f4d257a2990"} {:created-at 1412268673788, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "->>", :library-url "https://github.com/clojure/clojure"}, :_id "542d8281e4b05f4d257a2991"}], :line 7584, :examples [{:body "user=> (-> {:a 1} :b inc)\n;; NullPointerException clojure.lang.Numbers.ops (Numbers.java:942)\n\nuser=> (some-> {:a 1} :b inc)\n;; nil\n", :author {:login "boxp", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1819576?v=2"}, :created-at 1412868850592, :updated-at 1412868897594, :editors [{:login "boxp", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1819576?v=2"}], :_id "5436aaf2e4b06dbffbbb00bd"} {:updated-at 1444741522705, :created-at 1444741522705, :author {:login "marick", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/71909?v=3"}, :body ";; Often used to \"short-circuit out\" of a series of steps:\n\n(some-> val\n step1\n step2\n step3)\n\n;; When nil is returned by any step, the further steps are not executed. Thus\n;; the nil case need be handled only once, at the end.", :_id "561d0192e4b084e61c76ecc3"}], :macro true, :notes nil, :arglists ["expr & forms"], :doc "When expr is not nil, threads it into the first form (via ->),\n and when that result is not nil, through the next etc", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/some->"} {:added "1.9", :ns "clojure.core", :name "nat-int?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495640911419, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pos-int?", :ns "clojure.core"}, :_id "5925ab4fe4b093ada4d4d72e"} {:created-at 1495640921991, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "neg-int?", :ns "clojure.core"}, :_id "5925ab59e4b093ada4d4d72f"} {:created-at 1495705366734, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "int?", :ns "clojure.core"}, :_id "5926a716e4b093ada4d4d750"}], :line 1420, :examples [{:updated-at 1495030925280, :created-at 1495030925280, :author {:login "larrychristensen", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/2092583?v=3"}, :body "user> (nat-int? 0)\ntrue\nuser> (nat-int? 1)\ntrue\nuser> (nat-int? -1)\nfalse\n;; especially useful for specs\nuser> (require '[clojure.spec :as spec])\nnil\nuser> (spec/def quantity nat-int?)\nuser/quantity\nuser> (spec/def ::quantity nat-int?)\n:user/quantity\nuser> (spec/valid? ::quantity -1)\nfalse", :_id "591c5c8de4b01920063ee060"} {:updated-at 1495703903990, :created-at 1495703903990, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body "(nat-int? 0)\n;;=> true\n(nat-int? 1)\n;;=> true\n(nat-int? 9223372036854775807)\n;;=> true\n\n;;;; false for negative values\n\n(nat-int? -1)\n;;=> false\n\n;;;; false for decimal values\n\n(nat-int? 0.0)\n;;=> false\n(nat-int? 1.0)\n;;=> false\n(nat-int? 1/2)\n;;=> false\n\n;;;; false for BigInt values\n\n(nat-int? 0N)\n;;=> false\n(nat-int? 1N)\n;;=> false\n(nat-int? 9223372036854775808)\n;;=> false", :_id "5926a15fe4b093ada4d4d74d"}], :notes nil, :arglists ["x"], :doc "Return true if x is a non-negative fixed precision integer", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/nat-int_q"} {:ns "clojure.core", :name "proxy-name", :file "clojure/core_proxy.clj", :type "function", :column 1, :see-alsos nil, :line 37, :examples nil, :notes nil, :tag "java.lang.String", :arglists ["super interfaces"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/proxy-name"} {:added "1.0", :ns "clojure.core", :name "ns-interns", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1288055138000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "ns-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ae9"} {:created-at 1298556643000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "ns-publics", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aea"} {:created-at 1348479295000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ns-aliases", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aeb"} {:created-at 1348479323000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ns-refers", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aec"}], :line 4207, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body "user=> (take 2 (ns-interns `clojure.core))\n([sorted-map #'clojure.core/sorted-map] [read-line #'clojure.core/read-line])\n\nuser=> (take 5 (sort (keys (ns-interns `clojure.java.io))))\n(Coercions IOFactory append? as-file as-relative-path)\n\nuser=> (count (ns-interns `clojure.core)) ; only 621 functions to learn :-)\n621\nuser=>", :created-at 1313988495000, :updated-at 1313988495000, :_id "542692c8c026201cdc3269ea"} {:author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :editors [], :body ";; See also http://clojure.org/namespaces for information on namespaces in Clojure and how to inspect and manipulate them", :created-at 1348479359000, :updated-at 1348479359000, :_id "542692d4c026201cdc327018"}], :notes nil, :arglists ["ns"], :doc "Returns a map of the intern mappings for the namespace.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ns-interns"} {:added "1.0", :ns "clojure.core", :name "all-ns", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1516472495588, :author {:login "bkovitz", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/4142015?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ns-name", :ns "clojure.core"}, :_id "5a6388afe4b093a19c35dc09"}], :line 4147, :examples [{:updated-at 1332953063000, :created-at 1281460579000, :body "user=> (all-ns)\n(# # # # # # # # # # # # # # # # # # # # # # # # #)", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692c7c026201cdc326990"} {:updated-at 1516472462629, :created-at 1516472462629, :author {:login "bkovitz", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/4142015?v=4"}, :body ";; The names of all your current namespaces that end in \"-test\":\n\n(->> (all-ns)\n (map ns-name)\n (map name)\n (filter #(clojure.string/ends-with? % \"-test\")))\n;;=> (\"core-test\" \"farg.pmatch-test\")", :_id "5a63888ee4b093a19c35dc08"}], :notes nil, :arglists [""], :doc "Returns a sequence of all namespaces.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/all-ns"} {:ns "clojure.core", :name "find-protocol-method", :file "clojure/core_deftype.clj", :type "function", :column 1, :see-alsos nil, :line 546, :examples nil, :notes nil, :arglists ["protocol methodk x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/find-protocol-method"} {:added "1.0", :ns "clojure.core", :name "subvec", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1291975197000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vector", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dee"} {:created-at 1291975205000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vector?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521def"}], :line 3818, :examples [{:updated-at 1423278293433, :created-at 1281558954000, :body ";; not supplying 'end' returns vector from 'start' to (count vector)\nuser=> (subvec [1 2 3 4 5 6 7] 2)\n[3 4 5 6 7]\n\n;; supplying 'end' returns vector from 'start' to element (- end 1)\nuser=> (subvec [1 2 3 4 5 6 7] 2 4)\n[3 4]", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"} {:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"} {:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"} {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"}], :author {:avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon", :account-source "clojuredocs", :login "zmila"}, :_id "542692cec026201cdc326d62"} {:editors [{:login "burnall", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1253998?v=3"}], :body ";; Remove one item by index\n\n(let [coll [0 1 2 3 4 5]\n i 3]\n (concat (subvec coll 0 i)\n (subvec coll (inc i))))\n;; => (0 1 2 4 5)", :author {:avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3", :account-source "github", :login "freckletonj"}, :created-at 1476828499701, :updated-at 1485765017826, :_id "58069d53e4b001179b66bdcd"} {:updated-at 1504176183534, :created-at 1503932170688, :author {:login "Sophia-Gold", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/19278114?v=4"}, :body ";; To query the indices of a subvec:\n(def foo (vec (range 10)))\n(def bar (subvec foo 3 7)) \n=> (.start bar)\n3\n=> (.end bar)\n7\n\n;; Increments with repeated slicing:\n(def baz (subvec bar 2))\n=> (.start baz)\n5\n\n;; Return the original vector:\n=> (.v bar)\n[0 1 2 3 4 5 6 7 8 9]\n=> (.v baz)\n[0 1 2 3 4 5 6 7 8 9]", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/19278114?v=4", :account-source "github", :login "Sophia-Gold"}], :_id "59a42f0ae4b09f63b945ac58"} {:updated-at 1573491889014, :created-at 1573491506809, :author {:login "jonathan-chen-tda", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/17070766?v=4"}, :body ";; IndexOutOfBoundsException for bad indices\n=> (subvec [0 1 2 3 4 5] 8 9)\nExecution error (IndexOutOfBoundsException) at ...", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/17070766?v=4", :account-source "github", :login "jonathan-chen-tda"}], :_id "5dc99332e4b0ca44402ef7d7"}], :notes [{:author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :updated-at 1522075347012, :created-at 1522075347012, :body "
    \n;; Note that subvec holds a reference to the original vector. If you plan \n;; to split a large vector and never using it again, consider freeing up\n;; the reference.\n\n(let [v1 (subvec (vec (range 1e7)) 0 5)\n      v2 (subvec (vec (range 1e7)) 5 10)]\n      (into v1 v2))\n;; OutOfMem\n\n(let [v1 (into [] (subvec (vec (range 1e7)) 0 5))\n      v2 (into [] (subvec (vec (range 1e7)) 5 10))]\n      (into v1 v2))\n;; [0 1 2 3 4 5 6 7 8 9]\n
    ", :_id "5ab906d3e4b045c27b7fac25"}], :arglists ["v start" "v start end"], :doc "Returns a persistent vector of the items in vector from\n start (inclusive) to end (exclusive). If end is not supplied,\n defaults to (count vector). This operation is O(1) and very fast, as\n the resulting vector shares structure with the original and no\n trimming is done.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/subvec"} {:added "1.0", :ns "clojure.core", :name "for", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1318594692000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "doseq", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c7f"} {:created-at 1338714786000, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "doall", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c80"} {:created-at 1360362825000, :author {:login "ViljamiPeltola", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1535c08820796d57a212a46a6bdd4cca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "recur", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c81"} {:created-at 1484942509711, :author {:login "bheesham", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/171007?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "range", :ns "clojure.core"}, :_id "58826cade4b09108c8545a5c"} {:created-at 1602104691947, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "let", :ns "clojure.core"}, :_id "5f7e2d73e4b0b1e3652d73cc"} {:created-at 1602104699060, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "when", :ns "clojure.core"}, :_id "5f7e2d7be4b0b1e3652d73cd"}], :line 4624, :examples [{:updated-at 1421257348418, :created-at 1279388402000, :body ";; prepare a seq of the even values \n;; from the first six multiples of three\n(for [x [0 1 2 3 4 5]\n :let [y (* x 3)]\n :when (even? y)]\n y)\n;;=> (0 6 12)\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692c7c026201cdc326952"} {:updated-at 1588419699839, :created-at 1279947290000, :body "(def digits [1 2 3])\n\n(for [x1 digits\n x2 digits]\n (* x1 x2))\n;;=> (1 2 3 2 4 6 3 6 9)", :editors [{:avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon", :account-source "clojuredocs", :login "Jacolyte"} {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "YizhePKU", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/42838469?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon", :account-source "clojuredocs", :login "Jacolyte"}, :_id "542692c7c026201cdc326954"} {:updated-at 1588419818008, :created-at 1283713265000, :body ";; produce a seq of all pairs drawn from two vectors\n(for [x ['a 'b 'c] \n y [1 2 3]]\n [x y])\n;;=> ([a 1] [a 2] [a 3] [b 1] [b 2] [b 3] [c 1] [c 2] [c 3])\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "SubhaSingh", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/12873392?v=3"} {:login "YizhePKU", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/42838469?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/4b163432c99a124feee4be046a3f9d66?r=PG&default=identicon", :account-source "clojuredocs", :login "james"}, :_id "542692c7c026201cdc326957"} {:author {:login "james", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4b163432c99a124feee4be046a3f9d66?r=PG&default=identicon"}, :editors [{:login "james", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4b163432c99a124feee4be046a3f9d66?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; produce a seq of the first three powers for a range of integers\n(for [x (range 1 6) \n :let [y (* x x) \n z (* x x x)]] \n [x y z])\n;;=> ([1 1 1] [2 4 8] [3 9 27] [4 16 64] [5 25 125])\n", :created-at 1283713566000, :updated-at 1421257621209, :_id "542692c7c026201cdc326959"} {:updated-at 1588419920709, :created-at 1292101988000, :body ";; produce a seq of squares\n(for [x (range 6)] \n (* x x))\n;;=> (0 1 4 9 16 25)", :editors [{:avatar-url "https://www.gravatar.com/avatar/6ff7e838d2c47adf942be6df4d22b452?r=PG&default=identicon", :account-source "clojuredocs", :login "pashields"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "YizhePKU", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/42838469?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon", :account-source "clojuredocs", :login "alimoeeny"}, :_id "542692c7c026201cdc32695d"} {:author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=2"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; prepare a seq of all keys from entries whose values are 0\n(for [[x y] '([:a 1] [:b 2] [:c 0]) :when (= y 0)] x)\n;;=> (:c)\n", :created-at 1305076075000, :updated-at 1421257745017, :_id "542692c7c026201cdc32695f"} {:author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; Demonstrating performance difference between :when and :while\n\n(time (dorun (for [x (range 1000) y (range 10000) :when (> x y)] [x y])))\n;; \"Elapsed time: 2898.908 msecs\"\n;;=> nil\n\n(time (dorun (for [x (range 1000) y (range 10000) :while (> x y)] [x y])))\n;; \"Elapsed time: 293.677 msecs\"\n;;=> nil\n", :created-at 1338313241000, :updated-at 1421258673026, :_id "542692d3c026201cdc326fa6"} {:author {:login "bzhou", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5ea589e907c3d7da52e3c76924fbe3f7?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; Demonstrating functional difference between :when and :while\n\n(for [x (range 3) y (range 3)] [x y])\n;;=> ([0 0] [0 1] [0 2] \n;; [1 0] [1 1] [1 2]\n;; [2 0] [2 1] [2 2])\n\n(for [x (range 3) y (range 3) :when (not= x y)] [x y])\n;;=> ( [0 1] [0 2] \n;; [1 0] [1 2] \n;; [2 0] [2 1] )\n\n; Here we see the :while applied to the immediately preceding seq\n(for [x (range 3) y (range 3) :while (not= x y)] [x y])\n;;=> ( \n;; [1 0] \n;; [2 0] [2 1] )\n\n;; The placement of the :while is important\n;; :while can cause a halt for a particular sequence\n\n(for [x (range 3) y (range 3) :while (not= x 1)] [x y])\n;;=> ([0 0] [0 1] [0 2] [2 0] [2 1] [2 2])\n\n(for [x (range 3) :while (not= x 1) y (range 3)] [x y])\n;;=> ([0 0] [0 1] [0 2])\n", :created-at 1340260912000, :updated-at 1510266180494, :_id "542692d3c026201cdc326fa7"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; More examples illustrating the difference between :when and :while\n\n;; Simple but inefficient method of checking whether a number is\n;; prime.\nuser=> (defn prime? [n]\n (not-any? zero? (map #(rem n %) (range 2 n))))\n#'user/prime?\n\nuser=> (range 3 33 2)\n(3 5 7 9 11 13 15 17 19 21 23 25 27 29 31)\n\n;; :when continues through the collection even if some have the\n;; condition evaluate to false, like filter\nuser=> (for [x (range 3 33 2) :when (prime? x)]\n x)\n(3 5 7 11 13 17 19 23 29 31)\n\n;; :while stops at the first collection element that evaluates to\n;; false, like take-while\nuser=> (for [x (range 3 33 2) :while (prime? x)]\n x)\n(3 5 7)\n\n;; The examples above can easily be rewritten with filter or\n;; take-while. When you have a for with multiple binding forms, so\n;; that the iteration occurs in a nested fashion, it becomes possible\n;; to write something briefly with 'for' that would be more verbose or\n;; unwieldy with nested filter or take-while expressions.\n\nuser=> (for [x (range 3 17 2) :when (prime? x)\n y (range 3 17 2) :when (prime? y)]\n [x y])\n([ 3 3] [ 3 5] [ 3 7] [ 3 11] [ 3 13]\n [ 5 3] [ 5 5] [ 5 7] [ 5 11] [ 5 13]\n [ 7 3] [ 7 5] [ 7 7] [ 7 11] [ 7 13]\n [11 3] [11 5] [11 7] [11 11] [11 13]\n [13 3] [13 5] [13 7] [13 11] [13 13])\n\nuser=> (for [x (range 3 17 2) :while (prime? x)\n y (range 3 17 2) :while (prime? y)]\n [x y])\n([3 3] [3 5] [3 7]\n [5 3] [5 5] [5 7]\n [7 3] [7 5] [7 7])\n\n;; This example only gives a finite result because of the :while\n;; expressions.\nuser=> (for [x (range) :while (< x 10) \n y (range) :while (<= y x)]\n [x y])\n\n([0 0]\n [1 0] [1 1]\n [2 0] [2 1] [2 2]\n [3 0] [3 1] [3 2] [3 3]\n [4 0] [4 1] [4 2] [4 3] [4 4]\n [5 0] [5 1] [5 2] [5 3] [5 4] [5 5]\n [6 0] [6 1] [6 2] [6 3] [6 4] [6 5] [6 6]\n [7 0] [7 1] [7 2] [7 3] [7 4] [7 5] [7 6] [7 7]\n [8 0] [8 1] [8 2] [8 3] [8 4] [8 5] [8 6] [8 7] [8 8]\n [9 0] [9 1] [9 2] [9 3] [9 4] [9 5] [9 6] [9 7] [9 8] [9 9])\n", :created-at 1345760672000, :updated-at 1345760672000, :_id "542692d3c026201cdc326fa8"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; Here are a couple of examples where the only difference is where\n;; the :while is placed, but it makes a significant difference in the\n;; behavior.\n\n;; When x=2 y=1 is reached, :while (<= x y) evaluates false, so all\n;; further items in the y collection are skipped. When x=3 y=1 is\n;; reached, the same thing happens.\n\nuser=> (for [x [1 2 3]\n y [1 2 3]\n :while (<= x y)\n z [1 2 3]]\n [x y z])\n([1 1 1] [1 1 2] [1 1 3]\n [1 2 1] [1 2 2] [1 2 3]\n [1 3 1] [1 3 2] [1 3 3])\n\n;; This is different. When x=2 y=1 z=1 is reached, :while (<= x y)\n;; evaluates false, but since the :while is after the binding for z,\n;; all further items in the z collection are skipped. Then x=2 y=2\n;; z=1 is tried, where the while expresssion evaluates true.\n\nuser=> (for [x [1 2 3]\n y [1 2 3]\n z [1 2 3]\n :while (<= x y)]\n [x y z])\n([1 1 1] [1 1 2] [1 1 3]\n [1 2 1] [1 2 2] [1 2 3]\n [1 3 1] [1 3 2] [1 3 3]\n [2 2 1] [2 2 2] [2 2 3]\n [2 3 1] [2 3 2] [2 3 3]\n [3 3 1] [3 3 2] [3 3 3])\n", :created-at 1345760698000, :updated-at 1345760698000, :_id "542692d3c026201cdc326fa9"} {:author {:login "octopusgrabbus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon"}, :editors [], :body "(defn all-files-present?\n\"Takes a list of real file names, and returns a map of files present 1\nand not present 0.\"\n[file-seq]\n(for [fnam file-seq\n :let [stat-map {(keyword fnam) (look-for fnam \"f\")}]]\n stat-map))\n\n(into {} (all-files-present? '(\"Makefile\" \"build.sh\" \"real-estate.csv\")))\n\n{:Makefile 1, :build.sh 1, :real-estate.csv 0}", :created-at 1356651292000, :updated-at 1356651292000, :_id "542692d3c026201cdc326faa"} {:editors [{:login "alvarogarcia7", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4199136?v=3"}], :updated-at 1456570106848, :created-at 1425980108716, :author {:avatar-url "https://avatars.githubusercontent.com/u/6026368?v=3", :account-source "github", :login "m-combinator"}, :body ";; Flattening a seq of pairs using for comprehensions\n\n(def pairs (for [i (range 10)] [i (inc i)]))\n;; ([0 1] [1 2] [2 3] [3 4] [4 5] [5 6] [6 7] [7 8] [8 9] [9 10])\n\n(def flattened (for [pair pairs element pair] element))\n;; (0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10)", :_id "54febacce4b0b716de7a6536"} {:editors [{:login "colorgmi", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/9025191?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/4199136?v=3", :account-source "github", :login "alvarogarcia7"} {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}], :body ";; Given an array of integers, return indices of the two numbers such that they \n;; add up to a specific target.\n\n;; You may assume that each input would have exactly one solution.\n;; Given nums = [2, 7, 11, 15], target = 9,\n\n;; Because nums[0] + nums[1] = 2 + 7 = 9,\n;; return [0, 1].\n\n(defn two-sum [nums target]\n (let [nums-index (zipmap nums (range))\n indexs (for [[x i] nums-index\n [y j] nums-index\n :when (< i j)\n :when (= (+ x y) target)]\n [i j])]\n (first indexs)))\n\n(two-sum [2 7 11 15] 9)\n;; [0 1]\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/9025191?v=3", :account-source "github", :login "colorgmi"}, :created-at 1455449257369, :updated-at 1460403168325, :_id "56c064a9e4b060004fc217c4"} {:updated-at 1494499956872, :created-at 1494499956872, :author {:login "abhilater", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1904958?v=3"}, :body ";;; Cartesian products of two sets\n\n(#(set\n (for[x %1, y %2]\n [x y])) #{1 2 3} #{4 5})\n\n;=> #{[2 5] [3 4] [1 4] [1 5] [2 4] [3 5]}", :_id "59144274e4b01f4add58feb5"} {:updated-at 1506265801327, :created-at 1506265801327, :author {:login "cuspymd", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/8870299?v=4"}, :body ";; Nested 'for' example to produce indexes of Two-dimensional array\n(for [i (range 3)]\n (for [j (range 3)]\n [i j]))\n\n;=> (([0 0] [0 1] [0 2]) \n; ([1 0] [1 1] [1 2]) \n; ([2 0] [2 1] [2 2]))", :_id "59c7cac9e4b03026fe14ea49"} {:updated-at 1626035981287, :created-at 1626035981287, :author {:login "jr0cket", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/250870?v=4"}, :body ";; Generate the hiccup for a collection of books, each book has unique details defined in each hash-map inside the collection.\n;; Destructure the keys in the hash-map for each book in turn\n\n(def practicalli-book-list\n [{:title \"Practicalli Spacemacs\"\n :url \"https://practical.li/spacemacs\"\n :image \"/practicalli-spacemacs-book-banner.png\"\n :description \"Coding Clojure with Emacs and Vim multi-modal editing\"}\n {:title \"Practicalli Clojure\"\n :url \"https://practical.li/clojure\"\n :image \"/practicalli-clojure-book-banner.png\"\n :description \"Learn the Clojure language through REPL driven development\"}])\n\n(defn books-list\n [books]\n (for [{:keys [title description url image]} books]\n [:div {:class \"column\"}\n [:a {:href url :target \"_blank\"}\n [:img {:src image}]]\n [:p [:a {:href url :target \"_blank\" }\n title]\n description]]))\n\n(book-list practicalli-book-list)\n;; => [:div {:class \"box\"} [:div {:class \"column\"} [:h2 {:class \"title has-text-centered\"} \"Freely available online books\"]] nil ([:div {:class \"column\"} [:div {:class \"columns\"} [:div {:class \"column\"} [:a {:href \"https://practical.li/spacemacs\", :target \"_blank\"} [:figure {:class \"image\"} [:img {:src \"/practicalli-spacemacs-book-banner.png\"}]]]] [:div {:class \"column\"} [:p [:a {:href \"https://practical.li/spacemacs\", :target \"_blank\", :class \"has-text-weight-bold\"} \"Practicalli Spacemacs\"] \"Emacs and Vim multi-modal editing\"]]]] [:div {:class \"column\"} [:div {:class \"columns\"} [:div {:class \"column\"} [:a {:href \"https://practical.li/clojure\", :target \"_blank\"} [:figure {:class \"image\"} [:img {:src \"/practicalli-clojure-book-banner.png\"}]]]] [:div {:class \"column\"} [:p [:a {:href \"https://practical.li/clojure\", :target \"_blank\", :class \"has-text-weight-bold\"} \"Practicalli Clojure\"] \"Learn the Clojure language through REPL driven development\"]]]])]\n", :_id "60eb570de4b0b1e3652d7516"} {:updated-at 1652121747673, :created-at 1652121747673, :author {:login "vipermark7", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/9751748?v=4"}, :body ";; Easy iteration through nested vectors\n\n(def matrix \n [[\"a\" \"b\"] [\"c\" \"d\"]])\n\n(for [row matrix letter row] \n letter)\n\n;; (\"a\" \"b\" \"c\" \"d\")", :_id "62796093e4b0b1e3652d75ed"}], :macro true, :notes [{:updated-at 1279948874000, :body "My English parser was choking on the description of this function.\r\n\r\n[This SO question](http://stackoverflow.com/questions/3322552/how-do-i-multiply-all-elements-in-one-collection-with-all-the-elements-in-another) has helped clarify how this function works.", :created-at 1279948874000, :author {:login "Jacolyte", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f87"} {:updated-at 1279949964000, :body "Example 1 can be rewritten without using the for macro. Pure functional should be preferred if possible:\r\n
    \r\n(filter even? (map (partial * 3)  [0 1 2 3 4 5]))\r\n
    ", :created-at 1279949964000, :author {:login "juergenhoetzel", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2736dfffc803c704dcf25b45ff63cede?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f88"} {:updated-at 1313975247000, :body "On juergenhoetzel's comment:\r\n\r\nAll the examples could be re-written in some combination of map and filter, but they are still valid examples of using the for comprehension, AFAIK:\r\n\r\nExamples:\r\n
    user=> (mapcat (fn [e] (map (fn [x] (* x e)) [1 2 3])) [1 2 3])\r\n(1 2 3 2 4 6 3 6 9)\r\nuser=> (mapcat (fn [e] (map (fn [x] [e x]) [1 2 3])) ['a 'b 'c])\r\n([a 1] [a 2] [a 3] [b 1] [b 2] [b 3] [c 1] [c 2] [c 3])\r\nuser=> (map (fn [e] [e (* e e)(* e e e)]) (range 1 6))\r\n([1 1 1] [2 4 8] [3 9 27] [4 16 64] [5 25 125])\r\nuser=> (map (fn [e] (* e e)) (range 3 7))\r\n(9 16 25 36)\r\nuser=> (map first (filter (fn [[x y]] (= y 0)) '([:a 1] [:b 2] [:c 0])))\r\n(:c)\r\nuser=>\r\n
    \r\n\r\n", :created-at 1313973784000, :author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fc7"} {:updated-at 1356553692000, :body "Take careful note of the description's wording:\r\n\r\n binding-form/collection-expr pairs, \r\n each followed by zero or more modifiers\r\n\r\nA consequence is that the binding list may *not* begin with a modifier, i.e a `:let`, `:when` or `:while`!\r\n\r\nThe following example is **illegal** syntax:\r\n\r\n (for [:let [a 1] b (range 5)] \r\n {a b})\r\n\r\nWhile it might sometimes be convenient to start a `for` with a `:let` to reduce code clutter, the \"correct\" procedure is to nest the `for` in a \"proper\" `let`, like this:\r\n\r\n (let [a 1]\r\n (for [b (range 5)] \r\n {a b}))\r\n\r\nSimilarly, a `:when` is better represented by nesting in an `if`.\r\n\r\n", :created-at 1356553540000, :author {:login "csmotricz", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/6c620615dfb537dbd5325380bd2eaa07?r=PG&default=identicon"}, :_id "542692edf6e94c6970521ffa"} {:updated-at 1375377539000, :body "The fifth example should probably be shown in first position, it's the most straightforward and readable for a beginner : \r\n\r\n(for [x (range 3 7)] (* x x))", :created-at 1375377539000, :author {:login "Joan Charmant", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/75a5fdba1a164425d43d3b9c4b830287?r=PG&default=identicon"}, :_id "542692edf6e94c6970522009"} {:updated-at 1395006875000, :body "\"**Sequence** comprehension\", not \"list comprehension\". ", :created-at 1395006875000, :author {:login "Thumbnail", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/db68e51797a2382e185b42ce6534b7a4?r=PG&default=identicon"}, :_id "542692edf6e94c6970522021"}], :arglists ["seq-exprs body-expr"], :doc "List comprehension. Takes a vector of one or more\n binding-form/collection-expr pairs, each followed by zero or more\n modifiers, and yields a lazy sequence of evaluations of expr.\n Collections are iterated in a nested fashion, rightmost fastest,\n and nested coll-exprs can refer to bindings created in prior\n binding-forms. Supported modifiers are: :let [binding-form expr ...],\n :while test, :when test.\n\n (take 100 (for [x (range 100000000) y (range 1000000) :while (< y x)] [x y]))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/for"} {:added "1.0", :ns "clojure.core", :name "binding", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1322088130000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-redefs", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e9a"} {:created-at 1374313487000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-bindings", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e9b"} {:created-at 1374512208000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-local-vars", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e9c"} {:created-at 1425742740372, :author {:login "kimtg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7685905?v=3"}, :to-var {:ns "clojure.core", :name "def", :library-url "https://github.com/clojure/clojure"}, :_id "54fb1b94e4b01ed96c93c886"}], :line 1947, :examples [{:author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :editors [{:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Here are the definitions.\n(defn mymax [x y]\n (min x y))\n\n(defn find-max [x y]\n (max x y))\n\nuser=> (let [max mymax]\n (find-max 10 20))\n\n20 ;let is ineffective outside current lexical scope\n\n\nuser=> (binding [max mymax]\n (find-max 10 20))\n\n10 ;because max is now acting as min", :created-at 1281546900000, :updated-at 1287628874000, :_id "542692cfc026201cdc326e66"} {:updated-at 1579643060326, :created-at 1321652674000, :body ";; As of Clojure 1.3, vars need to be explicitly marked as ^:dynamic in order for\n;; them to be dynamically rebindable:\n\nuser=> (def ^:dynamic x 1)\nuser=> (def ^:dynamic y 1)\nuser=> (+ x y)\n2\n\n;; Within the scope of the binding, x = 2 and y = 3\n\nuser=> (binding [x 2 \n y 3]\n (+ x y))\n5\n\n;; But once you leave the binding's scope, x and y maintain their original\n;; bindings:\n\nuser=> (+ x y)\n2", :editors [{:login "dijonkitchen", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/cab456ee2c30d86ce89400390ad812c6?r=PG&default=identicon", :account-source "clojuredocs", :login "onlyafly"}, :_id "542692d2c026201cdc326f54"} {:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [{:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}], :body ";;Use t like a \"template\"\n\n(declare ^:dynamic t)\n\n(defn addt [] \n (+ t 10))\n\n(binding [t 1]\n (addt))\n=> 11", :created-at 1326330032000, :updated-at 1326330097000, :_id "542692d2c026201cdc326f55"} {:body "; You can set! bindings. Useful in a stateful programming.\nuser=> (def ^:dynamic d)\n#'user/d\nuser=> d\n#\nuser=> (binding [d 0] (prn d) (set! d 1) (prn d))\n0\n1\nnil\nuser=> d\n#\n\n; Note that you can't use set! outside of binding [] \"stack\":\n(set! d 1) ; => ...Can't change/establish root binding...\n; You can use set! anywhere under binding [] \"stack\", including from lazy sequences:\n(defn set-d [v] (set! d v))\n(binding [d 0] (set-d 1) (prn d)) ;=> 1\n(first (binding [d 0] (set-d 1) (repeat d)) ) ;=> 1\n; But NOT from delay/force:\n(force (binding [d 0] (set-d 1) (delay d)) ) ;=> ...clojure.lang.Var$Unbound...", :author {:login "kimtg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7685905?v=3"}, :created-at 1425741813941, :updated-at 1546186846359, :editors [{:login "kimtg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7685905?v=3"} {:avatar-url "https://avatars2.githubusercontent.com/u/4270240?v=4", :account-source "github", :login "peter-kehl"} {:login "green-coder", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4"}], :_id "54fb17f5e4b01ed96c93c883"} {:body "; Speed test. recur is the preferred way.\nuser=> (def a (atom 0))\n#'user/a\nuser=> (def ^:dynamic b)\n#'user/b\nuser=> (def d)\n#'user/d\nuser=> (time (loop [r 0] (when (< r 10000000) (recur (inc r)))))\n\"Elapsed time: 8.062612 msecs\"\nnil\nuser=> (time (dotimes [_ 10000000] (reset! a 1)))\n\"Elapsed time: 93.428704 msecs\"\nnil\nuser=> (time (binding [b 0] (dotimes [_ 10000000] (set! b 1))))\n\"Elapsed time: 484.331821 msecs\"\nnil\nuser=> (time (with-local-vars [w 0] (dotimes [_ 10000000] (var-set w 1))))\n\"Elapsed time: 490.598696 msecs\"\nnil\nuser=> (time (dotimes [_ 10000000] (def d 1)))\n\"Elapsed time: 2154.646688 msecs\"\nnil\n", :author {:login "kimtg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7685905?v=3"}, :created-at 1425742394706, :updated-at 1425747333974, :editors [{:login "kimtg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7685905?v=3"}], :_id "54fb1a3ae4b0b716de7a6534"} {:editors [{:login "coldnew", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/39703?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3", :account-source "github", :login "bkovitz"}], :body ";; You can modify the variable inside a binding, \n;; inside a let, you can't.\n\n(def ^:dynamic z)\n\n(binding [z nil]\n (doseq [x (range 4) y (range 4)]\n (set! z [x y]))\n z)\n\n; => [3 3]\n\n;; You can modify the variable inside a for, with dorun.\n\n(binding [z nil]\n (dorun\n (for [x (range 4) y (range 4)]\n (set! z [x y])))\n z)\n\n; => [3 3]", :author {:avatar-url "https://avatars.githubusercontent.com/u/39703?v=3", :account-source "github", :login "coldnew"}, :created-at 1446002313487, :updated-at 1461711689159, :_id "56303e89e4b0290a56055d15"} {:editors [{:login "tizac", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1741276?v=3"}], :body ";; from stackoverflow http://stackoverflow.com/questions/1523240/let-vs-binding-in-clojure\n;; let creates a lexically scoped immutable alias for some value. \n;; binding creates a dynamically scoped binding for some Var.\n\n;; Dynamic binding means that the code inside your binding form and any code \n;; which that code calls (even if not in the local lexical scope) will see the new binding.\n\nuser> (def ^:dynamic x 0)\n#'user/x\n\n;; Lexical vs. dynamic binding:\n\nuser> (defn foo [] (println x))\n#'user/foo\nuser> (binding [x 1] (foo))\n1\nnil\nuser> (let [x 1] (foo))\n0\nnil", :author {:avatar-url "https://avatars.githubusercontent.com/u/1741276?v=3", :account-source "github", :login "tizac"}, :created-at 1463969516607, :updated-at 1463969570676, :_id "574266ece4b0a1a06bdee498"} {:updated-at 1468290506436, :created-at 1468290319127, :author {:login "eyelidlessness", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/199830?v=3"}, :body ";; Beware usage in ClojureScript around asynchronous calls, as the bound\n;; var's original value will be re-established before the async code executes:\n\n(def ^:dynamic *foo* nil)\n\n(binding [*foo* :bar]\n (js/setTimeout\n (fn []\n *foo* ;;=> nil\n ))\n\n;; Also beware *synchronous* usage inside `cljs.test/async`, as the bound\n;; var's original value will not be re-established:\n\n(ns my-ns\n (:require [cljs.test :refer-macros [async deftest is]]))\n\n(def ^:dynamic *foo* nil)\n\n(deftest my-test\n (async done\n (binding [*foo* :bar]\n (done))))\n\n(deftest another-test\n (async done\n (is (nil? *foo*))))\n\n;; FAIL in (another-test)\n;; expected: (nil? *foo*)\n;; actual: (not (nil? :bar))\n\n;; At time of writing, the stable ClojureScript version is 1.9.89.", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/199830?v=3", :account-source "github", :login "eyelidlessness"}], :_id "5784550fe4b0bafd3e2a049e"} {:updated-at 1556458271939, :created-at 1556458271939, :author {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}, :body ";; Re-bind `*in*` so that `read-line` reads from a file instead of stdin.\n;; Taken from here: https://stackoverflow.com/a/24826485/1019491\n\n(with-open [is (clojure.java.io/reader \"/tmp/foo.txt\")]\n (binding [*in* is]\n (println (read-line))))\n\n", :_id "5cc5ab1fe4b0ca44402ef712"} {:updated-at 1565050473837, :created-at 1565050473837, :author {:login "stribb", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/7216352?v=4"}, :body ";; Seed the random number generator so every invocation comes out the same.\n\n(require '[clojure.data.generators :as gen])\n\n(defn not-random-at-all []\n (let [wordlist '[one two three four five]]\n (binding [gen/*rnd* (java.util.Random. 42)]\n (gen/shuffle wordlist))))\n\n(not-random-at-all)\n;; => [two five one three four]\n(not-random-at-all)\n;; => [two five one three four]\n(not-random-at-all)\n;; => [two five one three four]\n", :_id "5d48c669e4b0ca44402ef791"} {:editors [{:login "PEZ", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/30010?v=4"}], :body ";; Beware of lazyness\n(def ^:dynamic *foo* :FOO)\n(defn foo [x] [*foo* x])\n\n;; realized when bindings are reset\n(binding [*foo* :BAR]\n (map foo [1 2 3]))\n=> ([:FOO 1] [:FOO 2] [:FOO 3])\n\n;; force realization while bindings active\n(binding [*foo* :BAR]\n (doall (map foo [1 2 3])))\n=> ([:BAR 1] [:BAR 2] [:BAR 3]) \n\n;; closure `bound-foo` with bindings\n(binding [*foo* :BAR]\n (let [bound-foo (bound-fn [x] (foo x))]\n (map bound-foo [1 2 3])))\n=> ([:BAR 1] [:BAR 2] [:BAR 3]) \n\n;; more convenient closuring\n(binding [*foo* :BAR]\n (let [bound-foo (bound-fn* foo)]\n (map bound-foo [1 2 3])))\n=> ([:BAR 1] [:BAR 2] [:BAR 3]) \n", :author {:avatar-url "https://avatars.githubusercontent.com/u/30010?v=4", :account-source "github", :login "PEZ"}, :created-at 1618243197010, :updated-at 1618346238324, :_id "60746e7de4b0b1e3652d74c4"}], :macro true, :notes [{:updated-at 1409723156000, :body "The first example (binding mymax to max) appears to be broken. The last line generates the error:\r\n
    \r\n  IllegalStateException Can't dynamically bind non-dynamic var: clojure.core/max\r\n
    \r\n\r\nI tried inserting (.setDynamic #'max) at the top, and it got rid of the error, but the binding didn't seem to actually happen. I.e. the last line prints 20.\r\n\r\n
    The only way I could get it to work is by redefining max from scratch as dynamic:\r\n\r\n
    \r\n(defn ^:dynamic max\r\n  ([x] x)\r\n  ([x y] (. clojure.lang.Numbers (max x y)))\r\n  ([x y & more]\r\n   (reduce max (max x y) more)))\r\n
    \r\n\r\nAfter THIS the first example succeeds.\r\n\r\n
    The moral of the story - I guess you can't easily bind built-in functions. You need to write your functions with the intention of them being bindable. And I guess the first example should simply be removed?", :created-at 1409723015000, :author {:login "fordsfords", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ab6989cb3f3a81269d91a003d45dab25?r=PG&default=identicon"}, :_id "542692edf6e94c697052202f"} {:author {:login "NeedMoreDesu", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/3812527?v=4"}, :updated-at 1509569062961, :created-at 1509569062961, :body "So about first example --\n
    \n(defn find-max [x y]\n  (max x y)) ;; => #'user/find-max\n(binding [max clojure.core/min]\n  (find-max 10 20)) ;; Can't dynamically bind non-dynamic var: clojure.core/max\n(def ^:dynamic max clojure.core/max)\n(binding [max clojure.core/min]\n  (find-max 10 20)) ;; => 20\n(defn find-max [x y]\n  (max x y)) ;; => #'user/find-max\n(binding [max clojure.core/min]\n  (find-max 10 20)) ;; => 10\n
    \nLong story short: var needs to be defined `^:dynamic` before you create your function with var being bound here, or else no dynamic building occur (which is intended behavior, I guess).", :_id "59fa3226e4b0a08026c48c8c"} {:author {:login "finalfantasia", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2316604?v=4"}, :updated-at 1677133081409, :created-at 1677133058906, :body "There's a great blog post from Chas Emerick about `binding`, [Be Mindful of Clojure's `binding`](https://cemerick.com/blog/2009/11/03/be-mindful-of-clojures-binding.html), that discusses two common pitfalls that one can fall into when using `binding`.", :_id "63f70502e4b08cf8563f4b72"}], :arglists ["bindings & body"], :doc "binding => var-symbol init-expr\n\n Creates new bindings for the (already-existing) vars, with the\n supplied initial values, executes the exprs in an implicit do, then\n re-establishes the bindings that existed before. The new bindings\n are made in parallel (unlike let); all init-exprs are evaluated\n before the vars are bound to their new values.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/binding"} {:added "1.0", :ns "clojure.core", :name "partial", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1358904778000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "comp", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ccb"} {:created-at 1358904783000, :author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "juxt", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ccc"} {:created-at 1598161159341, :author {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "apply", :ns "clojure.core"}, :_id "5f420107e4b0b1e3652d739e"}], :line 2614, :examples [{:author {:login "nipra", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/142529?v=3"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (def to-english (partial clojure.pprint/cl-format nil \"~@(~@[~R~]~^ ~A.~)\"))\n#'user/to-english\n\nuser=> (to-english 1234567890)\n\"One billion, two hundred thirty-four million, five hundred sixty-seven thousand, eight hundred ninety\"\n", :created-at 1279053300000, :updated-at 1285501907000, :_id "542692cdc026201cdc326ceb"} {:author {:login "nipra", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/142529?v=3"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}], :body "user=> (def hundred-times (partial * 100))\n#'user/hundred-times\n\nuser=> (hundred-times 5)\n500\n\nuser=> (hundred-times 4 5 6)\n12000\n\nuser=> (def add-hundred (partial + 100))\n#'user/add-hundred\n\nuser=> (add-hundred 5)\n105\n", :created-at 1279053544000, :updated-at 1310120171000, :_id "542692cdc026201cdc326cee"} {:author {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}, :editors [{:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"} {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}], :body "(def subtract-from-hundred (partial - 100))\n\nuser=> (subtract-from-hundred 10) ; same as (- 100 10)\n90\n\nuser=> (subtract-from-hundred 10 20) ; same as (- 100 10 20)\n70", :created-at 1317743830000, :updated-at 1318431084000, :_id "542692d4c026201cdc327023"} {:author {:login "mihirmp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a8fd3b9768ad2d1fe09405348276705c?r=PG&default=identicon"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7412474?v=3", :account-source "github", :login "Lacty"} {:login "pbalduino", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/32979?v=4"}], :body "; Maps exponent to coefficient\n; x^3 + 2x + 1\n(def poly (fn [n]\n (cond\n (= 0 n) 1\n (= 1 n) 2\n (= 3 n) 1\n :else 0)))\n\n; Differentiates input by returning a polynomial that is curried\n; 3x^2 + 2\n(defn diff [p]\n (partial (fn [p n] (* (+ 1 n) (p (+ 1 n)))) p))\n\n(poly 3)\n;=> 1\n((diff poly) 3)\n;=> 0\n((diff poly) 2)\n;=> 3\n", :created-at 1339255851000, :updated-at 1575656058223, :_id "542692d4c026201cdc327026"} {:updated-at 1440758720254, :created-at 1440758720254, :author {:login "ftravers", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/443507?v=3"}, :body "user=> (defn fun-full [x y] (+ x y))\n;=> # (fun-full 2 3)\n;=> 5\n\nuser=> (def fun-half (partial fun-full 2))\n;=> # (fun-half 3)\n;=> 5\n", :_id "55e03bc0e4b072d7f27980f2"} {:editors [{:login "liango2", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5696817?v=3"}], :body ";;Takes a function f and the normal full arguments is allowed\n\nuser=> (defn add [x y] (+ x y))\n#'user/add\nuser=> (partial add 1 1 )\n#object[clojure.core$partial$fn__4529 0x5eb8fe04 \"clojure.core$partial$fn__4529@5eb8fe04\"]\nuser=> (apply (partial add 1 1 ) nil)\n2\nuser=> ((partial add 1 1 ))\n2\nuser=> ((partial add 1 1 1))\nArityException Wrong number of args (3) passed to: user/add clojure.lang.AFn.throwArity (AFn.java:429)\n\nuser=>", :author {:avatar-url "https://avatars.githubusercontent.com/u/5696817?v=3", :account-source "github", :login "liango2"}, :created-at 1451241930491, :updated-at 1451242239728, :_id "568031cae4b0e0706e05bd8c"} {:updated-at 1470796972437, :created-at 1470796972437, :author {:login "gosukiwi", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/161972?v=3"}, :body "user=> (def add1 (partial + 1))\n#'user/add1\nuser=> (add1)\n;=> 1\nuser=> (add1 2)\n;=> 3\nuser=> (add1 2 3 4)\n;=> 10\nuser=> (= (add1 2 3 4) (+ 1 2 3 4))\n;=> true", :_id "57aa94ace4b0bafd3e2a04d7"} {:editors [{:login "Lacty", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7412474?v=3"}], :body "(def times (partial *))\n\n(times 1) ; -> 1\n\n(times 1 2 3) ; -> 6\n\n(* 1 2 3) ; -> 6\n\n\n(def add-hundred (partial + 100))\n\n(add-hundred 1) ; -> 101\n\n(add-hundred 1 2 3) ; -> 106\n\n(+ 100 1 2 3) ; -> 106", :author {:avatar-url "https://avatars.githubusercontent.com/u/7412474?v=3", :account-source "github", :login "Lacty"}, :created-at 1470811578410, :updated-at 1470811725631, :_id "57aacdbae4b0bafd3e2a04d8"} {:updated-at 1484410971744, :created-at 1484410971744, :author {:login "codxse", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5813694?v=3"}, :body ";; Check if a character is vowel\n\n(def vowel? #(some (partial = %) \"aiueo\"))\n\n(vowel? \\e)\n;;=> true\n\n(vowel? \\c)\n;;=> nil", :_id "587a505be4b09108c8545a5a"} {:updated-at 1494497949851, :created-at 1494497949851, :author {:login "abhilater", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1904958?v=3"}, :body ";; apply feeds sequence items as variable args to the conj function\n;; variable args gets converted to list in the function arg and hence conj \n;; adds them as a list\n(apply #(conj [0 1] %&) [2 3 4 5])\n;;=> [0 1 (2 3 4 5)]\n\n;; Partial offers are mechanism to feed the variable args as is to the conj \n;; function effectively like (conj [] 2 3 4 5)\n(apply (partial conj [0 1]) [2 3 4 5])\n;;=> [0 1 2 3 4 5]", :_id "59143a9de4b01f4add58feb4"} {:updated-at 1517160889010, :created-at 1517160889010, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;practical example\n\n(def add-domain\n (partial (str \"@clojure.com\")))\n\n(str \"info\" add-domain )\n;;\"info@clojure.com\"", :_id "5a6e09b9e4b0c974fee49d11"} {:updated-at 1518786294793, :created-at 1518786294793, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body "(defn email-struct\n [username domain]\n (str username \"@\" domain))\n\n(def build-email\n #(partial email-struct %))\n\n((build-email \"info\") \"example.com\")\n;;\"info@example.com\"", :_id "5a86d6f6e4b0316c0f44f8c7"} {:updated-at 1556081366466, :created-at 1556081366466, :author {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}, :body ";; partial does not gel well with pure java methods\n\n;; Wrap Java method in Clojure fn\n(defn letter? [ch]\n (Character/isLetter ch))\n\n;; Idiomatic\n(filter letter? \"hello, world!\")\n;; => (\\h \\e \\l \\l \\o \\w \\o \\r \\l \\d)\n\n;; This works\n(filter (partial letter?) \"hello, world!\")\n;; => (\\h \\e \\l \\l \\o \\w \\o \\r \\l \\d)\n\n;; This also works\n(filter #(Character/isLetter %) \"hello, world!\")\n;; => (\\h \\e \\l \\l \\o \\w \\o \\r \\l \\d)\n\n;; This doesn't\n(filter (partial Character/isLetter) \"hello, world!\")\n;; => Unable to find static field: isLetter in class java.lang.Character", :_id "5cbfead6e4b0ca44402ef70f"} {:updated-at 1580488372127, :created-at 1580488372127, :author {:login "sulami", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1843193?v=4"}, :body ";; Beware that partial \"bakes in\" the original function and does not look it up\n;; again at call time, which can be confusing when mocking.\n\n(defn foo [] \"hit foo\")\n;; => #'user/foo\n(defn mock [] \"hit the mock\")\n;; => #'user/mock\n(def par (partial foo))\n;; => #'user/par\n(with-redefs-fn {#'foo mock} #(foo))\n;; => \"hit the mock\"\n(with-redefs-fn {#'foo mock} #(par))\n;; => \"hit foo\"", :_id "5e3456b4e4b0ca44402ef82a"} {:editors [{:login "jvw-git", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/3646688?v=4"}], :body ";; Partial application by calling partial significantly differs from partial\n;; application by wrapping a function call in an anonymous function.\n\n;; The code representing the to-be-applied function and to-be-applied-to arguments\n;; - with the 'call to partial' approach\n;; - is evaluated exactly once, when the call to partial is evaluated.\n;; - is not evaluated when a call to the resulting function is evaluated.\n;; - with the 'wrapped in an anonymous function' approach\n;; - is not evaluated when the anonymous function is evaluated.\n;; - is evaluated anew each time a call to the anonymous function is evaluated.\n\n;; If there are side effects involved in obtaining the to-be-applied function or\n;; to-be-applied-to arguments (because of with-redefs, this includes referring to a\n;; var by providing a symbol), carefully consider which approach to take.\n\n(defn fetch-processing-fn! [] (prn \"fetching...\") (fn [entity] entity))\n\n(defn load-entity! [id] (prn \"loading...\") :entity)\n\n\n(def top-level-fn-1 (partial (fetch-processing-fn!) (load-entity! 123)))\n;; \"fetching...\" is printed.\n;; \"loading...\" is printed.\n\n(top-level-fn-1)\n;; Nothing is printed.\n\n(top-level-fn-1)\n;; Nothing is printed.\n\n\n(def top-level-fn-2 #((fetch-processing-fn!) (load-entity! 123)))\n;; Nothing is printed.\n\n(top-level-fn-2)\n;; \"fetching...\" is printed.\n;; \"loading...\" is printed.\n\n(top-level-fn-2)\n;; \"fetching...\" is printed.\n;; \"loading...\" is printed.", :author {:avatar-url "https://avatars0.githubusercontent.com/u/3646688?v=4", :account-source "github", :login "jvw-git"}, :created-at 1596472064570, :updated-at 1596697721148, :_id "5f283b00e4b0b1e3652d7331"}], :notes [{:updated-at 1385283247000, :body "This function implements the concept of “[currying](http://en.wikipedia.org/wiki/Currying)â€�.", :created-at 1385283247000, :author {:login "roryokane", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5b2b185c814bb25f2f95a1152e58f033?r=PG&default=identicon"}, :_id "542692edf6e94c697052200e"}], :arglists ["f" "f arg1" "f arg1 arg2" "f arg1 arg2 arg3" "f arg1 arg2 arg3 & more"], :doc "Takes a function f and fewer than the normal arguments to f, and\n returns a fn that takes a variable number of additional args. When\n called, the returned function calls f with args + additional args.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/partial"} {:ns "clojure.core", :name "chunked-seq?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1443935187252, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk", :ns "clojure.core"}, :_id "5610b3d3e4b08e404b6c1c97"} {:created-at 1443935201452, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-first", :ns "clojure.core"}, :_id "5610b3e1e4b08e404b6c1c98"} {:created-at 1443935208310, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-rest", :ns "clojure.core"}, :_id "5610b3e8e4b08e404b6c1c99"} {:created-at 1443935214143, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-buffer", :ns "clojure.core"}, :_id "5610b3eee4b0686557fcbd46"} {:created-at 1443935221866, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-next", :ns "clojure.core"}, :_id "5610b3f5e4b0686557fcbd47"}], :line 715, :examples [{:updated-at 1335431382000, :created-at 1335431382000, :body "user=> (chunked-seq? (range 1000))\nfalse\n\nuser=> (chunked-seq? (seq (range 1000)))\ntrue\n\nuser=> (chunked-seq? (iterate inc 10))\nfalse\n\nuser=> (chunked-seq? (seq (iterate inc 10)))\nfalse", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692d2c026201cdc326f60"}], :notes nil, :arglists ["s"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/chunked-seq_q"} {:added "1.3", :ns "clojure.core", :name "find-keyword", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1430167074779, :author {:login "ljosa", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/197881?v=3"}, :to-var {:ns "clojure.core", :name "keyword", :library-url "https://github.com/clojure/clojure"}, :_id "553e9e22e4b01bb732af0a88"} {:created-at 1430167092343, :author {:login "ljosa", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/197881?v=3"}, :to-var {:ns "clojure.core", :name "name", :library-url "https://github.com/clojure/clojure"}, :_id "553e9e34e4b01bb732af0a89"} {:created-at 1430167188442, :author {:login "ljosa", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/197881?v=3"}, :to-var {:ns "clojure.core", :name "keyword?", :library-url "https://github.com/clojure/clojure"}, :_id "553e9e94e4b06eaacc9cda7d"} {:created-at 1430167194731, :author {:login "ljosa", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/197881?v=3"}, :to-var {:ns "clojure.core", :name "symbol", :library-url "https://github.com/clojure/clojure"}, :_id "553e9e9ae4b01bb732af0a8a"} {:created-at 1430167201482, :author {:login "ljosa", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/197881?v=3"}, :to-var {:ns "clojure.core", :name "intern", :library-url "https://github.com/clojure/clojure"}, :_id "553e9ea1e4b06eaacc9cda7e"}], :line 625, :examples [{:body "user=> (find-keyword \"a\")\nnil\nuser=> :a\n:a\nuser=> (find-keyword \"a\")\n:a", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1422932628869, :updated-at 1422932628869, :_id "54d03a94e4b081e022073c45"}], :notes nil, :tag "clojure.lang.Keyword", :arglists ["name" "ns name"], :doc "Returns a Keyword with the given namespace and name if one already\n exists. This function will not intern a new keyword. If the keyword\n has not already been interned, it will return nil. Do not use :\n in the keyword strings, it will be added automatically.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/find-keyword"} {:added "1.0", :ns "clojure.core", :name "replicate", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1385848235000, :author {:login "Alexey Tarasevich", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/43e0398b89022d32b43de4c968069312?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "repeat", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d08"}], :line 3006, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (apply str (replicate 7 \\space))\n ; 7 spaces\n\nuser=> (replicate 7 (rand-int 10))\n(3 3 3 3 3 3 3) ; the same number", :created-at 1281549294000, :updated-at 1332950215000, :_id "542692c9c026201cdc326a82"}], :deprecated "1.3", :notes [{:updated-at 1281553461000, :body "Note that `replicate` is obsolete. It's functionality is now available via the two-arg arity form of [`repeat`](http://clojuredocs.org/v/1578).", :created-at 1281553461000, :author {:login "kotarak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5db30f607f0b5fa70d690311aa3bfd3b?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f94"}], :arglists ["n x"], :doc "DEPRECATED: Use 'repeat' instead.\n Returns a lazy seq of n xs.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/replicate"} {:added "1.0", :ns "clojure.core", :name "min-key", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1371841141000, :author {:login "adereth", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5ad11b4e208a6cdb3bd45fe01dea59b7?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "min", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521df4"} {:created-at 1371841145000, :author {:login "adereth", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5ad11b4e208a6cdb3bd45fe01dea59b7?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "max-key", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521df5"}], :line 5009, :examples [{:updated-at 1672874240930, :created-at 1280009320000, :body ";; we have a list of key colours\n;; We want to find the one closest to a supplied colour\n;; We're storing rgb values as [r g b]\n;; use min-key to find colour that minimizes \n;; the euclidean distance between the supplied colour \n;; and each key colour\n;; thanks to rhudson, raek and mfex on #clojure\n\n(defn distance-squared\n \"Euclidean distance between two collections considered as coordinates\"\n [c1 c2]\n (->> (map - c1 c2) (map #(* % %)) (reduce +)))\n\n(def key-colours\n {[224 41 224] :purple\n [24 180 46] :green\n [12 129 245] :blue\n [254 232 23] :yellow\n [233 233 233] :white\n [245 27 55] :red\n [231 119 41] :orange\n })\n\n(defn rgb-to-key-colour\n \"Find colour in colour map closest to the supplied [r g b] triple\"\n [rgb-triple colour-map]\n (colour-map\n (apply min-key (partial distance-squared rgb-triple) (keys colour-map))))\n\nuser=> (rgb-to-key-colour [255 0 0] key-colours)\n:red\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:login "jimberry1", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/73443103?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/583358786e336bb14a400ca17722ec3b?r=PG&default=identicon", :account-source "clojuredocs", :login "lozh"}, :_id "542692ccc026201cdc326ca7"} {:author {:login "jamesqiu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc1268deaa7f2e78fe2b5ea76e6481d8?r=PG&default=identicon"}, :editors [{:login "jamesqiu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc1268deaa7f2e78fe2b5ea76e6481d8?r=PG&default=identicon"}], :body "; \"min-key\"/\"max-key\" to \"min\"/\"max\" like \"sort-by\" to \"sort\"\n(min-key #(Math/abs %) -3 1 4)\n; 1\n\n(apply min-key #(Math/abs %) [-3 1 4])\n; 1\n", :created-at 1311522786000, :updated-at 1328006403000, :_id "542692ccc026201cdc326ca9"} {:updated-at 1593445838944, :created-at 1593445838944, :author {:login "guillaume", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/368?v=4"}, :body "user=> (min-key second [\"Jon\" 1] [\"Rich\" 6] [\"Nancy\" 3])\n[\"Jon\" 1]", :_id "5efa0dcee4b0b1e3652d731a"}], :notes nil, :arglists ["k x" "k x y" "k x y & more"], :doc "Returns the x for which (k x), a number, is least.\n\n If there are multiple such xs, the last one is returned.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/min-key"} {:added "1.5", :ns "clojure.core", :name "reduced", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1416151548299, :author {:login "ljos", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/585174?v=2"}, :to-var {:ns "clojure.core", :name "reduce", :library-url "https://github.com/clojure/clojure"}, :_id "5468c1fce4b0dc573b892fd4"} {:created-at 1416151556515, :author {:login "ljos", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/585174?v=2"}, :to-var {:ns "clojure.core", :name "reduced?", :library-url "https://github.com/clojure/clojure"}, :_id "5468c204e4b03d20a10242ab"} {:created-at 1456683943617, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unreduced", :ns "clojure.core"}, :_id "56d33ba7e4b02a6769b5a4ba"} {:created-at 1464286469066, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ensure-reduced", :ns "clojure.core"}, :_id "57473d05e4b0af2c9436d1f3"}], :line 2836, :examples [{:body ";; Suppose you want to short-circuit a sum like:\n(reduce (fn [a v] (+ a v)) (range 10))\n;;=> 45\n\n;; So that it returns the sum of the integers if less than 100:\n(reduce (fn [a v] (if (< a 100) (+ a v) (reduced :big))) (range 10))\n;;=> 45\n\n;; But the keyword :big otherwise:\n(reduce (fn [a v] (if (< a 100) (+ a v) (reduced :big))) (range 20))\n;;=> :big\n\n;; The value returned by (reduced :big) short-circuits the reduction so that \n;; it returns the wrapped value without ranging over the entire sequence.\n;; This is useful for infinite lazy sequences:\n(reduce (fn [a v] (if (< a 100) (+ a v) (reduced :big))) (range))\n;;=>:big\n\n;; Which would otherwise not terminate.", :author {:login "silasdavis", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/99715?v=2"}, :created-at 1412246795536, :updated-at 1495285680591, :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/4996067?v=3", :account-source "github", :login "matanster"}], :_id "542d2d0be4b05f4d257a2985"} {:updated-at 1516387837196, :created-at 1447889898907, :author {:login "teymuri", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/13352033?v=3"}, :body ";;re-implementing (some) using (reduce) and (reduced):\n\n(defn resome [pred koll]\n (reduce (fn [_ c] (when-let [x (pred c)] (reduced x)))\n nil koll))\n\n;;user> (resome #{4} [3 4 2 3 2])\n;;>>> 4\n;;user> (resome even? [3 41 25 3 2])\n;;>>> true\n;;user> (resome even? [3 41 25 3 27])\n;;>>> nil", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/13352033?v=3", :account-source "github", :login "teymuri"} {:login "functor-soup", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6382230?v=3"} {:avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4", :account-source "github", :login "bfontaine"} {:login "featheredtoast", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1322534?v=4"}], :_id "564d0beae4b0be225c0c4795"} {:updated-at 1545247173119, :created-at 1545247173119, :author {:login "TravisHeppner", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/9536486?v=4"}, :body ";;note the return from f must be from reduced for reduce to terminate early.\n\n;;no early termination as the return of f is nil\n(reduce (fn f [a b]\n (when (> b 2)\n (reduced \"Done early!\"))\n (println b)) [1 2 3 4 5])\n;;2\n;;3\n;;4\n;;5\n;;=> nil\n\n;;early termination as the return of f is \"Done early!\" wrapped in a reduce object.\n(reduce (fn f [a b]\n (if (> b 2)\n (reduced \"Done early!\")\n (println b))) [1 2 3 4 5])\n;;2\n;;=> \"Done early!\"", :_id "5c1a99c5e4b0ca44402ef5ee"}], :notes nil, :arglists ["x"], :doc "Wraps x in a way such that a reduce will terminate with the value x", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/reduced"} {:added "1.0", :ns "clojure.core", :name "char-escape-string", :file "clojure/core_print.clj", :type "var", :column 1, :see-alsos [{:created-at 1375209851000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "char-name-string", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cd9"} {:created-at 1534950301941, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "escape", :ns "clojure.string"}, :_id "5b7d7b9de4b00ac801ed9e6b"}], :line 200, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; simple examples\n\nuser=> (char-escape-string \\newline)\n\"\\\\n\"\nuser=> (char-escape-string \\c) ; no escape sequence for 'c'\nnil\nuser=> (char-escape-string \\tab)\n\"\\\\t\"\nuser=> (char-escape-string \\backspace)\n\"\\\\b\"\nuser=>", :created-at 1313928437000, :updated-at 1313928437000, :_id "542692c7c026201cdc3269b6"} {:updated-at 1534950256834, :created-at 1534950256834, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body "(require '[clojure.string :as s])\n\n;; Would like to print \"s\" as shown literally:\n(def s \"Type backslash-t '\\t' followed by backslash-n '\\n'\")\n\n;; This doesn't work, as \\t and \\n are interpreted:\n(println s)\n;; Type backslash-t ' ' followed by backslash-n '\n;; '\n\n;; Use with escape to print literally:\n(println (s/escape s char-escape-string))\n;; Type backslash-t '\\t' followed by backslash-n '\\n'", :_id "5b7d7b70e4b00ac801ed9e6a"}], :notes nil, :tag "java.lang.String", :arglists [], :doc "Returns escape string for char or nil if none", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/char-escape-string"} {:added "1.0", :ns "clojure.core", :name "re-matches", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1324028223000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "re-find", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d06"} {:created-at 1379040151000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "subs", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d07"} {:created-at 1432238328876, :author {:login "bobpoekert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/45596?v=3"}, :to-var {:ns "clojure.core", :name "re-groups", :library-url "https://github.com/clojure/clojure"}, :_id "555e38f8e4b01ad59b65f4d9"} {:created-at 1521975114344, :author {:login "witek", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/209520?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "re-pattern", :ns "clojure.core"}, :_id "5ab77f4ae4b045c27b7fac24"}], :line 4886, :examples [{:author {:login "ysph", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/eed512f3595f1baa31fd91f3b297ebbf?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; The distinction is that re-find tries to find _any part_ of the string\n;; that matches the pattern, but re-matches only matches if the _entire_\n;; string matches the pattern.\nuser=> (re-matches #\"hello\" \"hello, world\")\nnil\n\nuser=> (re-matches #\"hello.*\" \"hello, world\")\n\"hello, world\"\n\nuser=> (re-matches #\"hello, (.*)\" \"hello, world\")\n[\"hello, world\" \"world\"]\n", :created-at 1294394717000, :updated-at 1324028606000, :_id "542692c8c026201cdc3269eb"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; Note: See clojure.core/subs for discussion of behavior of substrings\n;; holding onto references of the original strings, which can\n;; significantly affect your memory usage in some cases.", :created-at 1379040148000, :updated-at 1379040148000, :_id "542692d4c026201cdc32704f"} {:author {:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"}, :editors [{:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"} {:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"} {:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"}], :body "; Regex match flags can be embedded in the regex string. So, we can convert the normal case-sensitive matching into case-insensitive matching.\n\nuser=> (re-matches #\"hello\" \"HELLO\") ; case-sensitive\nnil\n\nuser=> (re-matches #\"(?i)hello\" \"hello\") ; case-insensitive\n\"hello\"\nuser=> (re-matches #\"(?i)hello\" \"HELLO\") ; case-insensitive\n\"HELLO\"\nuser=> (re-matches #\"(?i)HELLO\" \"heLLo\") ; case-insensitive\n\"heLLo\"\n", :created-at 1399524098000, :updated-at 1399524286000, :_id "542692d4c026201cdc327050"}], :notes [{:author {:login "caumond", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11491686?v=4"}, :updated-at 1615713542191, :created-at 1615713542191, :body "Here is the [java official documentation](https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/util/regex/Pattern.html) for pattern specifications", :_id "604dd506e4b0b1e3652d748e"}], :arglists ["re s"], :doc "Returns the match, if any, of string to pattern, using\n java.util.regex.Matcher.matches(). Uses re-groups to return the\n groups.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/re-matches"} {:added "1.0", :ns "clojure.core", :name "array-map", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1283650361000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "assoc", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c4c"} {:created-at 1397668962000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "hash-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c4d"} {:created-at 1397668975000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sorted-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c4e"}], :line 4379, :examples [{:author {:login "Jacolyte", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (array-map [1 2] [3 4 5])\n{[1 2] [3 4 5]}", :created-at 1280205415000, :updated-at 1332949878000, :_id "542692cec026201cdc326d8c"} {:author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :editors [{:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"} {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (array-map :a 10)\n{:a 10}\n\nuser=> (array-map :a 10 :b 20)\n{:a 10 :b 20}\n\nuser=> (apply array-map [:a 10 :b 20 :c 30])\n{:a 10 :b 20 :c 30}\n\nuser=> (apply assoc {} [:a 10 :b 20 :c 30]) ;same result using assoc\n{:a 10 :b 20 :c 30}\n", :created-at 1283649638000, :updated-at 1285492106000, :_id "542692cec026201cdc326d8e"} {:updated-at 1463365462869, :created-at 1303524077000, :body "user=> (keys (assoc (array-map :foo 10 :bar 20) :baz 30))\n(:baz :foo :bar)\n; baz is first; :foo and :bar follow the order given to array-map\n\n\n;; My results have consistently been different from what's listed above.\nuser=> (keys (assoc (array-map :foo 10 :bar 20) :baz 30))\n; => (:foo :bar :baz)\nuser=> (assoc (array-map :foo 10 :bar 20) :baz 30)\n; => {:foo 10, :bar 20, :baz 30}\nuser=> *clojure-version*\n; => {:major 1, :minor 8, :incremental 0, :qualifier nil}\n;; As long as I have an array map, new items get added to the end, not\n;; the beginning.", :editors [{:login "TradeIdeasPhilip", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/18409827?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon", :account-source "clojuredocs", :login "steveminer"}, :_id "542692cec026201cdc326d93"} {:updated-at 1463365157869, :created-at 1463365157869, :author {:login "TradeIdeasPhilip", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/18409827?v=3"}, :body ";; Sometimes Clojure will automatically choose between a hash map and\n;; an array map. What's the rule? Let's try a few experiments.\n\n;; Start with a quick way to make a map with N items.\nuser=> (defn make-map [count] (zipmap (range count) (range count)))\n;; => #'user/make-map\nuser=> (make-map 3)\n;; => {0 0, 1 1, 2 2}\n\n;; Try a few maps. The cutoff seems to be 9.5. If you have fewer than\n;; 9.5 items you get an array map. If you have more than 9.5 items you\n;; get a hash map.\nuser=> (type (make-map 8))\n;; => clojure.lang.PersistentArrayMap\nuser=> (type (make-map 9))\n;; => clojure.lang.PersistentArrayMap\nuser=> (type (make-map 10))\n;; => clojure.lang.PersistentHashMap\nuser=> (type (make-map 11))\n;; => clojure.lang.PersistentHashMap\n\n;; Using assoc we get similar results. 9 or fewer items yields an array\n;; map. 10 or more yields a hash map.\nuser=> (type (assoc (make-map 9) :x 1)) ; 10 items -> hash map.\n;; => clojure.lang.PersistentHashMap\nuser=> (type (assoc (make-map 8) :x 1)) ; 9 items -> array map.\n;; => clojure.lang.PersistentArrayMap\nuser=> (type (assoc (make-map 8) :x 1 :y 2)) ; 10 items -> hash map.\n;; => clojure.lang.PersistentHashMap\nuser=> (type (assoc (assoc (make-map 8) :x 1) :y 2)) ; 10 items -> hash map.\n;; => clojure.lang.PersistentHashMap\n\n;; But when we use { and } to create a map, the cutoff seems to move to 8.5.\n;; A map with 9 items created with assoc or zipmap would be an array map,\n;; but a map with 9 items created by { } is a hash map.\nuser=> (type {0 0, 1 1, 2 2, 3 3, 4 4, 5 5, 6 6, 7 7}) ; 8 items -> array map.\n;; => clojure.lang.PersistentArrayMap\nuser=> (type {0 0, 1 1, 2 2, 3 3, 4 4, 5 5, 6 6, 7 7, 8 8}) ; 9 items -> hash\n;; => clojure.lang.PersistentHashMap\n\n;; Calling dissoc on an array map always yields an array map, regardless of\n;; the size of the map.\n;; Let's start by making a large array map then remove a few items. This will\n;; give us array maps larger than you could create with assoc.\nuser=> (def array20 (apply array-map (range 40)))\n;; => #'user/array20\nuser=> (type array20)\n;; => clojure.lang.PersistentArrayMap\nuser=> (type (dissoc array20 6))\n;; => clojure.lang.PersistentArrayMap\nuser=> (count (dissoc array20 6))\n;; => 19\nuser=> (type (dissoc array20 6 2))\n;; => clojure.lang.PersistentArrayMap\nuser=> (count (dissoc array20 6 2))\n;; => 18\n\n;; Calling dissoc on a hash map always yields another hash map, regardless\n;; of the size of the map.\n;; Let's start by making a large hash map then remove a lot of items. This\n;; will give us hash maps smaller than you could create with assoc.\nuser=> (type (make-map 40))\n;; => clojure.lang.PersistentHashMap\nuser=> (type (apply dissoc (make-map 40) (range 1 80)))\n;; => clojure.lang.PersistentHashMap\nuser=> (count (apply dissoc (make-map 40) (range 1 80)))\n;; => 1\nuser=> (apply dissoc (make-map 40) (range 1 80))\n;; => {0 0}\nuser=> (type (apply dissoc (make-map 40) (range 0 80)))\n;; => clojure.lang.PersistentHashMap\nuser=> (count (apply dissoc (make-map 40) (range 0 80)))\n;; => 0\nuser=> (apply dissoc (make-map 40) (range 0 80))\n;; => {}\n", :_id "57392e25e4b071da7d6cfd0c"} {:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; Maybe you generated a sequence of kv pairs\n(def kvs [[:a 1] [:b 2] [:c 3] [:d 4] [:e 5] [:f 6] [:g 7] [:h 8] [:i 9]])\n\n;; A naïve approach to putting into an array-map…\n(into (array-map) kvs)\n;; => {:e 5, :g 7, :c 3, :h 8, :b 2, :d 4, :f 6, :i 9, :a 1}\n;; …loses order\n(type *1)\n;; => clojure.lang.PersistentHashMap\n\n;; This approach…\n(apply array-map (sequence cat kvs))\n;; => {:a 1, :b 2, :c 3, :d 4, :e 5, :f 6, :g 7, :h 8, :i 9}\n;; …preserves order\n(type *1)\n;; => clojure.lang.PersistentArrayMap", :author {:avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4", :account-source "github", :login "tomdl89"}, :created-at 1659043605194, :updated-at 1682634761186, :_id "62e2ff15e4b0b1e3652d7631"}], :notes [{:updated-at 1280205606000, :body "The definition is kind of short, IMO. More descriptively, `array-map` creates a mapping with arrays being the keys and the values. It doesn't seem like `array-map` cares whether or not the keys/values are arrays, although it doesn't seem to like sequences.", :created-at 1280205606000, :author {:login "Jacolyte", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f8d"} {:updated-at 1303523878000, :body "An array-map maintains the insertion order of the keys. Look up is linear, which is not a problem for small maps (say less than 10 keys). If your map is large, you should use hash-map instead. \r\n\r\nWhen you assoc onto an existing array-map, the result is a new array-map with the new key as the first key. The rest of the keys are in the same order as the original. Functions such as seq and keys will respect the key order. \r\n\r\nNote that assoc will decide to return a hash-map if the result is too big to be efficient.

    \r\n", :created-at 1303523878000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fba"}], :arglists ["" "& keyvals"], :doc "Constructs an array-map. If any keys are equal, they are handled as\n if by repeated uses of assoc.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/array-map"} {:added "1.3", :ns "clojure.core", :name "unchecked-byte", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1496262162534, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "byte", :ns "clojure.core"}, :_id "592f2612e4b06e730307db1c"}], :line 3516, :examples [{:body "user=> (unchecked-byte 127)\n127\nuser=> (unchecked-byte 128)\n-128\nuser=> (unchecked-byte 255)\n-1\nuser=> (unchecked-byte 256)\n0\nuser=> (unchecked-byte 257)\n1", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423522274775, :updated-at 1423522274775, :_id "54d939e2e4b081e022073c74"} {:updated-at 1496262153952, :created-at 1496262153952, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body "(unchecked-byte 1)\n;;=> 1\n(unchecked-byte 1N)\n;;=> 1\n(unchecked-byte 1.1)\n;;=> 1\n(unchecked-byte 1.9)\n;;=> 1\n(unchecked-byte 5/3)\n;;=> 1\n\n(unchecked-byte -1)\n;;=> -1\n(unchecked-byte -1N)\n;;=> -1\n(unchecked-byte -1.1)\n;;=> -1\n(unchecked-byte -1.9)\n;;=> -1\n(unchecked-byte -5/3)\n;;=> -1\n\n;;;; Note that (unchecked-byte) does not range check its argument\n;;;; so integer overflow or rounding may occur. \n;;;; Use (byte) if you want to throw an exception in such cases.\n\n(unchecked-byte 128)\n;;=> -128\n(unchecked-byte -129)\n;;=> 129\n\n(byte 128)\n;;=> IllegalArgumentException Value out of range for byte: 128\n(byte -129)\n;;=> IllegalArgumentException Value out of range for byte: -129\n\n(unchecked-byte 1.0E2)\n;;=> 100\n(unchecked-byte 1.0E3)\n;;=> -24\n\n(byte 1.0E2)\n;;=> 100\n(byte 1.0E3)\n;;=> IllegalArgumentException Value out of range for byte: 1000.0", :_id "592f2609e4b06e730307db1b"}], :notes nil, :arglists ["x"], :doc "Coerce to byte. Subject to rounding or truncation.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-byte"} {:added "1.0", :ns "clojure.core", :name "with-local-vars", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1374310504000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-bindings", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cea"} {:created-at 1423524505831, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "var-set", :library-url "https://github.com/clojure/clojure"}, :_id "54d94299e4b081e022073c7d"} {:created-at 1437143798426, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "volatile!", :ns "clojure.core"}, :_id "55a912f6e4b06a85937088aa"} {:created-at 1461815729270, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "var-get", :ns "clojure.core"}, :_id "572189b1e4b0f8c89e75b110"}], :line 4340, :examples [{:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; with-local-vars allows you to write more imperative-style code, for cases\n;; where you really want to. factorial isn't a case where it helps, but\n;; it is short and familiar. Note that (var-get acc) can be abbreviated\n;; as @acc\nuser=> (defn factorial [x]\n (with-local-vars [acc 1, cnt x]\n (while (> @cnt 0)\n (var-set acc (* @acc @cnt))\n (var-set cnt (dec @cnt)))\n @acc))\n#'user/factorial\nuser=> (factorial 7)\n5040\n", :created-at 1331249053000, :updated-at 1331249053000, :_id "542692d6c026201cdc3270b9"} {:updated-at 1492497328392, :created-at 1492497328392, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :body "(with-local-vars [a-local-var-variable \"value\"]\n ;; If you use the symbol by itself, you get the Var back\n (println a-local-var-variable)\n ;; So when using local var variables, you must explicitly\n ;; get the value inside the Var\n (println (var-get a-local-var-variable))\n ;; You can also get the value of a Var by using deref\n (println (deref a-local-var-variable))\n ;; Or the @ reader macro\n (println @a-local-var-variable))", :_id "58f5b3b0e4b01f4add58fe96"} {:updated-at 1567623091068, :created-at 1500198345816, :author {:login "char16t", :account-source "github", :avatar-url "https://avatars6.githubusercontent.com/u/5310476?v=4"}, :body ";; with-local-vars allows you to write more imperative-style code, for cases\n;; where you really want to. This example demonstrate how to change variable value\n;; like in for-loop. There used doseq instead of for, because `for` is a macro\n;; that generates lazy sequence that will be realized out of ranges\n;; with-local-vars block \n(with-local-vars [n 0] \n (doseq [x (range 3)]\n (do (var-set n (inc (var-get n)))\n (println (var-get n)))))\n; 1\n; 2\n; 3\n;=> nil\n", :editors [{:avatar-url "https://avatars6.githubusercontent.com/u/5310476?v=4", :account-source "github", :login "char16t"} {:login "cloojure", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/7083783?v=4"}], :_id "596b35c9e4b0d19c2ce9d6fc"}], :macro true, :notes nil, :arglists ["name-vals-vec & body"], :doc "varbinding=> symbol init-expr\n\n Executes the exprs in a context in which the symbols are bound to\n vars with per-thread bindings to the init-exprs. The symbols refer\n to the var objects themselves, and must be accessed with var-get and\n var-set", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/with-local-vars"} {:added "1.0", :ns "clojure.core", :name "ns-imports", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1288055178000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "ns-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e00"}], :line 4200, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [], :body "user> (ns-imports 'clojure.core)\n{ClassVisitor clojure.asm.ClassVisitor, ProcessBuilder java.lang.ProcessBuilder, Enum java.lang.Enum, SuppressWarnings java.lang.SuppressWarnings, Throwable java.lang.Throwable, InterruptedException ...chop...}", :created-at 1288074884000, :updated-at 1288074884000, :_id "542692ccc026201cdc326c68"}], :notes nil, :arglists ["ns"], :doc "Returns a map of the import mappings for the namespace.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ns-imports"} {:added "1.0", :ns "clojure.core", :name "send-off", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1282635172000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "send", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e37"} {:created-at 1282635178000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "agent", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e38"} {:created-at 1282635185000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "shutdown-agents", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e39"} {:created-at 1614551206060, :author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "send-via", :ns "clojure.core"}, :_id "603c18a6e4b0b1e3652d7468"}], :line 2122, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"} {:login "sfreund", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a288ab5288d2c86c37f8ae3aaa133b1a?r=PG&default=identicon"} {:login "sfreund", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a288ab5288d2c86c37f8ae3aaa133b1a?r=PG&default=identicon"} {:login "fordsfords", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7671908?v=3"}], :body "user=> (def my-agent (agent \"\"))\n#'user/my-agent\nuser=> @my-agent\n\"\"\n\n;; Note the following happens asynchronously in a thread\n;; pool\nuser=> (send-off my-agent #(slurp %2) \"file.txt\")\n#\n\n;; while the slurp is in-progress, @my-agent will return \"\".\n\n;; Once the request has completed, the value will\n;; be updated when we look at it.\nuser=> @my-agent\n\"file contents\"\n", :created-at 1285922554000, :updated-at 1417372052900, :_id "542692c8c026201cdc326a5a"} {:editors [{:login "kwladyka", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/3903726?v=3"}], :body ";; send should be used for actions that are CPU limited,\n;; while send-off is appropriate for actions that may block on IO.\n\n;; send is like async/go, send-off is like async/thread\n;; so send use limited pool by CPU for agents to not overload CPU,\n;; while send-off use independent threads without limitations.", :author {:avatar-url "https://avatars1.githubusercontent.com/u/3903726?v=3", :account-source "github", :login "kwladyka"}, :created-at 1496609297326, :updated-at 1496609746458, :_id "59347211e4b06e730307db22"}], :notes [{:updated-at 1396535611000, :body "The example uses \"send\", this is supposed to be an example for \"send-off\".", :created-at 1396535611000, :author {:login "Benissimo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e580eaf74a5f97c7ea01e0c026221a1d?r=PG&default=identicon"}, :_id "542692edf6e94c6970522022"} {:body "\"send\" and \"send-off\" are identical in syntax and semantics. The only difference is the thread pool used to dispatch the agent. \"send\" uses a fixed-sized thread pool initialized at startup to contain a few more threads than the number of cores on the host computer. Since \"send\"s thread pool is fixed size, using it to dispatch blocking code can result in all the pool's threads being blocked, and other \"send\"s queued waiting for a thread to finish its work. This can produce artificially low performance, and in rare conditions, can deadlock (if a queued thread is needed to unblock the blocked pool threads).\n\n\"send-off\" uses a separate thread pool which can grow as-needed. I.e. a \"send-off\" request will never be queued waiting for a thread; if the existing pool is empty, a new thread is created. However, if many long-running CPU-bound (not blocking) requests are being submitted, \"send-off\" can be counter-productive; having more CPU-bound threads than cores results in unnecessary scheduling overhead as the threads are timeshared across the cores. \"send\"s limited thread pool produces higher throughput for CPU-bound requests.", :created-at 1417371642071, :updated-at 1417372219777, :author {:login "fordsfords", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7671908?v=3"}, :_id "547b5ffae4b0dc573b892fe6"}], :arglists ["a f & args"], :doc "Dispatch a potentially blocking action to an agent. Returns the\n agent immediately. Subsequently, in a separate thread, the state of\n the agent will be set to the value of:\n\n (apply action-fn state-of-agent args)", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/send-off"} {:added "1.0", :ns "clojure.core", :name "defmacro", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1336311079000, :author {:login "redraiment", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/33087654dbc710e81f51fda5f8241f28?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "macroexpand", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f7d"} {:created-at 1336311088000, :author {:login "redraiment", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/33087654dbc710e81f51fda5f8241f28?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "macroexpand-1", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f7e"} {:created-at 1336311122000, :author {:login "redraiment", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/33087654dbc710e81f51fda5f8241f28?r=PG&default=identicon"}, :to-var {:ns "clojure.walk", :name "macroexpand-all", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f7f"}], :line 444, :examples [{:author {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"}, :editors [{:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"} {:login "kochb", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1012892?v=3"}], :body "(defmacro with-tree\n \"works on a JTree and restores its expanded paths after executing body\"\n [tree & body]\n `(let [tree# ~tree\n root# (.getRoot (.getModel tree#))\n expanded# (if-let [x# (.getExpandedDescendants\n tree# (TreePath. root#))]\n (enumeration-seq x#)\n ())\n selectionpaths# (. selectionmodel# getSelectionPaths)]\n ~@body\n (doseq [path# expanded#]\n (.expandPath tree# path#))))\n\n;; usage:\n\n(with-tree *one-jtree-instance*\n ;; some code here...\n )", :created-at 1286492372000, :updated-at 1421193676346, :_id "542692ccc026201cdc326c86"} {:author {:login "Clinton", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e460563f35b0b25d8671d6ef83f54ce?r=PG&default=identicon"}, :editors [], :body "(defmacro unless [pred a b]\n `(if (not ~pred) ~a ~b))\n\n;; usage:\n\n(unless false (println \"Will print\") (println \"Will not print\"))", :created-at 1327060274000, :updated-at 1327060274000, :_id "542692d2c026201cdc326f7a"} {:author {:login "octopusgrabbus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon"}, :editors [], :body "(def dbg 1)\n\n(defmacro chk-flagM\n \"Throws an exception if flag does not resolve; else returns flag's value.\"\n [flag]\n (if (not (resolve flag))\n (throw (Exception. (str 'flag \" is not a valid var.\")))\n flag))\n\n(defn write-csv-file\n \"Writes a csv file using a key and an s-o-s\"\n [out-sos out-file]\n\n (if (>= (chk-flagM dbg) 2)\n (println (first out-sos), \"\\n\", out-file))\n\n (spit out-file \"\" :append false)\n (with-open [out-data (io/writer out-file)]\n (csv/write-csv out-data (map #(concat % [\"\"]) out-sos))))\n\n", :created-at 1361941726000, :updated-at 1361941726000, :_id "542692d2c026201cdc326f7b"} {:updated-at 1592919257677, :created-at 1592919257677, :author {:login "vale981", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4025991?v=4"}, :body ";; We can implement algebraic infix notation, which is quite handy for\n;; typing in formulas. :-)\n\n(defmacro __\n \"Expands algebraic infix notation to standard clojure forms. Supports\n operator precedence.\"\n [[item op & rst :as lst]]\n (let [item (if (seq? item)\n `(__ ~item)\n item)]\n (if op\n (case op\n (+ -) `(~op ~item (__ ~rst))\n (* /) (let [[next & rst] rst]\n `(__\n ((~op ~item\n ~(if (seq? next)\n `(__ ~next) next)) ~@rst)))\n ;; we already have a clojure form\n lst)\n item)))\n\n(clojure.walk/macroexpand-all '(__ (1 * 2 + 3 * 4 + (1 + 2))))\n;; => (+ (* 1 2) (+ (* 3 4) (+ 1 2)))\n\n;; parens for precedence\n(clojure.walk/macroexpand-all '(__ (1 + 2 * (3 + 4))))\n;; => (+ 1 (* 2 (+ 3 4)))\n\n;; usual clojure notation in the middle of it\n(clojure.walk/macroexpand-all '(__ (1 + 2 * (+ 3 4))))\n;; => (+ 1 (* 2 (+ 3 4)))", :_id "5ef204d9e4b0b1e3652d730e"} {:updated-at 1603447108371, :created-at 1603446989723, :author {:login "jimka2001", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/6414129?v=4"}, :body ";; The meta data notation `^:dynamic` can be used to force a variable to be dynamic.\n\n(def ^:dynamic *my-dynamic-variable* \"my doc string\" the-initial-value)\n\n;; However, using this notation within a macro does not have the same semantics.\n;; For example the following macro *will not* expand to a definition of a dynamic \n;; variable whose value is a function.\n\n\n(defmacro dyn-fun [name lambda-list & body]. ;; WRONG\n `(def ^:dynamic ~name (fn ~lambda-list ~@body)))\n\n\n;; The macro should be written something like the following.\n\n\n(defmacro dyn-fun [name lambda-list & body]\n `(def ~(with-meta name {:dynamic true}) (fn ~lambda-list ~@body)))\n", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/6414129?v=4", :account-source "github", :login "jimka2001"}], :_id "5f92a8cde4b0b1e3652d73e8"}], :macro true, :notes [{:updated-at 1332614198000, :body "The body of a macro has two implicitly bound symbols: &form and &env. They work like two extra unnamed args. The names begin with '&' to avoid name clashes with normal user-defined symbols. The value of &form is the form of the original macro call before macro expansion. There's useful meta-data on &form. The value of &env is the \"environment\", which is basically a map of lexical bindings. The keys of &env are the lexically bound symbols. The values are internal compiler details, and probably aren't useful for user code.\r\n\r\n\r\nSee also:\r\n[http://blog.jayfields.com/2011/02/clojure-and.html](http://blog.jayfields.com/2011/02/clojure-and.html)", :created-at 1332559647000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fdc"} {:updated-at 1348338864000, :body "Due to syntax-quote resolving symbols (see the [Clojure reader docs](http://clojure.org/reader)), you won't be able to include a regular `let` statement inside a macro, i.e.:\r\n\r\n
    (defmacro m [] `(let [x 1] x))\r\n(m) ; => CompilerException java.lang.RuntimeException: Can't let qualified name: user/x, compiling:(NO_SOURCE_PATH:1)
    \r\n\r\nWe can see why:\r\n\r\n
    (macroexpand-1 '(m)) ; => (clojure.core/let [user/x 1] user/x)
    \r\nThe syntax-quote has resolved `x` to `user/x`—which can't be `let`. This is a good thing, as it's signalling to us that we should use gensyms by appending `#`:\r\n\r\n
    (defmacro m [] `(let [x# 1] x#))\r\n(m) ; => 1\r\n(macroexpand-1 '(m)) ; => (clojure.core/let [x__383__auto__ 1] x__383__auto__)
    ", :created-at 1348338864000, :author {:login "Arlen", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8bfb3a1eb9879049b4886cd3f9f321c4?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fe7"} {:updated-at 1396943327000, :body "@Arlen:\r\nIf you want to capture the local variables, or create a non-locally scoped variable, you can prepend them with ~', allow a namespace capture:\r\n\r\n
    (defmacro m [] `(let [~'x 1] ~'x))\r\n(m) ; => 1\r\n(macroexpand-1 '(m)) ; => (clojure.core/let [x 1] x)\r\n
    \r\nuseful, if you desire it.", :created-at 1396943283000, :author {:login "travis_rodman", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/988e7de687c27107309bebe02aee1984?r=PG&default=identicon"}, :_id "542692edf6e94c6970522024"} {:body "When debugging macros that use &env, beware that
    clojure.walk/macroexpand-all
    doesn't \"set up\" any symbols. It ignores any symbols from
    (let [...] ...)
    and similar. To test &env, run the macro directly.", :created-at 1547117881414, :updated-at 1547117901908, :author {:avatar-url "https://avatars2.githubusercontent.com/u/4270240?v=4", :account-source "github", :login "peter-kehl"}, :_id "5c372539e4b0ca44402ef619"}], :arglists ["name doc-string? attr-map? [params*] body" "name doc-string? attr-map? ([params*] body) + attr-map?"], :doc "Like defn, but the resulting function name is declared as a\n macro and will be used as a macro by the compiler when it is\n called.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/defmacro"} {:added "1.3", :ns "clojure.core", :name "every-pred", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1348529552000, :author {:login "hugoduncan", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/80fa2a15219b987664e4d6f5c78b4c27?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "some-fn", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bf2"} {:created-at 1422932166689, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "every?", :library-url "https://github.com/clojure/clojure"}, :_id "54d038c6e4b0e2ac61831cf4"}], :line 7396, :examples [{:updated-at 1335431607000, :created-at 1335431607000, :body "user=> ((every-pred number? odd?) 3 9 11)\ntrue", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692d2c026201cdc326fa0"} {:editors [{:login "daveliepmann", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/974443?v=4"}], :body "(filter (every-pred pos? ratio?)\n [0 2/3 -2/3 1/4 -1/10 5 3/3])\n=> (2/3 1/4)", :author {:avatar-url "https://avatars3.githubusercontent.com/u/974443?v=4", :account-source "github", :login "daveliepmann"}, :created-at 1549903494471, :updated-at 1551557625726, :_id "5c61a686e4b0ca44402ef67b"} {:updated-at 1549903552234, :created-at 1549903552234, :author {:login "daveliepmann", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/974443?v=4"}, :body "((every-pred string? (comp (partial > 5) count)) \"abc\")\ntrue\n((every-pred string? (comp (partial > 5) count)) \"abcdef\")\nfalse", :_id "5c61a6c0e4b0ca44402ef67c"}], :notes [{:body "Careful—every predicate with no arguments is considered true:\n
    \nuser> ((every-pred (constantly false)))\ntrue\nuser> ((every-pred (constantly false)) 1)\nfalse\n
    ", :created-at 1468616330948, :updated-at 1468616364083, :author {:avatar-url "https://avatars.githubusercontent.com/u/7443?v=3", :account-source "github", :login "harold"}, :_id "57894e8ae4b0bafd3e2a04a3"}], :arglists ["p" "p1 p2" "p1 p2 p3" "p1 p2 p3 & ps"], :doc "Takes a set of predicates and returns a function f that returns true if all of its\n composing predicates return a logical true value against all of its arguments, else it returns\n false. Note that f is short-circuiting in that it will stop execution on the first\n argument that triggers a logical false result against the original predicates.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/every-pred"} {:added "1.0", :ns "clojure.core", :name "keys", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1289979132000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "vals", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cef"} {:created-at 1289979143000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "hash-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cf0"} {:created-at 1318592870000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "key", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cf1"} {:created-at 1470842025768, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "select-keys", :ns "clojure.core"}, :_id "57ab44a9e4b0bafd3e2a04db"}], :line 1555, :examples [{:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "(keys {:keys :and, :some :values})\n;;=> (:keys :some)\n\n(keys {})\n;;=> nil\n\n(keys nil)\n;;=> nil", :created-at 1280458583000, :updated-at 1423522822893, :_id "542692c7c026201cdc326951"} {:updated-at 1477296966414, :created-at 1477296966414, :author {:login "gzmask", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/132936?v=3"}, :body ";; although doc says it only takes a map, this still works:\n(keys (filter (fn [[_ v]] (-> v :t)) {:a {:t true} :b {:t false} :c {:t true}}))\n;;=> (:a :c)", :_id "580dc346e4b001179b66bddb"}], :notes [{:updated-at 1385457055000, :body "Functions keys and vals return sequences such that\r\n
    \r\n(= (zipmap (keys m) (vals m)) m)\r\n
    ", :created-at 1385457055000, :author {:login "akhudek", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/aaf21f137b69cc5154c8afb29b793e18?r=PG&default=identicon"}, :_id "542692edf6e94c6970522010"} {:body "I noticed that the keys are not always returned in the same order. Usually they are, but not always.", :created-at 1443420358374, :updated-at 1443420375336, :author {:avatar-url "https://avatars.githubusercontent.com/u/5528061?v=3", :account-source "github", :login "Jarzka"}, :_id "5608d8c6e4b08e404b6c1c8a"} {:author {:login "ac1dr3d", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10298138?v=4"}, :updated-at 1522928591363, :created-at 1522928591363, :body "Map with 8 or more keys order are unexpected.", :_id "5ac60bcfe4b045c27b7fac36"}], :arglists ["map"], :doc "Returns a sequence of the map's keys, in the same order as (seq map).", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/keys"} {:added "1.0", :ns "clojure.core", :name "rationalize", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 1277, :examples [{:author {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}, :editors [], :body "
    \r\nuser=> (rationalize 1.5)\r\n3/2\r\n
    ", :created-at 1283819843000, :updated-at 1283819843000, :_id "542692cbc026201cdc326c27"} {:updated-at 1335430728000, :created-at 1335430728000, :body "user=> (rationalize Math/PI)\n3141592653589793/1000000000000000\n\nuser=> (rationalize (Math/sqrt 2))\n14142135623730951/10000000000000000", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692d4c026201cdc327049"} {:body "(rationalize 2/4)\n;; => 1/2\n\n(rationalize 4/2)\n;; => 2\n\n(rationalize 2)\n;; => 2\n\n(rationalize 2.0)\n;; => 2N", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423041167517, :updated-at 1423041167517, :_id "54d1e28fe4b0e2ac61831d0c"} {:updated-at 1495120328324, :created-at 1495120328324, :author {:login "mhmdsalem1993", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/10787314?v=3"}, :body ";; To quickly convert a mixed number to an improper fraction, \n;; multiply the denominator\n;; by the whole number and add to the numerator\n\n(= (+ 20 3/4) (rationalize (/ (+ (* 20 4) 3) 4)))\n;; => true", :_id "591db9c8e4b01920063ee061"}], :notes [{:updated-at 1388083523000, :body "Remember that for irrational numbers, like sqrt 2, this is only an estimate (pretty good one). ", :created-at 1388083523000, :author {:login "wikopl", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ebf7a80146fda866cb2737cbabf79d63?r=PG&default=identicon"}, :_id "542692edf6e94c6970522017"}], :arglists ["num"], :doc "returns the rational value of num", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/rationalize"} {:added "1.0", :ns "clojure.core", :name "load-file", :type "function", :see-alsos [{:created-at 1286271536000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "load", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d3c"} {:created-at 1350073018000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "spit", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d3d"} {:created-at 1519290658085, :author {:login "witek", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/209520?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "load-string", :ns "clojure.core"}, :_id "5a8e8922e4b0316c0f44f8e9"}], :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "shawnmorel", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4a701b9e9467b6ccee6b83c698ea6b15?r=PG&default=identicon"} {:login "Jeff Terrell", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/658b2643cf2a8192286b5bb1ecb62cf8?r=PG&default=identicon"}], :body ";; Very useful from a REPL\n;; Paths are specified as strings using canonical file path notation \n;; (rather than clojure-style namespaces dependent on the JVM classpath).\n;; The working directory is set to wherever you invoked the JVM from, \n;; likely the project root.\n\n(load-file \"src/mylib/core.clj\")\n\n;; now you can go and evaluate vars defined in that file.", :created-at 1286271505000, :updated-at 1344912514000, :_id "542692cdc026201cdc326d3e"} {:author {:login "lambder", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1c0c20072f52de3a6335cae183b865f6?r=PG&default=identicon"}, :editors [{:login "lambder", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1c0c20072f52de3a6335cae183b865f6?r=PG&default=identicon"}], :body ";; file located at src/address_book/core.clj\n;; current dir is src/..\n\n(load-file \"src/address_book/core.clj\")", :created-at 1307936530000, :updated-at 1307936548000, :_id "542692cdc026201cdc326d41"} {:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4", :account-source "github", :login "bfontaine"} {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4"}], :body ";; create a clojure file on the fly using spit\n;; then load it into the REPL and use its function\n\nuser=> (spit \"mycode.clj\" \"(defn doub [x] (* x 2))\")\nnil\nuser=> (load-file \"mycode.clj\")\n#'user/doub\nuser=> (doub 23)\n46\n\n;; Note this is similar to using load-string:\nuser=> (load-string \"(defn doub [x] (* x 2))\")\n#'user/doub", :created-at 1313970180000, :updated-at 1666340708697, :_id "542692cdc026201cdc326d43"}], :notes [{:updated-at 1350351731000, :body "

    Be aware that this function is intended to load code only. If your data structures or a string in them grow bigger than around 65,535 it crashes.

    \r\n\r\n

    Exception similar to:

    \r\n
    java.lang.ClassFormatError: Unknown constant tag 49 in class file parse$eval13
    \r\n\r\n

    Please use read-string instead.

    \r\n\r\nExample:
    (read-string (slurp \"data.clj\"))
    \r\n\r\nSource: Google Groups", :created-at 1350351731000, :author {:login "dedeibel", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e89e54d864f1e584c5ef4102f98bc83?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fee"} {:updated-at 1371613686000, :body "

    The following marginally helpful error will be thrown if you have a typo in your file:

    \r\n\r\n
    CompilerException java.lang.RuntimeException: Unable to resolve symbol: load-file in this context, compiling:(NO_SOURCE_PATH:1:1)
    \r\n\r\n

    Fix the syntax error(s) in and you'll be able to use load-file again.

    \r\n\r\n\r\n", :created-at 1371447277000, :author {:login "arkh", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1c6ed9b963d758914c2744befd4974ca?r=PG&default=identicon"}, :_id "542692edf6e94c6970522005"}], :arglists ["name"], :doc "Sequentially read and evaluate the set of forms contained in the file.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/load-file"} {:added "1.0", :ns "clojure.core", :name "distinct?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1396938477000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "distinct", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bf7"}], :line 5685, :examples [{:updated-at 1521560626736, :created-at 1279073728000, :body "user=> (distinct? 1 2 3)\ntrue\nuser=> (distinct? 1 2 3 3)\nfalse\nuser=> (distinct? 1 2 3 1)\nfalse", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/675861?v=3", :account-source "github", :login "fellipebrito"} {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/147981?v=3", :account-source "github", :login "dpritchett"}, :_id "542692c9c026201cdc326a8f"} {:editors [{:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"} {:login "rmfbarker", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4708454?v=4"}], :body "(distinct? ['A 'A 'c]) ;;=> true\n(distinct? 'A 'A 'c) ;;=> false\n(apply distinct? ['A 'A 'c]) ;;=> false\n\n(distinct? [1 1 'c]) ;;=> true\n(distinct? 1 1 'c) ;;=> false\n\n;; Like `min` or `max` and unlike `distinct` the \n;; parameters are taken separately, i.e. not in a \n;; collection. ", :author {:avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4", :account-source "github", :login "Crowbrammer"}, :created-at 1615302123852, :updated-at 1687644700733, :_id "60478debe4b0b1e3652d747d"}], :notes nil, :tag "java.lang.Boolean", :arglists ["x" "x y" "x y & more"], :doc "Returns true if no two of the arguments are =", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/distinct_q"} {:added "1.9", :ns "clojure.core", :name "pos-int?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495640931493, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "neg-int?", :ns "clojure.core"}, :_id "5925ab63e4b093ada4d4d730"} {:created-at 1495640936398, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nat-int?", :ns "clojure.core"}, :_id "5925ab68e4b093ada4d4d731"} {:created-at 1495705345491, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "int?", :ns "clojure.core"}, :_id "5926a701e4b093ada4d4d74e"}], :line 1408, :examples [{:editors [{:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}], :body "(pos-int? 1)\n;;=> true\n(pos-int? 9223372036854775807)\n;;=> true\n\n;;;; false for non-positive values\n\n(pos-int? 0)\n;;=> false\n(pos-int? -1)\n;;=> false\n\n;;;; false for decimal values\n\n(pos-int? 1.0)\n;;=> false\n(pos-int? 1/2)\n;;=> false\n\n;;;; false for BigInt values\n\n(pos-int? 1N)\n;;=> false\n(pos-int? 9223372036854775808)\n;;=> false", :author {:avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3", :account-source "github", :login "svenschoenung"}, :created-at 1495703711193, :updated-at 1495703782768, :_id "5926a09fe4b093ada4d4d74b"}], :notes nil, :arglists ["x"], :doc "Return true if x is a positive fixed precision integer", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/pos-int_q"} {:added "1.2", :ns "clojure.core", :name "extenders", :file "clojure/core_deftype.clj", :type "function", :column 1, :see-alsos [{:created-at 1542365699743, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defprotocol", :ns "clojure.core"}, :_id "5beea203e4b00ac801ed9eff"} {:created-at 1542365712085, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "extends?", :ns "clojure.core"}, :_id "5beea210e4b00ac801ed9f00"}], :line 563, :examples [{:author {:login "leifp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d2f37720f063404ef83b987d2824353d?r=PG&default=identicon"}, :editors [], :body "user=> (defprotocol P (id [this]))\nP\nuser=> (extend-protocol P \n String \n (id [this] this)\n clojure.lang.Symbol \n (id [this] (name this))\n clojure.lang.Keyword\n (id [this] (name this)))\nnil\nuser=> (extenders P)\n(java.lang.String clojure.lang.Symbol clojure.lang.Keyword)\n", :created-at 1342531381000, :updated-at 1342531381000, :_id "542692d3c026201cdc326fa3"}], :notes nil, :arglists ["protocol"], :doc "Returns a collection of the types explicitly extending protocol", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/extenders"} {:added "1.3", :ns "clojure.core", :name "unchecked-short", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1496261308269, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "short", :ns "clojure.core"}, :_id "592f22bce4b06e730307db19"}], :line 3522, :examples [{:editors [{:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}], :body "(unchecked-short 1)\n;;=> 1\n(unchecked-short 1N)\n;;=> 1\n(unchecked-short 1.1)\n;;=> 1\n(unchecked-short 1.9)\n;;=> 1\n(unchecked-short 5/3)\n;;=> 1\n\n(unchecked-short -1)\n;;=> -1\n(unchecked-short -1N)\n;;=> -1\n(unchecked-short -1.1)\n;;=> -1\n(unchecked-short -1.9)\n;;=> -1\n(unchecked-short -5/3)\n;;=> -1\n\n;;;; Note that (unchecked-short) does not range check its argument\n;;;; so integer overflow or rounding may occur. \n;;;; Use (short) if you want to throw an exception in such cases.\n\n(unchecked-short 32768)\n;;=> -32768\n(unchecked-short -32769)\n;;=> 32767\n\n(short 32768)\n;;=> IllegalArgumentException Value out of range for short: 32768\n(short -32769)\n;;=> IllegalArgumentException Value out of range for short: -32769\n\n(unchecked-short 1.0E4)\n;;=> 10000\n(unchecked-short 1.0E5)\n;;=> -31072\n\n(short 1.0E4)\n;;=> 10000\n(short 1.0E5)\n;;=> IllegalArgumentException Value out of range for short: 100000.0\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3", :account-source "github", :login "svenschoenung"}, :created-at 1496261208846, :updated-at 1496261256909, :_id "592f2258e4b06e730307db17"}], :notes nil, :arglists ["x"], :doc "Coerce to short. Subject to rounding or truncation.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-short"} {:added "1.0", :ns "clojure.core", :name "methods", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1337585063000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "get-method", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f4f"} {:created-at 1337585066000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "remove-method", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f50"} {:created-at 1337585074000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "prefer-method", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f51"} {:created-at 1337585077000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "prefers", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f52"}], :line 1811, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user=> (use 'clojure.pprint)\nuser=> (pprint (methods print-dup))\n{nil #,\n java.lang.String #,\n java.lang.Boolean #,\n clojure.lang.IPersistentList\n #,\n java.sql.Timestamp\n #,\n java.util.UUID #,\n clojure.lang.Var #,\n clojure.lang.PersistentVector\n #,\n java.util.Calendar\n #,\n java.util.Map #,\n java.lang.Class #,\n java.util.regex.Pattern #,\n java.lang.Number #,\n java.lang.Long #,\n clojure.lang.Namespace #,\n java.math.BigDecimal #,\n clojure.lang.Symbol #,\n clojure.lang.Keyword #,\n clojure.lang.LazilyPersistentVector\n #,\n java.util.Collection #,\n java.lang.Double #,\n clojure.lang.Fn #,\n clojure.lang.IRecord #,\n clojure.lang.PersistentHashSet\n #,\n clojure.lang.IPersistentCollection\n #,\n clojure.lang.BigInt #,\n clojure.lang.ISeq #,\n java.util.Date #,\n clojure.lang.PersistentHashMap\n #,\n clojure.lang.IPersistentMap\n #,\n clojure.lang.Ratio #,\n java.lang.Character #}", :created-at 1286272206000, :updated-at 1423014816147, :_id "542692ccc026201cdc326cc5"} {:updated-at 1456200644152, :created-at 1456200644152, :author {:login "runningskull", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/187989?v=3"}, :body "user=> (defmulti do-math (fn [operation x y] operation))\n\n#'user/do-math\n\nuser=> (defmethod do-math :add [_ x y] (+ x y))\n... (defmethod do-math :subtract [_ x y] (- x y))\n... (defmethod do-math :hypotenuse [_ x y] (Math/sqrt (+ (* x x) (* y y))))\n\n#multifn[do-math 0x3a1c348]\n\nuser=> (methods do-math)\n\n{:hypotenuse #function[user/eval42540$fn--42541],\n :add #function[user/eval42521$fn--42522],\n :subtract #function[user/eval42525$fn--42526]}\n", :_id "56cbdbc4e4b0b41f39d96cd2"}], :notes [{:updated-at 1286272245000, :body "Not the most useful output format I've ever seen. :-)", :created-at 1286272245000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f99"}], :arglists ["multifn"], :doc "Given a multimethod, returns a map of dispatch values -> dispatch fns", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/methods"} {:added "1.0", :ns "clojure.core", :name "odd?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "even?", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1354423246000, :_id "542692ebf6e94c6970521d53"}], :line 1394, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (odd? 1)\ntrue\nuser=> (odd? 2)\nfalse\nuser=> (odd? 0)\nfalse", :created-at 1279074688000, :updated-at 1332952870000, :_id "542692c8c026201cdc3269e5"} {:body "user=> (filter odd? (range 15))\n(1 3 5 7 9 11 13)", :author {:login "mookid", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7757342?v=3"}, :created-at 1429217504160, :updated-at 1429217504160, :_id "553020e0e4b033f34014b76f"}], :notes nil, :arglists ["n"], :doc "Returns true if n is odd, throws an exception if n is not an integer", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/odd_q"} {:ns "clojure.core", :name "->ArrayChunk", :file "clojure/gvec.clj", :type "function", :column 1, :see-alsos nil, :line 36, :examples nil, :notes nil, :arglists ["am arr off end"], :doc "Positional factory function for class clojure.core.ArrayChunk.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/->ArrayChunk"} {:added "1.0", :ns "clojure.core", :name "float-array", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1657816974619, :author {:login "rosejn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/36590?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "aset", :ns "clojure.core"}, :_id "62d0478ee4b0b1e3652d7620"} {:created-at 1657816984539, :author {:login "rosejn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/36590?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "aget", :ns "clojure.core"}, :_id "62d04798e4b0b1e3652d7621"}], :line 5277, :examples [{:updated-at 1657817072470, :created-at 1281617421000, :body "user=> (float-array [1 2 3])\n#\nuser=> (aget *1 2)\n3.0\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "rosejn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/36590?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon", :account-source "clojuredocs", :login "gstamp"}, :_id "542692c9c026201cdc326ae0"} {:editors [{:login "JulienRouse", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/5703619?v=4"}], :body "user=> (def f (float-array [1 2 3]))\n#'user/f\n\nuser=> f\n#object[\"[F\" 0x56ce4eda \"[F@56ce4eda\"]\n\n;;You can transform the array back into a Clojure vector with vec\nuser=> (vec f)\n[1.0 2.0 3.0]\n\n;;Also with into, works with list vector and set but not map\nuser=> (into [] f)\n[1.0 2.0 3.0]\n\nuser=> (into () f)\n(3.0 2.0 1.0)\n\nuser=> (into #{} f)\n=> #{3.0 2.0 1.0}\n\nuser=> (into {} f)\nExecution error (IllegalArgumentException) at user/eval1691 \n(form-init8077017244851884694.clj:1).\nDon't know how to create ISeq from: java.lang.Float", :author {:avatar-url "https://avatars1.githubusercontent.com/u/5703619?v=4", :account-source "github", :login "JulienRouse"}, :created-at 1550505235553, :updated-at 1550515519268, :_id "5c6ad513e4b0ca44402ef68f"} {:editors [{:login "JulienRouse", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/5703619?v=4"}], :body ";;Works for vector, list and set\nuser=> (float-array [1 2 3])\n#object[\"[F\" 0x6a86faa1 \"[F@6a86faa1\"]\n\nuser=> (float-array '(1 2 3))\n#object[\"[F\" 0xd5e9fe8 \"[F@d5e9fe8\"]\n\nuser=> (float-array #{1 2 3})\n#object[\"[F\" 0x7b327946 \"[F@7b327946\"]\n\n;;But not map\nuser=> (float-array {1 2})\nExecution error (ClassCastException) at user/eval2022 \n(form-init8077017244851884694.clj:1).\nclojure.lang.MapEntry cannot be cast to java.lang.Number", :author {:avatar-url "https://avatars1.githubusercontent.com/u/5703619?v=4", :account-source "github", :login "JulienRouse"}, :created-at 1550515507149, :updated-at 1550515532633, :_id "5c6afd33e4b0ca44402ef694"}], :notes nil, :arglists ["size-or-seq" "size init-val-or-seq"], :doc "Creates an array of floats", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/float-array"} {:added "1.0", :ns "clojure.core", :name "*3", :file "clojure/core.clj", :type "var", :column 1, :see-alsos [{:created-at 1302912219000, :author {:login "hoornet", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5834f829a9def19620d4014c46642172?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "*1", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d6a"} {:created-at 1302912225000, :author {:login "hoornet", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5834f829a9def19620d4014c46642172?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "*2", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d6b"}], :dynamic true, :line 6289, :examples [{:updated-at 1285502085000, :created-at 1279048146000, :body "user=> \"Hello!\"\n\"Hello!\"\n\nuser=> \"Hello World!\"\n\"Hello World!\"\n\nuser=> \"Hi Everyone!\"\n\"Hi Everyone!\"\n\nuser=> [*1 *2 *3]\n[\"Hi Everyone!\" \"Hello World!\" \"Hello!\"]\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692c6c026201cdc326913"} {:updated-at 1285502101000, :created-at 1279048336000, :body "user=> (range 5)\n(0 1 2 3 4)\nuser=> (last *1)\n4\nuser=> (last *2)\n4\nuser=> (last *3)\n4\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692c6c026201cdc326915"}], :notes nil, :arglists [], :doc "bound in a repl thread to the third most recent value printed", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*3"} {:added "1.0", :ns "clojure.core", :name "alias", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1374148345000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ns-aliases", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d62"} {:created-at 1390613584000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "ns-unalias", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d63"} {:created-at 1412905255114, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "require", :library-url "https://github.com/clojure/clojure"}, :_id "54373927e4b0ae7956031580"} {:created-at 1416004697043, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:ns "clojure.core", :name "ns", :library-url "https://github.com/clojure/clojure"}, :_id "54668459e4b03d20a10242a5"}], :line 4264, :examples [{:author {:login "teyc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd6e62afb4881ab0f617611b8b65d003?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(require 'clojure.string)\n;;=> nil\n\n(alias 'string 'clojure.string)\n;;=> nil\n\n(string/capitalize \"hONdURas\")\n;;=> \"Honduras\"", :created-at 1283925470000, :updated-at 1416004474780, :_id "542692cec026201cdc326e01"} {:body ";; The alias can also be created when the \n;; namespace is required using the :as keyword.\n\n(require '[clojure.string :as string])\n(string/capitalize \"hONdURas\")\n;;=> \"Honduras\"", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1412886822918, :updated-at 1412886822918, :_id "5436f126e4b0ae795603157f"}], :notes nil, :arglists ["alias namespace-sym"], :doc "Add an alias in the current namespace to another\n namespace. Arguments are two symbols: the alias to be used, and\n the symbolic name of the target namespace. Use :as in the ns macro in preference\n to calling this directly.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/alias"} {:added "1.2", :ns "clojure.core", :name "frequencies", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1325040915000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "group-by", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d38"} {:created-at 1396938657000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "distinct", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d39"}], :line 7203, :examples [{:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (frequencies ['a 'b 'a 'a])\n{a 3, b 1}", :created-at 1282321661000, :updated-at 1332952608000, :_id "542692cac026201cdc326b14"} {:updated-at 1492057390955, :created-at 1492057390955, :author {:login "pharcosyle", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/60688?v=3"}, :body ";; Turn a frequency map back into a coll.\n\n(mapcat (fn [[x n]] (repeat n x)) {:a 2 :b 1 :c 3})\n;;=> (:a :a :b :c :c :c)\n", :_id "58eefd2ee4b01f4add58fe8d"} {:updated-at 1617958558047, :created-at 1617958558047, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1334295?v=4"}, :body ";; combine it with map to apply a function\n\n(def students\n [{:name \"Alice\" :age 23 :gender :female}\n {:name \"Bob\" :age 21 :gender :male}\n {:name \"John\" :age 23 :gender :male}\n {:name \"Maria\" :age 22 :gender :female}\n {:name \"Julie\" :age 22 :gender :female}])\n\n(frequencies (map :gender students))\n;; => {:female 3, :male 2}\n\n(frequencies (map :age students))\n;;=> {23 2, 21 1, 22 2}\n", :_id "6070169ee4b0b1e3652d74ba"}], :notes [{:updated-at 1358885265000, :body "
    (fn [coll]\r\n   (let [gp (group-by identity coll)] \r\n      (zipmap (keys gp) (map #(count (second %)) gp))))
    ", :created-at 1358885188000, :author {:login "lispro06", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/20c3faad6f66a434dae42b5ed8ad305?r=PG&default=identicon"}, :_id "542692edf6e94c6970521ffb"} {:updated-at 1370062406000, :body " (into {} (for [[k v] (group-by identity \"abbbc\")] [k (count v)]))\r\n", :created-at 1370062406000, :author {:login "danneu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c42635853936e509f76ece9d8187c4aa?r=PG&default=identicon"}, :_id "542692edf6e94c6970522004"} {:author {:login "ppsreejith", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1743700?v=3"}, :updated-at 1453125303725, :created-at 1453125303725, :body "
    \nuser=> (frequencies [3 6 2 6 8 7 'b 'c 3 5 3 4 7 6 'a])\n{2 1, 3 3, 4 1, 5 1, 6 3, 7 2, 8 1, a 1, c 1, b 1}\nuser=> (frequencies [3 6 2 6 8 7 'b 'c])\n{3 1, 6 2, 2 1, 8 1, 7 1, b 1, c 1}\n;Note that the order of keys need not be in order of vector\n
    ", :_id "569ceeb7e4b060004fc217ae"} {:author {:login "humorless", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/3061798?v=4"}, :updated-at 1557220455720, :created-at 1557220455720, :body "```\n(defn frequencies-by\n \"a generalized version of frequencies\"\n [f coll]\n (let [gp (group-by f coll)]\n (zipmap (keys gp) (map #(count (second %)) gp))))\n```", :_id "5cd14c67e4b0ca44402ef71b"}], :arglists ["coll"], :doc "Returns a map from distinct items in coll to the number of times\n they appear.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/frequencies"} {:added "1.0", :ns "clojure.core", :name "read-string", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1289454685000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pr-str", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a90"} {:created-at 1289454689000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "str", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a91"} {:created-at 1313054776000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "read", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a92"} {:created-at 1334883935000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "load-string", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a93"} {:created-at 1352963672000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "*read-eval*", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a94"} {:created-at 1422653056995, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=2"}, :to-var {:ns "clojure.main", :name "load-script", :library-url "https://github.com/clojure/clojure"}, :_id "54cbf680e4b0e2ac61831cef"} {:created-at 1422653083632, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=2"}, :to-var {:ns "clojure.edn", :name "read-string", :library-url "https://github.com/clojure/clojure"}, :_id "54cbf69be4b0e2ac61831cf0"}], :line 3805, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (read-string \"1.1\") \n1.1\n\nuser=> (read-string \"1.1.1 (+ 1 1)\")\njava.lang.RuntimeException: java.lang.NumberFormatException: Invalid number: 1.1.1 (NO_SOURCE_FILE:0)\n\nuser=> (read-string \"(+ 1 1)\")\n(+ 1 1)\n", :created-at 1282634798000, :updated-at 1285494370000, :_id "542692c9c026201cdc326ad6"} {:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [{:login "tormaroe", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8bc7bb10bee96efb190053fe92ffd250?r=PG&default=identicon"}], :body "user=> (eval (read-string \"(+ 1 1)\"))\n2\n\nuser=> (read-string (prn-str (+ 1 1)))\n2\n", :created-at 1289408002000, :updated-at 1289710230000, :_id "542692c9c026201cdc326ad8"} {:author {:login "benjiiiiii", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd1adaf32d9dc6531d6041dbc379efb0?r=PG&default=identicon"}, :editors [], :body "user=> (+ 11 (read-string \"23\"))\n34\n", :created-at 1291246357000, :updated-at 1291246357000, :_id "542692c9c026201cdc326ada"} {:author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}], :body "user=> (read-string \"; foo\\n5\")\n5\n\nuser=> (read-string \"#^String x\")\nx\n\nuser=> (read-string \"(1)\")\n(1)\n\nuser=> (read-string \"(+ 1 2) (- 3 2)\")\n(+ 1 2)\n\nuser=> (read-string \"@a\")\n(clojure.core/deref a)\n\nuser=> (read-string \"(+ 1 2))))))\")\n(+ 1 2)\n\nuser=> (read-string \"::whatever-namespace-you-are-in\")\n:user/whatever-namespace-you-are-in", :created-at 1335430367000, :updated-at 1335430553000, :_id "542692d5c026201cdc32705f"} {:author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :editors [{:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}], :body ";convert a string representing a sequence,\n;to the sequence that the string represents\nuser=> (read-string \"(\\\\( \\\\x \\\\y \\\\) \\\\z)\")\n(\\( \\x \\y \\) \\z)\n\n;then you can convert to the string that the string-sequence represents\nuser=> (apply str (read-string \"(\\\\( \\\\x \\\\y \\\\) \\\\z)\"))\n\"(xy)z\"\n\n;which is the inverse of\nuser=> (str (first (list (seq \"(xy)z\"))))\n\"(\\\\( \\\\x \\\\y \\\\) \\\\z)\"", :created-at 1345526514000, :updated-at 1345526600000, :_id "542692c9c026201cdc326adb"} {:author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :editors [], :body ";; you can think of read-string as the inverse of pr-str\n;; turn string into symbols\nuser=> (read-string \"(a b foo :bar)\")\n(a b foo :bar)\n\n;;turn symbols into a string\nuser=> (pr-str '(a b foo :bar))\n\"(a b foo :bar)\"", :created-at 1346843994000, :updated-at 1346843994000, :_id "542692d5c026201cdc327061"} {:updated-at 1518357675254, :created-at 1360635743000, :body ";; WARNING: You SHOULD NOT use clojure.core/read-string to read data from\n;; untrusted sources. See the examples for clojure.core/read, because the same\n;; issues exist for both read and read-string.", :editors [{:login "green-coder", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}, :_id "542692d5c026201cdc327062"} {:updated-at 1455932713195, :created-at 1455932713195, :author {:login "one-finger", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/17347889?v=3"}, :body ";; convert binary number provided in the form of a string to its numerical value.\nuser=> (read-string (str \"2r\" \"1011\"))\n11\n", :_id "56c7c529e4b0b41f39d96ccf"} {:updated-at 1613109472732, :created-at 1557061665574, :author {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/24317401?v=4"}, :body ";; be careful with octal values\nuser=> (read-string \"042\")\n34\n\nuser=> (read-string \"08\")\nExecution error (NumberFormatException)\nInvalid number: 08\n\n;; replace leading zeroes with regex\nuser=> (read-string (clojure.string/replace \"042\" #\"^0+(?!$)\" \"\"))\n42\n\nuser=> (read-string (clojure.string/replace \"00\" #\"^0+(?!$)\" \"\"))\n0", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/39972994?v=4", :account-source "github", :login "jocatelo"}], :_id "5ccee021e4b0ca44402ef71a"} {:editors [{:login "adanhawth", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/36526095?v=4"}], :body ";; if someone littered your csv fields with escaped double quotes...\n(def quoted-string \"\\\"1.23\\\"\")\n\n;; and you find yourself in angst, cause this won't work...\n(Double. quoted-string)\n\t;; Execution error (IllegalArgumentException) at user/eval6365 (form-init17453115089215840832.clj:1).\n\t;; No matching ctor found for class java.lang.Double\n\n;; you don't have to hate the player; but you can come prepared for the game\n(Double. (read-string quoted-string))\n\t;; 1.23", :author {:avatar-url "https://avatars2.githubusercontent.com/u/36526095?v=4", :account-source "github", :login "adanhawth"}, :created-at 1582746730566, :updated-at 1582746790901, :_id "5e56cc6ae4b087629b5a18aa"} {:updated-at 1660763271174, :created-at 1660763271174, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=4"}, :body ";;;; Data representation is same as the one produced by (read-string)\n;;;; and (read) when provided with the option to preserve data conditionals\n\n(read-string {:read-cond :preserve} \"#?(:clj (println \\\"Hey World!\\\"))\")\n;;=> #?(:clj (println \"Hey World!\"))\n", :_id "62fd3c87e4b0b1e3652d763d"}], :notes [{:updated-at 1289408055000, :body "read-string is useful for running clojure code from a script or translator.", :created-at 1289408055000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fa2"} {:author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :updated-at 1568111197675, :created-at 1568111197675, :body "Never **EVER** use `read-string` on data from an untrusted source. Prefer `clojure.edn/read-string` to parse EDN. The former can execute arbitrary code, including calling external URLs or reading/writing/erasing files.", :_id "5d777a5de4b0ca44402ef7af"}], :arglists ["s" "opts s"], :doc "Reads one object from the string s. Optionally include reader\n options, as specified in read.\n\n Note that read-string can execute code (controlled by *read-eval*),\n and as such should be used only with trusted sources.\n\n For data structure interop use clojure.edn/read-string", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/read-string"} {:added "1.0", :ns "clojure.core", :name "proxy", :file "clojure/core_proxy.clj", :type "macro", :column 1, :see-alsos [{:created-at 1360270636000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "gen-class", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521c9e"} {:created-at 1360270701000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "gen-interface", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521c9f"} {:created-at 1361858921000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "reify", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ca0"}], :line 329, :examples [{:author {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3", :account-source "github", :login "bkovitz"}], :body ";; adding a mouse-pressed callback to a Swing component:\n\n(defn add-mousepressed-listener\n [component f & args]\n (let [listener (proxy [MouseAdapter] []\n (mousePressed [event]\n (apply f event args)))]\n (.addMouseListener component listener)\n listener))\n", :created-at 1287523639000, :updated-at 1460780025090, :_id "542692cdc026201cdc326d5c"} {:author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :editors [], :body ";; BUG: proxy dispatches *only* on name, not arity:\nuser=> (let [p (proxy [java.io.InputStream] [] (read [] -1))]\n (println (.read p))\n (println (.read p (byte-array 3) 0 3)))\n\n-1\nArityException Wrong number of args (4) passed to: core$eval213$fn clojure.lang.AFn.throwArity (AFn.java:437)\n", :created-at 1336686490000, :updated-at 1336686490000, :_id "542692d4c026201cdc327040"} {:updated-at 1586252027510, :created-at 1363059784000, :body ";; You can, however, provide multiple-arity functions to get some support \n;; for overloading\nuser> (let [p (proxy [java.io.InputStream] []\n (read\n ([] 1)\n ([^bytes bytes] 2)\n ([^bytes bytes off len] 3)))]\n (println (.read p))\n (println (.read p (byte-array 3)))\n (println (.read p (byte-array 3) 0 3)))\n\n1\n2\n3\nnil", :editors [{:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/61b4809de147650070a5e209be48fe7f?r=PG&default=identicon", :account-source "clojuredocs", :login "craigandera"}, :_id "542692d4c026201cdc327041"} {:updated-at 1586252042920, :created-at 1542943086091, :author {:login "gluer", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/22495106?v=4"}, :body ";; a simple example\n\n(defn f [& i]\n (proxy [clojure.lang.ISeq][]\n (seq [] (sort i))\n (toString [] (apply str (interpose \"-\" i)))))\n\n(seq (f 4 3 2 1))\n;;=> (1 2 3 4)\n\n\n(str (f 4 3 2 1))\n;;=> \"4-3-2-1\"", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/22495106?v=4", :account-source "github", :login "gluer"} {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}], :_id "5bf7716ee4b0ca44402ef5c6"} {:updated-at 1587490591311, :created-at 1587490591311, :author {:login "audriu", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/41568862?v=4"}, :body ";; usage of implicit 'this\n(def prx (proxy [java.lang.Runnable] []\n (run \n ([] (println \"We can use this inside here\" this) 1))))\n\n(.run prx)\n;;=>We can use this inside here #object[user.proxy$java.lang.Object$Runnable.....", :_id "5e9f2f1fe4b087629b5a18db"}], :macro true, :notes nil, :arglists ["class-and-interfaces args & fs"], :doc "class-and-interfaces - a vector of class names\n\n args - a (possibly empty) vector of arguments to the superclass\n constructor.\n\n f => (name [params*] body) or\n (name ([params*] body) ([params+] body) ...)\n\n Expands to code which creates a instance of a proxy class that\n implements the named class/interface(s) by calling the supplied\n fns. A single class, if provided, must be first. If not provided it\n defaults to Object.\n\n The interfaces names must be valid interface types. If a method fn\n is not provided for a class method, the superclass method will be\n called. If a method fn is not provided for an interface method, an\n UnsupportedOperationException will be thrown should it be\n called. Method fns are closures and can capture the environment in\n which proxy is called. Each method fn takes an additional implicit\n first arg, which is bound to 'this. Note that while method fns can\n be provided to override protected methods, they have no other access\n to protected members, nor to super, as these capabilities cannot be\n proxied.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/proxy"} {:added "1.0", :ns "clojure.core", :name "rsubseq", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1330671605000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "subseq", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521efe"}], :line 5126, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [], :body "user> (rsubseq (sorted-set 1 2 3 4 5) < 3)\n(2 1)", :created-at 1286871962000, :updated-at 1286871962000, :_id "542692c9c026201cdc326af4"} {:editors [{:login "TradeIdeasPhilip", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/18409827?v=3"}], :body ";; If you use the longer form, with the end condition, there are some rules.\n;; start-key should be <= end-key. start-test should be \">\" or \">=\".\n;; end-test should be \"<\" or \"<=\". If follow these rules you'll get all the\n;; values between start-key and end-key. If you don't you won't get an error,\n;; but you probably won't get the result you expect. These rules are exactly\n;; the same for subseq.\n\n;; As expected, returns everything between 2 and 4, in reverse order.\nuser=> (rsubseq (sorted-set 1 2 3 4 5) >= 2 <= 4)\n;; => (4 3 2)\n\n;; Probably not what you expected!\nuser=> (rsubseq (sorted-set 1 2 3 4 5) <= 4 >= 2)\n;; => (2 1)\n\n;; As expected, returns everything between 2 and 4, in order.\nuser=> (subseq (sorted-set 1 2 3 4 5) >= 2 <= 4)\n;; => (2 3 4)\n\n;; Probably not what you expected!\nuser=> (subseq (sorted-set 1 2 3 4 5) <= 4 >= 2)\n;; => (4 5)\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/18409827?v=3", :account-source "github", :login "TradeIdeasPhilip"}, :created-at 1463328932267, :updated-at 1463329023275, :_id "5738a0a4e4b071da7d6cfd0b"}], :notes nil, :arglists ["sc test key" "sc start-test start-key end-test end-key"], :doc "sc must be a sorted collection, test(s) one of <, <=, > or\n >=. Returns a reverse seq of those entries with keys ek for\n which (test (.. sc comparator (compare ek key)) 0) is true", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/rsubseq"} {:added "1.2", :ns "clojure.core", :name "inc", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1325850434000, :author {:login "frangio", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/646001f0ba2b7df47a16c0a1d5b62225?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "dec", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d99"} {:created-at 1415177507055, :author {:login "rvlieshout", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/139665?v=2"}, :to-var {:ns "clojure.core", :name "inc'", :library-url "https://github.com/clojure/clojure"}, :_id "5459e523e4b03d20a102429d"} {:created-at 1525271648690, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unchecked-inc", :ns "clojure.core"}, :_id "5ae9cc60e4b045c27b7fac5b"}], :line 922, :examples [{:author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (inc 1)\n2\n\nuser=> (inc 1.0)\n2.0\n\nuser=> (inc 1/2)\n3/2\n\nuser=> (inc -1)\n0", :created-at 1279992305000, :updated-at 1411874902968, :_id "542692cac026201cdc326b45"} {:updated-at 1516199380227, :created-at 1516199380227, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;increment all the element in a collection\n\n(map inc [1 2 3 4 5])\n;;(2 3 4 5 6) return type list\n\n(into [] (map inc [1 2 3 4 5]))\n;;[2 3 4 5 6] return type vector", :_id "5a5f5dd4e4b0a08026c48cf8"} {:updated-at 1524688467780, :created-at 1524688121378, :author {:login "wuleicanada", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/5652075?v=4"}, :body ";; Careful when using ClojureScript\n;; Make sure you're passing a number\n;; because JavaScript + also does string concatenation\ncljs.user=> (inc \"1\")\n\"11\"\ncljs.user=> (inc 1)\n2\n\n;; Although it's not the case with dec\n;; In JavaScript \"1\" - 1 = 0\ncljs.user=> (dec \"1\")\n0\ncljs.user=> (dec 1)\n0\n\n", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/5652075?v=4", :account-source "github", :login "wuleicanada"}], :_id "5ae0e4f9e4b045c27b7fac53"} {:updated-at 1633068446525, :created-at 1633068446525, :author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :body ";; You cannot `inc` a `nil` in Clojure, but you\n;; can in ClojureScript\n\n;; Clojure\n(inc nil) ;;=> NullPointerException\n\n;; ClojureScript\n(inc nil) ;;=> 1", :_id "6156a59ee4b0b1e3652d754f"}], :notes [{:updated-at 1316509073000, :body "Is the documentation suppose to be: \"Returns a number one greater than x.\" ? If not what is num?", :created-at 1316509073000, :author {:login "icefox", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/dc848256f8954abd612cbe7e81859f91?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fcc"} {:author {:login "arashgithub", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1148053?v=3"}, :updated-at 1457669616170, :created-at 1457669616170, :body "is code \"(def i (inc i))\" is conflict with the notion of immutable of data in Clojure. ", :_id "56e245f0e4b0119038be0212"} {:author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=3"}, :updated-at 1458583922104, :created-at 1458583922104, :body "Nope, quite the opposite. \"def\" defines a var: \n
    \nuser=> (type (def i 1))\nclojure.lang.Var\n
    \nA var is one of the 4 types dealing with mutable state (it is not an immutable data structure, like maps, vectors, sets and so on) and it does so following a specific semantic (see http://clojure.org/reference/vars).", :_id "56f03972e4b09295d75dbf35"}], :arglists ["x"], :doc "Returns a number one greater than num. Does not auto-promote\n longs, will throw on overflow. See also: inc'", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/inc"} {:added "1.0", :ns "clojure.core", :name "get-method", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1337585046000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "remove-method", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e3c"} {:created-at 1337585052000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "methods", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e3d"}], :line 1817, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; define a multi-method, then demonstrate that you may use \n;; get-method in the same way you can call the method directly\n\nuser=> (defmulti tos :Ob)\n#'user/tos\nuser=> (defn line [p1 p2] {:Ob :line :p1 p1 :p2 p2})\n#'user/line\nuser=> (defn circle [cent rad] {:Ob :circle :cent cent :rad rad})\n#'user/circle\nuser=> (defmethod tos :line [l] (str \"Line:\" (l :p1) (l :p2)))\n#\nuser=> (defmethod tos :circle [c] (str \"Circle:\" (c :cent) (c :rad)))\n#\nuser=> (println (tos (circle [2 3] 3.3)))\nCircle:[2 3]3.3\nnil\nuser=> (println (tos (line [1 1][0 0])))\nLine:[1 1][0 0]\nnil\nuser=> (println ((get-method tos :line) (line [1 2][3 4]) ))\nLine:[1 2][3 4]\nnil\nuser=>", :created-at 1313922883000, :updated-at 1313922883000, :_id "542692cfc026201cdc326e6b"}], :notes nil, :arglists ["multifn dispatch-val"], :doc "Given a multimethod and a dispatch value, returns the dispatch fn\n that would apply to that value, or nil if none apply and no default", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/get-method"} {:added "1.3", :ns "clojure.core", :name "with-redefs", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1322088077000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-redefs-fn", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b7b"} {:created-at 1322088155000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "alter-var-root", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b7c"} {:created-at 1365637645000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-bindings", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b7d"}], :line 7518, :examples [{:updated-at 1335591486000, :created-at 1335591486000, :body "user=> [(type []) (class [])]\n[clojure.lang.PersistentVector clojure.lang.PersistentVector]\n\nuser=> (with-redefs [type (constantly java.lang.String)\n class (constantly 10)]\n [(type [])\n (class [])])\n[java.lang.String 10]", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692d6c026201cdc3270bc"} {:author {:login "johnnyluu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ba99f2dc1064733c7badbb16db9254a?r=PG&default=identicon"}, :editors [{:login "johnnyluu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ba99f2dc1064733c7badbb16db9254a?r=PG&default=identicon"} {:login "rebcabin", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/880b0bb3a4be9237326dd69565444dee?r=PG&default=identicon"}], :body "(ns http)\n\n(defn post [url]\n {:body \"Hello world\"})\n\n(ns app\n (:require [clojure.test :refer [deftest is run-tests]]))\n\n(deftest is-a-macro\n (with-redefs [http/post (fn [url] {:body \"Goodbye world\"})]\n (is (= {:body \"Goodbye world\"} (http/post \"http://service.com/greet\")))))\n\n(run-tests) ;; test is passing", :created-at 1350024154000, :updated-at 1366582892000, :_id "542692d6c026201cdc3270bd"} {:author {:login "w01fe", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e6b62d981155b5945a29d84a2e439663?r=PG&default=identicon"}, :editors [], :body ";; be careful, with-redefs can permanently change a var if applied concurrently:\n\nuser> (defn ten [] 10)\n#'user/ten\nuser> (doall (pmap #(with-redefs [ten (fn [] %)] (ten)) (range 20 100)))\n...\nuser> (ten)\n79", :created-at 1352471112000, :updated-at 1352471112000, :_id "542692d6c026201cdc3270c0"} {:author {:login "nickzam", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/89377?v=2"}, :editors [], :body ";; redefine var\n(def foo 1)\n#'user/foo\n(with-redefs [foo 2] foo)\n2\n\n;; redefine private var\n(ns first)\n(def ^:private foo 1)\n#'first/foo\n\n(ns second)\n(with-redefs [first/foo 2] @#'first/foo)\n2\n\n;; @#' is the macros of (deref (var first/foo))\n(with-redefs [first/foo 2] (deref (var first/foo))\n2", :created-at 1405030383000, :updated-at 1405030383000, :_id "542692d6c026201cdc3270c1"} {:updated-at 1625736978558, :created-at 1625736978558, :author {:login "deadghost", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1156996?v=4"}, :body ";; Vars return to their previous value outside of `with-redefs` body\n\n(with-redefs [first last] (first [1 2]))\n;; => 2\n((with-redefs [first last] #(first [1 2])))\n;; => 1", :_id "60e6c712e4b0b1e3652d7514"} {:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; Macros are not stored in vars, so `with-redefs` doesn't work on them.\n(defmacro a [] 1)\n=> #'user/a\n(a)\n=> 1\n(with-redefs [a (constantly 2)] (a))\n=> 1", :author {:avatar-url "https://avatars.githubusercontent.com/u/8080718?v=4", :account-source "github", :login "owenRiddy"}, :created-at 1658537792859, :updated-at 1659109879089, :_id "62db4740e4b0b1e3652d762f"}], :macro true, :notes nil, :arglists ["bindings & body"], :doc "binding => var-symbol temp-value-expr\n\n Temporarily redefines Vars while executing the body. The\n temp-value-exprs will be evaluated and each resulting value will\n replace in parallel the root value of its Var. After the body is\n executed, the root values of all the Vars will be set back to their\n old values. These temporary changes will be visible in all threads.\n Useful for mocking out functions during testing.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/with-redefs"} {:added "1.9", :ns "clojure.core", :name "uuid?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 6805, :examples [{:updated-at 1495999029126, :created-at 1495999029126, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body "(uuid? (java.util.UUID/randomUUID))\n;;=> true\n(uuid? (read-string \"#uuid \\\"f81d4fae-7dec-11d0-a765-00a0c91e6bf6\\\"\"))\n;;=> true\n\n(uuid? \"f81d4fae-7dec-11d0-a765-00a0c91e6bf6\")\n;;=> false", :_id "592b2235e4b093ada4d4d780"} {:editors [{:login "E-A-Griffin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/53583563?v=4"}], :body ";; If using a version of Clojure >= 1.11 use `parse-uuid`\n(def new-u (parse-uuid \"4fe5d828-6444-11e8-8222-720007e40350\"))\n;;=> #'user/new-u\nnew-u\n;;=> #uuid \"4fe5d828-6444-11e8-8222-720007e40350\"\n(uuid? new-u)\n;;=> true\n\n;; There is no (uuid) function to coerce a string to a UUID prior to Clojure v1.11, but you can \n;; produce one via Java interop:\n\n(def old-u (java.util.UUID/fromString \"4fe5d828-6444-11e8-8222-720007e40350\"))\n;;=> #'user/old-u\nold-u\n;;=> #uuid \"4fe5d828-6444-11e8-8222-720007e40350\"\n(uuid? old-u)\n;;=> true", :author {:avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4", :account-source "github", :login "timgilbert"}, :created-at 1527711361366, :updated-at 1665246163158, :_id "5b0f0681e4b045c27b7fac86"} {:updated-at 1539315353361, :created-at 1539315353361, :author {:login "ashton314", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/2874507?v=4"}, :body ";; Change a UUID to a string:\n\n\n(.toString (java.util.UUID/randomUUID))\n;;=>\"91bb281c-4cdd-4bea-bd9c-27b5f9c75812\"", :_id "5bc01699e4b00ac801ed9ed9"}], :notes [{:author {:login "E-A-Griffin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/53583563?v=4"}, :updated-at 1665246371235, :created-at 1665246331215, :body ";; Docs for added UUID functions in Clojure 1.11\n\n`parse-uuid`: https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/parse-uuid\n\n`random-uuid`: https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/random-uuid", :_id "6341a47be4b0b1e3652d7673"}], :arglists ["x"], :doc "Return true if x is a java.util.UUID", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/uuid_q"} {:added "1.0", :ns "clojure.core", :name "bit-clear", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1527805067810, :author {:login "NealEhardt", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1338977?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "bit-set", :ns "clojure.core"}, :_id "5b10748be4b045c27b7fac8b"}], :line 1331, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (bit-clear 2r1011 3) ; index is 0-based\n3 \n;; 3 = 2r0011\n\n;; the same in decimal\nuser=> (bit-clear 11 3) \n3", :created-at 1280337817000, :updated-at 1332950801000, :_id "542692cbc026201cdc326bbf"}], :notes nil, :arglists ["x n"], :doc "Clear bit at index n", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bit-clear"} {:added "1.0", :ns "clojure.core", :name "filter", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1282310761000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "remove", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e17"} {:created-at 1399907449000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "keep", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e19"} {:created-at 1413316825235, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "filterv", :library-url "https://github.com/clojure/clojure"}, :_id "543d80d9e4b02688d208b1b6"} {:created-at 1487135971846, :author {:login "chrismurrph", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10278575?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "group-by", :ns "clojure.core"}, :_id "58a3e4e3e4b01f4add58fe56"}], :line 2793, :examples [{:updated-at 1420743803007, :created-at 1279065921000, :body "(filter even? (range 10))\n;;=> (0 2 4 6 8)\n\n(filter (fn [x]\n (= (count x) 1))\n [\"a\" \"aa\" \"b\" \"n\" \"f\" \"lisp\" \"clojure\" \"q\" \"\"])\n;;=> (\"a\" \"b\" \"n\" \"f\" \"q\")\n\n(filter #(= (count %) 1)\n [\"a\" \"aa\" \"b\" \"n\" \"f\" \"lisp\" \"clojure\" \"q\" \"\"])\n;;=> (\"a\" \"b\" \"n\" \"f\" \"q\")\n\n; When coll is a map, pred is called with key/value pairs.\n(filter #(> (second %) 100)\n {:a 1\n :b 2\n :c 101\n :d 102\n :e -1})\n;;=> ([:c 101] [:d 102])\n\n(into {} *1)\n;;=> {:c 101, :d 102}\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/263299?v=2", :account-source "github", :login "zw"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692cac026201cdc326b5f"} {:updated-at 1435879726137, :created-at 1435879726137, :author {:login "bsvingen", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1647562?v=3"}, :body ";; Used without a collection, filter will create a transducer:\n(def xf (filter odd?))\n\n;; We can now apply this transducer to a sequence:\n(transduce xf conj (range 10))\n;; => [1 3 5 7 9]\n", :_id "5595c92ee4b00f9508fd66f4"} {:updated-at 1446483945707, :created-at 1446482046531, :author {:login "Art-B", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1143795?v=3"}, :body ";;When filtering a map, the predicate takes a _list_ of length 2\n(filter (fn [[k v]] (even? k))\n {1 \"a\", 2 \"b\", 3 \"c\", 4 \"d\"}\n)\n;;output:: ([2 \"b\"] [4 \"d\"])\n\n;;A function of arity two will cause an error\n(comment will fail!) \n(filter (fn [k v] (even? k))\n {1 \"a\", 2 \"b\", 3 \"c\", 4 \"d\"}\n)\n;;output:: clojure.lang.ArityException: Wrong number of args (1) passed to: ...", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/1143795?v=3", :account-source "github", :login "Art-B"}], :_id "5637907ee4b04b157a6648df"} {:updated-at 1638750543664, :created-at 1446999529588, :author {:login "puppybits", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/140163?v=3"}, :body "; remove empty vectors from the root vector\n(def vector-of-vectors [[1 2 3] [] [1] []])\n\n(def populated-vector? \n (fn \n [item] \n (not= item [])))\n\n(filter populated-vector? vector-of-vectors)\n\n; => ([1 2 3] [1])\n\n; or\n(filter seq vector-of-vectors)", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/140163?v=3", :account-source "github", :login "puppybits"} {:login "KyleErhabor", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/40676441?v=4"}], :_id "563f75e9e4b0290a56055d22"} {:updated-at 1471132372267, :created-at 1471132372267, :author {:login "sleyzerzon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/528932?v=3"}, :body ";;filter a map on its values\n(filter (comp #{2 3} last) {:x 1 :y 2 :z 3})\n;;=> ([:y 2] [:z 3])", :_id "57afb2d4e4b02d8da95c26fd"} {:updated-at 1471132498612, :created-at 1471132498612, :author {:login "sleyzerzon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/528932?v=3"}, :body ";;filter a map on its values\n(filter (comp #{2 3} last) {:x 1 :y 2 :z 3})\n;;=> ([:y 2] [:z 3])\n\n;;extract keys for certain values\n(map first (filter (comp #{2 3} last) {:x 1 :y 2 :z 3}))\n=> (:y :z)", :_id "57afb352e4b02d8da95c26fe"} {:editors [{:login "mdubakov", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/465999?v=3"}], :body ";; You can use set as a filter predicate. In this case it is sets intersection\n(filter #{0 1 2 3} #{2 3 4 5})\n=> (3 2) ", :author {:avatar-url "https://avatars2.githubusercontent.com/u/465999?v=3", :account-source "github", :login "mdubakov"}, :created-at 1491555992092, :updated-at 1491556073772, :_id "58e75698e4b01f4add58fe86"} {:updated-at 1494575824785, :created-at 1494575824785, :author {:login "st-keller", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/476463?v=3"}, :body ";; That's how to get everything from a seq that is not nil;\n(filter some? '(1 nil [] :a nil))\n=> (1 [] :a)", :_id "59156ad0e4b01920063ee05a"} {:updated-at 1517054565714, :created-at 1517054565714, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;practical example using an anonymous function \n;;which return a boolean value\n(def entries [{:month 1 :val 12 :s1 true :s2 false}\n {:month 2 :val 3 :s1 false :s2 true}\n {:month 3 :val 32 :s1 true :s2 false}\n {:month 4 :val 18 :s1 true :s2 false}\n {:month 5 :val 32 :s1 false :s2 true}\n {:month 6 :val 62 :s1 false :s2 true}\n {:month 7 :val 12 :s1 false :s2 true}\n {:month 8 :val 142 :s1 true :s2 false}\n {:month 9 :val 52 :s1 true :s2 false}\n {:month 10 :val 18 :s1 true :s2 false}\n {:month 11 :val 23 :s1 false :s2 true}\n {:month 12 :val 56 :s1 false :s2 true}])\n\n(filter #(:s2 %) entries)\n\n(filter #(and (:s2 %) (> (:val %) 30)) entries)\n", :_id "5a6c6a65e4b076dac5a728aa"} {:editors [{:login "ahmadrasyidsalim", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/18344132?v=4"}], :body ";; given users\n;; [\"pinisi\" \"sikad\" \"zenius\" \"teacher\" \"law\" \"calvin\" \"ijul\"]\n;; \n;; kick \"law\" and \"teacher\"\n\n(filter #(not (some (fn [u] (= u %)) \n [\"law\" \"teacher\"])) \n [\"pinisi\" \"sikad\" \"zenius\" \"teacher\" \"law\" \"calvin\" \"ijul\"])", :author {:avatar-url "https://avatars3.githubusercontent.com/u/5813694?v=4", :account-source "github", :login "codxse"}, :created-at 1530620467973, :updated-at 1632120981728, :_id "5b3b6a33e4b00ac801ed9e23"} {:editors [{:login "tmountain", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/135297?v=4"}], :body ";; if you want to apply multiple predicates, use every-pred\n;; in conjunction with filter\n;; output: (2, 4)\n\n(filter\n (apply every-pred [even? #(< % 5)]) [1, 2, 3, 4, 5])\n\n;; if you want to apply any predicate, use some-fn\n;; output: (0 2 4 6 7 8 9)\n\n(filter\n (some-fn even? #(> % 5))\n (range 10))", :author {:avatar-url "https://avatars1.githubusercontent.com/u/135297?v=4", :account-source "github", :login "tmountain"}, :created-at 1539887379558, :updated-at 1539888985733, :_id "5bc8d113e4b00ac801ed9ee4"}], :notes [{:author {:login "brunchboy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2228869?v=3"}, :updated-at 1441227184007, :created-at 1441227184007, :body "Although the documentation states that the predicate must be free of side effects, it would be more accurate to say that you should not rely on filter to induce side effects that may be caused by the predicate, nor on the timing of when the predicate will be evaluated, because of the lazy and chunked nature of filter.", :_id "55e761b0e4b0efbd681fbb93"} {:author {:login "mattiasw2", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1294931?v=3"}, :updated-at 1474933697182, :created-at 1474933697182, :body "Note that filtering a map will not create a map. If you want to do a lookup on the result, you need to surround the call to filter with (into {} (filter ...))", :_id "57e9b3c1e4b0709b524f050e"}], :arglists ["pred" "pred coll"], :doc "Returns a lazy sequence of the items in coll for which\n (pred item) returns logical true. pred must be free of side-effects.\n Returns a transducer when no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/filter"} {:added "1.0", :ns "clojure.core", :name "locking", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1410129605000, :author {:login "SQuest", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/14c2b5159bb6d42d41ab04b1c714bd1b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "future", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c76"}], :line 1647, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "(def o (Object.))\n(future (locking o \n (Thread/sleep 5000) \n (println \"done1\")))\n\n;; Now run this before 5 seconds is up and you'll \n;; find the second instance waits for the first instance to print done1\n;; and release the lock, and then it waits for 1 second and prints done2\n\n(Thread/sleep 1000) ; give first instance 1 sec to acquire the lock\n(locking o \n (Thread/sleep 1000)\n (println \"done2\"))\n;; => done1\n;; => done2\n;; => nil\n\n;; locking operates like the synchronized keyword in Java.\n", :created-at 1286271996000, :updated-at 1423012941325, :_id "542692cdc026201cdc326d21"} {:updated-at 1563441285293, :created-at 1563441285293, :author {:login "liuchong", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/236058?v=4"}, :body "(def x 1)\n\n;; Reentrant\n\n(locking x (locking x (println \"hehe in\")) (println \"hehe out\"))\n;; => hehe in\n;; => hehe out\n;; => nil", :_id "5d303885e4b0ca44402ef787"}], :macro true, :notes nil, :arglists ["x & body"], :doc "Executes exprs in an implicit do, while holding the monitor of x.\n Will release the monitor of x in all circumstances.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/locking"} {:added "1.0", :ns "clojure.core", :name "list", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 16, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (list 'a 'b 'c 'd 'e 'f 'g)\n(a b c d e f g)\nuser=> (list 1 2 3)\n(1 2 3)", :created-at 1279072062000, :updated-at 1332950370000, :_id "542692cfc026201cdc326e52"} {:author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (let [m {:1 1 :2 2 :3 3 :4 4}] (map list (keys m) (vals m)))\n((:1 1) (:2 2) (:3 3) (:4 4))", :created-at 1279557389000, :updated-at 1332950386000, :_id "542692cfc026201cdc326e54"} {:body ";; Lists can also be constructed literally using quote, but note the difference\n\n;; When using list the arguments are evaluated\n(let [x 1 y 2]\n (list x y))\n;; => (1 2)\n\n;; ... and when using quote ' they are not:\n(let [x 1 y 2]\n '(x y))\n;; => (x y)\n\n;; there is syntax quote ` (back tick) that allows selective evaluation inside it with ~:\n(let [x 1 y 2]\n `(~x ~y))\n;; => (1 2)\n\n;; But syntax quote ` is mostly used in macro definitions where most elements\n;; should not be evaluated and unquoted with ~ and list form above feels\n;; more idiomatic for simple list construction.", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423011991402, :updated-at 1423012027889, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :_id "54d17097e4b0e2ac61831cfe"}], :notes nil, :arglists ["& items"], :doc "Creates a new list containing the items.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/list"} {:added "1.2", :ns "clojure.core", :name "+", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1351919360000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "+'", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cb3"} {:created-at 1314343076000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "*", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eaa"} {:created-at 1314343079000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "-", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eab"} {:created-at 1423526895712, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "unchecked-add", :library-url "https://github.com/clojure/clojure"}, :_id "54d94befe4b081e022073c82"} {:created-at 1525303139502, :author {:login "NealEhardt", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1338977?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "inc", :ns "clojure.core"}, :_id "5aea4763e4b045c27b7fac5d"}], :line 984, :examples [{:updated-at 1598154469428, :created-at 1279418175000, :body "(+)\n;;=> 0\n\n(+ 1)\n;;=> 1\n\n(+ -10)\n;;=> -10\n\n(+ 1 2)\n;;=> 3\n\n(+ 1 2 3)\n;;=> 6\n\n(+ 1/2 1/2)\n;;=> 1N\n\n(apply + (range 10000000000000 10000000001000))\n;; ArithmeticException: integer overflow", :editors [{:login "MrHus", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4"} {:avatar-url "https://www.gravatar.com/avatar/edeae8e7534b3d554e4ec2c35ffc68d?r=PG&default=identicon", :account-source "clojuredocs", :login "semperos"} {:avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon", :account-source "clojuredocs", :login "TimMc"} {:avatar-url "https://www.gravatar.com/avatar/611bdccae60c79419a30df0e2d6adc2b?r=PG&default=identicon", :account-source "clojuredocs", :login "csophys"} {:avatar-url "https://www.gravatar.com/avatar/60838f7abe2eb311a6e00b10597f34c2?r=PG&default=identicon", :account-source "clojuredocs", :login "BenjyCui"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=2", :account-source "github", :login "phreed"} {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}], :author {:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"}, :_id "542692c8c026201cdc326a18"}], :notes nil, :arglists ["" "x" "x y" "x y & more"], :doc "Returns the sum of nums. (+) returns 0. Does not auto-promote\n longs, will throw on overflow. See also: +'", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/+"} {:added "1.0", :ns "clojure.core", :name "split-with", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1314290648000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "split-at", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c05"} {:created-at 1314291178000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "split", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c06"} {:created-at 1347077825000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "take-while", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c07"} {:created-at 1347077831000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "drop-while", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c08"} {:created-at 1659193713800, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "partition-by", :ns "clojure.core"}, :_id "62e54971e4b0b1e3652d7633"}], :line 2992, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user=> (split-with (partial >= 3) [1 2 3 4 5])\n[(1 2 3) (4 5)]\n\nuser=> (split-with (partial > 3) [1 2 3 2 1])\n[(1 2) (3 2 1)]\n\nuser=> (split-with (partial > 10) [1 2 3 2 1])\n[(1 2 3 2 1) ()]", :created-at 1281512571000, :updated-at 1423277699986, :_id "542692c8c026201cdc3269ee"} {:editors [{:login "achesnais", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6626105?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/1200122?v=3", :account-source "github", :login "Bediako"} {:login "v-kolesnikov", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/6506296?v=4"}], :body ";; If your plan is to split based on a certain value, using sets as\n;; predicates here isn't entirely straightforward.\n\nuser=> (split-with #{:c} [:a :b :c :d])\n[() (:a :b :c :d)]\n\n;; This is because the split happens at the first false/nil predicate result.\n;; Your predicate should thus return false upon hitting the desired split value!\n\nuser=> (split-with (complement #{:c}) [:a :b :c :d])\n[(:a :b) (:c :d)]\n\n;; In short, the predicate defines an attribute valid for the whole left\n;; side of the split. There's no such guarantee for the right side!\n\nuser=> (split-with odd? [1 3 5 6 7 9])\n[(1 3 5) (6 7 9)]\n\n;; Except if your predicate never returns false.\nuser=> (split-with (complement #{:e}) [:a :b :c :d])\n[(:a :b :c :d) ()]\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/6626105?v=3", :account-source "github", :login "achesnais"}, :created-at 1470855993350, :updated-at 1511009715200, :_id "57ab7b39e4b0bafd3e2a04dd"} {:updated-at 1623499263951, :created-at 1581787276541, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; The following split-by builds on top of split-with. Instead of \n;; splitting only the first time pred returns false, it splits (lazily)\n;; every time it turns from true to false.\n\n(defn split-by [pred coll]\n (lazy-seq\n (when-let [s (seq coll)]\n (let [[xs ys] (split-with pred s)]\n (if (seq xs)\n (cons xs (split-by pred ys))\n (let [!pred (complement pred)\n skip (take-while !pred s)\n others (drop-while !pred s)\n [xs ys] (split-with pred others)]\n (cons (concat skip xs)\n (split-by pred ys))))))))\n\n(split-by #(zero? (mod % 2)) [1 1 2 3 3 4 5 6 7 9])\n;; => ((1 1 2) (3 3 4) (5 6) (7 9))", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"} {:login "frwdrik", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/13023061?v=4"}], :_id "5e48288ce4b0ca44402ef839"}], :notes nil, :arglists ["pred coll"], :doc "Returns a vector of [(take-while pred coll) (drop-while pred coll)]", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/split-with"} {:added "1.0", :ns "clojure.core", :name "aset", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1588281651305, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "aget", :ns "clojure.core"}, :_id "5eab4133e4b087629b5a18ee"} {:created-at 1668707576824, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "aset-int", :ns "clojure.core"}, :_id "637674f8e4b0b1e3652d7683"} {:created-at 1668707583337, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "aset-double", :ns "clojure.core"}, :_id "637674ffe4b0b1e3652d7684"}], :line 3923, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [], :body "user=> (def my-array (into-array Integer/TYPE [1 2 3]))\n#'user/my-array\n\nuser=> (aset my-array 1 10) ; Set the element with index 1 to 10\n10\n\nuser=> (into [] my-array)\n[1 10 3]", :created-at 1286508598000, :updated-at 1286508598000, :_id "542692cbc026201cdc326ba0"} {:body "; Two dimensional example\n(use 'clojure.pprint)\n(let [the-array (make-array Long/TYPE 2 3) ]\n (dotimes [nn 6]\n (let [ii (quot nn 3)\n jj (rem nn 3) ]\n (aset the-array ii jj nn)\n ))\n (pprint the-array)\n)\n;=> [[0, 1, 2], [3, 4, 5]]\n\n; Types are defined in clojure/genclass.clj:\n; Boolean/TYPE\n; Character/TYPE\n; Byte/TYPE\n; Short/TYPE\n; Integer/TYPE\n; Long/TYPE\n; Float/TYPE\n; Double/TYPE\n; Void/TYPE\n\n", :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :created-at 1423782804290, :updated-at 1423783298831, :editors [{:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}], :_id "54dd3394e4b0e88f43c5afa1"} {:body ";; Simple 2D example:\n(def a (to-array-2d [[1 2] [3 4]]))\n;=> #'expt.core/a\n(aset a 0 1 \"foo\")\n;=> \"foo\"\nexpt.core=> (map vec a)\n;=> ([1 \"foo\"] [3 4])", :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :created-at 1432828883628, :updated-at 1432829193467, :editors [{:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}], :_id "55673bd3e4b01ad59b65f4dc"} {:updated-at 1588283235231, :created-at 1588282039336, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; transpose a matrix (two-dimensional array of doubles)\n;; using in-place mutation and no additional memory space.\n\n(defn transpose! [^\"[[D\" matrix]\n (dotimes [i (alength matrix)]\n (doseq [j (range (inc i) (alength matrix))]\n (let [copy (aget matrix i j)]\n (aset matrix i j (aget matrix j i))\n (aset matrix j i copy)))))\n\n(def matrix\n (into-array\n (map double-array\n [[1.0 2.0 3.0]\n [4.0 5.0 6.0]\n [7.0 8.0 9.0]])))\n\n(transpose! matrix)\n(mapv vec matrix)\n\n;; [[1.0 4.0 7.0]\n;; [2.0 5.0 8.0]\n;; [3.0 6.0 9.0]]\n", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5eab42b7e4b087629b5a18ef"} {:updated-at 1682634188137, :created-at 1682634188137, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; Doubles are converted to floats; longs to ints, and vice versa:\n(aset (int-array [1 2 3]) 0 (long 42))\n;; => 42\n\n(aset (long-array [1 2 3]) 0 (int 42))\n;; => 42\n\n(aset (float-array [1.0 2.0 3.0]) 0 (double 42.0))\n;; => 42.0\n\n(aset (double-array [1.0 2.0 3.0]) 0 (float 42.0))\n;; => 42.0\n\n;; But some other conversions that may seem possible, are not:\n(aset (byte-array [1 2 3]) 0 (int 42))\n;; => Execution error (IllegalArgumentException) at…\n;; No matching method aset found taking 3 args\n\n(aset (short-array [1 2 3]) 0 (long 42))\n;; => Execution error (IllegalArgumentException) at…\n;; No matching method aset found taking 3 args\n\n;; It's best to be explicit:\n(aset (short-array [1 2 3]) 0 (short 42))\n;; => 42\n", :_id "644af5cce4b08cf8563f4b9e"}], :notes nil, :arglists ["array idx val" "array idx idx2 & idxv"], :doc "Sets the value at the index/indices. Works on Java arrays of\n reference types. Returns val.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/aset"} {:ns "clojure.core", :name "->VecNode", :file "clojure/gvec.clj", :type "function", :column 1, :see-alsos nil, :line 17, :examples nil, :notes nil, :arglists ["edit arr"], :doc "Positional factory function for class clojure.core.VecNode.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/->VecNode"} {:added "1.0", :ns "clojure.core", :name "keyword", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1292127515000, :author {:login "bgruber", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3c2dc1a076ff6e60dfb085ecddcc9f6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "name", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cf9"} {:created-at 1318592819000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "keyword?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cfa"} {:created-at 1331680528000, :author {:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "namespace", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cfb"} {:created-at 1331680582000, :author {:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "find-keyword", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cfc"} {:created-at 1350410417000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "symbol", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cfd"}], :line 614, :examples [{:updated-at 1406075185000, :created-at 1280546489000, :body ";; (keyword name): name can be string, symbol, or keyword.\n;; \n;; (keyword ns name): ns and name must both be string.\n;; \n;; A keyword string, like a symbol, begins with a non-numeric\n;; character and can contain alphanumeric characters and *, +, !, -,\n;; _, and ?. (see http://clojure.org/reader for details).\n;; \n;; keyword does not validate input strings for ns and name, and may\n;; return improper keywords with undefined behavior for non-conformant\n;; ns and name.\n\nuser=> (keyword 'foo)\n:foo\n\nuser=> (keyword \"foo\") \n:foo\n\nuser=> (keyword \"user\" \"foo\")\n:user/foo\n\n;; keyword in current namespace\nuser=> (keyword (str *ns*) \"foo\")\n:user/foo", :editors [{:avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon", :account-source "clojuredocs", :login "gstamp"} {:avatar-url "https://www.gravatar.com/avatar/7567c12df3f5e8f8ca031d4320b476ba?r=PG&default=identicon", :account-source "clojuredocs", :login "Alan"} {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"}], :author {:avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon", :account-source "clojuredocs", :login "dakrone"}, :_id "542692cec026201cdc326d70"} {:author {:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"}, :editors [{:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"} {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}], :body ";; some gotchas to be aware of:\n\nuser=> (keyword \"user\" 'abc)\nClassCastException clojure.lang.Symbol cannot be cast to java.lang.String clojure.core/keyword (core.clj:558)\n\nuser=> (keyword *ns* \"abc\")\nClassCastException clojure.lang.Namespace cannot be cast to java.lang.String clojure.core/keyword (core.clj:558)\n\nuser=> (keyword 'user \"abc\")\nClassCastException clojure.lang.Symbol cannot be cast to java.lang.String clojure.core/keyword (core.clj:558)\n\n\n;; Warning - the following generated keywords are non-conformant and may wreak\n;; serious havoc in the near/far future when least expected...\n;; Even if `keyword?` might return true for them and they seem to work with\n;; `name` and `namespace` as well, and they can be used as functions\n;; (e.g. `(:/// {:/// \"x\"})` works), problems usually come at e.g. destructuring... \n\nuser=> (keyword \"abc def\")\n:abc def\n\nuser=> (keyword \"123def\")\n:123def\n\nuser=> (keyword \"/abc/def/ghi\")\n:/abc/def/ghi\n\nuser=> (keyword \":\" \":\")\n::/:\n\nuser=> (keyword \"/\" \"/\")\n:///\n\nuser=> (keyword \"\")\n:\n\nuser=> (keyword \"\" \"/\")\n://\n\nuser=> (keyword \"...\")\n:...", :created-at 1331680488000, :updated-at 1548520687081, :_id "542692d3c026201cdc326fde"} {:updated-at 1406075556000, :created-at 1392677011000, :body ";; You can define namespaced keywords using '::'\nuser=> (def a :foo)\n#'user/a\n\nuser=> (def b ::foo)\n#'user/b\n\nuser=> (ns foo)\nfoo=> user/a\n:foo\n\nfoo=> user/b\n:user/foo\n\nfoo=> ::foo\n:foo/foo\n\nfoo=> (= user/a :foo)\ntrue\n\nfoo=> (= user/b ::foo)\nfalse\n\nfoo=> (= user/b :user/foo)\ntrue", :editors [{:avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon", :account-source "clojuredocs", :login "Phalphalak"} {:avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon", :account-source "clojuredocs", :login "Phalphalak"} {:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"}], :author {:avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon", :account-source "clojuredocs", :login "Phalphalak"}, :_id "542692d3c026201cdc326fe0"} {:updated-at 1445848617591, :created-at 1445848617591, :author {:login "ShayMatasaro", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1350551?v=3"}, :body ";;only convert strings\nuser=> (keyword 1)\nnil\n\n\nuser=> (keyword '1)\nnil\n", :_id "562de629e4b0290a56055d13"} {:editors [{:login "PetrGlad", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/124476?v=3"}], :body "(keyword \"my.key\")\n;=> :my.key\n(qualified-keyword? :my.key)\n;=> nil ;; \"my.key\" is just name, dot does not count\n(keyword \"my.namespace\" \"my.key\") \n;=> :my.namespace/my.key\n(qualified-keyword? :my.namespace/my.key)\n;=> true \n(namespace :my.namespace/my.key) \n;=> \"my.namespace\"\n(name :my.namespace/my.key) \n;=> \"my.key\"\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/124476?v=3", :account-source "github", :login "PetrGlad"}, :created-at 1482252029047, :updated-at 1482252099977, :_id "58595efde4b004d3a355e2c9"} {:updated-at 1517353605671, :created-at 1517352728207, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body ";; let's make an illustrative namespace\n(create-ns 'my.arbitrary.long.namespace)\n(alias 'maln 'my.arbitrary.long.namespace)\n;; more typically loaded and aliased with require\n;; (require '[my.arbitrary.long.namespace :as maln])\n\n;; Qualified keywords may be specified with the namespace or the alias.\n;; But unlike with symbols where the bare alias is used \n;; you need to prefix the alias with '::' \n:my.arbitrary.long.namespace/foo\n;=> :my.arbitrary.long.namespace/foo\n::maln/bar\n;=> :my.arbitrary.long.namespace/bar", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}], :_id "5a70f718e4b0c974fee49d14"} {:editors [{:login "jasonisgraham", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/3493406?v=4"} {:avatar-url "https://avatars3.githubusercontent.com/u/11671382?v=4", :account-source "github", :login "dominem"}], :body "\n;; You can use existing keywords (cljs only)\n\n(keyword :namespace :keyword)\n;;=> :namespace/keyword\n\n(keyword \"namespace\" :keyword)\n;;=> :namespace/keyword\n\n(keyword :namespace \"keyword\")\n;;=> :namespace/keyword\n\n(keyword :meta-namespace/namespace :meta-keyword/keyword)\n;;=> :namespace/keyword\n", :author {:avatar-url "https://avatars2.githubusercontent.com/u/10955264?v=4", :account-source "github", :login "troglotit"}, :created-at 1527776571957, :updated-at 1565335543185, :_id "5b10053be4b045c27b7fac89"} {:editors [{:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}], :body ";; different (non-conformant) keywords can have the same printed representation:\n\n(= :a/b/c (keyword \"a\" \"b/c\"))\n;;=> true\n\n(keyword \"a/b\" \"c\")\n;;=> :a/b/c\n\n(= (str (keyword \"a/b\" \"c\")) (str (keyword \"a\" \"b/c\")))\n;;=> true\n\n(= (keyword \"a/b\" \"c\") (keyword \"a\" \"b/c\"))\n;;=> false\n", :author {:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"}, :created-at 1548521622644, :updated-at 1548521923629, :_id "5c4c9096e4b0ca44402ef63d"} {:updated-at 1599398418945, :created-at 1599398354277, :author {:login "luiszambon", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/41161270?v=4"}, :body "(defn creating-map\n [key value]\n {(keyword key) value})\n\n(:map-key (creating-map \"map-key\" \"map-value\"))\n;;=>\"map-value\"", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/41161270?v=4", :account-source "github", :login "luiszambon"}], :_id "5f54e1d2e4b0b1e3652d73b0"} {:updated-at 1641596456686, :created-at 1641596456686, :author {:login "jkndrkn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/91959?v=4"}, :body ";; Be careful because it is possible to create keywords that contain whitespace\n\n(keyword \"my-keyword\\t\")\n;;=> :my-keyword\n\n(name (keyword \"my-keyword\\t\"))\n;;=> \"my-keyword\\t\"\n\n\n(= (keyword \"my-keyword\") :my-keyword)\n;;=> true\n\n(= (keyword \"my-keyword\\t\") :my-keyword)\n;;=> false\n", :_id "61d8c628e4b0b1e3652d759d"}], :notes nil, :tag "clojure.lang.Keyword", :arglists ["name" "ns name"], :doc "Returns a Keyword with the given namespace and name. Do not use :\n in the keyword strings, it will be added automatically.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/keyword"} {:added "1.0", :ns "clojure.core", :name "*ns*", :type "var", :see-alsos nil, :examples [{:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [], :body "user=> *ns*\n#", :created-at 1289039963000, :updated-at 1289039963000, :_id "542692c7c026201cdc3269c7"} {:author {:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"}], :body "user=> (ns foo.bar)\nnil\n\nfoo.bar=> *ns*\n#", :created-at 1406094577000, :updated-at 1406094613000, :_id "542692d1c026201cdc326f35"} {:editors [{:login "Artiavis", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1834136?v=3"}], :body ";; A (rare) trap which can happen is attempting to dynamically call `in-ns`, due to how\n;; `*ns*` is really an instance of `clojure.lang.Var` with a root binding.\nuser=> (ns my.namespace)\nnil\n\nmy.namespace=> *ns*\n#\n\n;; This will *only* work in the REPL (or REPL-like environments)!!\n;; Tools like Boot and Lein may or may not provide this (read the manual/code)\nmy.namespace=> (defn swap-ns! [ns-name] (in-ns ns-name))\n#'my.namespace/swap-ns!\n\nmy.namespace=> (swap-ns! 'other.ns)\n#namespace[other.ns]\n\n;; Later, at runtime...\n;; Throws IllegalStateException(\"Can't change/establish root binding of: *ns* with set\")\n;; Remember, *ns* is a root var and in-ns calls set!, which only works after\n;; someone somewhere calls the binding macro (or Java equivalent)\n(defn -main\n [& args]\n (println *ns*)\n (swap-ns! 'arbitrary-namespace))\n;; prints #namespace[clojure.core] and then will crash", :author {:avatar-url "https://avatars1.githubusercontent.com/u/1834136?v=3", :account-source "github", :login "Artiavis"}, :created-at 1497795113128, :updated-at 1497795249422, :_id "59468a29e4b06e730307db35"}], :notes [{:updated-at 1310470085000, :body "A trap I fell into was that *ns* seems to get assigned to clojure.core when run as a \"gen-class\" compiled class.", :created-at 1310470085000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fc4"} {:body "To clarify the above point, see my example above. Although within Lein/Boot/REPL/Compiler contexts, `*ns*` is thread-local due to the use of the `binding` machinery, and so `in-ns` works in those situtations, `*ns*` has a root of `clojure.core`. That means that, at runtime, you cannot call `in-ns` within functions until you've first called `binding`. (This could be relevant for e.g. `eval` calls.)", :created-at 1497579558843, :updated-at 1497795316359, :author {:avatar-url "https://avatars1.githubusercontent.com/u/1834136?v=3", :account-source "github", :login "Artiavis"}, :_id "59434026e4b06e730307db34"}], :tag "clojure.lang.Namespace", :arglists [], :doc "A clojure.lang.Namespace object representing the current namespace.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*ns*"} {:ns "clojure.core", :name "destructure", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 4389, :examples [{:author {:login "reborg", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5b2768c3c24e6e96d838c4c43038de93?r=PG&default=identicon"}, :editors [], :body "; look ma, no let!\n(map #(intern *ns* (first %) (eval (last %))) (partition 2 (destructure '[[a b] [\"a\" \"b\"]])))\nuser=> a\n\"a\"\nuser=> b\n\"b\"", :created-at 1396388229000, :updated-at 1396388229000, :_id "542692d2c026201cdc326f8d"} {:updated-at 1519692244573, :created-at 1519675914364, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body ";; Based on the previous example...\n\n;; Suppose you want to do some work at the repl.\n;; It would be nice if the def and let had similar syntax but they do not.\n\n(defn def+ [bindings] \n (let [bings (partition 2 (destructure bindings))\n obj (first bings)\n redef (rest bings)]\n \n (intern *ns* (first obj) (eval (second obj))) \n (map #(intern *ns* (first %) (eval (last %))) redef)))\n\n(def+ '[[u s v] [1 5 9]]) \n \n;; def+ is better implemented as a macro.\n;; It does have the drawback of introducing some intermediate gen variables.\n;; But, it prints the names of all variables.\n\n(defmacro def+\n \"binding => binding-form\n internalizes binding-forms as if by def.\"\n {:added \"1.9\", :special-form true, :forms '[(def+ [bindings*])]}\n [& bindings]\n (let [bings (partition 2 (destructure bindings))]\n (sequence cat \n ['(do) \n (map (fn [[var value]] `(def ~var ~value)) bings)\n [(mapv (fn [[var _]] (str var)) bings)]])))\n\n(def+ [u s v] [1 5 9] \n foo \"bar\" \n [a b] [\"abc\" \"bcd\"])\n;=> #'user/b\n\na\n;=> \"abc\"\n\n;; The justification for such a macro is manifest when\n;; debugging at the repl.\n;; Suppose the following is in a function and \n(let [[a b] [\"a\" \"b\"]] \n (str a b) ; is this correct?\n (conj a b) ; how about this?\n (cat a b)) ; or this?\n\n;; Now in this case the problem is clear but in general it may not be.\n;; So you get set up to track down this problem. \n(def+ [a b] [\"a\" \"b\"])\n\n;; Without def+ you would have to do something like the following...\n(def ab [\"a\" \"b\"])\n(def a (nth ab 0))\n(def b (nth ab 1))\n;; ...to get set up in the repl.", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}], :_id "5a946a0ae4b0316c0f44f8f2"}], :notes [{:author {:login "Ragsboss", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/3869936?v=3"}, :updated-at 1494263800930, :created-at 1494263800930, :body "I found https://clojure.org/guides/destructuring extremely useful", :_id "5910a7f8e4b01f4add58feb1"} {:body "\"[The `destructure` function] implements the destructuring logic and [...] is designed to be invoked in a macro\". For more info about `desctructure` see https://clojure.org/guides/destructuring#_macros.", :created-at 1519164976336, :updated-at 1519165254309, :author {:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"}, :_id "5a8c9e30e4b0316c0f44f8d8"}], :arglists ["bindings"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/destructure"} {:ns "clojure.core", :name "*assert*", :type "var", :see-alsos [{:created-at 1301778092000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "assert", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d09"}], :examples [{:updated-at 1475615278407, :created-at 1475615278407, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body "user=> (set! *assert* true)\n\nuser=> (defn str->int\n [x]\n {:pre [(string? x)]}\n (Integer/valueOf x))\n\nuser=> (str->int 12.2)\n;;=> AssertionError Assert failed: (string? x) user/str->int...", :_id "57f41a2ee4b0709b524f051e"}], :notes [{:updated-at 1406676369000, :body "A little digging through the RT.java code confirms that this is dynamic, and defaults to true.", :created-at 1406676369000, :author {:login "hlship", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cb598cc180c2363c093e92e8e87e0493?r=PG&default=identicon"}, :_id "542692edf6e94c697052202e"}], :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*assert*"} {:added "1.0", :ns "clojure.core", :name "defmulti", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1285162568000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defmethod", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c30"} {:created-at 1341270331000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "remove-method", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c31"} {:created-at 1341270338000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "remove-all-methods", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c32"} {:created-at 1341270344000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "prefers", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c33"} {:created-at 1341270349000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "methods", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c34"} {:created-at 1341270355000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "get-method", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c35"} {:created-at 1351463879000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defprotocol", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c36"} {:created-at 1413313710551, :author {:login "kgann", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1098962?v=2"}, :to-var {:ns "clojure.core", :name "make-hierarchy", :library-url "https://github.com/clojure/clojure"}, :_id "543d74aee4b02688d208b1b5"} {:created-at 1485980931712, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "multi-spec", :ns "clojure.spec"}, :_id "58924503e4b01f4add58fe38"}], :line 1725, :examples [{:author {:login "Victor", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc41ebab54cc0e0fbe99d753876d45ce?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:avatar-url "https://avatars.githubusercontent.com/u/200617?v=3", :account-source "github", :login "bsima"} {:avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4", :account-source "github", :login "bfontaine"} {:login "Luke1298", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7078861?v=4"}], :body ";; Define the multimethod\n(defmulti service-charge (juxt account-level :tag))\n\n;; Handlers for resulting dispatch values\n(defmethod service-charge [::acc/Basic ::acc/Checking] [_] 25)\n(defmethod service-charge [::acc/Basic ::acc/Savings] [_] 10)\n(defmethod service-charge [::acc/Premium ::acc/Account] [_] 0)", :created-at 1290489704000, :updated-at 1643237673567, :_id "542692cdc026201cdc326d58"} {:author {:login "Victor", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc41ebab54cc0e0fbe99d753876d45ce?r=PG&default=identicon"}, :editors [{:login "stand", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d7f9ed2753f8b3517f1539f6129f0a17?r=PG&default=identicon"} {:avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4", :account-source "github", :login "bfontaine"} {:login "blue0513", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/8979468?v=4"}], :body ";this example illustrates that the dispatch type\n;does not have to be a symbol, but can be anything (in this case, it's a string)\n\n(defmulti greeting\n (fn[x] (get x \"language\")))\n\n;params is not used, so we could have used [_]\n(defmethod greeting \"English\" [params]\n \"Hello!\")\n\n(defmethod greeting \"French\" [params]\n \"Bonjour!\")\n\n;;default handling\n(defmethod greeting :default [params]\n (throw (IllegalArgumentException. \n (str \"I don't know the \" (get params \"language\") \" language\"))))\n\n;then can use this like this:\n(def english-map {\"id\" \"1\", \"language\" \"English\"})\n(def french-map {\"id\" \"2\", \"language\" \"French\"})\n(def spanish-map {\"id\" \"3\", \"language\" \"Spanish\"})\n\n=>(greeting english-map)\n\"Hello!\"\n=>(greeting french-map)\n\"Bonjour!\"\n=>(greeting spanish-map)\n java.lang.IllegalArgumentException: I don't know the Spanish language", :created-at 1290492895000, :updated-at 1589637326870, :_id "542692cdc026201cdc326d59"} {:author {:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"}, :editors [{:login "cddr", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/48030?v=3"}], :body ";; Implementing factorial using multimethods Note that factorial-like function \n;; is best implemented using `recur` which enables tail-call optimization to avoid \n;; a stack overflow error. This is a only a demonstration of clojure's multimethod\n\n;; identity form returns the same value passed\n(defmulti factorial identity)\n\n(defmethod factorial 0 [_] 1)\n(defmethod factorial :default [num] \n (* num (factorial (dec num))))\n\n(factorial 0) ; => 1\n(factorial 1) ; => 1\n(factorial 3) ; => 6\n(factorial 7) ; => 5040", :created-at 1313197324000, :updated-at 1433710661793, :_id "542692cdc026201cdc326d5b"} {:body ";; defmulti/defmethods support variadic arguments and dispatch functions.\n\n(defmulti bat \n (fn ([x y & xs] \n (mapv class (into [x y] xs)))))\n(defmethod bat [String String] [x y & xs] \n (str \"str: \" x \" and \" y))\n(defmethod bat [String String String] [x y & xs] \n (str \"str: \" x \", \" y \" and \" (first xs)))\n(defmethod bat [String String String String] [x y & xs] \n (str \"str: \" x \", \" y \", \" (first xs) \" and \" (second xs)))\n(defmethod bat [Number Number] [x y & xs] \n (str \"number: \" x \" and \" y))\n\n;; you call it like this...\n\n(bat \"mink\" \"stoat\")\n;; => \"str: mink and stoat\"\n\n(bat \"bear\" \"skunk\" \"sloth\")\n;; => \"str: bear, skunk and sloth\"\n\n(bat \"dog\" \"cat\" \"cow\" \"horse\")\n;; => \"str: dog, cat, cow and horse\"\n\n(bat 1 2)\n;; => \"number: 1 and 2\"", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1412178008616, :updated-at 1412178054860, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :_id "542c2058e4b05f4d257a2966"} {:body ";; defmulti - custom hierarchy\n\n(def h (-> (make-hierarchy)\n (derive :foo :bar)))\n\n(defmulti f identity :hierarchy #'h) ;; hierarchy must be a reference type\n\n(defmethod f :default [_] \"default\")\n(defmethod f :bar [_] \"bar\")\n\n(f :unknown) ;; \"default\"\n(f :bar) ;; \"bar\"\n(f :foo) ;; \"bar\"\n\n;; Note that any deref'able type is fine. \n;; Using an atom instead of (var h) is preferable in clojurescript \n;; (which adds a lot of meta information to vars)", :author {:login "kgann", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1098962?v=2"}, :created-at 1413313971298, :updated-at 1440343358927, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/671872?v=3", :account-source "github", :login "hura"}], :_id "543d75b3e4b0a3cf052fe476"} {:updated-at 1440343192893, :created-at 1440343192893, :author {:login "hura", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/671872?v=3"}, :body ";; If you're REPLing you might want to re-define the defmulti dispatch function \n;; (which defmulti won't allow you to do). For this you can use `ns-unmap`:\n\n(defmulti x (fn[_] :inc))\n(defmethod x :inc [y] (inc y))\n(defmethod x :dec [y] (dec y))\n(x 0) ;; => 1\n(defmulti x (fn[_] :dec)) ;; Can't redefine :(\n(x 0) ;; => 1 ;; STILL :(\n(ns-unmap *ns* 'x) ;; => unmap the var from the namespace\n(defmulti x (fn[_] :dec))\n(x 0) ;; => Exception, we now need to redefine our defmethods.\n\n;; So in your file while developing you'd put the ns-unmap to the top of the file\n", :_id "55d9e498e4b0831e02cddf1b"} {:updated-at 1444625178263, :created-at 1444625178263, :author {:login "metasoarous", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/88556?v=3"}, :body ";; It's nice for multimethods to have arglists metadata so that calling `doc`\n;; prints the arglist, instead of just the docstring. For example:\n\n(defmulti f \"Great function\" (fn [x] :blah))\n(doc f)\n;; -------------------------\n;; user/f\n;; Great function\n\n;; However, we can add `:arglists` metadata via a third (optional) argument to `defmulti` (`attr-map?` in the docstring for `defmulti`):\n\n(defmulti g \"Better function\" {:arglists '([x])} (fn [x] :blah))\n(doc g)\n;; -------------------------\n;; user/f\n;; ([x])\n;; Better function\n", :_id "561b3b1ae4b0b41dac04c957"} {:updated-at 1452157994440, :created-at 1452156707338, :author {:login "peter", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2008?v=3"}, :body "(defmulti compact map?)\n\n(defmethod compact true [map]\n (into {} (remove (comp nil? second) map)))\n\n(defmethod compact false [col]\n (remove nil? col))\n\n; Usage:\n\n(compact [:foo 1 nil :bar])\n; => (:foo 1 :bar)\n\n(compact {:foo 1 :bar nil :baz \"hello\"})\n; => {:foo 1, :baz \"hello\"}\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/2008?v=3", :account-source "github", :login "peter"}], :_id "568e2723e4b0f37b65a3c27f"} {:updated-at 1465222176322, :created-at 1465221190822, :author {:login "rauhs", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/11081351?v=3"}, :body ";; This show how to do a wildcard match to a dispatch value:\n(defmulti xyz (fn [x y] [x y]))\n\n;; We don't care about the first argument:\n(defmethod xyz [::default :b]\n [x y]\n :d-b)\n\n;; We have to implement this manually:\n(defmethod xyz :default\n [x y]\n (let [recover (get-method xyz [::default y])]\n ;; Prevent infinite loop:\n (if (and recover (not (= (get-method xyz :default) recover)))\n (do\n (println \"Found a default\")\n ;; Add the default to the internal cache:\n ;; Clojurescript will want (-add-method ...)\n (.addMethod ^MultiFn xyz [x y] recover)\n (recover ::default y))\n :default)))\n\n(xyz nil :b) ;; => :d-b\n;; only prints \"Found a default\" once!", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/11081351?v=3", :account-source "github", :login "rauhs"}], :_id "57558046e4b0bafd3e2a0474"} {:updated-at 1484939584615, :created-at 1484939584615, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :body ";; Extremely simple example, dispatching on a single field of the input map.\n;; Here we have a polymorphic map that looks like one of these two examples:\n\n;; {:name/type :split :name/first \"Bob\" :name/last \"Dobbs\"}\n;; {:name/type :full :name/full \"Bob Dobbs\"}\n\n(defmulti full-name :name/type)\n\n(defmethod full-name :full [name-data] \n (:name/full name-data))\n\n(defmethod full-name :split [name-data] \n (str (:name/first name-data) \" \" (:name/last name-data)))\n\n(defmethod full-name :default [_] \"???\")\n\n(full-name {:name/type :full :name/full \"Bob Dobbs\"})\n;; => \"Bob Dobbs\"\n\n(full-name {:name/type :split :name/first \"Bob\" :name/last \"Dobbs\"})\n;; => \"Bob Dobbs\"\n\n(full-name {:name/type :oops :name/full \"Bob Dobbs\"})\n;; => \"???\"\n", :_id "58826140e4b09108c8545a5b"} {:editors [{:login "green-coder", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4"}], :body ";;polymorphism classic example\n\n;;defmulti\n(defmulti draw :shape)\n\n;;defmethod\n(defmethod draw :square [geo-obj] (str \"Drawing a \" (:clr geo-obj) \" square\"))\n(defmethod draw :triangle [geo-obj] (str \"Drawing a \" (:clr geo-obj) \" triangle\"))\n\n(defn square [color] {:shape :square :clr color})\n(defn triangle [color] {:shape :triangle :clr color})\n\n(draw (square \"red\"))\n(draw (triangle \"green\"))", :author {:avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4", :account-source "github", :login "ibercode"}, :created-at 1510785469752, :updated-at 1531155016694, :_id "5a0cc1bde4b0a08026c48cb9"} {:updated-at 1510845199326, :created-at 1510845199326, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;defmulti with dispatch function\n(defmulti salary (fn[amount] (amount :t)))\n\n;;defmethod provides a function implementation for a particular value\n(defmethod salary \"com\" [amount] (+ (:b amount) (/ (:b amount) 2)))\n(defmethod salary \"bon\" [amount] (+ (:b amount) 99))\n\n(salary {:t \"com\" :b 1000}) ;;1500\n(salary {:t \"bon\" :b 1000}) ;;1099 ", :_id "5a0dab0fe4b0a08026c48cba"} {:updated-at 1568297637555, :created-at 1568297637555, :author {:login "the-frey", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/2385077?v=4"}, :body ";; dispatch on the first argument\n(defmulti example-multimethod\n (fn [arg-one opts] arg-one))\n\n;; the opts are available in the defmethods\n(defmethod example-multimethod :path-one [_ opts]\n (println (:first-opt opts)))\n\n(defmethod example-multimethod :path-two [_ opts]\n (println (:second-opt opts)))\n\n(example-multimethod :path-one {:first-opt 1\n :second-opt 2})\n;; 1\n;; => nil", :_id "5d7a52a5e4b0ca44402ef7b3"} {:updated-at 1598457058014, :created-at 1598457058014, :author {:login "Gavlooth", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10321050?v=4"}, :body ";; You can use multiarity in multimethods \n(defmulti foo (fn [x & _] x))\n\n(defmethod foo :default [_ & _] \"DEFAULT VALUE DISPACHED\")\n\n;; Like a standar multi-arity function\n(defmethod foo :bar \n ([_ _] \"ONE ARGUMENT\")\n ([_ _ _] \"TWO ARGUMENTs\")\n ([_ _ _ _] \"THREE ARGUMENTs\")\n ([_ _ _ _ & more] (cl-format nil \"~d ARGUMENTS\" (+ 3 (count more)))))\n \n(foo :baz 1)\n;; => \"DEFAULT VALUE DISPACHED\"\n\n(foo :bar 1)\n;; => \"ONE ARGUMENT\"\n\n(foo :bar 1 2)\n;; => \"TWO ARGUMENTs\"\n\n(foo :bar 1 2 3)\n;; => \"THREE ARGUMENTs\"\n\n(foo :bar 1 2 3 4 )\n;; => \"4 ARGUMENTS\"\n\n(foo :bar 1 2 3 4 5)\n;; => \"5 ARGUMENTS\"\n\n(foo :baz 1)\n;; => \"DEFAULT VALUE DISPACHED\"\n\n(foo :bar)\n; eval (current-form): (foo :bar)\n; (err) Execution error (ArityException) at user/eval22248 \n; (err) Wrong number of args (1) passed to: user/eval22204/fn--22205\n\n", :_id "5f4684e2e4b0b1e3652d73ad"} {:editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}], :body ";; To call the dispatch function without dispatching to a method, \n;; just to examine the dispatch key\n(defmulti xyzzy (fn [x y] (+ x y)))\n((.dispatchFn xyzzy) 3 7)\n;; => 10\n\n;; The above is specific to Clojure on the JVM. In ClojureScript it is\n;; slightly different:\n((.-dispatch-fn xyzzy) 3 7)\n;; => 10", :author {:avatar-url "https://avatars1.githubusercontent.com/u/6414129?v=4", :account-source "github", :login "jimka2001"}, :created-at 1601239335909, :updated-at 1601314098960, :_id "5f70f927e4b0b1e3652d73c3"}], :macro true, :notes [{:updated-at 1290493285000, :body "See also\r\n\r\nhttp://clojure.org/runtime_polymorphism\r\n\r\nhttp://clojure.org/multimethods\r\n\r\n", :created-at 1290493285000, :author {:login "Victor", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc41ebab54cc0e0fbe99d753876d45ce?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fa5"}], :arglists ["name docstring? attr-map? dispatch-fn & options"], :doc "Creates a new multimethod with the associated dispatch function.\n The docstring and attr-map are optional.\n\n Options are key-value pairs and may be one of:\n\n :default\n\n The default dispatch value, defaults to :default\n\n :hierarchy\n\n The value used for hierarchical dispatch (e.g. ::square is-a ::shape)\n\n Hierarchies are type-like relationships that do not depend upon type\n inheritance. By default Clojure's multimethods dispatch off of a\n global hierarchy map. However, a hierarchy relationship can be\n created with the derive function used to augment the root ancestor\n created with make-hierarchy.\n\n Multimethods expect the value of the hierarchy option to be supplied as\n a reference type e.g. a var (i.e. via the Var-quote dispatch macro #'\n or the var special form).", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/defmulti"} {:added "1.1", :ns "clojure.core", :name "chars", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "char-array", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917427000, :_id "542692eaf6e94c6970521bcf"}], :line 5358, :examples [{:updated-at 1486713986324, :created-at 1486713986324, :author {:login "zezhenyan", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8064559?v=3"}, :body "user=> (seq (chars (char-array \"this is a good one\")))\n(\\t \\h \\i \\s \\space \\i \\s \\space \\a \\space \\g \\o \\o \\d \\space \\o \\n \\e)", :_id "589d7482e4b01f4add58fe44"} {:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; char-array will convert where possible\n(char-array \"foo\");; => [\\f, \\o, \\o]\n\n;; chars will not\n(try (chars \"foo\")\n (catch ClassCastException e (ex-message e)))\n;; => \"java.lang.String cannot be cast to [C\"\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4", :account-source "github", :login "tomdl89"}, :created-at 1656673310214, :updated-at 1656673548489, :_id "62bed41ee4b0b1e3652d7615"} {:updated-at 1682278412171, :created-at 1682278412171, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; Casting avoids expensive reflection, so to see the benefit, enable warning:\n(set! *warn-on-reflection* true)\n\n;; We'll def a char-array but won't type-hint the var:\n(def my-array (char-array [\\f \\g \\h \\i \\j]))\n\n;; and try to amap over it without using `chars` or type hinting:\n(amap my-array i _ (-> my-array (aget i) clojure.string/capitalize first unchecked-char))\n;; Reflection warning… call to static method alength on clojure.lang.RT can't be resolved (argument types: unknown).\n;; Reflection warning… call to static method aclone on clojure.lang.RT can't be resolved (argument types: unknown).\n;; Reflection warning… call to static method aget on clojure.lang.RT can't be resolved (argument types: unknown, int).\n;; Reflection warning… call to static method aset on clojure.lang.RT can't be resolved (argument types: unknown, int, char).\n;; => [\\F, \\G, \\H, \\I, \\J]\n\n;; We can use `chars` to avoid reflection:\n(amap (chars my-array) i _ (-> (chars my-array) (aget i) clojure.string/capitalize first unchecked-char))\n;; => [\\F, \\G, \\H, \\I, \\J]\n\n;; Just as we can type hint in place:\n(amap ^chars my-array i _ (-> ^chars my-array (aget i) clojure.string/capitalize first unchecked-char))\n;; => [\\F, \\G, \\H, \\I, \\J]\n\n;; Or type hint the var:\n(def ^\"[C\" my-array (char-array [\\f \\g \\h \\i \\j]))\n(amap my-array i _ (-> my-array (aget i) clojure.string/capitalize first unchecked-char))\n;; => [\\F, \\G, \\H, \\I, \\J]\n", :_id "6445880ce4b08cf8563f4b94"}], :notes nil, :arglists ["xs"], :doc "Casts to chars[]", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/chars"} {:added "1.0", :ns "clojure.core", :name "str", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1347870090000, :author {:login "JR0cket", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ff5786158c0be54051ef8e5c544555d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pr", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e5e"} {:created-at 1347870109000, :author {:login "JR0cket", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ff5786158c0be54051ef8e5c544555d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "prn", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e5f"} {:created-at 1423277783809, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "pr-str", :library-url "https://github.com/clojure/clojure"}, :_id "54d57ed7e4b0e2ac61831d22"} {:created-at 1423277796681, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "prn-str", :library-url "https://github.com/clojure/clojure"}, :_id "54d57ee4e4b0e2ac61831d23"} {:created-at 1423277811434, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "print-str", :library-url "https://github.com/clojure/clojure"}, :_id "54d57ef3e4b0e2ac61831d24"} {:created-at 1423277823482, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "println-str", :library-url "https://github.com/clojure/clojure"}, :_id "54d57effe4b0e2ac61831d25"}], :line 544, :examples [{:author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:avatar-url "https://avatars2.githubusercontent.com/u/24441401?v=4", :account-source "github", :login "themustafabasit"}], :body "user=> \"some string\"\n\"some string\"\n\nuser=> (str)\n\"\"\n\nuser=> (str nil)\n\"\"\n\nuser=> (str 1)\n\"1\"\n\nuser=> (str 1 2 3)\n\"123\"\n\nuser=> (str 1 'symbol :keyword)\n\"1symbol:keyword\"\n\n;; A very common usage of str is to apply it to an existing collection:\nuser=> (apply str [1 2 3])\n\"123\"\n\n;; compare it with:\nuser=> (str [1 2 3])\n\"[1 2 3]\"\n\n", :created-at 1279191631000, :updated-at 1599671667197, :_id "542692ccc026201cdc326c5f"} {:author {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"}, :editors [{:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"}], :body ";; Destructuring with a string, getting just a few characters from it\nuser=> (let [[first-char second-char] \"abcde\"] \n (prn 'first= first-char) \n (prn 'second= second-char))\nfirst= \\a\nsecond= \\b\nnil\n\n;; More destructuring with a string\nuser=> (let [[first-char second-char & rest-of-chars] \"abcde\"] \n (prn 'first= first-char) \n (prn 'second= second-char) \n (prn 'rest= rest-of-chars))\nfirst= \\a\nsecond= \\b\nrest= (\\c \\d \\e)\nnil\n\n;; Destructuring, getting the first character of a string\n;; and then a reference to the entire string\nuser=> (let [[first-char :as all-the-string] \"abcde\"] \n (prn 'first= first-char) \n (prn 'all= all-the-string))\nfirst= \\a\nall= \"abcde\"\nnil", :created-at 1285683003000, :updated-at 1285683237000, :_id "542692ccc026201cdc326c64"} {:updated-at 1471001180731, :created-at 1471001180731, :author {:login "Lacty", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7412474?v=3"}, :body "user=> (str \"L\" \"a\")\n\"La\"\n\nuser=> (str \"L\" 5 \"a\")\n\"L5a\"", :_id "57adb25ce4b0bafd3e2a04ef"} {:updated-at 1517964096633, :created-at 1517964096633, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body ";; sometimes when printing lazy sequences you do not get what you want.\n(str (take 5 (range 10)))\n;=> \"clojure.lang.LazySeq@1b554e1\"\n\n;; in those cases `pr-str` to the rescue.\n(pr-str (take 5 (range 10)))\n;=> \"(0 1 2 3 4)\"", :_id "5a7a4b40e4b0e2d9c35f7422"} {:updated-at 1527025723311, :created-at 1527025723311, :author {:login "operasfantom", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31903947?v=4"}, :body ";; be careful with java.lang.Double to java.lang.String conversion\n(str -128004972.0)\n;=> \"-1.28004972E8\"\n", :_id "5b04903be4b045c27b7fac74"} {:updated-at 1547468102218, :created-at 1547468102218, :author {:login "RayceeM", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/28865179?v=4"}, :body ";; Using str in maps\n(def user-map {:fname \"Jane\" :sname \"Doe\"})\n\n;;getting the value of the first key \n(:fname user-map)\n;=> \"Jane\"\n\n(str (:fname user-map) \" \" (:sname user-map))\n;=> \"Jane Doe\"", :_id "5c3c7d46e4b0ca44402ef61b"} {:updated-at 1599671842283, :created-at 1599671842283, :author {:login "themustafabasit", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/24441401?v=4"}, :body "(str nil)\n;; => \"\"\n\n(str true)\n;; => \"true\"\n\n(str false)\n;; => \"false\"\n", :_id "5f590e22e4b0b1e3652d73b6"}], :notes nil, :tag "java.lang.String", :arglists ["" "x" "x & ys"], :doc "With no args, returns the empty string. With one arg x, returns\n x.toString(). (str nil) returns the empty string. With more than\n one arg, returns the concatenation of the str values of the args.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/str"} {:added "1.0", :ns "clojure.core", :name "next", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1289038123000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rest", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cc7"} {:created-at 1289038131000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "first", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cc8"} {:created-at 1344490440000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "fnext", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cc9"} {:created-at 1505013547909, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nthrest", :ns "clojure.core"}, :_id "59b4af2be4b09f63b945ac6c"} {:created-at 1505013554008, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/601540?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nthnext", :ns "clojure.core"}, :_id "59b4af32e4b09f63b945ac6d"}], :line 57, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}], :body "user=> (next '(:alpha :bravo :charlie))\n(:bravo :charlie)\n\nuser=> (next (next '(:one :two :three)))\n(:three)\n\nuser=> (next (next (next '(:one :two :three))))\nnil", :created-at 1279071284000, :updated-at 1289038286000, :_id "542692c8c026201cdc3269fb"} {:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [{:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"} {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"} {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}], :body ";; next is used in the recursive call. (This is a naive implementation for illustration only. Using `rest` is usually preferred over `next`.)\n\n(defn my-map [func a-list]\n (when a-list\n (cons (func (first a-list))\n (my-map func (next a-list)))))", :created-at 1289038112000, :updated-at 1306984795000, :_id "542692c8c026201cdc3269fd"} {:body ";; Difference between next and rest:\n\n(next [:a])\n;; => nil\n(rest [:a])\n;; => ()\n\n(next [])\n;; => nil\n(rest [])\n;; => ()\n\n(next nil)\n;; => nil\n(rest nil)\n;; => ()", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423016858063, :updated-at 1423094962892, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :_id "54d1839ae4b0e2ac61831d05"}], :notes [{:updated-at 1306987897000, :body "
    (next aseq) === (seq (rest aseq))
    \r\n\r\nWhen writing lazy sequence functions, you should use [rest](../clojure.core/rest), not next.", :created-at 1306984569000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fc0"}], :tag "clojure.lang.ISeq", :arglists ["coll"], :doc "Returns a seq of the items after the first. Calls seq on its\n argument. If there are no more items, returns nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/next"} {:added "1.0", :ns "clojure.core", :name "hash-map", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1317787775000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "merge", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b50"} {:created-at 1320356522000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "assoc", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b51"} {:created-at 1320356532000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "dissoc", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b52"} {:created-at 1397669031000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "array-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b53"} {:created-at 1397669038000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sorted-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b54"} {:created-at 1437362390089, :author {:login "ljosa", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/197881?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "into", :ns "clojure.core"}, :_id "55ac68d6e4b06a85937088b2"} {:created-at 1474932016523, :author {:login "olivergeorge", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/99447?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "zipmap", :ns "clojure.core"}, :_id "57e9ad30e4b0709b524f050d"} {:created-at 1517623031883, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "keys", :ns "clojure.core"}, :_id "5a7516f7e4b0e2d9c35f7413"} {:created-at 1517623038263, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "vals", :ns "clojure.core"}, :_id "5a7516fee4b0e2d9c35f7414"}], :line 379, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"} {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"} {:login "pilku", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/2970556?v=4"}], :body ";; create hash map the long way\nuser=> (hash-map)\n{}\n\n;; create array map the short way\nuser=> {}\n{}\n\n;; sending a key more times, will remap it to the last value\nuser=> (hash-map :key1 1, :key1 2) \n{:key1 2} \n\nuser=> {:key1 1, :key1 2}\nIllegalArgumentException Duplicate key: :key1 clojure.lang.PersistentArrayMap.createWithCheck (PersistentArrayMap.java:70)\n\n\nuser=> (hash-map :key1 'val1, 'key2 :val2, [:compound :key] nil)\n{[:compound :key] nil, :key1 val1, key2 :val2} \n\n", :created-at 1280353272000, :updated-at 1591472591014, :_id "542692cfc026201cdc326e1f"} {:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (map #(hash-map % 0) (seq \"abcdefgh\"))\n({\\a 0} {\\b 0} {\\c 0} {\\d 0} {\\e 0} {\\f 0} {\\g 0} {\\h 0}) \n\nuser=> (apply hash-map (.split \"a 1 b 2 c 3\" \" \"))\n{\"a\" \"1\", \"b\" \"2\", \"c\" \"3\"}", :created-at 1280353365000, :updated-at 1332950168000, :_id "542692cfc026201cdc326e23"} {:author {:login "dipto_sarkar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c1d3141a40d240f0918260201aaa0b01?r=PG&default=identicon"}, :editors [{:login "dipto_sarkar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c1d3141a40d240f0918260201aaa0b01?r=PG&default=identicon"} {:login "roryokane", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5b2b185c814bb25f2f95a1152e58f033?r=PG&default=identicon"}], :body "; a hash map can be stored in a var by using `def`\nuser=> (def person {:name \"Steve\" :age 24 :salary 7886 :company \"Acme\"})\n#'user/person\nuser=> person\n{:age 24, :name \"Steve\", :salary 7886, :company \"Acme\"}", :created-at 1341478710000, :updated-at 1388572400000, :_id "542692d3c026201cdc326fc4"} {:updated-at 1463334174783, :created-at 1342846621000, :body ";; Take a sequence of sequences (vector of vectors), and create a map\n;; using date as the map key.\n(def csv1 [[\"01/01/2012\" 1 2 3 4][\"06/15/2012\" 38 24 101]])\n\n(map #(hash-map (keyword (first %1)) (vec (rest %1))) csv1)\n;;=> ({:01/01/2012 [1 2 3 4]} {:06/15/2012 [38 24 101]})\n\n;; merge the list of maps into a single map\n(apply merge '({\"01/01/2012\" [1 2 3 4]} {\"06/15/2012\" [38 24 101]}))\n;;=> {\"06/15/2012\" [38 24 101], \"01/01/2012\" [1 2 3 4]}\n\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/b11cdeef90d84ff8af2a2c5012402939?r=PG&default=identicon", :account-source "clojuredocs", :login "Deadron"} {:avatar-url "https://www.gravatar.com/avatar/b11cdeef90d84ff8af2a2c5012402939?r=PG&default=identicon", :account-source "clojuredocs", :login "Deadron"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "TradeIdeasPhilip", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/18409827?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon", :account-source "clojuredocs", :login "octopusgrabbus"}, :_id "542692d3c026201cdc326fc7"} {:updated-at 1459028606947, :created-at 1459028606947, :author {:login "smnplk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/380618?v=3"}, :body "(apply hash-map [:a 1 :b 2])\n;;=> {:b 2 :a 1}\n\n;;is the same as\n(def build-map (partial assoc {}))\n(apply build-map [:a 1 :b 2])\n;;=> {:b 2 :a 1}", :_id "56f7027ee4b0103e9c7d9d26"} {:editors [{:login "rebcabin", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/207047?v=4"} {:avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4", :account-source "github", :login "dijonkitchen"}], :body ";; A hash map acts like a lookup function taking a key as first argument:\n({:a 1, :b 2} :a)\n;;=> 1\n\n;; If the key is not present, nil is returned...\n({:a 1, :b 2} :qwerty)\n;;=> nil\n\n;; ... unless there is a second argument, which becomes the default value to\n;; return when the lookup key is not found:\n({:a 1, :b 2} :qwerty :uiop)\n;;=> :uiop\n\n;; That behavior can lead to surprises:\n(let [map-example {:a 1, :b 2}]\n (map-example #(* % %) (range 10)))\n;;=> (0 1 2 3 4 5 6 7 8 9) \n;; since (range 10) is the default and #(* % %) is an anonymous function that isn't a key in map-example\n\n;; It may be more explicit to use get instead\n(get {:a 1, :b 2} :qwerty :uiop)\n;;=> :uiop", :author {:avatar-url "https://avatars1.githubusercontent.com/u/207047?v=4", :account-source "github", :login "rebcabin"}, :created-at 1563554106051, :updated-at 1587741064160, :_id "5d31f13ae4b0ca44402ef788"}], :notes [{:author {:login "er2", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4515131?v=4"}, :updated-at 1670789233819, :created-at 1670789233819, :body "If you want to create a map from a sequence of pairs, e.g. `[[k1 v1] [k2 v2]]`, see [`into`](https://clojuredocs.org/clojure.core/into).", :_id "63963871e4b0b1e3652d7698"}], :arglists ["" "& keyvals"], :doc "keyval => key val\n Returns a new hash map with supplied mappings. If any keys are\n equal, they are handled as if by repeated uses of assoc.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/hash-map"} {:added "1.0", :ns "clojure.core", :name "if-let", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1293436184000, :author {:login "0x89", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/56bc4acd59315ed4dc1cb99c3be71102?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "when-let", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d88"} {:created-at 1315004464000, :author {:login "srid", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd3a68d670372cd09876c26270a4299a?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "if", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d89"} {:created-at 1440455843468, :author {:login "brunchboy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2228869?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "if-some", :ns "clojure.core"}, :_id "55db9ca3e4b072d7f27980f0"}], :line 1841, :examples [{:updated-at 1285499963000, :created-at 1279379785000, :body "user=> (defn sum-even-numbers [nums]\n (if-let [nums (seq (filter even? nums))]\n (reduce + nums)\n \"No even numbers found.\"))\n#'user/sum-even-numbers\n\nuser=> (sum-even-numbers [1 3 5 7 9])\n\"No even numbers found.\"\n\nuser=> (sum-even-numbers [1 3 5 7 9 10 12])\n22\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692cdc026201cdc326cf5"} {:author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :editors [{:login "nipra", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/142529?v=3"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :body " (if-let [x false y true]\n \"then\"\n \"else\")\n;; java.lang.IllegalArgumentException: if-let requires exactly 2 forms in binding vector (NO_SOURCE_FILE:1)\n;; see if-let* below\n\n(defn if-let-demo [arg]\n (if-let [x arg]\n \"then\"\n \"else\"))\n\n(if-let-demo 1) ; anything except nil/false\n;;=> \"then\"\n(if-let-demo nil)\n;;=> \"else\"\n(if-let-demo false)\n;;=> \"else\"\n", :created-at 1279489140000, :updated-at 1508883080013, :_id "542692cdc026201cdc326cf7"} {:updated-at 1529851111869, :created-at 1305844049000, :body ";; This macro is nice when you need to calculate something big. And you need \n;; to use the result but only when it's true:\n\n(if-let [life (meaning-of-life 12)]\n life\n (if-let [origin (origin-of-life 1)]\n origin\n (if-let [shooter (who-shot-jr 5)]\n shooter\n\t 42)))\n\n;; As you can see in the above example it will return the answer \n;; to the question only if the answer is not nil. If the answer\n;; is nil it will move to the next question. Until finally it\n;; gives up and returns 42.", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"} {:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:login "green-coder", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4"}], :author {:login "MrHus", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4"}, :_id "542692cdc026201cdc326cfa"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; See examples for \"if\" explaining Clojure's idea of logical true\n;; and logical false.", :created-at 1334293326000, :updated-at 1334293326000, :_id "542692d3c026201cdc326fcb"} {:author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :editors [{:login "schmee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3405586?v=3"}], :body ";;; with destructuring binding\n\n;; successful case\n(if-let [[w n] (re-find #\"a(\\d+)x\" \"aaa123xxx\")]\n [w n]\n :not-found) ;=> [\"a123x\" \"123\"]\n\n;; unsuccessful case\n(if-let [[w n] (re-find #\"a(\\d+)x\" \"bbb123yyy\")]\n [w n]\n :not-found) ;=> :not-found\n\n;; same as above\n(if-let [[w n] nil]\n [w n]\n :not-found) ;=> :not-found\n\n;; on Map\n(if-let [{:keys [a b]} nil]\n [a b]\n :not-found) ;=> :not-found\n", :created-at 1399644384000, :updated-at 1420673793910, :_id "542692d3c026201cdc326fcc"} {:body ";; Note that the binding only extends to the then form, not to the else:\nuser=> (if-let [x nil] \"then\" x)\nCompilerException java.lang.RuntimeException: Unable to resolve symbol:\nx in this context, compiling: ...", :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :created-at 1418536023963, :updated-at 1418536080362, :editors [{:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}], :_id "548d2457e4b04e93c519ffa7"} {:editors [{:avatar-url "https://avatars.githubusercontent.com/u/367789?v=3", :account-source "github", :login "mattvvhat"} {:login "antonmos", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2713?v=3"}], :updated-at 1472595205961, :created-at 1428550556244, :author {:avatar-url "https://avatars.githubusercontent.com/u/367789?v=3", :account-source "github", :login "mattvvhat"}, :body ";; Works well with collections\n\n=> (def x {:whatever 1})\n\n=> (if-let [value (:whatever x)] value \"Not found\")\n1\n\n=> (if-let [value (:no-match x)] value \"Not found\")\n\"Not found\"", :_id "5525f39ce4b033f34014b76a"} {:updated-at 1587464733428, :created-at 1469577276189, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body ";; if-let multiple bindings version\n;; Edited: Else branch did not work with expressions.\n\n(defmacro if-let*\n ([bindings then]\n `(if-let* ~bindings ~then nil))\n ([bindings then else]\n (if (seq bindings)\n `(if-let [~(first bindings) ~(second bindings)]\n (if-let* ~(drop 2 bindings) ~then ~else)\n ~else)\n then)))\n\n(if-let* [a 1\n b (+ a 1) ]\n b)\n;;=> 2\n\n(if-let* [a 1\n b (+ a 1)\n c false] ;;false or nil - does not matter\n b\n a)\n;;=> 1\n\n;; Note that this implementation short-curcuits on false so that the prn form \n;; is _not_ evaluated in the below form.\n(if-let* [a false\n b (prn \"Do we evaluate this?\")]\n true\n false)\n;;=> false", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3", :account-source "github", :login "ertugrulcetin"} {:login "LukasRychtecky", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/585068?v=3"} {:avatar-url "https://avatars2.githubusercontent.com/u/632775?v=4", :account-source "github", :login "Rovanion"}], :_id "5797f83ce4b0bafd3e2a04b9"} {:updated-at 1499190178133, :created-at 1499190178133, :author {:login "claresudbery", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/8990232?v=3"}, :body ";; (if-let [definition condition] then else):\n;; if the value of condition is truthy, then that value is assigned to the definition, \n;; and \"then\" is evaluated.\n;; Otherwise the value is NOT assigned to the definition, and \"else\" is evaluated.\n\n;; Although you can use this structure with booleans, \n;; there's not much point unless you only want to\n;; use the resulting boolean if it's true - as evidenced in the first example below.\n;; if-let is mostly useful when checking for nil.\n\n;; In this first example if Clare is old, it outputs \"Clare is old\".\n;; (the let part of the statement is rather pointless, \n;; as the definition old-clare-age is never used).\n\n(def clare-age 47)\n(if-let [old-clare-age (> clare-age 100)] \n \"Clare is old\" \n \"Clare is not old\")\n;;=> Clare is not old\n\n;; In the next two examples, it only outputs Clare's age if it is valid (ie not nil)\n\n(def clare-age nil)\n(if-let [valid-clare-age clare-age] \n (str \"Clare has a valid age: \" valid-clare-age) \n \"Clare's age is invalid\")\n;;=> Clare's age is invalid\n\n(def clare-age 47)\n(if-let [valid-clare-age clare-age] \n (str \"Clare has a valid age: \" valid-clare-age) \n \"Clare's age is invalid\")\n;;=> Clare has a valid age: 47", :_id "595bd3a2e4b06e730307db4d"} {:updated-at 1534962715587, :created-at 1534962715587, :author {:login "midnio", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/36359066?v=4"}, :body "(if-let [value true]\n \"The expression is true!\"\n \"Sorry, it's not true.\")", :_id "5b7dac1be4b00ac801ed9e6c"} {:updated-at 1535296034148, :created-at 1535296034148, :author {:login "cuspymd", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/8870299?v=4"}, :body ";; Destructuring maps\n(def x {:it 1 :that 2})\n(def y {:that 2}\n(if-let [{value :it} x] value \"Not found\") ;;=> 1\n(if-let [{value :it} nil] value \"Not found\") ;;=> \"Not found\"\n(if-let [{value :it} false] value \"Not found\") ;;=> \"Not found\"\n(if-let [{value :it} y] value \"Not found\") ;;=> nil\n(if-let [{value :it} {}] value \"Not found\") ;;=> nil\n(if-let [{value :it} 1] value \"Not found\") ;;=> nil", :_id "5b82c222e4b00ac801ed9e78"} {:editors [{:login "arlicle", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/153773?v=4"} {:avatar-url "https://avatars2.githubusercontent.com/u/632775?v=4", :account-source "github", :login "Rovanion"}], :body ";; if-let multiple bindings version\n(defmacro if-let*\n ([bindings-vec then] `(if-let* ~bindings-vec ~then nil))\n ([bindings-vec then else]\n (if (seq bindings-vec)\n `(let ~bindings-vec\n (if (and ~@(take-nth 2 bindings-vec))\n ~then\n ~else)))))\n\n\n(if-let* [a 1\n b (+ a 1) ]\n b)\n;;=> 2\n\n(if-let* [a 1\n b (+ a 1)\n c false] ;;false or nil - does not matter\n b\n a)\n;;=> 1 \n\n;; Note that this implementation does _not_ short-circuit on falsey forms.\n(if-let* [a false\n b (prn \"Do we evaluate this?\")]\n true\n false)\n;; \"Do we evaluate this?\"\n;;=> false\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/153773?v=4", :account-source "github", :login "arlicle"}, :created-at 1536027516561, :updated-at 1587464633192, :_id "5b8deb7ce4b00ac801ed9e81"} {:updated-at 1565305899936, :created-at 1565305899936, :author {:login "metacritical", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/760429?v=4"}, :body ";; Check if the value is true print it otherwise not.\n\n(def log-output \"\") \n\n;; Assume log-output could be the result of another operation like\n;; (def log-output (Gl/ShaderInfoLog shader))\n;; The Following will only print, when logout is not empty.\n\n(if-let [out (not-empty logout)]\n (println out))\n", :_id "5d4cac2be4b0ca44402ef794"} {:updated-at 1590171632153, :created-at 1590171632153, :author {:login "themustafabasit", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/24441401?v=4"}, :body ";; fun of if-let \n(defn some-condition\n [data]\n true)\n\n(let [result (some-condition \"ABC\")]\n (if (true? result)\n \"Success\"\n \"Failure\"))\n;; => \"success\"\n\n;; if-let in Action\n(if-let [result (some-condition \"ABC\")]\n \"Success\"\n \"Failure\")\n;; => \"success\"\n", :_id "5ec817f0e4b087629b5a1911"}], :macro true, :notes [{:updated-at 1299054285000, :body "The difference between when-let and if-let is that when-let doesn't have an else clause and and also accepts multiple forms so you don't need to use a (do...).", :created-at 1299054285000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fb5"} {:updated-at 1326335082000, :body "I wonder what motivates the restriction of only one binding, e.g. many Schemes implement an `and-let*` form which allows multiple bindings, evaluating them in order and breaking out on the first binding that evaluates to false. Can somebody shed some light on this?", :created-at 1326335082000, :author {:login "DerGuteMoritz", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/66bba784787f4f725b1568ec69a616cc?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fd6"}], :arglists ["bindings then" "bindings then else & oldform"], :doc "bindings => binding-form test\n\n If test is true, evaluates then with binding-form bound to the value of \n test, if not, yields else", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/if-let"} {:added "1.0", :ns "clojure.core", :name "underive", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1524236415414, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "derive", :ns "clojure.core"}, :_id "5ada007fe4b045c27b7fac49"}], :line 5664, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body ";; create a simple hierarchy using the global hierarchy\n;; and demonstrate how underive is used\n\nuser=> (derive ::dog ::animal)\nnil\nuser=> (derive ::spaniel ::dog)\nnil\nuser=> (derive ::tabby ::dog)\nnil\nuser=> (ancestors ::tabby)\n#{:user/dog :user/animal}\nuser=> (underive ::tabby ::dog)\nnil\nuser=> (ancestors ::tabby)\nnil", :created-at 1313962237000, :updated-at 1423522531628, :_id "542692cdc026201cdc326d0f"}], :notes nil, :arglists ["tag parent" "h tag parent"], :doc "Removes a parent/child relationship between parent and\n tag. h must be a hierarchy obtained from make-hierarchy, if not\n supplied defaults to, and modifies, the global hierarchy.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/underive"} {:added "1.1", :ns "clojure.core", :name "ref-max-history", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1323973069000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ecf"} {:created-at 1364770314000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref-min-history", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ed0"} {:created-at 1364770319000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref-history-count", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ed1"}], :line 2479, :examples nil, :notes nil, :arglists ["ref" "ref n"], :doc "Gets the max-history of a ref, or sets it and returns the ref", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ref-max-history"} {:added "1.7", :ns "clojure.core", :name "Throwable->map", :file "clojure/core_print.clj", :type "function", :column 1, :see-alsos [{:created-at 1538988481625, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ex-data", :ns "clojure.core"}, :_id "5bbb19c1e4b00ac801ed9eb7"}], :line 471, :examples [{:updated-at 1450285594446, :created-at 1450285594446, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=3"}, :body "(def trace (try (/ 1 0) (catch Throwable t (Throwable->map t))))\n(keys trace)\n;; (:cause :via :trace)\n(:cause trace)\n;; \"Divide by zero\"\n(count (:trace trace))\n;; 33 (this stack trace is 33 invocations deep) ", :_id "56719a1ae4b08a391679537c"}], :notes nil, :arglists ["o"], :doc "Constructs a data representation for a Throwable with keys:\n :cause - root cause message\n :phase - error phase\n :via - cause chain, with cause keys:\n :type - exception class symbol\n :message - exception message\n :data - ex-data\n :at - top stack element\n :trace - root cause stack elements", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/Throwable->map"} {:added "1.0", :ns "clojure.core", :name "false?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1375213349000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "not", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521efc"}], :line 505, :examples [{:author {:login "samaaron", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ee3512261f38df2541b9adca77f025cb?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "(false? false) ;=> true\n(false? true) ;=> false\n(false? nil) ;=> false\n(false? \"foo\") ;=> false", :created-at 1278738764000, :updated-at 1332950044000, :_id "542692c7c026201cdc32699d"}], :notes nil, :tag "java.lang.Boolean", :arglists ["x"], :doc "Returns true if x is the value false, false otherwise.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/false_q"} {:added "1.0", :ns "clojure.core", :name "*print-readably*", :type "var", :see-alsos nil, :examples [{:updated-at 1620478814999, :created-at 1620478814999, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :body ";; Showing how *print-readably* is used internally to escape/unescape control\n;; characters:\n\n(binding [*print-readably* false]\n (pr \"a\\nb\\nc\"))\n;; a\n;; b\n;; cnil\n\n;; Only use to change behaviour of code you don't control.\n;; Otherwise, it's equivalent to `print`:\n(print \"a\\nb\\nc\")\n;; a\n;; b\n;; cnil\n", :_id "60968b5ee4b0b1e3652d74f6"}], :notes nil, :arglists [], :doc "When set to logical false, strings and characters will be printed with\n non-alphanumeric characters converted to the appropriate escape sequences.\n\n Defaults to true", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*print-readably*"} {:added "1.0", :ns "clojure.core", :name "ints", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1299221089000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "int-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bc6"}], :line 5373, :examples [{:updated-at 1656672965213, :created-at 1656672965213, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body "(def my-floats (float-array [1.1 2.2 3.3]));; => #'user/my-floats\n\n;; int-array will convert where possible\n(int-array my-floats);; => [1, 2, 3]\n\n;; ints will not\n(try (ints my-floats)\n (catch ClassCastException e (ex-message e)));; => \"[F cannot be cast to [I\"\n", :_id "62bed2c5e4b0b1e3652d7613"} {:updated-at 1682268162146, :created-at 1682268162146, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; Casting avoids expensive reflection, so to see the benefit, enable warning:\n(set! *warn-on-reflection* true)\n\n;; We'll def an int-array but won't type-hint the var:\n(def my-array (int-array [10 20 30 40 50 60]))\n\n;; and try to amap over it without using `ints` or type hinting:\n(amap my-array i _ (unchecked-inc-int (aget my-array i)))\n;; Reflection warning… call to static method alength on clojure.lang.RT can't be resolved (argument types: unknown).\n;; Reflection warning… call to static method aclone on clojure.lang.RT can't be resolved (argument types: unknown).\n;; Reflection warning… call to static method aget on clojure.lang.RT can't be resolved (argument types: unknown, int).\n;; Reflection warning… call to static method aset on clojure.lang.RT can't be resolved (argument types: unknown, int, int).\n;; => [11, 21, 31, 41, 51, 61]\n\n;; We can use `ints` to avoid reflection:\n(amap (ints my-array) i _ (unchecked-inc-int (aget (ints my-array) i)))\n;; => [11, 21, 31, 41, 51, 61]\n\n;; Just as we can type hint in place:\n(amap ^ints my-array i _ (unchecked-inc-int (aget ^ints my-array i)))\n;; => [11, 21, 31, 41, 51, 61]\n\n;; Or type hint the var:\n(def ^\"[I\" my-array (int-array [10 20 30 40 50 60]))\n(amap my-array i _ (unchecked-inc-int (aget my-array i)))\n;; => [11, 21, 31, 41, 51, 61]\n", :_id "64456002e4b08cf8563f4b8e"}], :notes nil, :arglists ["xs"], :doc "Casts to int[]", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/ints"} {:added "1.0", :ns "clojure.core", :name "class", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1281949437000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "type", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a95"} {:created-at 1325041755000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "class?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a96"} {:created-at 1357883208000, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :to-var {:ns "clojure.core", :name "instance?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a97"}], :line 3460, :examples [{:updated-at 1451352065851, :created-at 1280546296000, :body "user=> (class 1)\njava.lang.Long\n\nuser=> (class [1 2 3])\nclojure.lang.PersistentVector\n\nuser=> (class (String. \"foo\"))\njava.lang.String", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "rtoal", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/538615?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon", :account-source "clojuredocs", :login "dakrone"}, :_id "542692cac026201cdc326b68"} {:editors [{:login "rtoal", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/538615?v=3"}], :body "user=> (class class)\nclojure.core$class", :author {:avatar-url "https://avatars.githubusercontent.com/u/538615?v=3", :account-source "github", :login "rtoal"}, :created-at 1451352054083, :updated-at 1451352297752, :_id "5681dff6e4b01f598e267e93"} {:updated-at 1474629795271, :created-at 1474629795271, :author {:login "jfacorro", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1522569?v=3"}, :body "user=> (class nil)\nnil", :_id "57e510a3e4b0709b524f0509"}], :notes nil, :arglists ["x"], :doc "Returns the Class of x", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/class"} {:added "1.3", :ns "clojure.core", :name "some-fn", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1348529537000, :author {:login "hugoduncan", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/80fa2a15219b987664e4d6f5c78b4c27?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "every-pred", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ecd"} {:created-at 1374512408000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "some", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ece"} {:created-at 1461817364964, :author {:login "bkovitz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "some->", :ns "clojure.core"}, :_id "57219014e4b0fc95a97eab5f"} {:created-at 1461817376595, :author {:login "bkovitz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "some->>", :ns "clojure.core"}, :_id "57219020e4b0fc95a97eab60"} {:created-at 1582756004670, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "or", :ns "clojure.core"}, :_id "5e56f0a4e4b087629b5a18ac"} {:created-at 1609357926155, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "fnil", :ns "clojure.core"}, :_id "5fecda66e4b0b1e3652d7425"}], :line 7436, :examples [{:updated-at 1462556528065, :created-at 1321364478000, :body "\nuser=> ((some-fn even?) 1)\nfalse\nuser=> ((some-fn even?) 2)\ntrue\nuser=> ((some-fn even?) 1 2)\ntrue\n", :editors [{:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/e7869fe1a48cb1814c657eaca6bea3eb?r=PG&default=identicon", :account-source "clojuredocs", :login "replore"}, :_id "542692d5c026201cdc32708b"} {:author {:login "uvtc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/34f159f89cbd1d9beac0276f5a7af552?r=PG&default=identicon"}, :editors [], :body ";; `some-fn` is useful for when you'd use `some` (to find out if any\n;; values in a given coll satisfy some predicate), but have more than\n;; one predicate. For example, to check if any values in a coll are\n;; either even or less than 10:\n\n(or (some even? [1 2 3])\n (some #(< % 10) [1 2 3]))\n\n;; but `some-fn` can save you some duplication here:\n\n((some-fn even? #(< % 10)) 1 2 3)\n\n;; Minor note: the former returns nil if it doesn't find\n;; what it's looking for. The latter returns false.", :created-at 1343775095000, :updated-at 1343775095000, :_id "542692d5c026201cdc32708c"} {:updated-at 1477665180894, :created-at 1399749753000, :body ";;; http://en.wikipedia.org/wiki/Fizz_buzz\n(def fizzbuzz\n (some-fn #(and (= (mod % 3) 0) (= (mod % 5) 0) \"FizzBuzz\")\n #(and (= (mod % 3) 0) \"Fizz\")\n #(and (= (mod % 5) 0) \"Buzz\")\n str))\n\n(run! println (map fizzbuzz (range 1 18)))\n\n1\n2\nFizz\n4\nBuzz\nFizz\n7\n8\nFizz\nBuzz\n11\nFizz\n13\n14\nFizzBuzz\n16\n17", :editors [{:login "GordonGustafson", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6244646?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon", :account-source "clojuredocs", :login "ryo"}, :_id "542692d5c026201cdc32708d"} {:updated-at 1461825756902, :created-at 1461820011453, :author {:login "bkovitz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3"}, :body ";; Here's an easy way to apply several functions in succession to the same\n;; value and get the first true result. Note the double parentheses at the\n;; beginning: because some-fn returns a function, you have to apply it.\n\n((some-fn :a :b :c :d) {:c 3 :d 4})\n;=> 3\n\n;; Here's how to do the same thing but with a vector of functions. Note\n;; the 'apply' as well as the double parentheses, since you have to make\n;; some-fn take its arguments from the vector.\n\n(def parsers\n [parse-custom-command\n parse-basic-command\n parse-weird-command\n reject-command])\n\n((apply some-fn parsers) text-from-user)\n\n;; Each element of parsers is a function that returns a data structure if\n;; it successfully parses its argument or nil if it fails. reject-command\n;; always succeeds, returning a representation of an error.\n\n;; Note the technique of putting a catch-all function for errors last.\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3", :account-source "github", :login "bkovitz"}], :_id "57219a6be4b0f8c89e75b111"}], :notes nil, :arglists ["p" "p1 p2" "p1 p2 p3" "p1 p2 p3 & ps"], :doc "Takes a set of predicates and returns a function f that returns the first logical true value\n returned by one of its composing predicates against any of its arguments, else it returns\n logical false. Note that f is short-circuiting in that it will stop execution on the first\n argument that triggers a logical true result against the original predicates.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/some-fn"} {:added "1.2", :ns "clojure.core", :name "case", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1294148893000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "cond", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d1e"} {:created-at 1294148897000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "condp", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d1f"}], :line 6697, :examples [{:author {:login "jneira", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2c8ecc24181d171df85a26458b9cd5f?r=PG&default=identicon"}, :editors [{:login "jneira", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2c8ecc24181d171df85a26458b9cd5f?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "dale", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a7a1eca257c6cea943fea41e5cc3e9a3?r=PG&default=identicon"} {:login "dale", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a7a1eca257c6cea943fea41e5cc3e9a3?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(let [mystr \"hello\"]\n (case mystr\n \"\" 0\n \"hello\" (count mystr)))\n;;=> 5\n\n(let [mystr \"no match\"]\n (case mystr\n \"\" 0\n \"hello\" (count mystr)))\n;; No matching clause: no match\n;; [Thrown class java.lang.IllegalArgumentException]\n\n(let [mystr \"no match\"]\n (case mystr\n \"\" 0\n \"hello\" (count mystr)\n \"default\"))\n;;=> \"default\"\n\n;; You can give multiple values for the same condition by putting\n;; those values in a list.\n(case 'y\n (x y z) \"x, y, or z\"\n \"default\")\n;;=> \"x, y, or z\"\n\n(let [myseq '(1 2)]\n (case myseq\n (()) \"empty seq\"\n ((1 2)) \"my seq\"\n \"default\"))\n;;=> \"my seq\"\n\n;; \"The test-constants are not evaluated.They must be compile-time\n;; literals, and need not be quoted.\" \n(let [myvec [1 2]]\n (case myvec\n [] \"empty vec\"\n (vec '(1 2)) \"my vec\"\n \"default\"))\n;;=> \"default\"\n", :created-at 1278987914000, :updated-at 1422376846462, :_id "542692ccc026201cdc326c89"} {:editors [{:login "rmprescott", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/224805?v=4"}], :body ";; From: The Clojure Style Guide \n;; https://github.com/bbatsov/clojure-style-guide#case\n;; License: Creative Commons Attribution 3.0 Unported License\n;;\n;; Prefer case instead of cond or condp when test expressions are compile-time constants.\n\n;; good\n(cond\n (= x 10) :ten\n (= x 20) :twenty\n (= x 30) :forty\n :else :dunno)\n\n;; better\n(condp = x\n 10 :ten\n 20 :twenty\n 30 :forty\n :dunno)\n\n;; best\n(case x\n 10 :ten\n 20 :twenty\n 30 :forty\n :dunno)", :author {:avatar-url "https://avatars1.githubusercontent.com/u/224805?v=4", :account-source "github", :login "rmprescott"}, :created-at 1539061331613, :updated-at 1539061466913, :_id "5bbc3653e4b00ac801ed9ecc"} {:updated-at 1575502428174, :created-at 1575502355101, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :body ";; test-constants are not evaluated, so the symbols should NOT be quoted\n(let [x 'a-symbol] ; quoted\n (case x \n a-symbol :a ; not quoted\n b-symbol :b)) ; not quoted\n;;=> :a", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4", :account-source "github", :login "huahaiy"}], :_id "5de84213e4b0ca44402ef7f1"} {:updated-at 1582540498084, :created-at 1582540498084, :author {:login "bnii", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/22633514?v=4"}, :body ";; Other example on\n;; \"The test-constants are not evaluated. They must be compile-time\n;; literals, and need not be quoted.\" \n\n(def one 1)\n;;=> #'user/one\n(case 1 \n one :one \n :not-one)\n;;=> :not-one", :_id "5e53a6d2e4b087629b5a18a1"} {:updated-at 1587638962866, :created-at 1587638962866, :author {:login "uosl", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/3865590?v=4"}, :body ";; You can use a macro to inline test-constants you wish to define separately.\n\n(def ops-single '(\"=\" \"!=\" \"<\" \"<=\" \">\" \">=\"))\n\n(def ops-multi '(\"ONE OF\" \"NONE OF\"))\n\n(defmacro ops-type [op]\n `(case ~op\n ~ops-single :single\n ~ops-multi :multi))", :_id "5ea172b2e4b087629b5a18df"} {:updated-at 1587918490021, :created-at 1587918490021, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/8271291?v=4"}, :body "(case :blocking\n (:blocking :compute) :block-or-compute\n :async :async)\n\n;;=> :block-or-compute\n\n\n(case :async\n (:blocking :compute) :block-or-compute\n :async :async)\n\n;;=> :async", :_id "5ea5b69ae4b087629b5a18e9"} {:updated-at 1629037974768, :created-at 1615140525278, :author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :body ";; I timed rmprescott's example:\n\n(let [x 30] \n ;; \"good\"\n (time (cond\n (= x 10) :ten\n (= x 20) :twenty\n (= x 30) :thirty\n :else :dunno)) ;;=> \"Elapsed time: 0.0666 msecs\"\n\n ;; \"better\"\n (time (condp = x\n 10 :ten\n 20 :twenty\n 30 :thirty\n :dunno)) ;;=> \"Elapsed time: 0.4197 msecs\"\n\n ;; best in performance if else statement is executed (not shown)\n ;; best in readability\n (time (case x\n 10 :ten\n 20 :twenty\n 30 :thirty\n :dunno)) ;;=> \"Elapsed time: 0.0032 msecs\"\n \n ;; best in performance if known branches are executed\n ;; worst in readability\n (time (if (= x 10)\n :ten\n (if (= x 20)\n :twenty\n (if (= x 30)\n :thirty\n :dunno)))))) ;;=> \"Elapsed time: 0.0021 msecs\" \n\n;;=> :thirty", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4", :account-source "github", :login "Crowbrammer"}], :_id "604516ade4b0b1e3652d746d"} {:updated-at 1643907667427, :created-at 1643907667427, :author {:login "fdhenard", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/884972?v=4"}, :body ";; demonstrates inclusion on the test\n;; ... could be one of \"what\" or \"why\"\n\n(case \"what\"\n (\"what\" \"why\") :question\n :something-else)\n\n;;=> :question", :_id "61fc0a53e4b0b1e3652d75a6"}], :macro true, :notes [{:updated-at 1290270646000, :body "the third example describing myseq may be incorrect. I think we have to use vectors for comparing list of compile time constants.\r\n
    \r\n(let [myseq [1 2]]\r\n (case myseq\r\n  [] \"empty seq\"\r\n  [1 2] \"my seq\"\r\n  \"default\"))\r\n
    \r\n\r\nThe parenthesized test conditions are used when multiple test conditions give the same output (output expression). In my case , since both [true, true] and [false, false] return true, i have put them within parenthesis.\r\n\r\n
    \r\n(defn equ\r\n [a b]\r\n (case [a b]\r\n   ([true true] [false false]) true\r\n   true))\r\n\r\n(equ true true) ;; returns true\r\n(equ false false) ;; returns true\r\n(equ false true) ;; return false\r\n(equ true false) ;; returns false\r\n
    ", :created-at 1290269788000, :author {:login "dpani", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3229d0eee8f780b9baa64657ff561fd3?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fa4"} {:updated-at 1290655074000, :body "I updated that example with myseq to reflect behavior of Clojure 1.2.0 on my machine. I also added an additional example to explicitly demonstrate multiple values for the same condition.", :created-at 1290655074000, :author {:login "dale", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a7a1eca257c6cea943fea41e5cc3e9a3?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fa6"} {:body "Java enums are not compile-time literals.", :created-at 1613272178203, :updated-at 1613272197403, :author {:avatar-url "https://avatars.githubusercontent.com/u/6383047?v=4", :account-source "github", :login "beluchin"}, :_id "60289472e4b0b1e3652d7455"} {:body "Keep in mind this is not quite like pattern matching.\n\n```\n(case [:a :b]\n [:a :b] \"a b combo\"\n [_ :b] \"at least b\" \n)\n```\n\nWill not work. Instead install and use core.match:\n\n```\n(clojure.core.match/match [:a :b]\n [:a :b] \"a b combo\"\n [_ :b] \"at least b\")\n```\n(Thanks to potetm and Martin Půda on Clojurians Slack)", :created-at 1648411010714, :updated-at 1648411421228, :author {:avatar-url "https://avatars.githubusercontent.com/u/590297?v=4", :account-source "github", :login "eccentric-j"}, :_id "6240c182e4b0b1e3652d75c3"} {:author {:login "KingMob", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/946421?v=4"}, :updated-at 1680176304321, :created-at 1680176304321, :body "Reminder: compile-time *literals* are not the same thing as compile-time *constants*. The Clojure macro/compiler is not smart enough to work with things like Java constants or `^:const` vars.\n\nE.g.: \n\n```\n(case Math/PI\n Math/PI :pi\n Math/E :e\n :default)\n=> :default\n\n\n\n(def ^:const pi Math/PI)\n=> #'user/pi\n(case Math/PI\n pi :pi\n Math/E :e\n :default)\n=> :default\n```\n\nwill not work.", :_id "642574b0e4b08cf8563f4b87"}], :arglists ["e & clauses"], :doc "Takes an expression, and a set of clauses.\n\n Each clause can take the form of either:\n\n test-constant result-expr\n\n (test-constant1 ... test-constantN) result-expr\n\n The test-constants are not evaluated. They must be compile-time\n literals, and need not be quoted. If the expression is equal to a\n test-constant, the corresponding result-expr is returned. A single\n default expression can follow the clauses, and its value will be\n returned if no clause matches. If no default expression is provided\n and no clause matches, an IllegalArgumentException is thrown.\n\n Unlike cond and condp, case does a constant-time dispatch, the\n clauses are not considered sequentially. All manner of constant\n expressions are acceptable in case, including numbers, strings,\n symbols, keywords, and (Clojure) composites thereof. Note that since\n lists are used to group multiple constants that map to the same\n expression, a vector can be used to match a list if needed. The\n test-constants need not be all of the same type.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/case"} {:added "1.0", :ns "clojure.core", :name "*flush-on-newline*", :type "var", :see-alsos nil, :examples nil, :notes nil, :arglists [], :doc "When set to true, output will be flushed whenever a newline is printed.\n\n Defaults to true.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*flush-on-newline*"} {:added "1.0", :ns "clojure.core", :name "to-array", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1329377518000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "alength", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ba2"} {:created-at 1329377602000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "char-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ba3"} {:created-at 1329377609000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "int-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ba4"} {:created-at 1329377615000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "long-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ba5"} {:created-at 1374150114000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "into-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ba6"} {:created-at 1374150319000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "make-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ba7"} {:created-at 1375613635000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "to-array-2d", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ba8"}], :line 338, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user=> (to-array [1 2 3])\n#", :created-at 1285922749000, :updated-at 1423279139981, :_id "542692cfc026201cdc326e1e"} {:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "(def hello (to-array \"Hello World!\"))\n\n(aget hello 1)\n;; => \\e\n\n(aset hello 1 \\b) ;;Mutability! Watch out!\n;; => \\b\n\n(dotimes [n (alength hello)] (print (aget hello n)))\n;; => Hbllo World!\n\n;; Calling `to-array` on array returns the original, not a copy\n(identical? (to-array hello) hello)\n;; => true", :created-at 1329377512000, :updated-at 1423279331082, :_id "542692d5c026201cdc3270a9"} {:editors [{:login "luiszambon", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/41161270?v=4"}], :body "user> (class '(1 2 3 4))\n;=> clojure.lang.PersistentList\n\nuser> (class (to-array '(1 2 3 4)))\n;=> [Ljava.lang.Object;\n\nuser> (get (to-array '(1 2 3 4)) 0)\n;=> 1\n", :author {:avatar-url "https://avatars0.githubusercontent.com/u/41161270?v=4", :account-source "github", :login "luiszambon"}, :created-at 1599766069962, :updated-at 1600132120029, :_id "5f5a7e35e4b0b1e3652d73b8"}], :notes nil, :tag "[Ljava.lang.Object;", :arglists ["coll"], :doc "Returns an array of Objects containing the contents of coll, which\n can be any Collection. Maps to java.util.Collection.toArray().", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/to-array"} {:added "1.0", :ns "clojure.core", :name "bigdec", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1374317032000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "decimal?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ec2"} {:created-at 1514475884312, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "with-precision", :ns "clojure.core"}, :_id "5a45116ce4b0a08026c48ce7"} {:created-at 1579780078637, :author {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "bigint", :ns "clojure.core"}, :_id "5e2987eee4b0ca44402ef81e"} {:created-at 1579780089811, :author {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "double", :ns "clojure.core"}, :_id "5e2987f9e4b0ca44402ef81f"} {:created-at 1579780098355, :author {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "float", :ns "clojure.core"}, :_id "5e298802e4b0ca44402ef820"}], :line 3647, :examples [{:updated-at 1321355928000, :created-at 1280814320000, :body "user=> (bigdec 3.0)\n3.0M\n\nuser=> (bigdec 5)\n5M\n\nuser=> (bigdec -1)\n-1M\n\nuser=> (bigdec -1.0)\n-1.0M\n\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/e7869fe1a48cb1814c657eaca6bea3eb?r=PG&default=identicon", :account-source "clojuredocs", :login "replore"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692cec026201cdc326d80"} {:updated-at 1535909835189, :created-at 1535909835189, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/7083783?v=4"}, :body "; It also works for strings:\n(bigdec \"123.45\") => 123.45M\n", :_id "5b8c1fcbe4b00ac801ed9e7d"} {:updated-at 1598220594241, :created-at 1598220594241, :author {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}, :body ";; Works with ratios too\n\nuser => (bigdec 1/2)\n;; 0.5M", :_id "5f42e932e4b0b1e3652d73a6"} {:updated-at 1605204244578, :created-at 1605204244578, :author {:login "Arvantos", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/74289274?v=4"}, :body "user=> (+ 0.1 0.1 0.1)\n0.30000000000000004\nuser=> (def a (bigdec 0.1))\n#'user/a\nuser=> (+ a a a)\n0.3M", :_id "5fad7914e4b0b1e3652d7404"}], :notes nil, :tag "java.math.BigDecimal", :arglists ["x"], :doc "Coerce to BigDecimal", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bigdec"} {:added "1.0", :ns "clojure.core", :name "list?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1318710916000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "seq?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b5e"} {:created-at 1356063872000, :author {:login "hugoduncan", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/80fa2a15219b987664e4d6f5c78b4c27?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sequential?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b5f"} {:created-at 1356066804000, :author {:login "hugoduncan", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/80fa2a15219b987664e4d6f5c78b4c27?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "coll?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b60"} {:created-at 1414509201213, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "map?", :library-url "https://github.com/clojure/clojure"}, :_id "544fb291e4b0dc573b892fac"} {:created-at 1414509214198, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "set?", :library-url "https://github.com/clojure/clojure"}, :_id "544fb29ee4b0dc573b892fad"} {:created-at 1414509226885, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "vector?", :library-url "https://github.com/clojure/clojure"}, :_id "544fb2aae4b03d20a1024287"}], :line 6219, :examples [{:updated-at 1414509176872, :created-at 1279074216000, :body ";; an idiomatic persistent-list is a list\n(list? '(1 2 3))\n;;=> true\n\n;; a persistent-list is a list\n;; (list? (list 1 2))\n;;=> true\n\n;; a numeric value (long) is not a list\n(list? 0)\n;;=> false\n\n;; a persistent-array-map is not a list\n(list? {})\n;;=> false\n\n;; a persistent-vector is not a list\n(list? [])\n;;=> false\n\n;; a lazy-sequence is not always a list\n(list? (range 10))\n;;=> false\n", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"} {:avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon", :account-source "clojuredocs", :login "steveminer"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=2", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/147981?v=3", :account-source "github", :login "dpritchett"}, :_id "542692cbc026201cdc326b9d"} {:editors [{:login "muhuk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/40178?v=3"}], :body ";; not all lists are lists\n(cons 1 '(2 3))\n;; => (1 2 3)\n(= '(1 2 3) (cons 1 '(2 3)))\n;; => true\n(list? (cons 1 '(2 3)))\n;; => false\n\n;; good news is:\n(seq? (cons 1 '(2 3)))\n;; => true\n(seq? [1 2 3])\n;; => false\n\n;; So seq? might be what you are looking \n;; for when you want to test listness.\n\n\n\n\n\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/40178?v=3", :account-source "github", :login "muhuk"}, :created-at 1448895002974, :updated-at 1455541780305, :_id "565c621ae4b0be225c0c47a3"}], :notes [{:updated-at 1318711577000, :body "You may want to use `seq?` instead of `list?`, especially if you might be dealing with a lazy sequence as returned by `filter`, `range`, etc.", :created-at 1318711577000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fcf"}], :arglists ["x"], :doc "Returns true if x implements IPersistentList", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/list_q"} {:added "1.9", :ns "clojure.core", :name "simple-ident?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495714925553, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ident?", :ns "clojure.core"}, :_id "5926cc6de4b093ada4d4d755"} {:created-at 1495714934749, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "qualified-ident?", :ns "clojure.core"}, :_id "5926cc76e4b093ada4d4d756"} {:created-at 1596595008529, :author {:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "simple-symbol?", :ns "clojure.core"}, :_id "5f2a1b40e4b0b1e3652d736b"} {:created-at 1596595016865, :author {:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "simple-keyword?", :ns "clojure.core"}, :_id "5f2a1b48e4b0b1e3652d736c"}], :line 1617, :examples [{:updated-at 1596595653208, :created-at 1596595653208, :author {:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}, :body "(simple-ident? 'asymbol)\n;;=> true\n\n(simple-ident? :akeyword)\n;;=> true\n\n(simple-ident? 'clojure.core/asymbol)\n;;=> false\n\n(simple-ident? ::akeyword)\n;;=> false\n\n(simple-ident? \"hello\")\n;;=> false\n\n(simple-ident? 7)\n;;=> false\n\n(simple-ident? nil)\n;;=> false", :_id "5f2a1dc5e4b0b1e3652d736d"}], :notes nil, :arglists ["x"], :doc "Return true if x is a symbol or keyword without a namespace", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/simple-ident_q"} {:added "1.0", :ns "clojure.core", :name "bit-not", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 1286, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (bit-not 2r0111)\n-8 \n\nuser=> (bit-not -2r1000)\n7", :created-at 1280338423000, :updated-at 1332951542000, :_id "542692cac026201cdc326b50"}], :notes nil, :arglists ["x"], :doc "Bitwise complement", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bit-not"} {:added "1.0", :ns "clojure.core", :name "io!", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1554127057477, :author {:login "daveliepmann", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/974443?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "dosync", :ns "clojure.core"}, :_id "5ca218d1e4b0ca44402ef6f6"}], :line 2512, :examples [{:author {:login "mstoeckli", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/271f1fe6c39e19db5714ce29b64d3ad5?r=PG&default=identicon"}, :editors [], :body "user=> (def a (ref 0))\n#'user/a\n\nuser=> (dosync\n (io! (println \"hello\"))\n (alter a inc))\nIllegalStateException I/O in transaction\n\nuser=> (dosync\n (println \"hello\")\n (alter a inc))\n\"hello\"\n1\n\nuser=> (defn fn-with-io []\n (io! (println \"hello\")))\n#'user/fn-with-io\n\nuser=> (dosync\n (fn-with-io)\n (alter a inc))\nIllegalStateException I/O in transaction", :created-at 1337147168000, :updated-at 1337147168000, :_id "542692d3c026201cdc326fdc"}], :macro true, :notes nil, :arglists ["& body"], :doc "If an io! block occurs in a transaction, throws an\n IllegalStateException, else runs body in an implicit do. If the\n first expression in body is a literal string, will use that as the\n exception message.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/io!"} {:added "1.0", :ns "clojure.core", :name "xml-seq", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 4958, :examples [{:author {:login "ed-g", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9b506528a954f5a5e83bd7041d287f68?r=PG&default=identicon"}, :editors [{:login "biggert", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ebd5e5aaf54f2bb5b8b01872d8ffe5d0?r=PG&default=identicon"} {:login "biggert", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ebd5e5aaf54f2bb5b8b01872d8ffe5d0?r=PG&default=identicon"} {:login "biggert", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ebd5e5aaf54f2bb5b8b01872d8ffe5d0?r=PG&default=identicon"}], :body ";; data.xml from https://github.com/clojure/data.xml/\n(use '[clojure.data.xml :only [parse-str]])\n\nuser=> (let [xml-text \"\n 123\"]\n (let [root (parse-str xml-text)]\n (xml-seq root)))\n\n({:tag :foo, \n :attrs {:key \"val\"}, \n :content (\"1\" {:tag :bar, :attrs {}, :content (\"2\")} \"3\")} \n \"1\" \n {:tag :bar, :attrs {}, :content (\"2\")} \n \"2\" \n \"3\") \n", :created-at 1357886858000, :updated-at 1367460525000, :_id "542692d6c026201cdc3270c6"} {:updated-at 1474877368412, :created-at 1367493904000, :body "(use '[clojure.data.xml :only [parse]])\n\n;; clojure.xml/parse requires string to be ByteArrayInputStream\nuser-> (let [xml-text \"\n 123\"]\n (let [input (java.io.ByteArrayInputStream. \n (.getBytes xml-text))]\n (let [root (parse input)]\n (xml-seq root))))\n\n({:tag :foo, \n :attrs {:key \"val\"}, \n :content (\"1\" {:tag :bar, :attrs {}, :content (\"2\")} \"3\")} \n \"1\" \n {:tag :bar, :attrs {}, :content (\"2\")} \n \"2\" \n \"3\")", :editors [{:login "pho-coder", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6576686?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/ebd5e5aaf54f2bb5b8b01872d8ffe5d0?r=PG&default=identicon", :account-source "clojuredocs", :login "biggert"}, :_id "542692d6c026201cdc3270ca"} {:updated-at 1580661283196, :created-at 1519297750007, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Any breaking news today?\n(require '[clojure.java.io :as io])\n(require '[clojure.xml :as xml])\n\n(def feeds\n [[:guardian \"https://www.theguardian.com/world/rss\"]\n [:wash-post \"http://feeds.washingtonpost.com/rss/rss_blogpost\"]\n [:nytimes \"https://rss.nytimes.com/services/xml/rss/nyt/World.xml\"]\n [:wsj \"https://feeds.a.dj.com/rss/RSSWorldNews.xml\"]\n [:reuters \"http://feeds.reuters.com/reuters/UKTopNews\"]])\n\n(pmap\n (fn [[feed url]]\n (let [content (comp first :content)]\n [feed\n (sequence\n (comp\n (filter (comp string? content))\n (filter (comp #{:title} :tag))\n (filter #(re-find #\"(?i)breaking\" (content %)))\n (map content))\n (xml-seq (xml/parse url)))]))\n feeds)\n\n;; Only a false positive...\n;;([:guardian (\"Climate change 'will push European cities towards breaking point'\")]\n;; [:wash-post ()]\n;; [:nytimes ()]\n;; [:wsj ()]\n;; [:reuters ()])", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5a8ea4d6e4b0316c0f44f8eb"}], :notes nil, :arglists ["root"], :doc "A tree seq on the xml elements as per xml/parse", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/xml-seq"} {:added "1.0", :ns "clojure.core", :name "byte", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1334358069000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "byte-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e67"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "bytes", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917284000, :_id "542692ebf6e94c6970521e68"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "short", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917760000, :_id "542692ebf6e94c6970521e69"} {:created-at 1496262181439, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unchecked-byte", :ns "clojure.core"}, :_id "592f2625e4b06e730307db1d"}], :line 3504, :examples [{:author {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}, :editors [{:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}], :body "user=> (def x (byte-array [(byte 0x43) \n (byte 0x6c)\n (byte 0x6f)\n (byte 0x6a)\n (byte 0x75)\n (byte 0x72)\n (byte 0x65)\n (byte 0x21)]))\n#'user/x\n\nuser=> (String. x)\n\"Clojure!\"\n", :created-at 1283813146000, :updated-at 1287791649000, :_id "542692cbc026201cdc326c11"} {:updated-at 1596590375648, :created-at 1596572702674, :author {:login "wdhowe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4"}, :body ";; Casting a string does not work\n(byte \"123\")\n;;=> Execution error (ClassCastException) at user/eval157 (REPL:1).\n;;java.lang.String cannot be cast to java.lang.Number\n\n;; Use Java interop instead\n(Byte/parseByte \"123\")\n;;=> 123\n\n;; Content originally posted by u/didibus on https://clojuredocs.org/clojure.core/num", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/4631165?v=4", :account-source "github", :login "wdhowe"}], :_id "5f29c41ee4b0b1e3652d735d"}], :notes nil, :arglists ["x"], :doc "Coerce to byte", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/byte"} {:added "1.0", :ns "clojure.core", :name "max", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1343257166000, :author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "max-key", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cf7"} {:created-at 1371841162000, :author {:login "adereth", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5ad11b4e208a6cdb3bd45fe01dea59b7?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "min", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cf8"}], :line 1115, :examples [{:updated-at 1411918995332, :created-at 1279417705000, :body ";; `max` returns the largest of its arguments\nuser=> (max 1 2 3 4 5) \n5\n\n;; regardless of order of those arguments\nuser=> (max 5 4 3 2 1)\n5\n\nuser=> (max 100)\n100", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"}, :_id "542692ccc026201cdc326c99"} {:author {:login "mydoghasworms", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e1e4692b0c0b2fcc1844f11cb43191da?r=PG&default=identicon"}, :editors [], :body ";; If elements are already in a sequence, use apply\nuser=> (apply max [1 2 3 4 3])\n4\nuser=> (apply max '(4 3 5 6 2))\n6", :created-at 1367237523000, :updated-at 1367237523000, :_id "542692d4c026201cdc32700b"} {:updated-at 1482367699298, :created-at 1482367699298, :author {:login "zjliu1984", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1556007?v=3"}, :body "user> (reduce max [1 2 3 4 5 6 7 6 5 4 3])\n7", :_id "585b22d3e4b004d3a355e2d5"}], :notes [{:body "As of 1.6, `max`'s behavior differs when it's passed single / multiple non-numeric arguments:\n\n```\n(max \"foo\") ;;=> \"foo\"\n\n(max \"foo\" \"bar\") ;;=> ClassCastException thrown\n```", :created-at 1411919387514, :updated-at 1411919387514, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :_id "54282e1be4b0ba57bdbcf25d"} {:author {:login "burbma", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/7841889?v=4"}, :updated-at 1553102150973, :created-at 1553102150973, :body "```\n;; Be warned\nuser=> (max 1 nil)\njava.lang.NullPointerException\n```", :_id "5c927546e4b0ca44402ef6bb"}], :arglists ["x" "x y" "x y & more"], :doc "Returns the greatest of the nums.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/max"} {:added "1.0", :ns "clojure.core", :name "==", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1287469513000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "=", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e4b"} {:created-at 1350778281000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "identical?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f34"} {:created-at 1548959844037, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "compare", :ns "clojure.core"}, :_id "5c534064e4b0ca44402ef65f"}], :line 1100, :examples [{:author {:login "james", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4b163432c99a124feee4be046a3f9d66?r=PG&default=identicon"}, :editors [{:login "james", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4b163432c99a124feee4be046a3f9d66?r=PG&default=identicon"} {:login "james", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4b163432c99a124feee4be046a3f9d66?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :body ";; true:\n(== 1)\n(== 1 1) \n(== 1/1, 2/2, 3/3, 4/4) \n(== 1, 1.0, 1/1)\n(== :foo)\n\n\n;; false:\n(== 1 2)\n\n;; ClassCastException\n(== 1 \\1)\n(== 1 \"1\")", :created-at 1283399494000, :updated-at 1412882998472, :_id "542692c6c026201cdc3268dd"} {:body "user=> (= 0.0 0)\nfalse\nuser=> (== 0.0 0)\ntrue", :author {:login "h3x3d", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1663557?v=2"}, :created-at 1415298297003, :updated-at 1415298297003, :_id "545bbcf9e4b0dc573b892fbe"} {:body ";; Just what you would expect\n(== 2.0 1.9999999)\n;;=> false\n\n;; a suprising result\n(== 2.0 2 6/3 1.9999999999999999)\n;;=> true ??!?\n;; Yes, there is some rounding off going on.\n;; if you take off just one of the repeating 9 (on my machine) these compare.\n", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1415650668901, :updated-at 1415650668901, :_id "54611d6ce4b0dc573b892fc1"} {:editors [{:login "wontheone1", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/11784756?v=4"}], :body "\n;; When floating point numbers are far enough from each other\n(== 2.0 1.9999999)\n;;=> false\n(- 100.0 100.00000000000001) ;13(Thirteen) 0s after floating point in the last number\n;;=> -1.4210854715202004E-14\n\n;; When two floating point numbers are too close some basic algebraic properties don't strictly hold.\n(== 2.0 1.9999999999999999)\n;;=> true\n\n(* 100 (- 1.0 1.0000000000000001)) ;15(fifteen) 0s after floating point in the last number\n;;=> 0.0\n\n;; They are still different types\n(= 2 1.9999999999999999)\n;;=> false\n\n;; see more from https://en.wikibooks.org/wiki/Floating_Point/Epsilon\n;; I found above example was distracting by putting 6/3 and 2 in the equality check that is why I decided to write up a similar but new example.", :author {:avatar-url "https://avatars1.githubusercontent.com/u/11784756?v=4", :account-source "github", :login "wontheone1"}, :created-at 1504857100867, :updated-at 1504857144266, :_id "59b24c0ce4b09f63b945ac62"} {:editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}], :body ";; See the Clojure Equality guide for more details:\n;; https://clojure.org/guides/equality\n\n;; == returns false whenever comparing the special \"not a number\" value to any\n;; number, including itself.\n\nuser=> (== 1 ##NaN)\nfalse ;; this result you probably expect\n\nuser=> (== ##NaN ##NaN)\nfalse ;; this one may surprise you\n", :author {:avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4", :account-source "github", :login "jafingerhut"}, :created-at 1548789636747, :updated-at 1565641625053, :_id "5c50a784e4b0ca44402ef659"} {:updated-at 1598156432612, :created-at 1598156432612, :author {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}, :body "user => (= 1/2 0.5)\n;; => false\n\nuser => (== 1/2 0.5)\n;; => true", :_id "5f41ee90e4b0b1e3652d738f"}], :notes [{:updated-at 1287470809000, :body "There is a difference between \"=\" and \"==\". For primitives you definitely want to use \"==\" as \"=\" will result in a cast to the wrapped types for it's arguments.\r\n\r\nThis may not be the case come Clojure 1.3 (see [1])\r\n\r\n[1] http://github.com/clojure/clojure/commit/df8c65a286e90e93972bb69392bc106128427dde", :created-at 1287470809000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f9c"} {:updated-at 1363156271000, :body "So what is difference with =? ", :created-at 1363156271000, :author {:login "popopome", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f764e6667c2664b9979227fc40be024e?r=PG&default=identicon"}, :_id "542692edf6e94c6970521ffe"} {:updated-at 1363512387000, :body "'== is defined only for numbers, where '= is general equality. The example showing (== :foo) as true is a bit misleading because (== :foo :foo) produces an exception. Unary == always returns true as an optimization.", :created-at 1363512387000, :author {:login "mattharden", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a0f377e9263784a0036c5417d0a18aef?r=PG&default=identicon"}, :_id "542692edf6e94c6970521fff"}], :arglists ["x" "x y" "x y & more"], :doc "Returns non-nil if nums all have the equivalent\n value (type-independent), otherwise false", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/=="} {:added "1.0", :ns "clojure.core", :name "*agent*", :type "var", :see-alsos [{:created-at 1399893914000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "agent", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d10"}], :examples [{:author {:login "goodmike", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/42e0998c3077ba0ac435423941a3978e?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; *agent* is often used with send or send-off to set up a repeated\n;; transformation of an agent's value. For example, to repeatedly \n;; increment the integer value of an agent 'myagent' until some \n;; flag value 'running' evaluates to false:\n\n;; Create an agent set to an initial value of 0:\n(def myagent (agent 0))\n\n;; Define a variable to act as a boolean flag:\n(def running true)\n\n;; Define a function to increment agent value repeatedly:\n(defn inc-while-running [agent-value]\n (when running\n (send-off *agent* inc-while-running)) ;sets up another call\n (inc agent-value))\n\n;; Dereference myagent to confirm it is set to value 0:\nuser=> @myagent\n0\n\n;; Start the fun:\nuser=> (send-off myagent inc-while-running)\n#<Agent@5fb9f88b: 20>\n\n;; The agent has already been incremented many times (20 when I ran this)\n;; by the time the REPL prints.\n\n;; Redefine running as false to stop repeated send-off:\n(def running false)\n\n;; Dereference myagent to find its new value:\nuser=> @myagent\n848167\n\n;; Dereference again to make sure incrementation has stopped:\nuser=> @myagent\n848167", :created-at 1279046895000, :updated-at 1285502273000, :_id "542692cec026201cdc326d88"}], :notes nil, :tag "clojure.lang.Agent", :arglists [], :doc "The agent currently running an action on this thread, else nil", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*agent*"} {:added "1.0", :ns "clojure.core", :name "lazy-cat", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1318396486000, :author {:login "haplo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/890d46f8c0e24dd6fb8546095b1144e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "lazy-seq", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cfe"} {:created-at 1318396500000, :author {:login "haplo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/890d46f8c0e24dd6fb8546095b1144e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "concat", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cff"} {:created-at 1464035689604, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "conj", :ns "clojure.core"}, :_id "57436969e4b0d7ce46a59c3c"} {:created-at 1550609183419, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "mapcat", :ns "clojure.core"}, :_id "5c6c6b1fe4b0ca44402ef69b"}], :line 4614, :examples [{:author {:login "pashields", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/6ff7e838d2c47adf942be6df4d22b452?r=PG&default=identicon"}, :editors [], :body "user=> (lazy-cat [1 2 3] [4 5 6])\n(1 2 3 4 5 6)\n", :created-at 1295304229000, :updated-at 1295304229000, :_id "542692c7c026201cdc3269d5"} {:author {:login "kij", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/153ba8c871d2f98e6683850790f27f60?r=PG&default=identicon"}, :editors [{:login "kij", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/153ba8c871d2f98e6683850790f27f60?r=PG&default=identicon"} {:login "bmabey", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1837?v=2"}], :body ";; N.B. this example holds onto the head of a lazy seq which should generally be avoided\n(def fib-seq\n (lazy-cat [0 1] (map + (rest fib-seq) fib-seq)))\n\n(take 10 fib-seq)", :created-at 1332777683000, :updated-at 1347405980000, :_id "542692d3c026201cdc326fe4"} {:author {:login "guruma", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ade3cfcd37c594a590528e352528bba2?r=PG&default=identicon"}, :editors [{:login "guruma", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ade3cfcd37c594a590528e352528bba2?r=PG&default=identicon"} {:login "guruma", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ade3cfcd37c594a590528e352528bba2?r=PG&default=identicon"} {:login "rahulpilani", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3c3585fc1c6bf074ed5f268c9ebcb2f?r=PG&default=identicon"}], :body ";; When the producer function produces a collection, not an element,\n;; lazy-cat is usable.\nuser=> (defn n-repeat [n] (lazy-cat (repeat n n) (n-repeat (inc n))))\n#'user/n-repeat\n\nuser=> (take 6 (n-repeat 1))\n(1 2 2 3 3 3)\n\nuser=> (take 12 (n-repeat 1))\n(1 2 2 3 3 3 4 4 4 4 5 5)\n", :created-at 1355523910000, :updated-at 1360760950000, :_id "542692d3c026201cdc326fe7"} {:updated-at 1441150658101, :created-at 1441150658101, :author {:login "mattvvhat", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/367789?v=3"}, :body "(lazy-cat (seq [\"lazy-cat\" \"is\" \"my\" \"favorite\" \"function\"]))", :_id "55e636c2e4b072d7f27980f6"} {:updated-at 1490842223357, :created-at 1490842223357, :author {:login "parkeristyping", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/9487556?v=3"}, :body "user=> (defn loop-endlessly\n \"Block thread with endless loop when evaluated\"\n []\n (while true))\n#'user/loop-endlessly\n\nuser=> (take 3 (lazy-cat [\"will\" \"it\" \"return?\"] (loop-endlessly)))\n(\"will\" \"it\" \"return?\")\n\nuser=> (take 4 (lazy-cat [\"will\" \"it\" \"return?\"] (loop-endlessly)))\n;; This gets stuck on loop-endlessly and never returns", :_id "58dc726fe4b01f4add58fe7f"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; Prefer lazy-cat to build a lazy seq out of \n;; non-lazy collections with different creation costs\n\n(time (first (concat (sort > (range 10)) (sort > (range 1e7)))))\n;; \"Elapsed time: 17442.084309 msecs\"\n(time (first (lazy-cat (sort > (range 10)) (sort > (range 1e7)))))\n;; \"Elapsed time: 0.458283 msecs\"", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1520442196806, :updated-at 1520457888627, :_id "5aa01b54e4b0316c0f44f910"}], :macro true, :notes [{:body "It looks like `lazy-cat` is on deprecation path in favor of `lazy-seq`.", :created-at 1423002660607, :updated-at 1423002660607, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :_id "54d14c24e4b081e022073c48"}], :arglists ["& colls"], :doc "Expands to code which yields a lazy sequence of the concatenation\n of the supplied colls. Each coll expr is not evaluated until it is\n needed. \n\n (lazy-cat xs ys zs) === (concat (lazy-seq xs) (lazy-seq ys) (lazy-seq zs))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/lazy-cat"} {:added "1.0", :ns "clojure.core", :name "comment", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos nil, :line 4711, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; The commented forms do not get executed\nuser=> (comment\n (functioncall-1)\n (functioncall-2))\nnil", :created-at 1279395666000, :updated-at 1285500093000, :_id "542692cac026201cdc326b64"} {:editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "zk", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/7194?v=4"}], :updated-at 1600227856975, :created-at 1416432947075, :author {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}, :body ";; What is inside the (comment ...) form is not completely ignored. Clojure\n;; still tries to use the normal reader to read it, so it must consist of\n;; a sequence of readable forms with balanced parens, braces, square brackets,\n;; with no unreadable elements.\n\n;; If you want lines to be completely ignored, you must use a ; to comment from\n;; the ; until the end of the line. If you want to quickly comment or uncomment\n;; a range of consecutive lines, most text editors have special commands\n;; specifically for that. e.g. Emacs has comment-region\n;; http://www.gnu.org/software/emacs/manual/html_node/emacs/Comment-Commands.html\n;; Vim has visual commands to do this, and probably many other text editors.\n;; (Feel free to edit this text to add links to docs for other editors).\n\n;; What is inside the (comment ...) is readable, so no error for this,\n;; and no code will be generated by the compiler.\n(comment\n(defn foo [x]\n (inc x))\n)\n\n;; What is inside the (comment ...) is NOT readable, so this will give an error\n(comment\na : b\n)", :_id "546d0d33e4b03d20a10242b0"} {:body ";; Another thing to watch out for: the comment form IS a form, and is usually\n;; the wrong way to comment out code. For example, let's say that you want to\n;; try out a new \"then\" form in an \"if\":\n(if true (comment :old-then) :new-then) ;;=> nil (Oops, :new-then was desired.)\n\n;; Instead, use the \"ignore next form\" reader macro #_:\n(if true #_(:old-then) :new-then) ;;=> :new-then\n\n;; Note that #_ also allows non-readable code:\n#_(a : b) 1 ;;=> 1 (contrast to (comment a : b) which doesn't compile.)\n", :author {:login "fordsfords", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7671908?v=3"}, :created-at 1416776582477, :updated-at 1416776582477, :_id "54724b86e4b03d20a10242b1"} {:updated-at 1591912144471, :created-at 1562932314262, :author {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/24317401?v=4"}, :body ";; You can use comment to work with a journal\n;; (but beware if you want to denote it as a journal)\n\n(comment) ;; works\n(comment ^:journal []) ;; works\n\n;; Doesn't work\n(comment\n ^:journal \n ;; I did some really cool stuff\n)\nERROR Could not Read: Unmatched delimiter ).", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/24317401?v=4", :account-source "github", :login "loeschzwerg"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}], :_id "5d28745ae4b0ca44402ef783"}], :macro true, :notes [{:updated-at 1389835580000, :body "it doesn't 100% ignore the body. If your comment has a map in it, for example, and that map isn't 100% correct it will fail to compile in some environments. I found that using Light Table. I am certain it would fail on other platforms that won't know to exclude it before parsing.\r\n\r\nExample:\r\n(comment\r\n here is some TeX: \\frac{\\sum_{m=1}^{m}x_{m}}{x_{s}}\r\n)\r\n\r\nThat will produce an error.", :created-at 1389835580000, :author {:login "Pete", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8e398ff59e0c0073ccb6770938de769e?r=PG&default=identicon"}, :_id "542692edf6e94c6970522019"}], :arglists ["& body"], :doc "Ignores body, yields nil", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/comment"} {:added "1.0", :ns "clojure.core", :name "parents", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1341101519000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "descendants", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521be0"} {:created-at 1341101522000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ancestors", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521be1"} {:created-at 1341101538000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "derive", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521be2"} {:created-at 1341101540000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "underive", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521be3"} {:created-at 1341101544000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "make-hierarchy", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521be4"} {:created-at 1341101631000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "isa?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521be5"}], :line 5585, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; simple example showing single parented derivation\n;; then adding another parent\n\nuser=> (derive ::toy_poodle ::poodle)\nnil\nuser=> (parents ::toy_poodle)\n#{:user/poodle}\nuser=> (derive ::toy_poodle ::toy_dogs)\nnil\nuser=> (parents ::toy_poodle)\n#{:user/poodle :user/toy_dogs}\nuser=>", :created-at 1313967813000, :updated-at 1313967813000, :_id "542692cbc026201cdc326bde"} {:updated-at 1678607760647, :created-at 1678607760647, :author {:login "KingMob", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/946421?v=4"}, :body ";; This works on Java classes as well. Note that\n;; it will only show direct parents, not the entire\n;; ancestor hierarchy.\n\n(parents CompletableFuture)\n=> #{java.util.concurrent.Future java.lang.Object java.util.concurrent.CompletionStage}\n\n(parents ConcurrentHashMap)\n=> #{java.io.Serializable java.util.AbstractMap java.util.concurrent.ConcurrentMap}", :_id "640d8590e4b08cf8563f4b7d"}], :notes nil, :arglists ["tag" "h tag"], :doc "Returns the immediate parents of tag, either via a Java type\n inheritance relationship or a relationship established via derive. h\n must be a hierarchy obtained from make-hierarchy, if not supplied\n defaults to the global hierarchy", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/parents"} {:added "1.0", :ns "clojure.core", :name "count", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1467307156453, :author {:login "miner", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/25400?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "counted?", :ns "clojure.core"}, :_id "57755494e4b0bafd3e2a049b"}], :line 874, :examples [{:updated-at 1424124841816, :created-at 1279416590000, :body "(count nil)\n;;=> 0\n\n(count [])\n;;=> 0\n\n(count [1 2 3])\n;;=> 3\n\n(count {:one 1 :two 2})\n;;=> 2\n\n(count [1 \\a \"string\" [1 2] {:foo :bar}])\n;;=> 5\n\n(count \"string\")\n;;=> 6", :editors [{:avatar-url "https://www.gravatar.com/avatar/b29dd31d183124d9e87d8037bb30e326?r=PG&default=identicon", :account-source "clojuredocs", :login "matthewg"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"}, :_id "542692cbc026201cdc326bf9"} {:author {:login "rquinn", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3f3b40ea11b41b503df93d8b4a17043?r=PG&default=identicon"}, :editors [{:login "Noneo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e66c8f6c768e29808bddd38ed2f21349?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(count '(1 2 3 3 1))\n;;=> 5\n\n;; and as a koan\n(= (count '(1 2 3 3 1)) 5)\n;;=> true", :created-at 1389437673000, :updated-at 1424124671851, :_id "542692d2c026201cdc326f75"} {:updated-at 1579258350735, :created-at 1579258350735, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; count can't count beyond (Integer/MAX_VALUE)\n;; (in partial compliance with Java's Collection::size() returning int)\n\n(count (range (inc (Integer/MAX_VALUE))))\n;; Execution error (ArithmeticException)\n;; integer overflow", :_id "5e2191eee4b0ca44402ef818"} {:updated-at 1656427246940, :created-at 1656427246940, :author {:login "JeniferDalcin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/83920579?v=4"}, :body "(def items-to-buy {:milk 2 :bread 10 :chocolate 1})\n\n(count items-to-buy)\n\n;;=> 3", :_id "62bb12eee4b0b1e3652d760e"}], :notes nil, :arglists ["coll"], :doc "Returns the number of items in the collection. (count nil) returns\n 0. Also works on strings, arrays, and Java Collections and Maps", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/count"} {:added "1.0", :ns "clojure.core", :name "supers", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1285511319000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "type", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d64"} {:created-at 1285513946000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "instance?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d65"} {:created-at 1307530958000, :author {:login "stand", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d7f9ed2753f8b3517f1539f6129f0a17?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "bases", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d66"} {:created-at 1374150792000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ancestors", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d67"}], :line 5553, :examples [{:author {:login "stand", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d7f9ed2753f8b3517f1539f6129f0a17?r=PG&default=identicon"}, :editors [], :body ";;find superclasses and interfaces of Java objects...\nuser> (supers Object)\nnil\n\nuser> (supers String)\n#{java.lang.Comparable java.lang.CharSequence java.io.Serializable java.lang.Object}\n\n;;...or Java interfaces\nuser> (supers javax.naming.Name)\n#{java.lang.Cloneable java.lang.Comparable java.io.Serializable}\n\n;;Also with clojure types...\nuser> (defrecord MyThing [a b c])\nuser.MyThing\n\nuser> (supers MyThing)\n#{clojure.lang.Counted java.lang.Iterable clojure.lang.IKeywordLookup clojure.lang.IObj clojure.lang.IPersistentMap clojure.lang.Associative clojure.lang.Seqable java.util.Map clojure.lang.IMeta java.io.Serializable java.lang.Object clojure.lang.IPersistentCollection clojure.lang.ILookup}\n", :created-at 1307530922000, :updated-at 1307530922000, :_id "542692cdc026201cdc326cce"} {:updated-at 1546970349060, :created-at 1546970349060, :author {:login "mikebohdan", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/9021802?v=4"}, :body ";; get all superclasses and interfaces for functions\nuser> (defn foo [x] (+ x 1))\nuser> (supers (class foo))\n#{java.lang.Runnable java.util.Comparator java.io.Serializable java.util.concurrent.Callable clojure.lang.AFn clojure.lang.IFn clojure.lang.Fn java.lang.Object clojure.lang.IMeta clojure.lang.AFunction clojure.lang.IObj}", :_id "5c34e4ede4b0ca44402ef618"}], :notes nil, :arglists ["class"], :doc "Returns the immediate and indirect superclasses and interfaces of c, if any", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/supers"} {:ns "clojure.core", :name "*fn-loader*", :type "var", :see-alsos nil, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*fn-loader*"} {:added "1.0", :ns "clojure.core", :name "sorted-map-by", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1281961885000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sorted-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e6b"} {:created-at 1330671660000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "subseq", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e6c"} {:created-at 1330671664000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rsubseq", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e6d"} {:created-at 1353458254000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "sorted-set-by", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e6e"} {:created-at 1427316125890, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :to-var {:ns "clojure.core", :name "compare", :library-url "https://github.com/clojure/clojure"}, :_id "55131d9de4b08eb9aa0a8d38"} {:created-at 1427316135655, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :to-var {:ns "clojure.core", :name "comparator", :library-url "https://github.com/clojure/clojure"}, :_id "55131da7e4b08eb9aa0a8d39"}], :line 407, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "STeveShary", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5167622?v=3"} {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}], :body "; The basic function requires discrete elements, and cannot accept a \n; pre-existing map:\nuser=> (sorted-map-by > 1 \"a\", 2 \"b\", 3 \"c\")\n{3 \"c\", 2 \"b\", 1 \"a\"}\n\n; We can use the syntax \"(sorted-map >)\" to create an empty sorted map that sorts \n; in reverse order (i.e. the opposite of \"(sorted-map)\"). It we can then fill\n; it using (into ...) with a pre-existing map:\nuser=> (into (sorted-map-by >) {1 :a 2 :b 3 :c} )\n{3 :c, 2 :b, 1 :a}\n\n; This two are the same\nuser=> (into (sorted-map-by <) {1 :a 2 :b 3 :c} )\n{1 :a, 2 :b, 3 :c}\nuser=> (into (sorted-map) {1 :a 2 :b 3 :c} )\n{1 :a, 2 :b, 3 :c}\n\n", :created-at 1286955811000, :updated-at 1423716874311, :_id "542692cac026201cdc326b5e"} {:updated-at 1548548894859, :created-at 1331260029000, :body ";; If you wish to sort the map according to the values, instead of by keys \n;; the following code WILL NOT WORK! This is because the map values are not unique.\n\nuser=> (let [results {:A 1 :B 2 :C 2 :D 5 :E 1 :F 1}]\n (into (sorted-map-by (fn [key1 key2]\n (compare (get results key2)\n (get results key1))))\n results))\n\n=> {:D 5, :C 2, :A 1}\n\n;; To make sure that the sorting works, we can make sure that the comparator \n;; works on unique values\n\nuser=> (let [results {:A 1 :B 2 :C 2 :D 5 :E 1 :F 1}]\n (into (sorted-map-by (fn [key1 key2]\n (compare [(get results key2) key2]\n [(get results key1) key1])))\n results))\n\n=> {:D 5, :C 2, :B 2, :F 1, :E 1, :A 1}\n\n;; See this article for more details: https://clojure.org/guides/comparators", :editors [{:avatar-url "https://www.gravatar.com/avatar/24b2f585e6df92df9885e37b3b285c43?r=PG&default=identicon", :account-source "clojuredocs", :login "defiantt"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/24b2f585e6df92df9885e37b3b285c43?r=PG&default=identicon", :account-source "clojuredocs", :login "defiantt"}, :_id "542692d5c026201cdc327094"} {:editors [{:login "aarkerio", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/226965?v=4"}], :body ";; Ordering using nested values\n\n(def rows {:45 {:ordnen 5} :55 {:ordnen 8} :66 {:ordnen 3} :68 {:ordnen 90} :13 {:ordnen 1}})\n\n(into (sorted-map-by (fn [key1 key2]\n (compare\n (get-in rows [key1 :ordnen])\n (get-in rows [key2 :ordnen]))))\n rows)\n\n{:13 {:ordnen 1},\n :66 {:ordnen 3},\n :45 {:ordnen 5},\n :55 {:ordnen 8},\n :68 {:ordnen 90}}\n ", :author {:avatar-url "https://avatars1.githubusercontent.com/u/226965?v=4", :account-source "github", :login "aarkerio"}, :created-at 1585685462057, :updated-at 1585685482087, :_id "5e83a3d6e4b087629b5a18c8"} {:updated-at 1588694823302, :created-at 1588694823302, :author {:login "ejschoen", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10605666?v=4"}, :body ";; Note that when querying values from the map, the comparator will be called, \n;; and must work on values that are not keys in the map:\n\nuser=> (get (into (sorted-map-by (fn [a b] (println a b) (compare a b))) \n {\"a\" 1 \"b\" 2})) \n \"c\")\nb a\nc a\nc b\n=> nil\n\n;; If the comparator looks into an auxiliary data structure for a comparison\n;; value, ensure that the comparator can handle a missing value in that data\n;; structure:\n\nuser=> (let [other {\"a\" 10 \"b\" 1}\n m (into (sorted-map-by (fn [a b] (< (get other a) (get other b)))) \n {\"a\" 1 \"b\" 2})]\n (println (get m \"a\"))\n (println (get m \"b\"))\n (println (get m \"c\")))\n1\n2\nNullPointerException clojure.lang.Numbers.ops (Numbers.java:1013)\nuser=>", :_id "5eb18f27e4b087629b5a1900"}], :notes [{:author {:login "noisesmith", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/169654?v=4"}, :updated-at 1517725988658, :created-at 1517725696549, :body "an unstable sorting function will give nonsense results:\n\n
    \nuser=> (into (sorted-map-by (fn [_ _] (rand-int Integer/MAX_VALUE))) [[:a 0] [:a 1] [:a 2]])\n\n{:a 0, :a 1, :a 2}\n
    ", :_id "5a76a800e4b0e2d9c35f7416"} {:author {:login "elias94", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8095533?v=4"}, :updated-at 1659590612300, :created-at 1659589967366, :body "As previously noted, using an unstable sorting function could lead to unexpected results and hard to find bug. The `PersistentTreeMap` object returned by `sorted-map-by`, stores the `comparator` function and will reuse it in consecutive operations as `assoc`.\n\n```\n(def ord [:a :b :c])\n(def m (into (sorted-map-by (fn [a b] \n                              (compare (.indexOf ord a) \n                                       (.indexOf ord b))))  \n             {:a 1 :b 2 :c 3}))\n(assoc m :d 4) ; => {:d 4, :a 1, :b 2, :c 3}\n(-> (assoc m :d 4)\n    (assoc :e 5)) ; => {:d 5, :a 1, :b 2, :c 3} WRONG\n```\n\n[Source reference](https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/PersistentTreeMap.java#L28)\n", :_id "62eb554fe4b0b1e3652d7637"}], :arglists ["comparator & keyvals"], :doc "keyval => key val\n  Returns a new sorted map with supplied mappings, using the supplied\n  comparator.  If any keys are equal, they are handled as if by\n  repeated uses of assoc.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/sorted-map-by"} {:added "1.0", :ns "clojure.core", :name "apply", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1285116731000, :author {:login "gregg-williams", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/58610a64fc8638eec8d2239d80d4046f?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eae"} {:created-at 1289278196000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "eval", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eaf"} {:created-at 1289278244000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.template", :name "apply-template", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eb1"} {:created-at 1411938673196, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "reduce", :library-url "https://github.com/clojure/clojure"}, :_id "54287971e4b0ba57bdbcf25f"} {:created-at 1598160814660, :author {:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "partial", :ns "clojure.core"}, :_id "5f41ffaee4b0b1e3652d739d"}], :line 660, :examples [{:updated-at 1422053574794, :created-at 1279062643000, :body "(def *strings* [\"str1\" \"str2\" \"str3\"])\n;; #'user/*strings*\n\n;; Oops!\n(str *strings*)\n;;=> \"[\\\"str1\\\" \\\"str2\\\" \\\"str3\\\"]\"\n\n;; Yay!\n(apply str *strings*)\n;;=> \"str1str2str3\"\n\n;; Note the equivalence of the following two forms\n(apply str [\"str1\" \"str2\" \"str3\"])  ;;=> \"str1str2str3\"\n(str \"str1\" \"str2\" \"str3\")          ;;=> \"str1str2str3\"\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/58610a64fc8638eec8d2239d80d4046f?r=PG&default=identicon", :account-source "clojuredocs", :login "gregg-williams"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692cdc026201cdc326d46"} {:author {:login "Jacolyte", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon"}, :editors [{:login "gregg-williams", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/58610a64fc8638eec8d2239d80d4046f?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; If you were to try\n(max [1 2 3])\n;;=> [1 2 3]\n\n;; You would get '[1 2 3]' for the result. In this case, 'max' has received one\n;; vector argument, and the largest of its arguments is that single vector.\n\n;; If you would like to find the largest item **within** the vector, you would need\n;; to use `apply`\n\n(apply max [1 2 3])\n;;=> 3\n\n;; which is the same as \n(max 1 2 3)\n;;=> 3\n", :created-at 1280207658000, :updated-at 1422053637350, :_id "542692cdc026201cdc326d49"} {:updated-at 1647518010897, :created-at 1285120582000, :body ";; Here's an example that uses a optional second argument, x:\n\n(apply map vector [[:a :b] [:c :d]])\n;;=> ([:a :c] [:b :d])\n\n;; In this example, 'f' = 'map', 'x' = 'vector', and args = '[:a :b] [:c :d]',\n;; making the above code equivalent to\n\n(map vector [:a :b] [:c :d])\n;;=> ([:a :c] [:b :d]) ;Same answer as above\n\n;; It might help to think of 'map' and 'vector' as \"slipping inside\" the argument\n;; list ( '[[:a :b] [:c :d]]' ) to give '[map vector [:a :b] [:c :d]]' , which \n;; then becomes the executable form '(map vector [:a :b] [:c :d])' .", :editors [{:avatar-url "https://www.gravatar.com/avatar/58610a64fc8638eec8d2239d80d4046f?r=PG&default=identicon", :account-source "clojuredocs", :login "gregg-williams"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/200617?v=3", :account-source "github", :login "bsima"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "gunnarx", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7410653?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/58610a64fc8638eec8d2239d80d4046f?r=PG&default=identicon", :account-source "clojuredocs", :login "gregg-williams"}, :_id "542692cdc026201cdc326d4d"} {:updated-at 1543265664647, :created-at 1288763486000, :body ";; only functions can be used with apply.  'and' is a macro\n;; because it needs to evaluate its arguments lazily and so\n;; does not work with apply.\n(apply and (list true true false true))\n;; RuntimeException : cannot take value of a macro\n\n;; This can be circumvented with another macro.\n;; But understand what is happening\n;; http://stackoverflow.com/questions/5531986/treat-clojure-macro-as-a-function\n(defmacro make-fn [m] \n `(fn [& args#]\n    (eval \n      (cons '~m args#))))\n\n(apply (make-fn and) '(true true false true))\n;;=> false\n\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "mdave16", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/15642321?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon", :account-source "clojuredocs", :login "gstamp"}, :_id "542692cdc026201cdc326d50"} {:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [{:login "jasonrudolph.com", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c4e34ac0818591402a41b2e9cfb4747b?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; 'apply' is used to apply an operator to its operands. \n(apply + '(1 2))  ; equivalent to (+ 1 2)\n;;=> 3\n\n\n;; You can also put operands before the list of \n;; operands and they'll be consumed in the list of operands\n\n(apply + 1 2 '(3 4))  ; equivalent to (apply + '(1 2 3 4))\n;;=> 10", :created-at 1289278192000, :updated-at 1422054628109, :_id "542692cdc026201cdc326d51"} {:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; You can use map and apply together to drill one level deep in a collection\n;; of collections, in this case returning a collection of the max of each\n;; nested collection\n\n(map #(apply max %) [[1 2 3][4 5 6][7 8 9]])\n;;=> (3 6 9)", :created-at 1310850474000, :updated-at 1422054659726, :_id "542692cdc026201cdc326d53"} {:author {:login "Jeff Terrell", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/658b2643cf2a8192286b5bb1ecb62cf8?r=PG&default=identicon"}, :editors [], :body ";; Using `apply` with optional keyword parameters:\n\n(defn add2 [a & {:keys [plus] :or {plus 0}}]\n  (+ 2 plus a))\n\n(add2 4)                    ; => 6\n(add2 4 :plus 1)            ; => 7\n(apply add2 [4])            ; => 6\n(apply add2 [4 {:plus 1}])  ; => IllegalArgumentException\n(apply add2 [4 :plus 1])    ; => 7\n", :created-at 1409438218000, :updated-at 1409438218000, :_id "542692d2c026201cdc326f4a"} {:editors [{:login "nbren12", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1386642?v=3"}], :body ";; Transpose a matrix\n(def A [[1 2]\n        [3 4]])\n\n(apply map vector A) ;  ([1 3] [2 4])\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/1386642?v=3", :account-source "github", :login "nbren12"}, :created-at 1437005741779, :updated-at 1437005816540, :_id "55a6f7ade4b0080a1b79cda1"} {:updated-at 1447364097315, :created-at 1447364097315, :author {:login "bsima", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/200617?v=3"}, :body ";; Use apply to map a function over a collection of pairs of arguments\n\n(map (partial apply +) [[1 2] [3 4]]) ; => (3 7)\n\n;; this is equivalent to '((+ 1 2) (+ 3 4))", :_id "56450601e4b053844439826e"} {:updated-at 1487799337630, :created-at 1487799337630, :author {:login "smnplk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/380618?v=3"}, :body "; Remove elements from a set with disj\n\n(disj #{1 2 3} 2 3) \n=> #{1}\n\n; Relative complement of two sets (difference)\n\n(apply disj #{2 3 4} #{1 2 3})\n=> #{4}\n\n; the above is same as calling\n(disj #{2 3 4} 1 2 3)", :_id "58ae0429e4b01f4add58fe5d"} {:updated-at 1517124285557, :created-at 1517124285557, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;practical example\n\n(def entries [{:month 1 :val 12}\n              {:month 2 :val 3}\n              {:month 3 :val 32}\n              {:month 4 :val 18}\n              {:month 5 :val 32}\n              {:month 6 :val 62}\n              {:month 7 :val 12}\n              {:month 8 :val 142}\n              {:month 9 :val 52}\n              {:month 10 :val 18}\n              {:month 11 :val 23}\n              {:month 12 :val 56}])\n\n(apply max (map\n            #(:val %)\n            entries))\n;;return 142\n;;this translates into (max 12 3 32 18 32 62 12 142 52 18 23 56)", :_id "5a6d7abde4b0c974fee49d10"} {:editors [{:login "Okwori", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/16775439?v=4"}], :body "(apply + [2 3 4])\n;;9\n\n(apply + 1 [2 3 4])\n;;10\n\n(apply max [1 3 2])\n;;3\n\n(apply max 4 [1 3 2])\n;;4\n\n(apply str [\"a\" \"b\" \"c\"])\n;;\"abc\"\n\n(apply str \"d\" [\"a\" \"b\" \"c\"])\n;;\"dabc\"\n\n(str \"Hi, here: \" (apply str (for [i (range 5)] i)) \" Cheers!\")\n;; \"Hi, here: 01234 Cheers!\"", :author {:avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4", :account-source "github", :login "ibercode"}, :created-at 1518885671189, :updated-at 1627950640374, :_id "5a885b27e4b0316c0f44f8c9"} {:updated-at 1535318272487, :created-at 1535318272487, :author {:login "hadielmougy", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1223207?v=4"}, :body "(reduce #(apply assoc %1 %2) {} [[:a 1] [:b 2]])\n\n;;{:a 1, :b 2}", :_id "5b831900e4b00ac801ed9e79"} {:updated-at 1550289947317, :created-at 1550285729081, :author {:login "jdf-id-au", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/9016301?v=4"}, :body "(defn chunks\n  \"Lazily break up map of colls into maps of chunks of n records (default 100 000).\n  Truncates at shortest coll (chunk-wise).\"\n  ([m] (chunks 100000 m))\n  ([n m] (apply map merge (repeatedly sorted-map)\n           (for [[k v] m]\n             (for [part (partition-all n v)]\n               {k part})))))\n\n(chunks 2 {:b [1 2 3] :a [1 2 3 4] :c [1 2 3 4 5]})\n=> ({:a (1 2), :b (1 2), :c (1 2)}\n    {:a (3 4), :b (3), :c (3 4)})\n\n(defn non-truncating-chunks\n  ([m] (chunks 100000 m))\n  ([n m] (let [partitioned-lists\n               ;; '(({k0 part0} {k0 part1} ... nil nil ...)\n               ;;   ({k1 part0} {k1 part1} ... nil nil ...)\n               ;;   ...)\n               (for [[k v] m]\n                 ;; '({k part0} {k part1} ... nil nil ... )\n                 (concat ; append nils to prevent map truncating at shortest\n                   (for [part (partition-all n v)]\n                     {k part})\n                   (repeat nil)))]\n           ;; '(({k0 part0} {k1 part0} ...)\n           ;;   ({k0 part1} {k1 part1} ...)\n           ;;   ...)\n           (for [ls (apply map list partitioned-lists)\n                 :while (not-every? nil? ls)]\n             (apply merge (sorted-map) ls)))))\n\n(non-truncating-chunks 2 {:b [1 2 3] :a [1 2 3 4] :c [1 2 3 4 5]})\n=> ({:a (1 2), :b (1 2), :c (1 2)}\n    {:a (3 4), :b (3), :c (3 4)}\n    {:c (5)})", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/9016301?v=4", :account-source "github", :login "jdf-id-au"}], :_id "5c677ba1e4b0ca44402ef688"} {:editors [{:login "berczeck", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4"}], :body ";; Based in the example from the great book CLOJURE for the BRAVE and TRUE\n;; https://www.braveclojure.com/core-functions-in-depth/\n\n(def countries [:peru :mexico])\n\n(defn add-first\n   [target addition]\n   (apply conj [addition] target))\n\n(add-first countries :brazil)\n\n;; [:brazil :peru :mexico]", :author {:avatar-url "https://avatars1.githubusercontent.com/u/1321842?v=4", :account-source "github", :login "berczeck"}, :created-at 1598163155919, :updated-at 1598165224331, :_id "5f4208d3e4b0b1e3652d739f"} {:editors [{:login "jimka2001", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6414129?v=4"}], :body ";; If `apply` is called on a function having optional arguments as shown in\n;; `function-2`, you must pre-manipulate the arguments before calling `apply`\n\n(defn function-2\n  [arg1 & {:keys [a b c]\n           :as all-optionals\n           :or {a 42}}]\n  (list arg1 a b c all-optionals))\n\n;; Suppose you'd like to call `function-2` from `function-1` passing along \n;; the *same* optional arguments.\n\n;; In this example, the call-site of `function-1` may contain any keyword \n;; argument for `function-1` or for `function-2`.\n\n(defn function-1\n  [arg1 & {:keys [c d e]\n           :as all-optionals\n           :or {d 42}}]\n  (apply function-2 arg1 (mapcat identity all-optionals)))\n\n(function-1 1)\n;; [arg1 1 a 42 b nil c nil all-optionals nil]\n\n(function-1 1 :c 2)\n;; [arg1 1 a 42 b nil c 2 all-optionals {:c 2}]\n\n(function-1 1 :c 2 :a 3)\n;; [arg1 1 a 3 b nil c 2 all-optionals {:c 2, :a 3}]\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/6414129?v=4", :account-source "github", :login "jimka2001"}, :created-at 1626948876981, :updated-at 1626949139811, :_id "60f9450ce4b0b1e3652d7519"} {:editors [{:login "pradeepbishnoi", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1634146?v=4"}], :body "(def input-2 [\"P1\" \"R2\" \"A3\" \"D4\" \"E5\" \"e6\" \"p7\"])\n\n(apply map vector input-2)\n;; => ([\\P \\R \\A \\D \\E \\e \\p] [\\1 \\2 \\3 \\4 \\5 \\6 \\7])\n\nis same as writing using map form :\n\n(map vector (nth input-2 0)\n     (nth input-2 1)\n     (nth input-2 2)\n     (nth input-2 3)\n     (nth input-2 4)\n     #_(nth input-2 5)\n     ,)\n;; => ([\\P \\R \\A \\D \\E] [\\1 \\2 \\3 \\4 \\5])\n\n(apply map #(println %&) input-2)\n;; => (P R A D E e p)\n;;    (nil(1 2 3 4 5 6 7)\n;;     nil)\n\nfurther playaround like below to get more comfortable\n(map vector \"P1\" \"R2\")\n;; => ([\\P \\R] [\\1 \\2])\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/1634146?v=4", :account-source "github", :login "pradeepbishnoi"}, :created-at 1638598080447, :updated-at 1638598196914, :_id "61ab05c0e4b0b1e3652d7580"}], :notes [{:author {:login "virajpurang", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1843638?v=3"}, :updated-at 1444440195862, :created-at 1444440123734, :body "The first example on the page, does not work on the REPL. It gives the following error: \n
     (def *strings* [\"str1\" \"str2\" \"str3\"])\" 
    \n\n*Warning: *strings* not declared dynamic and thus is not dynamically rebindable, but its name suggests otherwise. Please either indicate ^:dynamic *strings* or change the name.*\n\nShould this be prefixed by - \"^:dynamic\"?\n", :_id "5618683be4b084e61c76ecc0"} {:author {:login "didibus", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/601540?v=4"}, :updated-at 1534908180799, :created-at 1534906692760, :body "It looks like apply when used with a lazy sequence forces the realization of the first four elements.\n\n```\n(take 1\n (apply concat\n (repeatedly #(do\n (println \"called\")\n (range 1 10)))))\n\n=> \"called\"\n=> \"called\"\n=> \"called\"\n=> \"called\"\n```\n\nSee: https://stackoverflow.com/questions/51959298/clojure-apply-that-does-not-realize-the-first-four-elements-of-a-lazy-sequence", :_id "5b7cd144e4b00ac801ed9e69"}], :arglists ["f args" "f x args" "f x y args" "f x y z args" "f a b c d & args"], :doc "Applies fn f to the argument list formed by prepending intervening arguments to args.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/apply"} {:added "1.0", :ns "clojure.core", :name "interpose", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1293096431000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "interleave", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bbb"} {:created-at 1334733658000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.string", :name "join", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bbc"}], :line 5206, :examples [{:updated-at 1598971367289, :created-at 1278174751000, :body ";; The quintessential interpose example:\nuser> (def my-strings [\"one\" \"two\" \"three\"])\n\nuser> (interpose \", \" my-strings)\n=> (\"one\" \", \" \"two\" \", \" \"three\")\n\nuser> (apply str (interpose \", \" my-strings))\n=> \"one, two, three\"\n\n;; Might use clojure.string/join if the plan is to join\n(require '[clojure.string :as str])\nuser> (str/join \", \" my-strings)\n=> \"one, two, three\"", :editors [{:avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon", :account-source "clojuredocs", :login "philos99"} {:avatar-url "https://www.gravatar.com/avatar/c889e0a95a3bb07f90ab28ad442f1127?r=PG&default=identicon", :account-source "clojuredocs", :login "Iceland_jack"} {:avatar-url "https://www.gravatar.com/avatar/c889e0a95a3bb07f90ab28ad442f1127?r=PG&default=identicon", :account-source "clojuredocs", :login "Iceland_jack"} {:avatar-url "https://www.gravatar.com/avatar/c889e0a95a3bb07f90ab28ad442f1127?r=PG&default=identicon", :account-source "clojuredocs", :login "Iceland_jack"} {:avatar-url "https://www.gravatar.com/avatar/c889e0a95a3bb07f90ab28ad442f1127?r=PG&default=identicon", :account-source "clojuredocs", :login "Iceland_jack"} {:login "daveliepmann", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/974443?v=4"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}, :_id "542692cdc026201cdc326d31"} {:updated-at 1519242639737, :created-at 1352930917000, :body ";; This example converts what would be comma-separated values into pipe '|'\n;; separated values for alternate database loads. By switching delimiters, \n;; quotes can be eliminated from each sequence element, which are not \n;; needed for some databases.\n\n(def test-data-in '((\"43\" \"MORRISON, VAN X DMD\" \"43 ROADWAY\" \\;)\n (\"25\" \"JANE SMITH N\" \"25 GARDEN PATH\" \\!)))\n\n(def test-data-out (map #(concat (interpose \\| %) (list \\| \"\\n\"))\n test-data-in))\n\ntest-data-out\n\n=> ((\"43\" \\| \"MORRISON, VAN X DMD\" \\| \"43 ROADWAY\" \\| \\; \\| \"\\n\")\n (\"25\" \\| \"JANE SMITH N\" \\| \"25 GARDEN PATH\" \\| \\! \\| \"\\n\"))\n\n(doseq [in-seq test-data-out]\n (doseq [val in-seq]\n (spit \"temp1.csv\" val :append true)))\n\n;; cat temp1.csv:\n\n;; 43|MORRISON, VAN X DMD|43 ROADWAY|;|\n;; 25|JANE SMITH N|25 GARDEN PATH|!|", :editors [{:avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon", :account-source "clojuredocs", :login "octopusgrabbus"} {:avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon", :account-source "clojuredocs", :login "octopusgrabbus"} {:avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon", :account-source "clojuredocs", :login "octopusgrabbus"} {:avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon", :account-source "clojuredocs", :login "octopusgrabbus"} {:login "dosbol", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/6149147?v=4"} {:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"}], :author {:avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon", :account-source "clojuredocs", :login "octopusgrabbus"}, :_id "542692d3c026201cdc326fd3"}], :notes nil, :arglists ["sep" "sep coll"], :doc "Returns a lazy seq of the elements of coll separated by sep.\n Returns a stateful transducer when no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/interpose"} {:added "1.0", :ns "clojure.core", :name "deref", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1343082385000, :author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "atom", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e70"} {:created-at 1343082392000, :author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "agent", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e71"} {:created-at 1343082402000, :author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e72"} {:created-at 1423531286944, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=2"}, :to-var {:ns "clojure.core", :name "realized?", :library-url "https://github.com/clojure/clojure"}, :_id "54d95d16e4b081e022073c8a"} {:created-at 1510406134570, :author {:login "l3nz", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1101849?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "future", :ns "clojure.core"}, :_id "5a06f7f6e4b0a08026c48caf"}], :line 2306, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (def a (atom 0))\n#'user/a\nuser=> @a\n0\nuser=> (deref a)\n0\n\nuser=> (def b (ref 1))\n#'user/b\nuser=> @b\n1\nuser=> (deref b)\n1\n\nuser=> (def c (agent 2))\n#'user/c\nuser=> @c\n2\nuser=> (deref c)\n2\n\nuser=> (def d (future 3))\n#'user/d\nuser=> @d\n3\nuser=> (deref d)\n3", :created-at 1280548071000, :updated-at 1332951465000, :_id "542692c8c026201cdc326a12"} {:body "user=> (def a (promise))\n#'user/a\nuser=> (deref a) ;; blocking until a delivery occurs \n\nuser=> (deref a 100 :timeout) ;; block for at most 100ms\n:timeout", :author {:login "kgann", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1098962?v=2"}, :created-at 1421253947329, :updated-at 1421253947329, :_id "54b69d3be4b081e022073c0b"} {:updated-at 1534311765139, :created-at 1534311765139, :author {:login "viebel", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/955710?v=4"}, :body "user=> (def b 1)\n#'user/b\nuser=> (var b)\n#'user/b\nuser=> (deref (var b))\n1", :_id "5b73bd55e4b00ac801ed9e5a"}], :notes nil, :arglists ["ref" "ref timeout-ms timeout-val"], :doc "Also reader macro: @ref/@agent/@var/@atom/@delay/@future/@promise. Within a transaction,\n returns the in-transaction-value of ref, else returns the\n most-recently-committed value of ref. When applied to a var, agent\n or atom, returns its current state. When applied to a delay, forces\n it if not already forced. When applied to a future, will block if\n computation not complete. When applied to a promise, will block\n until a value is delivered. The variant taking a timeout can be\n used for blocking references (futures and promises), and will return\n timeout-val if the timeout (in milliseconds) is reached before a\n value is available. See also - realized?.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/deref"} {:added "1.0", :ns "clojure.core", :name "assoc", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1291975387000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "assoc-in", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ef1"} {:created-at 1295211937000, :author {:login "pauldoo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5cb916d3c8abc9f45a093209e72489fb?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "dissoc", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ef2"} {:created-at 1320356554000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "merge", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ef3"} {:created-at 1551138257703, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "update", :ns "clojure.core"}, :_id "5c747dd1e4b0ca44402ef6a7"} {:created-at 1570520695399, :author {:login "xmo-odoo", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/7571158?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "associative?", :ns "clojure.core"}, :_id "5d9c3e77e4b0ca44402ef7c9"}], :line 181, :examples [{:updated-at 1582579932440, :created-at 1278953718000, :body "(assoc {} :key1 \"value\" :key2 \"another value\")\n;;=> {:key2 \"another value\", :key1 \"value\"}\n\n;; Here we see an overwrite by a second entry with the same key\n(assoc {:key1 \"old value1\" :key2 \"value2\"} \n :key1 \"value1\" :key3 \"value3\")\n;;=> {:key3 \"value3\", :key2 \"value2\", :key1 \"value1\"}\n\n;; We see a nil being treated as an empty map\n(assoc nil :key1 4)\n;;=> {:key1 4}\n\n;; 'assoc' can be used on a vector (but not a list), in this way: \n;; (assoc vec index replacement)\n(assoc [1 2 3] 0 10) ;;=> [10 2 3]\n(assoc [1 2 3] 2 '(4 6)) ;;=> [1 2 (4 6)]\n;; Next, 0 < index <= n, so the following will work\n(assoc [1 2 3] 3 10) ;;=> [1 2 3 10]\n;; However, when index > n, an error is thrown\n(assoc [1 2 3] 4 10)\n;; java.lang.IndexOutOfBoundsException (NO_SOURCE_FILE:0)\n\n;; From http://clojure-examples.appspot.com/clojure.core/assoc", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon", :account-source "clojuredocs", :login "franks42"} {:avatar-url "https://www.gravatar.com/avatar/497a50e2eb50bb7a8dbb839adc473f1f?r=PG&default=identicon", :account-source "clojuredocs", :login "MikeT"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"} {:login "Eleonore9", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2502761?v=3"} {:login "borkdude", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/284934?v=4"} {:avatar-url "https://avatars2.githubusercontent.com/u/36526095?v=4", :account-source "github", :login "adanhawth"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}, :_id "542692c9c026201cdc326acd"} {:author {:login "octopusgrabbus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :body ";; here is an example of updating a field in a map.\n(def test-map {:account-no 12345678 :lname \"Jones\" :fnam \"Fred\"})\n(assoc test-map :fnam \"Sue\")\n;;=> {:account-no 12345678, :lname \"Jones\", :fnam \"Sue\"}\n\n;; notice that test-map is unchanged\ntest-map\n;;=> {:account-no 12345678 :lname \"Jones\" :fnam \"Fred\"})", :created-at 1366772136000, :updated-at 1412883533397, :_id "542692d2c026201cdc326f4b"} {:updated-at 1439568723313, :created-at 1439568723313, :author {:login "nickzam", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/89377?v=3"}, :body ";; beware of this\n(assoc {} nil nil)\n;;=> {nil nil}", :_id "55ce1353e4b0831e02cddf14"} {:updated-at 1516724671337, :created-at 1516724671337, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;transform a map´s values using reduce and assoc\n\n(defn transform\n [coll]\n (reduce (fn [ncoll [k v]]\n (assoc ncoll k (* 10 v)))\n {}\n coll))\n\n(transform {:a 1 :b 2 :c 3})\n;;{:a 10 :b 20 :c 30}\n", :_id "5a6761bfe4b09621d9f53a75"} {:updated-at 1518707659300, :created-at 1518707659300, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;assoc applied to a vector\n\n(def my-vec [1 2 5 6 8 9])\n\n(assoc my-vec 0 77)\n;;[77 2 5 6 8 9]\n", :_id "5a85a3cbe4b0316c0f44f8bf"} {:updated-at 1535116887042, :created-at 1535116887042, :author {:login "eddy147", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1145595?v=4"}, :body ";; convert a vector into a set with assoc\n\n(def book-city {:awards [\"Hugo\" \"World Fantasy Award\" \"Arthur C. Clarke Award\"\n \"British Science Fiction Award\"]\n :title \"The City and the City\"\n :authors [{:birth-year 1972, :name \"China Miéville\"}]})\n\n(assoc book-city :authors (set (:authors book-city)))\n\n;; {:awards [\"Hugo\" \"World Fantasy Award\" \"Arthur C. Clarke Award\" \"British Science Fiction Award\"], :title \"The City and the City\", :authors #{{:birth-year 1972, :name \"China Miéville\"}}}", :_id "5b800657e4b00ac801ed9e73"} {:updated-at 1562960552703, :created-at 1562960552703, :author {:login "victorb", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/459764?v=4"}, :body ";; You can also change multiple keys at once\n\n(def my-map {:name \"Victor\" :age 27 :city \"Barcelona\"})\n\n(assoc my-map :name \"Tom\" :age 47)\n\n;; {:name \"Tom\", :age 47, :city \"Barcelona\"}\n", :_id "5d28e2a8e4b0ca44402ef785"} {:updated-at 1582580850878, :created-at 1582580850878, :author {:login "adanhawth", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/36526095?v=4"}, :body ";; You can add some more fields (kvs) to your map\n(assoc {:type \"chicken\"} :home \"Kentucky\" :cooking-method \"fried\" :tasty \"definitely\")", :_id "5e544472e4b087629b5a18a6"} {:updated-at 1593400361528, :created-at 1593400361528, :author {:login "kimim", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/5523431?v=4"}, :body ";; add new key-value from original key value\n(let [contact {:name \"kimim\" :home \"Hangzhou\"}\n new-name \"ivy\"]\n (assoc contact :modified? (not (= (contact :name) new-name)) :name new-name))\n;; {:name \"ivy\" :home \"Hangzhou\" :modified? true}\n", :_id "5ef95c29e4b0b1e3652d7319"}], :notes [{:updated-at 1352836452000, :body "Here is a version that will create a vector when the key is numerical.\r\nThis may be useful instead of throwing an IndexOutOfBoundsException.\r\n\r\n
    \r\n(defn assoc-in-idx [m [k & ks] v]\r\n  (let [value (get m k (when (number? (first ks)) []))\r\n\tm (if (and (vector? m) (number? k) (-> m count (< k)))\r\n\t    (reduce (fn [m _] (conj m nil)) m (range (count m) k))\r\n\t    m)\r\n\tv (if ks\r\n\t    (assoc-in-idx value ks v)\r\n\t    v)]\r\n    (assoc m k v)))\r\n
    \r\n", :created-at 1352836452000, :author {:login "l0st3d", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cc23d1f40d9cfa1c5015ea972759cbf4?r=PG&default=identicon"}, :_id "542692edf6e94c6970521ff4"} {:updated-at 1378937381000, :body "the API is blurry When applied to a vector\r\n\r\n
    \r\n;; should indicate following\r\n(assoc vector index val) 
    ", :created-at 1378937381000, :author {:login "simlegate", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/313f9e3c2c4d3492222c1efd2fd955a4?r=PG&default=identicon"}, :_id "542692edf6e94c697052200b"}], :arglists ["map key val" "map key val & kvs"], :doc "assoc[iate]. When applied to a map, returns a new map of the\n same (hashed/sorted) type, that contains the mapping of key(s) to\n val(s). When applied to a vector, returns a new vector that\n contains val at index. Note - index must be <= (count vector).", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/assoc"} {:added "1.0", :ns "clojure.core", :name "rational?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos nil, :line 3612, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"} {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"} {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (rational? 1)\ntrue\nuser=> (rational? 1.0)\nfalse\nuser=> (class 1.0)\njava.lang.Double\n\n;; Note that decimal? only returns true if n is a BigDecimal.", :created-at 1279074804000, :updated-at 1285501218000, :_id "542692cec026201cdc326dc9"} {:editors [{:login "TradeIdeasPhilip", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/18409827?v=3"}], :body ";; Both True\nuser=> (ratio? 22/7) \n;; => true\nuser=> (rational? 22/7)\n;; => true\n\n;; Different\nuser=> (ratio? 22)\n;; => false\nuser=> (rational? 22)\n;; => true\n\n;; Both False\nuser=> (ratio? 0.5)\n;; => false\nuser=> (rational? 0.5)\n;; => false", :author {:avatar-url "https://avatars.githubusercontent.com/u/18409827?v=3", :account-source "github", :login "TradeIdeasPhilip"}, :created-at 1463237386081, :updated-at 1463237705871, :_id "57373b0ae4b05449374f52ed"}], :notes nil, :arglists ["n"], :doc "Returns true if n is a rational number", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/rational_q"} {:added "1.1", :ns "clojure.core", :name "transient", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1286870150000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "persistent!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521da8"} {:created-at 1286870156000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "conj!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521da9"} {:created-at 1321399323000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "assoc!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521daa"} {:created-at 1321399624000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "pop!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dab"} {:created-at 1324959569000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "dissoc!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dac"} {:created-at 1358908056000, :author {:login "jjcomer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ef581bba2f97adb539c67a35465b3e1b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "disj!", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dad"}], :line 3342, :examples [{:updated-at 1577917667056, :created-at 1286870136000, :body ";; As seen on http://clojure.org/transients\n;; array is initially made transient, modified, then finally made persistent.\n;; See assoc! for further discussion of why it must be done this way.\n;; Also see one example for conj! that contains a detailed example\n;; of a wrong result that can occur if you do not use its return value.\n\n(defn vrange2 [n]\n (loop [i 0 v (transient [])]\n (if (< i n)\n (recur (inc i) (conj! v i))\n (persistent! v))))\n\nuser=> (vrange2 10)\n[0 1 2 3 4 5 6 7 8 9]", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}], :author {:avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon", :account-source "clojuredocs", :login "gstamp"}, :_id "542692cbc026201cdc326bb5"} {:author {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}, :editors [{:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user> (def foo (transient [1 2 3]))\n#'user/foo\nuser> (get foo 0)\n1\nuser> (count foo)\n3\nuser> (nth foo 0)\n1\nuser> (def bar (transient {:honda 7 :kagawa 23 :ienaga 14}))\n#'user/bar\nuser> (get bar :kagawa)\n23\nuser> (count bar)\n3\n\n;; There is a known bug in Clojure 1.3 thru 1.6 where contains? always returns\n;; false for transients. http://dev.clojure.org/jira/browse/CLJ-700\n;; contains? works fine for persistent data structures.\nuser> (contains? bar :kagawa) ; Caution! \nfalse\nuser> (def bar2 (persistent! bar))\n#'user/bar2\nuser> (contains? bar2 :kagawa) ; Caution!\ntrue\n", :created-at 1307738808000, :updated-at 1417201029755, :_id "542692cbc026201cdc326bb6"}], :notes nil, :arglists ["coll"], :doc "Returns a new, transient version of the collection, in constant time.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/transient"} {:added "1.0", :ns "clojure.core", :name "clojure-version", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1458928229284, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "*clojure-version*", :ns "clojure.core"}, :_id "56f57a65e4b0103e9c7d9d25"}], :line 7081, :examples [{:author {:login "mattdw", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ee24aacb65359196b0a1bad050f9a62f?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (clojure-version)\n\"1.2.0-master-SNAPSHOT\"", :created-at 1280323117000, :updated-at 1332951038000, :_id "542692cec026201cdc326da5"}], :notes nil, :arglists [""], :doc "Returns clojure version as a printable string.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/clojure-version"} {:ns "clojure.core", :name "chunk-cons", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1443936300090, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-buffer", :ns "clojure.core"}, :_id "5610b82ce4b0686557fcbd4e"} {:created-at 1443936308702, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk", :ns "clojure.core"}, :_id "5610b834e4b08e404b6c1c9c"} {:created-at 1443936314187, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-append", :ns "clojure.core"}, :_id "5610b83ae4b08e404b6c1c9d"} {:created-at 1443936320194, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-rest", :ns "clojure.core"}, :_id "5610b840e4b08e404b6c1c9e"} {:created-at 1443936325789, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-next", :ns "clojure.core"}, :_id "5610b845e4b08e404b6c1c9f"} {:created-at 1443936329931, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-first", :ns "clojure.core"}, :_id "5610b849e4b08e404b6c1ca0"}], :line 710, :examples [{:editors [{:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}], :body "(let [chunked-cons (-> (chunk-buffer 32)\n (chunk)\n (chunk-cons (seq (range 42))))]\n\n chunked-cons\n ;; => (0 1 2 3 4 5 6 7 8 9 10\n ;; 11 12 13 14 15 16 17 18\n ;; 19 20 21 22 23 24 25 26\n ;; 27 28 29 30 31 32 33 34\n ;; 35 36 37 38 39 40 41)\n\n (class chunked-cons)\n ;; => clojure.lang.ChunkedCons\n\n)", :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :created-at 1443936277294, :updated-at 1443936290379, :_id "5610b815e4b08e404b6c1c9b"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; byte-seq creates a lazy chunked sequence of bytes from an InputStream.\n;; It takes the optimal chunk \"size\" to model a physical resource \n;; (for a disk this would be the block size).\n\n(import '[java.io FileInputStream InputStream])\n\n(defn byte-seq [^InputStream is size]\n (let [ib (byte-array size)]\n ((fn step []\n (lazy-seq\n (let [n (.read is ib)]\n (when (not= -1 n)\n (let [cb (chunk-buffer size)]\n (dotimes [i size] (chunk-append cb (aget ib i)))\n (chunk-cons (chunk cb) (step))))))))))\n\n;; Example with a text file and block size 4096.\n(with-open [is (FileInputStream. \"/usr/share/dict/words\")]\n (let [bs (byte-seq is 4096)]\n (String. (byte-array (take 20 bs)))))\n;; \"A\\na\\naa\\naal\\naalii\\naam\"", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1522963811986, :updated-at 1522966589373, :_id "5ac69563e4b045c27b7fac37"}], :notes nil, :arglists ["chunk rest"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/chunk-cons"} {:added "1.0", :ns "clojure.core", :name "comparator", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1668766070221, :author {:login "holyjak", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/624958?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "compare", :ns "clojure.core"}, :_id "63775976e4b0b1e3652d7685"}], :line 3094, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}], :body ";; simple example to create an ArrayList, initially [1,2,0]\n;; and sort it in descending order\n\nuser=> (def a (new java.util.ArrayList [1 2 0]))\n#'user/a\nuser=> (def compx (comparator (fn [x y] (> x y))))\n#'user/compx\nuser=> (java.util.Collections/sort a compx)\nnil\nuser=> a\n#\n\n;; Note however that 'comparator' is rarely (never?) needed because if\n;; the fn returns a boolean, the .compare implementation Clojure provides\n;; causes it to behave the same as if 'comparator' were wrapped around it:\n\n(sort (comparator (fn [x y] (> x y))) [1 2 0]) ;=> (2 1 0)\n(sort (fn [x y] (> x y)) [1 2 0]) ;=> (2 1 0)\n(sort > [1 2 0]) ;=> (2 1 0)\n(sort < [1 2 0]) ;=> (0 1 2)", :created-at 1313490576000, :updated-at 1345156531000, :_id "542692cdc026201cdc326cfd"}], :notes nil, :arglists ["pred"], :doc "Returns an implementation of java.util.Comparator based upon pred.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/comparator"} {:added "1.0", :ns "clojure.core", :name "sorted-map", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1281961873000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sorted-map-by", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cbd"} {:created-at 1330671636000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "subseq", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cbe"} {:created-at 1330671641000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "rsubseq", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cbf"} {:created-at 1330671776000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sorted-set", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cc0"} {:created-at 1397669012000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "array-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cc1"} {:created-at 1397669018000, :author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "hash-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cc2"} {:created-at 1494705692726, :author {:login "miner", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/25400?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "sorted?", :ns "clojure.core"}, :_id "5917661ce4b01920063ee05b"} {:created-at 1548549104189, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "compare", :ns "clojure.core"}, :_id "5c4cfbf0e4b0ca44402ef644"}], :line 398, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "clojureking", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/92625b8a6be91bb8c688d0d07b4e2a32?r=PG&default=identicon"} {:login "clojureking", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/92625b8a6be91bb8c688d0d07b4e2a32?r=PG&default=identicon"} {:login "clojureking", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/92625b8a6be91bb8c688d0d07b4e2a32?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:avatar-url "https://avatars2.githubusercontent.com/u/10404?v=4", :account-source "github", :login "delonnewman"} {:login "olfal", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/7503672?v=4"}], :body ";; Sorted maps are sorted by their keys, not their values.\n\nuser=> (sorted-map :z 0, :a 28, :b 35)\n{:a 28, :b 35, :z 0}\nuser=> (into (sorted-map) {:a 2 :b 1})\n{:a 2, :b 1}\n\n;; (sorted-map ...) is equivalent in behavior to (sorted-map-by compare ...)\n;; where compare is Clojure's default comparator function clojure.core/compare\n;; See the documentation of compare for more details on its behavior.\n\n;; For a map sorted by values, see the priority-map data structure:\n;; https://github.com/clojure/data.priority-map\n\n;; For a map sorted by the order that key/value pairs were added,\n;; see ordered-map: https://github.com/clj-commons/ordered\n\n;; Another sorted map variant is the ordering-map:\n;; https://github.com/clj-commons/useful/blob/master/src/flatland/useful/map.clj#L243-L245\n\n;; If you deal with many large maps where the keys are all integers, and\n;; want a faster data structure for those, see int-map:\n;; https://github.com/clojure/data.int-map", :created-at 1280746350000, :updated-at 1548623801809, :_id "542692c6c026201cdc3268c0"} {:body "; 'seq' can be used to turn a map into a list of vectors\n; notice how the list is built in the sorted order as with vectors.\n(seq (into (sorted-map) {:key1 \"value1\" :key2 \"value2\"}))\n;;=> ([:key1 \"value1\"] [:key2 \"value2\"])", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1422039046100, :updated-at 1426562359420, :editors [{:login "InSuperposition", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/433871?v=3"}], :_id "54c29806e4b081e022073c28"} {:updated-at 1548623900767, :created-at 1446961734028, :author {:login "chrismurrph", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10278575?v=3"}, :body "; sorting on integer keys\n; also notice how each pair becomes a `MapEntry` ('key' 'val')\n(into (sorted-map) [[23 :x] [17 :y]])\n;;=> {17 :y, 23 :x}", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/10278575?v=3", :account-source "github", :login "chrismurrph"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}], :_id "563ee246e4b04b157a6648e7"} {:updated-at 1494705953587, :created-at 1457752219009, :author {:login "fasiha", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/37649?v=3"}, :body ";; clojure doesn't have a `sorted-map?` function to distinguish a sorted-map\n;; from a regular map. use `instance?`:\n(def unremarkable-map {:k1 \"v1\" :k2 \"v2\"})\n(def very-remarkable-map (into (sorted-map) unremarkable-map))\n(instance? clojure.lang.PersistentTreeMap unremarkable-map)\n;;=> false\n(instance? clojure.lang.PersistentTreeMap very-remarkable-map)\n;;=> true\n\n;; This works because:\n(type unremarkable-map)\n;;=> clojure.lang.PersistentArrayMap (PersistentHashMap if many key-val-pairs)\n(type very-remarkable-map)\n;;=> clojure.lang.PersistentTreeMap\n\n;; Clojure does have a `sorted?` predicate so you could define `sorted-map?`\n(def sorted-map? (every-pred map? sorted?))\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/37649?v=3", :account-source "github", :login "fasiha"} {:login "miner", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/25400?v=3"}], :_id "56e3889be4b0ce130120e038"} {:updated-at 1564573338675, :created-at 1564573338675, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/8271291?v=4"}, :body ";; Sort hash map by it's keys\n(def data {\"k\" 11 \"z\" 12 \"a\" 13 \"d\" 14 })\n\n(into (sorted-map) (sort-by first (seq data)))\n\n;;=> {\"a\" 13, \"d\" 14, \"k\" 11, \"z\" 12}", :_id "5d417e9ae4b0ca44402ef790"} {:updated-at 1610531070746, :created-at 1610531070746, :author {:login "dupuchba", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/911705?v=4"}, :body ";; (from previous comment) clojure doesn't have a `sorted-map?` function to distinguish a sorted-map\n;; from a regular map. use `instance?`:\n\n;;You can indeed check if the sorted-map is an instance of a clojure.lang.PersistentTreeMap but it won't work for cljs/cljc code.\n\n;; +1 for the use of `map?` and `sorted?` \n\n(and (sorted? m) (map? m))", :_id "5ffec0fee4b0b1e3652d742f"} {:updated-at 1665400786595, :created-at 1665400754728, :author {:login "CapableWeb", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/112625454?v=4"}, :body ";; In ClojureScript, no exception gets thrown if you pass it a map\n;; rather than keyvals, leading to potentially unexpected data\n\n;; In Clojure (1.11.1):\n\n(sorted-map {:b 1 :a 2})\n\n;; Execution error (IllegalArgumentException) at user/eval1 (REPL:1).\n;; No value supplied for key: {:b 1, :a 2}\n\n;; In ClojureScript (1.8.40):\n\n(sorted-map {:b 1 :a 2})\n\n;; => {{:b 1, :a 2} nil}\n\n;; ^ is a sorted map, containing the passed in map as the key, with nil as the value\n\n;; What you probably want instead, as illustrated by the other examples:\n\n(into (sorted-map) {:b 1 :a 2})\n\n;; => {:a 2, :b 1}", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/112625454?v=4", :account-source "github", :login "CapableWeb"}], :_id "6343ffb2e4b0b1e3652d7674"} {:updated-at 1685115685170, :created-at 1685115685170, :author {:login "hoodr", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/15623686?v=4"}, :body ";; sorted-map requires that all keys are of the same type, otherwise the default\n;; clojure compare will throw a ClassCastException when attempt to get/insert\n\n(sorted-map :b \"bar\" :a \"foo\")\n;;=> {:a \"foo\" :b \"bar\"}\n\n(sorted-map \"b\" \"bar\" :a \"foo\")\n;;=> Execution error (ClassCastException) at user/eval1 (REPL:1).\n;;=> class java.lang.String cannot be cast to class clojure.lang.Keyword\n\n;; In addition, if you attempt to access keys of a different type from those\n;; that exist in the sorted-map you'll also get a ClassCastException from the\n;; default compare fn\n\n(def m (sorted-map :b \"bar\" :a \"foo\"))\n\n(get m :a) ;;=> \"foo\"\n\n(get m :b) ;;=> \"bar\"\n\n(get m \"a\")\n;;=> Execution error (ClassCastException) at user/eval1 (REPL:1).\n;; class java.lang.String cannot be cast to class clojure.lang.Keyword\n\n;; If you find yourself in a situation where you cannot guarantee the type of\n;; the key to lookup, you will need to write a custom compare fn and use\n;; sorted-map-by to have the same behavior as PersistentArrayMap and avoid an\n;; exception being thrown.\n\n(def p (sorted-map-by (fn [a b] (try (compare a b) (catch Exception _ 1)))\n :b \"bar\"\n :a \"foo\"))\n\n(get p :a) ;;=> \"foo\"\n\n(get p \"a\") ;;=> nil", :_id "6470d325e4b08cf8563f4bbe"}], :notes [{:body "If transient operations are needed for sorted-map, use [data.avl](https://github.com/clojure/data.avl) instead of this built-in one.", :created-at 1648838946843, :updated-at 1648838981619, :author {:avatar-url "https://avatars.githubusercontent.com/u/889685?v=4", :account-source "github", :login "huahaiy"}, :_id "62474922e4b0b1e3652d75c6"}], :arglists ["& keyvals"], :doc "keyval => key val\n Returns a new sorted map with supplied mappings. If any keys are\n equal, they are handled as if by repeated uses of assoc.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/sorted-map"} {:added "1.0", :ns "clojure.core", :name "send", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1282635091000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "shutdown-agents", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d0a"} {:created-at 1282635102000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "send-off", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d0b"} {:created-at 1282635125000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "agent", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d0c"}], :line 2111, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (def my-agent (agent 100))\n#'user/my-agent\nuser=> @my-agent\n100\n\n;; Note the following happens asynchronously in a thread\n;; pool\nuser=> (send my-agent + 100)\n#\n\n;; Assuming the addition has completed the value will\n;; now be updated when we look at it.\nuser=> @my-agent\n200", :created-at 1282635077000, :updated-at 1332951644000, :_id "542692cbc026201cdc326bf5"} {:updated-at 1508861291847, :created-at 1508861291847, :author {:login "elect000", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/18697629?v=4"}, :body ";; update agent value\nuser => (def foo (agent 100)) \n#'user/my-agent\nuser => @foo\n100\n\n;; function get \"old value\"\nuser => (send foo (fn [old-foo] \n (println old-foo \"foo will change\")\n (+ old-foo 100)))\n100 foo will change\n#agent[{:status :ready, :val 200} 0x000000]\n\nuser => @foo\n200", :_id "59ef656be4b0a08026c48c74"}], :notes [{:body "See \"send-off\" for the differences between \"send\" and \"send-off\".", :created-at 1417371874620, :updated-at 1417371874620, :author {:login "fordsfords", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7671908?v=3"}, :_id "547b60e2e4b03d20a10242ba"}], :arglists ["a f & args"], :doc "Dispatch an action to an agent. Returns the agent immediately.\n Subsequently, in a thread from a thread pool, the state of the agent\n will be set to the value of:\n\n (apply action-fn state-of-agent args)", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/send"} {:added "1.0", :ns "clojure.core", :name "drop-while", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1301365967000, :author {:login "pauldoo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5cb916d3c8abc9f45a093209e72489fb?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "take-while", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e46"} {:created-at 1347077852000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "split-with", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e47"} {:created-at 1473454505566, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "some", :ns "clojure.core"}, :_id "57d321a9e4b0709b524f04f3"}], :line 2952, :examples [{:updated-at 1331882398000, :created-at 1279378804000, :body ";; Note: Documentation should be \"starting from the first item for which\n;; (pred item) returns logical false, i.e. either of the values false or nil.\n\nuser=> (drop-while neg? [-1 -2 -6 -7 1 2 3 4 -5 -6 0 1])\n(1 2 3 4 -5 -6 0 1)\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692cfc026201cdc326e45"} {:updated-at 1518209200339, :created-at 1518209200339, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body "(def my-vec [1 2 3 4 5 6])\n\n(drop-while #(> 3 %) my-vec)\n;;(3 4 5 6)\n\n(drop-while #(>= 3 %) my-vec)\n;;(4 5 6)\n\n;;Returns a lazy sequence of the items in coll starting from the\n;;first item for which (pred item) returns logical FALSE", :_id "5a7e08b0e4b0316c0f44f8b3"}], :notes [{:updated-at 1280202567000, :body "The description of this function is throwing me off. I think it should say: returns a sequence of items from `coll` dropping the initial items that evaluate to true when passed to `pred`, once a non-true value is encountered, the rest of the list is returned.", :created-at 1280202567000, :author {:login "Jacolyte", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f8c"}], :arglists ["pred" "pred coll"], :doc "Returns a lazy sequence of the items in coll starting from the\n first item for which (pred item) returns logical false. Returns a\n stateful transducer when no collection is provided.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/drop-while"} {:ns "clojure.core", :name "proxy-call-with-super", :file "clojure/core_proxy.clj", :type "function", :column 1, :see-alsos nil, :line 384, :examples nil, :notes nil, :arglists ["call this meth"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/proxy-call-with-super"} {:added "1.3", :ns "clojure.core", :name "realized?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1334256253000, :author {:login "tcrawley", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9262893211442b0081f2bcd75bfd47f3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "promise", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c53"} {:created-at 1334256260000, :author {:login "tcrawley", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9262893211442b0081f2bcd75bfd47f3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "delay", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c54"} {:created-at 1334256266000, :author {:login "tcrawley", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9262893211442b0081f2bcd75bfd47f3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "future", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c55"}], :line 7533, :examples [{:author {:login "neotyk", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/366ff985977b3aab09510bc335cd44a4?r=PG&default=identicon"}, :editors [], :body ";; Create a promise\nuser> (def p (promise))\n#'user/p ; p is our promise\n\n;; Check if was delivered/realized\nuser> (realized? p)\nfalse ; No yet\n\n;; Delivering the promise\nuser> (deliver p 42)\n#\n\n;; Check again if it was delivered\nuser> (realized? p)\ntrue ; Yes!\n\n;; Deref to see what has been delivered\nuser> @p\n42\n\n;; Note that @ is shorthand for deref\nuser> (deref p)\n42", :created-at 1329847539000, :updated-at 1329847539000, :_id "542692d5c026201cdc327063"} {:body ";; For lazy sequences\n\nuser=> (def r (range 5))\n#'user/r\nuser=> (realized? r)\nfalse\nuser=> (first r)\n0\nuser=> (realized? r)\ntrue\n\n; As of Clojure 1.7.0 range may return things other than a LazySeq.\n; see https://groups.google.com/forum/#!topic/clojure/NFwHkZxUFuY\n; and another example here.\n\nuser=> (def r (lazy-seq (range 5)))\n#'user/r\nuser=> (realized? r)\nfalse\nuser=> (first r)\n0\nuser=> (realized? r)\ntrue", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423041981596, :updated-at 1646323852599, :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/6127708?v=3", :account-source "github", :login "mhuerster"} {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}], :_id "54d1e5bde4b081e022073c56"} {:updated-at 1609789065763, :created-at 1609789065763, :author {:login "timrobinson33", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/57178390?v=4"}, :body ";; Note that for delay (but not future), if the body is currently executing\n;; realized? will block until it completes.", :_id "5ff36e89e4b0b1e3652d7427"} {:editors [{:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}], :body ";; realized? does not work with all lazy sequences (since Clojure 1.7.0),\n;; and some functions that return lazy sequences might not always return\n;; a sequence to which realized? is applicable.\n\n;; realized? works with a bare call to range:\nuser=> (realized? (range))\ntrue\nuser=> (realized? (rest (range)))\nfalse\n;; but not when range is given an argument:\nuser=> (realized? (range 10000))\nExecution error (ClassCastException) at user/eval2036 (form-init1890379966749060098.clj:1).\nclojure.lang.LongRange cannot be cast to clojure.lang.IPending\n\n;; The reason is that range returns instances of different classes:\nuser=> (class (range))\nclojure.lang.Iterate\nuser=> (class (range 10000))\nclojure.lang.LongRange\n\n;; repeat is another example:\nuser=> (realized? (repeat 10000))\nExecution error (ClassCastException) at user/eval5991 (form-init1890379966749060098.clj:1).\nclojure.lang.Repeat cannot be cast to clojure.lang.IPending\nuser=> (class (repeat 10000))\nclojure.lang.Repeat\n\n;; All of the sequences returned above behave lazily, however.\n\n;; The upshot is that realized? is not considered an important tool for use\n;; with lazy sequences and probably shouldn't be depended on, except in \n;; special cases.\n\n;; As noted in another example, there's an old discussion here:\n;; https://groups.google.com/forum/#!topic/clojure/NFwHkZxUFu", :author {:avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4", :account-source "github", :login "mars0i"}, :created-at 1646325203994, :updated-at 1646325368517, :_id "6220edd3e4b0b1e3652d75b1"}], :notes nil, :arglists ["x"], :doc "Returns true if a value has been produced for a promise, delay, future or lazy sequence.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/realized_q"} {:added "1.1", :ns "clojure.core", :name "char-array", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1293675171000, :author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "into-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bd9"} {:created-at 1293675177000, :author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "to-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bda"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "chars", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917444000, :_id "542692eaf6e94c6970521bdb"}], :line 5301, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [], :body "user> (char-array \"asdf\")\n#\n\nuser> (seq (char-array \"asdf\"))\n(\\a \\s \\d \\f)\n\nuser> (seq (char-array 10))\n(\\^@ \\^@ \\^@ \\^@ \\^@ \\^@ \\^@ \\^@ \\^@ \\^@)", :created-at 1293675165000, :updated-at 1293675165000, :_id "542692c7c026201cdc32698c"} {:updated-at 1563833139082, :created-at 1563833139082, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; `slurp` is polymorphic and supports many types. Sometimes you \n;; need to `slurp` a generic argument that could be already a string\n;; (perhaps it was loaded somewhere else). Use `char-array` to convert\n;; the string into a format suitable for `slurp`:\n\n(defn fetch [x]\n (slurp (if (string? x) (char-array x) x)))\n \n(take 10 (fetch \"http://clojure.org\"))\n;;(\\h \\t \\t \\p \\: \\/ \\/ \\c \\l \\o)\n(take 10 (fetch \"Also loading from a string\"))\n;; (\\A \\l \\s \\o \\space \\l \\o \\a \\d \\i)", :_id "5d363333e4b0ca44402ef78a"}], :notes nil, :arglists ["size-or-seq" "size init-val-or-seq"], :doc "Creates an array of chars", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/char-array"} {:added "1.0", :ns "clojure.core", :name "resolve", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1289660999000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ns-resolve", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c5e"} {:created-at 1450428036535, :author {:login "blx", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/887504?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "symbol", :ns "clojure.core"}, :_id "5673c684e4b09a2675a0ba7a"} {:created-at 1571179430280, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "deref", :ns "clojure.core"}, :_id "5da64ba6e4b0ca44402ef7ce"} {:created-at 1654081047171, :author {:login "PEZ", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/30010?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "requiring-resolve", :ns "clojure.core"}, :_id "62974617e4b0b1e3652d75f5"}], :line 4372, :examples [{:author {:login "jonase", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5e0b0bd287633db6fccf32a2aa5efd42?r=PG&default=identicon"}, :editors [{:login "jonase", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5e0b0bd287633db6fccf32a2aa5efd42?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> ((-> \"first\" symbol resolve) [1 2 3])\n1", :created-at 1280971203000, :updated-at 1332950641000, :_id "542692cdc026201cdc326cde"} {:author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :editors [], :body ";; See also http://clojure.org/namespaces for information on namespaces in Clojure and how to inspect and manipulate them", :created-at 1348479395000, :updated-at 1348479395000, :_id "542692d5c026201cdc327074"} {:body "user=> (resolve 'x)\nnil\nuser=> (def x 1)\n#'user/x\nuser=> (resolve 'x)\n#'user/x\n\nuser=> (resolve 'join)\nnil\nuser=> (use '[clojure.string :only [join]])\nnil\nuser=> (resolve 'join)\n#'clojure.string/join\n\nuser=> (join \", \" [\"a\" \"b\"])\n\"a, b\"\nuser=> ((resolve 'join) \", \" [\"a\" \"b\"])\n\"a, b\"", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423094803389, :updated-at 1423094803389, :_id "54d2b413e4b081e022073c61"} {:updated-at 1533277711352, :created-at 1533277711352, :author {:login "philoskim", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/5637280?v=4"}, :body "user=> (resolve 'Exception)\njava.lang.Exception\n\nuser=> (type (resolve 'Exception))\njava.lang.Class\n", :_id "5b63f60fe4b00ac801ed9e46"} {:updated-at 1545993870224, :created-at 1545992641368, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Also resolve Array classes\n(resolve (symbol \"[I\"))\n;; [I", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5c25f9c1e4b0ca44402ef5f9"} {:updated-at 1545994118006, :created-at 1545994118006, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Also takes a set/map of symbols to ignore while resolving.\n\n(defn replace-var [name value]\n (let [protected #{'+ '- '* '/}]\n (when (resolve protected name)\n (intern *ns* name value))))\n\n(replace-var 'first last)\n(first [1 2 3 4])\n;; 4\n\n;; plus is protected.\n(replace-var '+ -)\n(+ 1 1)\n;; 2", :_id "5c25ff86e4b0ca44402ef5fe"} {:updated-at 1645559019391, :created-at 1645559019391, :author {:login "tekacs", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/63247?v=4"}, :body ";; Also works fine on namespaced symbols\n\n;; some-ns\n(def x 1)\n\n;; other-ns\n@(resolve 'some-ns/x)\n;; 1", :_id "62153cebe4b0b1e3652d75ad"}], :notes nil, :arglists ["sym" "env sym"], :doc "same as (ns-resolve *ns* symbol) or (ns-resolve *ns* &env symbol)", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/resolve"} {:added "1.0", :ns "clojure.core", :name "compare", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1361334293000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sort-by", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e7f"} {:created-at 1361334307000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sorted-set-by", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e80"} {:created-at 1361334315000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sorted-map-by", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e81"} {:created-at 1548959861545, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "==", :ns "clojure.core"}, :_id "5c534075e4b0ca44402ef660"}], :line 831, :examples [{:updated-at 1450882235668, :created-at 1313565230000, :body ";; various examples\n;; comparing vectors of different sizes does not work as you may expect\n;; the longer vector is always \"greater\" regardless of contents \n\nuser=> (compare [0 1 2] [0 1 2])\n0\nuser=> (compare [1 2 3] [0 1 2 3])\n-1\nuser=> (compare [0 1 2] [3 4])\n1\nuser=> (compare nil [1 2 3])\n-1\nuser=> (compare [1 2 3] nil)\n1\nuser=> (compare [2 11] [99 1])\n-1\nuser=> (compare \"abc\" \"def\")\n-3\nuser=> (compare \"abc\" \"abd\")\n-1", :editors [{:avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon", :account-source "clojuredocs", :login "shockbob"} {:avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon", :account-source "clojuredocs", :login "shockbob"} {:login "liango2", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5696817?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon", :account-source "clojuredocs", :login "shockbob"}, :_id "542692ccc026201cdc326cc6"} {:editors [{:login "nwallace", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1614172?v=3"}], :body ";; number comparisons give results of either 1, 0 or -1\n(compare 1 0) ;; => 1\n(compare 1 1) ;; => 0\n(compare 1 2) ;; => -1\n(compare 1 3) ;; => -1\n\n;; string comparisons give results of the distance between the first characters\n(compare \"B\" \"A\") ;; => 1\n(compare \"B\" \"B\") ;; => 0\n(compare \"B\" \"C\") ;; => -1\n(compare \"AA\" \"ZZ\") ;; => -25\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/1614172?v=3", :account-source "github", :login "nwallace"}, :created-at 1458443574384, :updated-at 1458443996870, :_id "56ee1536e4b09295d75dbf2e"} {:updated-at 1490657533575, :created-at 1490657533575, :author {:login "ercliou", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/6700692?v=3"}, :body "(compare true false)\n;;=> 1\n(compare false true)\n;;=> -1\n(compare true true)\n;;=> 0\n(compare false false)\n;;=> 0", :_id "58d9a0fde4b01f4add58fe79"} {:editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}], :body ";; `compare` is the default comparator for sorting with `sort` and\n;; `sort-by`, for ordering the elements of a `sorted-set`, and for\n;; ordering the keys of a `sorted-map`.\n\n;; See https://clojure.org/guides/comparators for advice on writing\n;; your own custom comparators.\n\n;; As for all 3-way comparators, compare takes two arguments `x` and\n;; `y`. It returns an int (i.e. a Java 32-bit Integer) that is\n;; negative if `x` should come before `y`, positive if `x` should come\n;; after `y`, or 0 if they are equal.\n\n;; `compare` works for many types of values, ordering values as\n;; follows.\n\n;; Numbers are sorted in increasing numeric order, returning 0 if two\n;; numbers are numerically equal by `==`, even if `=` returns false\n\nuser=> (sort [22/7 2.71828 ##-Inf 1 55 3N])\n(##-Inf 1 2.71828 3N 22/7 55)\n\n;; Regular sets use `=` for detecting duplicates, so all of the\n;; numbers in this example are considered distinct elements. Numbers\n;; in different \"categories\" (integer & ratio, floating point,\n;; BigDecimal) are never `=` to each other.\nuser=> (set [1.5 1.5M 3/2])\n#{1.5 3/2 1.5M}\n\n;; Sorted sets use `compare` for detecting duplicates, which is more\n;; like `==` for determining when numbers have the same numeric value\n;; regardless of \"category\", so all of the numbers in this example are\n;; considered equal. Thus only the first one is added.\nuser=> (sorted-set 1.5 1.5M 3/2)\n#{1.5}\n\n;; An oddity: (compare ##NaN x) and (compare x ##NaN) returns 0 (equal) for any\n;; number x, including ##NaN, but (== ##NaN x) and (== x ##NaN) returns false\n\nuser=> (== 1 ##NaN)\nfalse\nuser=> (compare 1 ##NaN)\n0\nuser=> (== ##NaN ##NaN)\nfalse\nuser=> (compare ##NaN ##NaN)\n0", :author {:avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4", :account-source "github", :login "jafingerhut"}, :created-at 1548617891609, :updated-at 1548789812583, :_id "5c4e08a3e4b0ca44402ef647"} {:updated-at 1548617914105, :created-at 1548617914105, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :body ";; Strings are sorted in lexicographic order, aka dictionary order\n;; (http://en.wikipedia.org/wiki/Lexicographical_order) by their\n;; representation as sequences of UTF-16 code units. This is\n;; alphabetical order (case-sensitive) for strings restricted to the\n;; ASCII subset. See Java documentation of String's `compareTo`\n;; method for additional details on `String` comparison.\n;; https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#compareTo-java.lang.String-\n\nuser=> (sorted-set \"aardvark\" \"boo\" \"a\" \"Antelope\" \"bar\")\n#{\"Antelope\" \"a\" \"aardvark\" \"bar\" \"boo\"}\n\n;; Symbols are sorted by their representation as strings, sorting\n;; first by their namespace name, and if they are in the same\n;; namespace, then by their name. If no namespace is included, those\n;; symbols will be sorted before any symbol with a namespace.\nuser=> (sorted-set 'user/foo 'clojure.core/pprint 'bar\n 'clojure.core/apply 'user/zz)\n#{bar clojure.core/apply clojure.core/pprint user/foo user/zz}\n\n;; Keywords are sorted similarly to symbols.\nuser=> (sorted-map :map-key 10, :amp [3 2 1], :blammo \"kaboom\")\n{:amp [3 2 1], :blammo \"kaboom\", :map-key 10}", :_id "5c4e08bae4b0ca44402ef648"} {:updated-at 1548617930499, :created-at 1548617930499, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :body ";; Vectors are sorted by their length first, from shortest to longest,\n;; then lexicographically among equal-length vectors.\n\nuser=> (sort [[-8 2 5] [-5 -1 20] [1 2] [1 -5] [10000]])\n([10000] [1 -5] [1 2] [-8 2 5] [-5 -1 20])", :_id "5c4e08cae4b0ca44402ef649"} {:updated-at 1548791137396, :created-at 1548617944751, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :body ";; All Java types implementing the `Comparable` interface such as\n;; characters, booleans, `File`, `URI`, and `UUID` are compared via\n;; their `compareTo` methods.\n;; https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html\n\nuser=> (import '(java.util UUID))\njava.util.UUID\nuser=> (def u1 (UUID. 5 10))\n#'user/u1\nuser=> (def u2 (UUID. 5 17))\n#'user/u2\nuser=> (def u3 (UUID. 10 0))\n#'user/u3\nuser=> u1\n#uuid \"00000000-0000-0005-0000-00000000000a\"\nuser=> u2\n#uuid \"00000000-0000-0005-0000-000000000011\"\nuser=> u3\n#uuid \"00000000-0000-000a-0000-000000000000\"\n\nuser=> (sort [u3 u2 u1])\n(#uuid \"00000000-0000-0005-0000-00000000000a\"\n #uuid \"00000000-0000-0005-0000-000000000011\"\n #uuid \"00000000-0000-000a-0000-000000000000\")\n\n;; `nil` can be compared to all values above, and is considered less\n;; than anything else.\n\nuser=> (sort [:ns2/kw1 :ns2/kw2 :ns1/kw2 :kw2 nil])\n(nil :kw2 :ns1/kw2 :ns2/kw1 :ns2/kw2)", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4", :account-source "github", :login "jafingerhut"}], :_id "5c4e08d8e4b0ca44402ef64a"} {:updated-at 1548617960867, :created-at 1548617960867, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :body ";; `compare` throws an exception if given two values whose types are\n;; \"too different\", e.g. it can compare integers, longs, and doubles\n;; to each other, but not strings to keywords or keywords to symbols.\n;; It cannot compare lists, sequences, sets, or maps at all.\n;; See https://clojure.org/guides/comparators for advice on writing\n;; your own custom comparators.\n\nuser=> (sort [5 \"a\"])\nExecution error (ClassCastException) at java.lang.String/compareTo (String.java:111).\njava.lang.Long cannot be cast to java.lang.String\n\nuser=> (sort [:foo 'bar])\nExecution error (ClassCastException) at java.util.TimSort/countRunAndMakeAscending (TimSort.java:355).\nclojure.lang.Keyword cannot be cast to clojure.lang.Symbol\n\nuser=> (sort [#{1 2} #{2 4}])\nExecution error (ClassCastException) at java.util.TimSort/countRunAndMakeAscending (TimSort.java:355).\nclojure.lang.PersistentHashSet cannot be cast to java.lang.Comparable\n\nuser=> (sort [{:a 1 :b 3} {:c -2 :d 4}])\nExecution error (ClassCastException) at java.util.TimSort/countRunAndMakeAscending (TimSort.java:355).\nclojure.lang.PersistentArrayMap cannot be cast to java.lang.Comparable\n\nuser=> (sort [[1 2] '(3 4)])\nExecution error (ClassCastException) at java.util.TimSort/countRunAndMakeAscending (TimSort.java:355).\nclojure.lang.PersistentList cannot be cast to java.lang.Comparable\n\nuser=> (sort [[1 2] (seq [3 4])])\nExecution error (ClassCastException) at java.util.TimSort/countRunAndMakeAscending (TimSort.java:355).\nclojure.lang.PersistentVector$ChunkedSeq cannot be cast to java.lang.Comparable", :_id "5c4e08e8e4b0ca44402ef64b"} {:updated-at 1595864314210, :created-at 1595864314210, :author {:login "uosl", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/3865590?v=4"}, :body ";; You can reverse the sort order returned by `compare` by swapping its arguments.\n\n#(compare %2 %1)\n\nuser=> (sort #(compare %2 %1) [3 2 4 1])\n(4 3 2 1)\n\n;; Source: https://clojure.org/guides/comparators#_reverse_order", :_id "5f1ef4fae4b0b1e3652d7325"}], :notes [{:author {:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}, :updated-at 1526151376043, :created-at 1526151376043, :body "It is clear what `compare` does, but how do you turn its output into an answer to questions like ‘is x less than y’ or ‘is x greater than or equal to y’?\n\nWhile the numeric `<` `<=` `=` `>=` `>` provide that answer in Boolean form right away, with `compare` a second step is required.\n\n ((juxt < <= = >= >) 2 3)\n ;;=> [true true false false false]\n\nHere is a listing of the same relations using `compare`:\n\n ((juxt (comp neg? compare)\n (comp not pos? compare)\n (comp zero? compare)\n (comp not neg? compare)\n (comp pos? compare))\n \"2\" \"3\")\n ;;=> [true true false false false]\n", :_id "5af738d0e4b045c27b7fac66"}], :arglists ["x y"], :doc "Comparator. Returns a negative number, zero, or a positive number\n when x is logically 'less than', 'equal to', or 'greater than'\n y. Same as Java x.compareTo(y) except it also works for nil, and\n compares numbers and collections in a type-independent manner. x\n must implement Comparable", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/compare"} {:added "1.0", :ns "clojure.core", :name "complement", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1301366589000, :author {:login "pauldoo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5cb916d3c8abc9f45a093209e72489fb?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "not", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b3f"}], :line 1433, :examples [{:author {:login "mattdw", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ee24aacb65359196b0a1bad050f9a62f?r=PG&default=identicon"}, :editors [{:login "mattdw", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ee24aacb65359196b0a1bad050f9a62f?r=PG&default=identicon"} {:login "mattdw", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/ee24aacb65359196b0a1bad050f9a62f?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; a simple not-empty? predicate\n(def not-empty? (complement empty?))\n;; #'user/not-empty?\n\n(not-empty? []) ;;=> false\n(not-empty? [1 2]) ;;=> true\n\n\n;; a slightly more complex example\n;; this function takes two arguments, and sometimes returns nil\n(defn contains-char? [the-string, the-char]\n (some #(= the-char %) the-string))\n;; #'user/contains-char?\n\n(contains-char? \"abc\" \\b) ;;=> true\n(contains-char? \"abc\" \\j) ;;=> nil\n\n;; define the complement, to check if a char is absent\n(def does-not-contain-char? (complement contains-char?))\n;; #'user/does-not-contain-char?\n\n;; our complement does exactly what we expect\n(does-not-contain-char? \"abc\" \\b) ;;=> false\n(does-not-contain-char? \"abc\" \\j) ;;=> true\n", :created-at 1280324273000, :updated-at 1420648560124, :_id "542692c7c026201cdc3269b7"} {:updated-at 1583065242138, :created-at 1503907232338, :author {:login "MokkeMeguru", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/30849444?v=4"}, :body "(map (complement even?) '(1 2 3 4))\n\n;; return...\n;; (true false true false)\n\n;; see also ...\n(map even? '(1 2 3 4))\n;; (false true false true)\n\n;; WARNING\n;; This function returns ERROR!!!\n(map (not even?) '(1 2 3 4))\n\n(map #(not (even? %)) '(1 2 3 4)) ; This works\n", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/655969?v=4", :account-source "github", :login "kopos"} {:login "wplj", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/12292887?v=4"}], :_id "59a3cda0e4b09f63b945ac53"} {:editors [{:login "kopos", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/655969?v=4"}], :body "(def not-empty? (complement empty?))\n\n(not-empty? \"abcde\")\n;;true\n\n(not-empty? \"\")\n;;false", :author {:avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4", :account-source "github", :login "ibercode"}, :created-at 1518787297119, :updated-at 1542283642709, :_id "5a86dae1e4b0316c0f44f8c8"} {:updated-at 1583065367049, :created-at 1583065367049, :author {:login "wplj", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/12292887?v=4"}, :body ";; flatten function from Clojure core:\n(defn flatten\n \"Takes any nested combination of sequential things (lists, vectors,\n etc.) and returns their contents as a single, flat lazy sequence.\n (flatten nil) returns an empty sequence.\"\n {:added \"1.2\"\n :static true}\n [x]\n (filter (complement sequential?)\n (rest (tree-seq sequential? seq x))))", :_id "5e5ba917e4b087629b5a18af"}], :notes nil, :arglists ["f"], :doc "Takes a fn f and returns a fn that takes the same arguments as f,\n has the same effects, if any, and returns the opposite truth value.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/complement"} {:added "1.4", :ns "clojure.core", :name "*compiler-options*", :type "var", :see-alsos nil, :examples [{:updated-at 1483010010444, :created-at 1483010010444, :author {:login "PetrGlad", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/124476?v=3"}, :body ";; Toggle locals clearing (set it to true to aid with debugging)\n(alter-var-root #'clojure.core/*compiler-options* \n update :disable-locals-clearing not)", :_id "5864efdae4b0fd5fb1cc964a"} {:updated-at 1615669432545, :created-at 1615140629289, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :body ";; If example.clj is on the classpath and contains something like:\n;; (ns example)\n;; (def ^{:t1 \"secret metadata\"\n;; :doc \"here's some useful info\"}\n;; foo 1))\n\n(binding [*compiler-options* {:elide-meta [:doc :t1]}]\n (compile 'example))\n\n;; AOT-compiles \"example.clj\" removing \":doc\" and \":t1\" values from\n;; the constant pool of the generated class.\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "60451715e4b0b1e3652d746f"}], :notes nil, :arglists [], :doc "A map of keys to options.\n Note, when binding dynamically make sure to merge with previous value.\n Supported options:\n :elide-meta - a collection of metadata keys to elide during compilation.\n :disable-locals-clearing - set to true to disable clearing, useful for using a debugger\n Alpha, subject to change.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*compiler-options*"} {:added "1.0", :ns "clojure.core", :name "*print-dup*", :type "var", :see-alsos nil, :examples [{:updated-at 1522749214303, :created-at 1281149003000, :body ";; `*print-dup*` is very handy when we want to write clojure code/data\n;; to a file to read it in later.\n\n(defn serialize\n \"Print a data structure to a file so that we may read it in later.\"\n [data-structure #^String filename]\n (with-out-writer\n (java.io.File. filename)\n (binding [*print-dup* true] (prn data-structure))))\n\n\n;; This allows us to then read in the structure at a later time, like so:\n(defn deserialize [filename]\n (with-open [r (PushbackReader. (FileReader. filename))]\n (read r)))\n\n\nuser=> (deserialize \"config.clj\")\n{:name \"Fred\", :age \"23\"}\n", :editors [{:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/57126d684344e156ede4592945b54366?r=PG&default=identicon", :account-source "clojuredocs", :login "bmillare"} {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692cec026201cdc326da7"}], :notes [{:author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :created-at 1281149184000, :body "It is sometimes preferable (depending on the size of the structure you're serializing) to wrap the `(with-out-writer ...)` inside a `(dorun (with-out-writer ...) nil)` in order to suppress the output at your REPL.", :updated-at 1281149184000, :_id "542692ecf6e94c6970521f93"} {:updated-at 1293075429000, :body "Note, I'm making changes to deserialize, there are a few typos.", :created-at 1293075226000, :author {:login "bmillare", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/57126d684344e156ede4592945b54366?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521faf"}], :arglists [], :doc "When set to logical true, objects will be printed in a way that preserves\n their type when read in later.\n\n Defaults to false.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*print-dup*"} {:added "1.2", :ns "clojure.core", :name "defrecord", :file "clojure/core_deftype.clj", :type "macro", :column 1, :see-alsos [{:created-at 1289817120000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "deftype", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d16"} {:created-at 1289817125000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defstruct", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d17"} {:created-at 1289817134000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "defprotocol", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d18"} {:created-at 1416251002018, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:ns "clojure.core", :name "instance?", :library-url "https://github.com/clojure/clojure"}, :_id "546a467ae4b0dc573b892fdb"} {:created-at 1439234754688, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "record?", :ns "clojure.core"}, :_id "55c8fac2e4b0080a1b79cdb8"}], :line 312, :examples [{:author {:login "Kototama", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a54a4dc204925d397ca010b9a332e74d?r=PG&default=identicon"}, :editors [{:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"} {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"} {:login "pvesna", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a9e4f72971f946e55c71222a37d8e947?r=PG&default=identicon"}], :body ";; from Stu's examples:\n\n(defrecord Person [fname lname address])\n-> user.Person\n\n(defrecord Address [street city state zip])\n-> user.Address\n\n(def stu (Person. \"Stu\" \"Halloway\"\n (Address. \"200 N Mangum\"\n \"Durham\"\n \"NC\"\n 27701)))\n-> #'user/stu\n\n(:lname stu)\n-> \"Halloway\"\n\n(-> stu :address :city)\n-> \"Durham\"\n\n(assoc stu :fname \"Stuart\")\n-> #:user.Person{:fname \"Stuart\", :lname \"Halloway\", :address #:user.Address{:street \"200 N Mangum\", :city \"Durham\", :state \"NC\", :zip 27701}}\n\n(update-in stu [:address :zip] inc)\n-> #:user.Person{:fname \"Stu\", :lname \"Halloway\", :address #:user.Address{:street \"200 N Mangum\", :city \"Durham\", :state \"NC\", :zip 27702}}", :created-at 1286314411000, :updated-at 1359584504000, :_id "542692c8c026201cdc326a32"} {:author {:login "puredanger", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/89c8afd032c7b3473f67c9b00d3acd5a?r=PG&default=identicon"}, :editors [{:login "puredanger", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/89c8afd032c7b3473f67c9b00d3acd5a?r=PG&default=identicon"} {:login "puredanger", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/89c8afd032c7b3473f67c9b00d3acd5a?r=PG&default=identicon"} {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"} {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"} {:login "pvesna", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a9e4f72971f946e55c71222a37d8e947?r=PG&default=identicon"}], :body ";; This example shows how to implement a Java interface in defrecord.\n;; We'll implement FileNameMap (because it has a simple interface, \n;; not for its real purpose). \n\n(import java.net.FileNameMap)\n-> java.net.FileNameMap\n\n;; Define a record named Thing with a single field a. Implement\n;; FileNameMap interface and provide an implementation for the single\n;; method: String getContentTypeFor(String fileName)\n(defrecord Thing [a]\n FileNameMap\n (getContentTypeFor [this fileName] (str a \"-\" fileName)))\n-> user.Thing\n\n;; construct an instance of the record\n(def thing (Thing. \"foo\"))\n-> #'user/thing\n\n;; check that the instance implements the interface\n(instance? FileNameMap thing)\n-> true\n\n;; get all the interfaces for the record type\n(map #(println %) (.getInterfaces Thing))\n-> java.net.FileNameMap\n-> clojure.lang.IObj\n-> clojure.lang.ILookup\n-> clojure.lang.IKeywordLookup\n-> clojure.lang.IPersistentMap\n-> java.util.Map\n-> java.io.Serializable\n\n;; actually call the method on the thing instance and pass \"bar\"\n(.getContentTypeFor thing \"bar\")\n-> \"foo-bar\"", :created-at 1290599788000, :updated-at 1359589207000, :_id "542692c8c026201cdc326a36"} {:author {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"}, :editors [{:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "belun", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8d3c423e74750fa42c0386833e4b8209?r=PG&default=identicon"} {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"} {:avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3", :account-source "github", :login "bkovitz"} {:login "green-coder", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4"} {:avatar-url "https://avatars.githubusercontent.com/u/4068533?v=4", :account-source "github", :login "lmartelli"}], :body ";; prepare a protocol\nuser=> (defprotocol Fun-Time (drinky-drinky [_]))\nFun-Time\n\n;; define a record and extend the previous protocol, implementing its function\nuser=> (defrecord Someone [nick-name preferred-drink] \n Fun-Time \n (drinky-drinky [_] (str nick-name \"(having \" preferred-drink \"): uuumm\")))\nuser.Someone\n;; NOTE how 'nick-name' and 'preferred-drink' are symbols\n;; that are not declared anywhere, they are 'provided' inside the function\n\n;; instantiate the protocol once and store it\nuser=> (def dude (->Someone \"belun\" \"daiquiri\"))\n#'user/dude\n\n;; use the function defined inside the protocol on the protocol instance\nuser=> (drinky-drinky dude)\n\"belun(having daiquiri): uuumm\"\n\n\n;; courtesy of Howard Lewis Ship - http://java.dzone.com/articles/changes-cascade-and-cautionary", :created-at 1317098332000, :updated-at 1672591553613, :_id "542692d2c026201cdc326f82"} {:updated-at 1442089153715, :created-at 1319420075000, :body "; If you define a defrecord in one namespace and want to use it\n; from another, there are 2 options:\n; 1. use the constructor (->Record) \n; (only available in clojure >= 1.4)\n;\n; 2. first require the namespace and then import\n; the record as a regular class.\n; The require+import order makes sense if you consider that first\n; the namespace has to be compiled--which generates a class for\n; the record--and then the generated class must be imported.\n; (Thanks to raek in #clojure for the explanations!)\n\n; Namespace \"my/data.clj\", where a defrecord is declared\n(ns my.data)\n\n(defrecord Employee [name surname])\n\n; Option 1: \n; Namescape \"my/queries-option-one.clj\", where a defrecord is used\n(ns my-queries-one\n (:use [my.data]))\n\n(println\n \"Employees named Albert:\"\n (filter #(= \"Albert\" (.name %))\n [(->Employee \"Albert\" \"Smith\")\n (->Employee \"John\" \"Maynard\")\n (->Employee \"Albert\" \"Cheng\")]))\n\n; Option 2:\n; Namescape \"my/queries-option-two.clj\", where a defrecord is used\n(ns my.queries-option-two\n (:require my.data)\n (:import [my.data Employee]))\n\n(println\n \"Employees named Albert:\"\n (filter #(= \"Albert\" (.name %))\n [(Employee. \"Albert\" \"Smith\")\n (Employee. \"John\" \"Maynard\")\n (Employee. \"Albert\" \"Cheng\")]))", :editors [{:avatar-url "https://www.gravatar.com/avatar/fea4948490b77a00b8c10bffd792f9d8?r=PG&default=identicon", :account-source "clojuredocs", :login "albertcardona"} {:avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon", :account-source "clojuredocs", :login "Ljos"} {:avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon", :account-source "clojuredocs", :login "Ljos"} {:login "edeustace", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/101623?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/fea4948490b77a00b8c10bffd792f9d8?r=PG&default=identicon", :account-source "clojuredocs", :login "albertcardona"}, :_id "542692d2c026201cdc326f87"} {:author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :editors [], :body ";; The map->Recordclass form works only in Clojure 1.3 or higher\n\n(defrecord Foo [a b])\n\n(defrecord Bar [a b c])\n\n(defrecord Baz [a c])\n\n(def f (Foo. 10 20))\n(println f)\n-> #user.Foo{:a 10, :b 20}\n\n(def r (map->Bar (merge f {:c 30})))\n(println r)\n-> #user.Bar{:a 10, :b 20, :c 30}\n\n(def z (map->Baz (merge f {:c 30})))\n(println z)\n-> #user.Baz{:a 10, :c 30, :b 20}", :created-at 1335392908000, :updated-at 1335392908000, :_id "542692d2c026201cdc326f8b"} {:body ";; Construct a record from a vector.\n(def info [\"Carl\" 20])\n\n(defrecord Person [name age])\n\n(apply ->Person info)\n-> #user.Person{:name \"Carl\", :age 20}\n\n;; This is particularly useful for mapping parsed CSV files to records\n(map #(apply ->Person %) parsed-csv-file)", :author {:login "EduardoMRB", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2163269?v=3"}, :created-at 1419039522858, :updated-at 1419039522858, :_id "5494d322e4b04e93c519ffaa"} {:updated-at 1444173053403, :created-at 1444173053403, :author {:login "minutetominute", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3320594?v=3"}, :body ";; Destructuring a record\n\n(defrecord Cat [age weight])\n\n(def Jasper (Cat. 2 10))\n\n(defn about-cat [{:keys [age weight]}] \n (str age \" yrs old and \" weight \" lbs\"))\n\n(about-cat Jasper)\n->\"2 yrs old and 10 lbs\"", :_id "561454fde4b0b41dac04c953"} {:updated-at 1479124081391, :created-at 1479124081391, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body "(defrecord Person [name age])\n;;=> user.Person\n\n(def ertu (->Person \"Ertu\" 24))\n;;=> #'user/ertu\n\n(record? ertu)\n;;=> true\n\n(record? (assoc ertu :address \"Somewhere\"))\n;;=> true\n\n;;removing base fields converts record to regular map\n(record? (dissoc ertu :name))\n;;=> false", :_id "5829a471e4b0782b632278c0"} {:updated-at 1486752453677, :created-at 1486752453677, :author {:login "bunbutter", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5318739?v=3"}, :body ";;iterate over the keys\n\n;;define the record\n(defrecord record-class [alplha beta])\n\n;;create a defrecord variable\n(def record (record-class. 1 2))\n\n;;iterate over the keys\n(for [key (keys record)]\n (println (key record)))", :_id "589e0ac5e4b01f4add58fe45"} {:updated-at 1510128100976, :created-at 1510128100976, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;define Address record\n(defrecord Address [city state])\n\n;;define Person record\n(defrecord Person [firstname lastname ^Address address])\n\n;;buid the constructor\n(defn make-person ([fname lname city state]\n (->Person fname lname (->Address city state))))\n\n;;create a person\n(def person1 (make-person \"John\" \"Doe\" \"LA\" \"CA\"))\n\n;;retrieve values\n(:firstname person1)\n(:city (:address person1))", :_id "5a02b9e4e4b0a08026c48ca3"} {:updated-at 1649147987152, :created-at 1528333981519, :author {:login "jennydickinson", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1972655?v=4"}, :body ";; Binary Search Tree (variation on implementation by Edd Mann)\n\n(defrecord Node [value left right])\n\n(defn insert [{:keys [value left right] :as node} item]\n (cond\n (nil? node) (->Node item nil nil)\n (< item value) (->Node value (insert left item) right)\n (> item value) (->Node value left (insert right item))\n :else (update node :count (fnil inc 1)))) ; Use of :count, not in defrecord\n\n(defn coll->bst [coll] (reduce insert nil coll))\n\n(coll->bst [10 5 20 10 10])\n=> #example.bst.Node{:value 10,\n :left #example.bst.Node{:value 5, :left nil, :right nil},\n :right #example.bst.Node{:value 20, :left nil, :right nil},\n :count 3}\n", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/1972655?v=4", :account-source "github", :login "jennydickinson"} {:login "mjul", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/142868?v=4"}], :_id "5b18869de4b00ac801ed9e0f"} {:updated-at 1658250170033, :created-at 1658250170033, :author {:login "quoll", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/358875?v=4"}, :body "(defrecord Person [first-name last-name age]\n ;; Provide a default string representation\n Object\n (toString [_] (format \"%s, %s (%d)\" last-name first-name age)))\n\n;; Construct a person with the auto-generated construction function\n(def p (->Person \"Alice\" \"Smith\" 22))\n\n;; use this object in a string\n(str \"The person is: \" p)\n\n;; output:\n;; \"The person is: Smith, Alice (22)\"", :_id "62d6e3bae4b0b1e3652d7628"}], :macro true, :notes [{:updated-at 1302904571000, :body "http://tech.puredanger.com/2010/11/23/implementing-java-interfaces-with-clojure-records/", :created-at 1302904571000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fb9"}], :arglists ["name [& fields] & opts+specs"], :doc "(defrecord name [fields*] options* specs*)\n\n Options are expressed as sequential keywords and arguments (in any order).\n\n Supported options:\n :load-ns - if true, importing the record class will cause the\n namespace in which the record was defined to be loaded.\n Defaults to false.\n\n Each spec consists of a protocol or interface name followed by zero\n or more method bodies:\n\n protocol-or-interface-or-Object\n (methodName [args*] body)*\n\n Dynamically generates compiled bytecode for class with the given\n name, in a package with the same name as the current namespace, the\n given fields, and, optionally, methods for protocols and/or\n interfaces.\n\n The class will have the (immutable) fields named by\n fields, which can have type hints. Protocols/interfaces and methods\n are optional. The only methods that can be supplied are those\n declared in the protocols/interfaces. Note that method bodies are\n not closures, the local environment includes only the named fields,\n and those fields can be accessed directly.\n\n Method definitions take the form:\n\n (methodname [args*] body)\n\n The argument and return types can be hinted on the arg and\n methodname symbols. If not supplied, they will be inferred, so type\n hints should be reserved for disambiguation.\n\n Methods should be supplied for all methods of the desired\n protocol(s) and interface(s). You can also define overrides for\n methods of Object. Note that a parameter must be supplied to\n correspond to the target object ('this' in Java parlance). Thus\n methods for interfaces will take one more argument than do the\n interface declarations. Note also that recur calls to the method\n head should *not* pass the target object, it will be supplied\n automatically and can not be substituted.\n\n In the method bodies, the (unqualified) name can be used to name the\n class (for calls to new, instance? etc).\n\n The class will have implementations of several (clojure.lang)\n interfaces generated automatically: IObj (metadata support) and\n IPersistentMap, and all of their superinterfaces.\n\n In addition, defrecord will define type-and-value-based =,\n and will defined Java .hashCode and .equals consistent with the\n contract for java.util.Map.\n\n When AOT compiling, generates compiled bytecode for a class with the\n given name (a symbol), prepends the current ns as the package, and\n writes the .class file to the *compile-path* directory.\n\n Two constructors will be defined, one taking the designated fields\n followed by a metadata map (nil for none) and an extension field\n map (nil for none), and one taking only the fields (using nil for\n meta and extension fields). Note that the field names __meta,\n __extmap, __hash and __hasheq are currently reserved and should not\n be used when defining your own records.\n\n Given (defrecord TypeName ...), two factory functions will be\n defined: ->TypeName, taking positional parameters for the fields,\n and map->TypeName, taking a map of keywords to field values.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/defrecord"} {:added "1.3", :ns "clojure.core", :name "with-redefs-fn", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1322088065000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-redefs", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d81"}], :line 7498, :examples [{:author {:login "johnnyluu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ba99f2dc1064733c7badbb16db9254a?r=PG&default=identicon"}, :editors [{:login "johnnyluu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ba99f2dc1064733c7badbb16db9254a?r=PG&default=identicon"} {:login "avasenin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/154699?v=3"}], :body "(ns http)\n\n(defn post [url]\n {:body \"Hello world\"})\n\n(ns app\n (:require [clojure.test :refer [run-tests]]))\n\n(deftest is-a-fn\n (with-redefs-fn {#'http/post (fn [url] {:body \"Hello world again\"})}\n #(is (= {:body \"Hello world again\"} (http/post \"http://service.com/greet\")))))\n\n(run-tests) ;; test is passing", :created-at 1350024230000, :updated-at 1352471467000, :_id "542692d6c026201cdc3270c2"} {:author {:login "tonsky", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4188c62c28a196e3e82363217c56fca5?r=PG&default=identicon"}, :editors [], :body "=> (defn f [] false)\n\n=> (println (f))\n;; false\n\n=> (with-redefs-fn {#'f (fn [] true)} \n #(println (f)))\n;; true", :created-at 1352394593000, :updated-at 1352394593000, :_id "542692d6c026201cdc3270c5"} {:updated-at 1452611657323, :created-at 1452611657323, :author {:login "Sangdol", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/803223?v=3"}, :body "(defn add-5 [n] (+ n 5))\n(with-redefs-fn {#'add-5 (fn [n] (+ n 50))}\n #(is (= 60 (add-5 10))))\n\n;; Cannot redefine the reference in the partial function\n(def partial-add-5 (partial add-5))\n(with-redefs-fn {#'add-5 (fn [n] (+ n 50))}\n #(is (= 15 (partial-add-5 10)))) \n", :_id "56951849e4b051fe5ede7753"}], :notes nil, :arglists ["binding-map func"], :doc "Temporarily redefines Vars during a call to func. Each val of\n binding-map will replace the root value of its key which must be\n a Var. After func is called with no args, the root values of all\n the Vars will be set back to their old values. These temporary\n changes will be visible in all threads. Useful for mocking out\n functions during testing.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/with-redefs-fn"} {:added "1.0", :ns "clojure.core", :name "sequence", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1374149058000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "seq", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a7e"} {:created-at 1520634654207, :author {:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "eduction", :ns "clojure.core"}, :_id "5aa30b1ee4b0316c0f44f91a"}], :line 2647, :examples [{:author {:login "yasuto", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cacfb7ecf08cb6461767e514c93b7bf9?r=PG&default=identicon"}, :editors [{:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}], :body "user> (sequence [1 2 3])\n(1 2 3)\nuser> (class (sequence '(1 2 3)))\nclojure.lang.PersistentList", :created-at 1307740020000, :updated-at 1423275662256, :_id "542692c8c026201cdc326a16"} {:updated-at 1477624741486, :created-at 1477624741486, :author {:login "G1enY0ung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/15034155?v=3"}, :body ";; let us make a transducer\nuser=> (def xf (comp (filter odd?) (take 5)))\n#'user/xf\nuser=> (sequence xf (range 1 10))\n(1 3 5 7 9)", :_id "5812c3a5e4b024b73ca35a1c"} {:updated-at 1519251895765, :created-at 1519251895765, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :body ";; turns a string into a sequence of characters:\n(sequence \"abc\")\n=> (\\a \\b \\c)", :_id "5a8df1b7e4b0316c0f44f8e4"} {:updated-at 1646145858679, :created-at 1519691165450, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body ";; combine a bunch of collections together\n(sequence cat [[1 2 3] [5 6 7] [8 9 0]])\n;=> (1 2 3 5 6 7 8 9 0) \n(sequence cat [ '(1 2 3) '(5 6 7) '(8 9 0) ])\n;=> (1 2 3 5 6 7 8 9 0)", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"} {:login "siddharthjain-in", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6537820?v=4"}], :_id "5a94a59de4b0316c0f44f8fb"} {:updated-at 1585287974225, :created-at 1585287974225, :author {:login "green-coder", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4"}, :body ";; When called with multiples collections.\n\n(sequence (map vector) [1 2 3] [:a :b :c])\n;=> ([1 :a] [2 :b] [3 :c])", :_id "5e7d9326e4b087629b5a18c4"} {:updated-at 1614561640162, :created-at 1614561640162, :author {:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}, :body ";; Comparison to seq\n(def v [1 2 3])\n(def l '(1 2 3))\n(def ss (sorted-set 1 2 3))\n(= (seq [1 2 3]) (sequence [1 2 3])) ;;=> true\n(= (sequence v) (seq v)) ;;=> true\n(= (sequence l) (seq l)) ;;=> true\n(= (sequence ss) (seq ss)) ;;=> true\n\n;; Comparison for non-ordered stuff\n(def m {:a 1 :b 2 :c 3})\n(def s #{1 2 3})\n(sequence m) ;;=> ([:a 1] [:b 2] [:c 3])\n(seq m) ;;=> ([:a 1] [:b 2] [:c 3])\n(sequence s) ;;=> (1 3 2)\n(seq s) ;;=> (1 3 2)", :_id "603c4168e4b0b1e3652d7469"}], :notes [{:author {:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}, :updated-at 1520634679847, :created-at 1520634679847, :body "Interesting background about `sequence` versus `eduction`: https://groups.google.com/d/msg/clojure/9I6MtgOTD0w/NiG5PimBCP8J", :_id "5aa30b37e4b0316c0f44f91b"}], :arglists ["coll" "xform coll" "xform coll & colls"], :doc "Coerces coll to a (possibly empty) sequence, if it is not already\n one. Will not force a lazy seq. (sequence nil) yields (), When a\n transducer is supplied, returns a lazy sequence of applications of\n the transform to the items in coll(s), i.e. to the set of first\n items of each coll, followed by the set of second\n items in each coll, until any one of the colls is exhausted. Any\n remaining items in other colls are ignored. The transform should accept\n number-of-colls arguments", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/sequence"} {:added "1.0", :ns "clojure.core", :name "constantly", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1345605389000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "repeatedly", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aa4"} {:created-at 1544362994989, :author {:login "Ramblurr", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/14830?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "identity", :ns "clojure.core"}, :_id "5c0d1bf2e4b0ca44402ef5ea"}], :line 1445, :examples [{:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (def boring (constantly 10))\n#'user/boring\n\nuser=> (boring 1 2 3)\n10\n\nuser=> (boring)\n10\n\nuser=> (boring \"Is anybody home?\")\n10\n", :created-at 1282320404000, :updated-at 1413580544498, :_id "542692cbc026201cdc326c18"} {:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/598193?v=4", :account-source "github", :login "green-coder"}], :body ";; A really goofy way to find the size of a collection\nuser=> (reduce + (map (constantly 1) [:a :b :c]))\n3", :created-at 1310850642000, :updated-at 1554005351294, :_id "542692cbc026201cdc326c1a"} {:author {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}, :editors [{:login "donkey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b1c297c3ac97ef732eb689213c3337b9?r=PG&default=identicon"} {:login "donkey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b1c297c3ac97ef732eb689213c3337b9?r=PG&default=identicon"}], :body ";; constantly returns a function which always returns the same value\n(map (constantly 9) [1 2 3])\nuser=> (9 9 9)\n\n(map (constantly (rand-int 100)) [:a :b :c])\nuser=> (43 43 43)", :created-at 1342722368000, :updated-at 1345367153000, :_id "542692d2c026201cdc326f72"} {:editors [{:avatar-url "https://avatars.githubusercontent.com/u/9038715?v=2", :account-source "github", :login "icemaze"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:login "Jjunior130", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7597818?v=3"}], :updated-at 1483822847346, :created-at 1412612363149, :author {:avatar-url "https://avatars.githubusercontent.com/u/9038715?v=2", :account-source "github", :login "icemaze"}, :body ";; 'Removed' example that was more about transducers than `constantly`.\n\n:O", :_id "5432c10be4b0069c44347255"}], :notes [{:updated-at 1291196938000, :body "any examples of when this would be useful? I think it is weird to want a function that always returns \"x\" regardless of the number of arguments passed to it - however since this exists in core I'm sure it is sensible, more a case of I've not enough experience to appreciate its value.", :created-at 1291196938000, :author {:login "ossareh", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9d0f447aca573ecf21a45c9272211140?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fa7"} {:updated-at 1292309493000, :body "I asked about use cases for this function in #clojure and got a good response from amalloy:\r\n\r\nSay you want to call a library function that asks you to pass it a function; it's going to call that function ten times with different arguments to decide how to populate a list it gives you. But your program is really simple and you want the list to just be full of zeroes. So you call:\r\n\r\n (libfn (constantly 0))\r\n\r\nHope that's useful!", :created-at 1292309381000, :author {:login "clizzin", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/555813697e5dc358bb27d5efd3ffa23?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fae"} {:author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :created-at 1306502622000, :body "(constantly 1) is often useful when it comes to testing. You can think of it like you would a \"stub\".", :updated-at 1306502622000, :_id "542692ecf6e94c6970521fbe"} {:updated-at 1403826661000, :body "constantly is typically used as an argument to a higher order function when a constant value is needed. ", :created-at 1403826661000, :author {:login "phreed", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a0c739cf289be18be932dc3022e6fd3?r=PG&default=identicon"}, :_id "542692edf6e94c697052202b"} {:body "It is also quite useful in unit tests:\n\n
    \n(deftest foo\n  (testing \"Clojure tweets only\"\n    (with-redefs [twitter/get-tweets\n                  (constantly [\"#clojure is awesome!\" \"Yay! #winning\"])]\n      (is (= [\"#clojure is awesome!\"]\n             (only-clojure \"@happyguy\"))))))\n
    \n", :created-at 1413545107841, :updated-at 1413545107841, :author {:login "jmglov", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/224070?v=2"}, :_id "5440fc93e4b049fc676849cc"} {:body "Basically, when you already know the result of a function that you would need\nto pass to a higher order function, you can simply wrap it in a constantly to\navoid creating a variadic anonymous function.\n\n (defn hof [f]\n (do-something-with (f ...))\n\n (def x \"result\")\n\n (hof (constantly x)) ", :created-at 1428223494135, :updated-at 1428223494135, :author {:login "dexterous", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94739?v=3"}, :_id "5520f606e4b0b96203a0d59c"} {:author {:login "bradleesand", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/810411?v=3"}, :updated-at 1484963377505, :created-at 1484963377505, :body "I've used this to create a `no-op` function.\n\n```clojure\n(let [handler (if (some? value)\n #(do-something-with value)\n ; else no-op\n (constantly nil))]\n ; call handler\n (handler \"foo\" \"bar\"))\n```", :_id "5882be31e4b01f4add58fe2c"} {:author {:login "defHLT", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1539296?v=4"}, :updated-at 1517096514668, :created-at 1517096514668, :body "Just a shortcut to
    (fn [& args] x)
    \n", :_id "5a6d0e42e4b0c974fee49d0f"}], :arglists ["x"], :doc "Returns a function that takes any number of arguments and returns x.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/constantly"} {:added "1.0", :ns "clojure.core", :name "get-proxy-class", :file "clojure/core_proxy.clj", :type "function", :column 1, :see-alsos [{:created-at 1539820739801, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "construct-proxy", :ns "clojure.core"}, :_id "5bc7ccc3e4b00ac801ed9edd"}], :line 276, :examples [{:updated-at 1539820731584, :created-at 1539820731584, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; generates a new Java class extending/implementing the given classes/interfaces:\n;; See \"construct-proxy\" on how to get an instance.\n\n(import '[clojure.lang IDeref IObj])\n(def DocumentException (get-proxy-class Exception IDeref))\n\n(type DocumentException)\n;; java.lang.Class\n\n(ancestors DocumentException)\n;; #{java.io.Serializable \n;; clojure.lang.IProxy \n;; java.lang.Exception \n;; clojure.lang.IDeref \n;; java.lang.Object \n;; java.lang.Throwable}\n", :_id "5bc7ccbbe4b00ac801ed9edc"}], :notes nil, :arglists ["& bases"], :doc "Takes an optional single class followed by zero or more\n interfaces. If not supplied class defaults to Object. Creates an\n returns an instance of a proxy class derived from the supplied\n classes. The resulting value is cached and used for any subsequent\n requests for the same class set. Returns a Class object.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/get-proxy-class"} {:added "1.0", :ns "clojure.core", :name "make-array", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1299713235000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "int-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f6c"} {:created-at 1299713241000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "double-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f6d"} {:created-at 1299713244000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "float-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f6e"} {:created-at 1299713281000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "short-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f6f"} {:created-at 1299713289000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "long-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f70"} {:created-at 1299713301000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "char-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f71"} {:created-at 1299713305000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "byte-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f72"} {:created-at 1299713311000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "boolean-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f73"} {:created-at 1299713319000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "object-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f74"} {:created-at 1299713350000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "to-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f75"} {:created-at 1299713355000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "to-array-2d", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f76"} {:created-at 1299713359000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "into-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f77"} {:created-at 1299713411000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "aget", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f78"} {:created-at 1299713415000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "aset", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f79"} {:created-at 1299713422000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "alength", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f7a"} {:created-at 1299713425000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "amap", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f7b"} {:created-at 1299713428000, :author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "areduce", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f7c"}], :line 3986, :examples [{:author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :editors [{:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}], :body "(make-array Integer/TYPE 3)\n\n; Types are defined in clojure/genclass.clj:\n; Boolean/TYPE\n; Character/TYPE\n; Byte/TYPE\n; Short/TYPE\n; Integer/TYPE\n; Long/TYPE\n; Float/TYPE\n; Double/TYPE\n; Void/TYPE", :created-at 1299713202000, :updated-at 1423783350038, :_id "542692cec026201cdc326dfb"} {:author {:login "sergey", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbf950615302e00a14bceec914af32ca?r=PG&default=identicon"}, :editors [{:login "kawas44", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fbe17f4245ddacea6f46aaff3b051429?r=PG&default=identicon"}], :body "user=> (pprint (make-array Double/TYPE 3))\n[0.0, 0.0, 0.0]\n\nuser=> (pprint (make-array Integer/TYPE 2 3))\n[[0, 0, 0], [0, 0, 0]]\n\n\n;; Create an array of Threads, then show content and type\nuser=> (def ar (make-array Thread 3))\n#'user/ar\n\nuser=> (pprint ar)\n[nil, nil, nil]\n\nuser=> (type ar)\n[Ljava.lang.Thread;\n", :created-at 1299713210000, :updated-at 1331510349000, :_id "542692cec026201cdc326dfc"}], :notes nil, :arglists ["type len" "type dim & more-dims"], :doc "Creates and returns an array of instances of the specified class of\n the specified dimension(s). Note that a class object is required.\n Class objects can be obtained by using their imported or\n fully-qualified name. Class objects for the primitive types can be\n obtained using, e.g., Integer/TYPE.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/make-array"} {:added "1.1", :ns "clojure.core", :name "shorts", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "short-array", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917710000, :_id "542692ebf6e94c6970521f31"}], :line 5363, :examples [{:updated-at 1656674521947, :created-at 1656674521947, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; short-array will convert where possible\n(short-array [32767 32768 32769]);; => [32767, -32768, -32767]\n\n;; shorts will not\n(try (shorts [32767 32768 32769])\n (catch ClassCastException e (ex-message e)))\n;; => \"clojure.lang.PersistentVector cannot be cast to [S\"\n", :_id "62bed8d9e4b0b1e3652d7619"} {:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; Casting avoids expensive reflection, so to see the benefit, enable warning:\n(set! *warn-on-reflection* true)\n\n;; We'll def a short-array but won't type-hint the var:\n(def my-array (short-array [10 20 30 40 50 60]))\n\n;; and try to amap over it without using `shorts` or type hinting:\n(amap my-array i _ (unchecked-short (unchecked-inc (aget my-array i))))\n;; Reflection warning… call to static method alength on clojure.lang.RT can't be resolved (argument types: unknown).\n;; Reflection warning… call to static method aclone on clojure.lang.RT can't be resolved (argument types: unknown).\n;; Reflection warning… call to static method aget on clojure.lang.RT can't be resolved (argument types: unknown, int).\n;; Reflection warning… call to static method aset on clojure.lang.RT can't be resolved (argument types: unknown, int, short).\n;; => [11, 21, 31, 41, 51, 61]\n\n;; We can use `shorts` to avoid reflection:\n(amap (shorts my-array) i _ (unchecked-short (unchecked-inc (aget (shorts my-array) i))))\n;; => [11, 21, 31, 41, 51, 61]\n\n;; Just as we can type hint in place:\n(amap ^shorts my-array i _ (unchecked-short (unchecked-inc (aget ^shorts my-array i))))\n;; => [11, 21, 31, 41, 51, 61]\n\n;; Or type hint the var:\n(def ^\"[S\" my-array (short-array [10 20 30 40 50 60]))\n(amap my-array i _ (unchecked-short (unchecked-inc (aget my-array i))))\n;; => [11, 21, 31, 41, 51, 61]\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4", :account-source "github", :login "tomdl89"}, :created-at 1682270458965, :updated-at 1682271131562, :_id "644568fae4b08cf8563f4b8f"}], :notes nil, :arglists ["xs"], :doc "Casts to shorts[]", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/shorts"} {:added "1.7", :ns "clojure.core", :name "completing", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1510099302386, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "transduce", :ns "clojure.core"}, :_id "5a024966e4b0a08026c48c9c"}], :line 6858, :examples [{:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}], :body ";; Fix apparently inconsistent behaviour of \"-\" (minus) with transduce:\n(transduce (map inc) - 0 (range 10))\n;; 55\n(transduce (map inc) (completing -) 0 (range 10))\n;; -55", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1509576734100, :updated-at 1620508070476, :_id "59fa501ee4b0a08026c48c8d"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; the reducing fn arity-1 executes the last transformation in transduce.\n;; completing defaults to \"identity\" but you can change it.\n;; Use this fact for example with transients and go back to persistent once done.\n(require '[clojure.string :refer [lower-case]])\n(transduce\n (comp\n (remove nil?)\n (map lower-case))\n (completing #(assoc! %1 %2 (inc (get %1 %2 0))) persistent!)\n (transient {})\n [\"hi\" \"ho\" \"Hello\" \"hoi\" \"Hi\" \"Ha\" \"ha\" \"hello\"])\n;; {\"hi\" 2, \"ho\" 1, \"hello\" 2, \"hoi\" 1, \"ha\" 2}", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1510933087748, :updated-at 1510936504930, :_id "5a0f025fe4b0a08026c48cbe"} {:updated-at 1670417339254, :created-at 1670417339254, :author {:login "naxels", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3195443?v=4"}, :body ";; Example calculating the average from \n;; https://aphyr.com/posts/360-loopr-a-loop-reduction-macro-for-clojure#comment-3800\n\n(transduce (map inc)\n (completing (fn [[sum cnt] x] [(+ sum x) (inc cnt)])\n (fn [[sum cnt]] (/ sum cnt)))\n [0 0]\n (range 7))\n\n;; 4", :_id "63908bbbe4b0b1e3652d7696"}], :notes nil, :arglists ["f" "f cf"], :doc "Takes a reducing function f of 2 args and returns a fn suitable for\n transduce by adding an arity-1 signature that calls cf (default -\n identity) on the result argument.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/completing"} {:added "1.0", :ns "clojure.core", :name "update-proxy", :file "clojure/core_proxy.clj", :type "function", :column 1, :see-alsos [{:created-at 1539943028356, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "init-proxy", :ns "clojure.core"}, :_id "5bc9aa74e4b00ac801ed9ee8"}], :line 308, :examples [{:author {:login "jneira", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2c8ecc24181d171df85a26458b9cd5f?r=PG&default=identicon"}, :editors [], :body ";; from http://groups.google.com/group/clojure/msg/71702435ccd1d189\nuser> (import java.util.Date)\njava.util.Date\n\nuser> (def d (proxy [Date] [] (toString [] \"hello\")))\n#'user/d\n\nuser> d\n#\n\nuser> (.toString d)\n\"hello\"\n\nuser> (.toGMTString d)\n\"17 Nov 2010 12:57:28 GMT\"\n\nuser> (update-proxy d {\"toGMTString\" (fn [this] \"goodbye\")})\nnil\n\nuser> (.toGMTString d)\n\"goodbye\" ", :created-at 1290029291000, :updated-at 1290029291000, :_id "542692cdc026201cdc326d30"}], :notes nil, :arglists ["proxy mappings"], :doc "Takes a proxy instance and a map of strings (which must\n correspond to methods of the proxy superclass/superinterfaces) to\n fns (which must take arguments matching the corresponding method,\n plus an additional (explicit) first arg corresponding to this, and\n updates (via assoc) the proxy's fn map. nil can be passed instead of\n a fn, in which case the corresponding method will revert to the\n default behavior. Note that this function can be used to update the\n behavior of an existing instance without changing its identity.\n Returns the proxy.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/update-proxy"} {:added "1.0", :ns "clojure.core", :name "unchecked-negate-int", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 1177, :examples [{:author {:login "Jens", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7f9a46b88f30d9461fea5670fd185f65?r=PG&default=identicon"}, :editors [], :body "user=> (unchecked-negate-int 4)\n-4\nuser=> (unchecked-negate-int 0)\n0\nuser=> (unchecked-negate-int -7)\n7\nuser=> (unchecked-negate-int Integer/MAX_VALUE)\n-2147483647\nuser=> (unchecked-negate-int Integer/MIN_VALUE) ;overflow\n-2147483648", :created-at 1331729438000, :updated-at 1331729438000, :_id "542692d5c026201cdc3270ae"}], :notes nil, :arglists ["x"], :doc "Returns the negation of x, an int.\n Note - uses a primitive operator subject to overflow.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-negate-int"} {:added "1.6", :ns "clojure.core", :name "hash-unordered-coll", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1495647921750, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "hash", :ns "clojure.core"}, :_id "5925c6b1e4b093ada4d4d735"} {:created-at 1495647929367, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "hash-ordered-coll", :ns "clojure.core"}, :_id "5925c6b9e4b093ada4d4d736"}], :line 5195, :examples [{:editors [{:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}], :body ";;;; Clojure's (hash-unordered-coll) ALWAYS produces the same hash code EVEN:\n;;;; (1) for different collection types\n;;;; (2) for differently ordered collections of the same type\n;;;; AS LONG AS the collections contain the same elements \n\n(hash-unordered-coll #{1 2})\n;;=> 460223544\n(hash-unordered-coll (sorted-set 1 2))\n;;=> 460223544\n(hash-unordered-coll (doto (new java.util.HashSet) (.add 1) (.add 2)))\n;;=> 460223544\n(hash-unordered-coll (doto (new java.util.TreeSet) (.add 1) (.add 2)))\n;;=> 460223544\n(hash-unordered-coll [1 2])\n;;=> 460223544\n(hash-unordered-coll [2 1])\n;;=> 460223544\n(hash-unordered-coll (doto (new java.util.ArrayList) (.add 1) (.add 2)))\n;;=> 460223544\n(hash-unordered-coll (doto (new java.util.ArrayList) (.add 2) (.add 1)))\n;;=> 460223544\n\n;;;; On the other hand: both Clojure's (hash) and Java's .hashCode()\n;;;; CAN (and often WILL) produce different hash codes:\n;;;; (1) for different collection types\n;;;; (2) for differently ordered collections of the same type\n;;;; EVEN if the collections contain the same elements\n\n(hash #{1 2})\n;;=> 460223544\n(hash (sorted-set 1 2))\n;;=> 460223544\n(hash (doto (new java.util.HashSet) (.add 1) (.add 2)))\n;;=> 3\n(hash (doto (new java.util.TreeSet) (.add 1) (.add 2)))\n;;=> 3\n(hash [1 2])\n;;=> 156247261\n(hash [2 1])\n;;=> -1994590503\n(hash (doto (new java.util.ArrayList) (.add 1) (.add 2)))\n;;=> 994\n(hash (doto (new java.util.ArrayList) (.add 2) (.add 1)))\n;;=> 1024\n\n(.hashCode #{1 2})\n;;=> 3\n(.hashCode (sorted-set 1 2))\n;;=> 3\n(.hashCode (doto (new java.util.HashSet) (.add 1) (.add 2)))\n;;=> 3\n(.hashCode (doto (new java.util.TreeSet) (.add 1) (.add 2)))\n;;=> 3\n(.hashCode [1 2])\n;;=> 994\n(.hashCode [2 1])\n;;=> 1024\n(.hashCode (doto (new java.util.ArrayList) (.add 1) (.add 2)))\n;;=> 994\n(.hashCode (doto (new java.util.ArrayList) (.add 2) (.add 1)))\n;;=> 1024\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3", :account-source "github", :login "svenschoenung"}, :created-at 1495647903722, :updated-at 1495649000733, :_id "5925c69fe4b093ada4d4d734"} {:updated-at 1495657051233, :created-at 1495657051233, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body ";;;;\n;;;; Only accepts implementations of java.lang.Iterable\n;;;;\n\n(hash-unordered-coll true)\n;;=> ClassCastException java.lang.Boolean cannot be cast to java.lang.Iterable\n(hash-unordered-coll 1)\n;;=> ClassCastException java.lang.Long cannot be cast to java.lang.Iterable\n(hash-unordered-coll \\c)\n;;=> ClassCastException java.lang.Character cannot be cast to java.lang.Iterable\n\n;;;;\n;;;; Being seqable is not sufficient!\n;;;;\n\n(hash-unordered-coll \"12\")\n;;=> ClassCastException java.lang.String cannot be cast to java.lang.Iterable\n(hash-unordered-coll (int-array [1 2]))\n;;=> ClassCastException [I cannot be cast to java.lang.Iterable\n(hash-unordered-coll nil)\n;;=> NullPointerException", :_id "5925ea5be4b093ada4d4d746"}], :notes nil, :arglists ["coll"], :doc "Returns the hash code, consistent with =, for an external unordered\n collection implementing Iterable. For maps, the iterator should\n return map entries whose hash is computed as\n (hash-ordered-coll [k v]).\n See http://clojure.org/data_structures#hash for full algorithms.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/hash-unordered-coll"} {:added "1.0", :ns "clojure.core", :name "repeat", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1286195040000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "repeatedly", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dae"} {:created-at 1291970208000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "cycle", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521daf"} {:created-at 1302045956000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "constantly", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521db0"} {:created-at 1327501829000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "dotimes", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521db1"}], :line 2999, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "john.r.woodward", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/22b6fbc4a386291e45b1cb4449377086?r=PG&default=identicon"}], :body "user=> (take 5 (repeat \"x\"))\n(\"x\" \"x\" \"x\" \"x\" \"x\")\n\n;; which is the same as:\nuser=> (repeat 5 \"x\")\n(\"x\" \"x\" \"x\" \"x\" \"x\")\n\n;; It should be noted that repeat simply repeats the value n number of times.\n;; If you wish to execute a function to calculate the value each time you \n;; probably want the repeatedly function.\n\n", :created-at 1279092799000, :updated-at 1343165038000, :_id "542692c7c026201cdc3269a5"} {:updated-at 1520873825360, :created-at 1520873825360, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body "(defn tally [n]\n (apply str\n (concat\n (repeat (quot n 5) \"卌\")\n (repeat (mod n 5) \"|\"))))\n\n(map tally (range 1 11))\n;; (\"|\" \"||\" \"|||\" \"||||\" \"卌\" \"卌|\" \"卌||\" \"卌|||\" \"卌||||\" \"卌卌\")", :_id "5aa6b161e4b0316c0f44f922"}], :notes nil, :arglists ["x" "n x"], :doc "Returns a lazy (infinite!, or length n if supplied) sequence of xs.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/repeat"} {:added "1.0", :ns "clojure.core", :name "unchecked-inc", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1289217232000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-add", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ba9"} {:created-at 1289217236000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-dec", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521baa"} {:created-at 1289217238000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-inc", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bab"} {:created-at 1289217241000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-negate", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bac"} {:created-at 1289217244000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-divide", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bad"} {:created-at 1289217247000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-subtract", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bae"} {:created-at 1289217251000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-multiply", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521baf"} {:created-at 1289217253000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "unchecked-remainder", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bb0"} {:created-at 1488018916400, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "inc", :ns "clojure.core"}, :_id "58b15de4e4b01f4add58fe60"} {:created-at 1488018923070, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "inc'", :ns "clojure.core"}, :_id "58b15debe4b01f4add58fe61"}], :line 1156, :examples [{:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [], :body "users=> (unchecked-inc Integer/MAX_VALUE)\n-2147483648\n\nusers=> (unchecked-inc 0)\n1", :created-at 1289217223000, :updated-at 1289217223000, :_id "542692c8c026201cdc326a14"} {:updated-at 1488018795920, :created-at 1488018795920, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :body ";; Illustrates the difference between (inc), (inc') and (unchecked-inc)\n\n;; The \"N\" suffix denotes a BigInt instance\n;; https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/BigInt.java\n\nLong/MAX_VALUE\n;;=> 9223372036854775807\n\n(inc Long/MAX_VALUE)\n;;=> ArithmeticException integer overflow clojure.lang.Numbers.throwIntOverflow (Numbers.java:1501)\n\n(inc' Long/MAX_VALUE)\n;;=> 9223372036854775808N\n\n;; Notice how the resulting number becomes NEGATIVE:\n(unchecked-inc Long/MAX_VALUE)\n;;=> -9223372036854775808", :_id "58b15d6be4b01f4add58fe5f"}], :notes nil, :arglists ["x"], :doc "Returns a number one greater than x, a long.\n Note - uses a primitive operator subject to overflow.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-inc"} {:ns "clojure.core", :name "*reader-resolver*", :type "var", :see-alsos nil, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/*reader-resolver*"} {:added "1.0", :ns "clojure.core", :name "nthnext", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1303125684000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "nth", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ca9"} {:created-at 1303125696000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "drop", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521caa"} {:created-at 1356088874000, :author {:login "TimMc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5d532e51427ef2f4ded31aaca16c8baf?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "nthrest", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cab"}], :line 3164, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body "(nthnext (range 10) 3)\n;;=> (3 4 5 6 7 8 9)\n\n(nthnext [] 3)\n;;=> nil\n\n(nthnext [1 2 3 4 5 6 7] 4)\n;;=> (5 6 7)\n\n", :created-at 1281033770000, :updated-at 1420736472299, :_id "542692cec026201cdc326d86"} {:body ";; drop is also similar, but different \n(nthnext (range 10) 5) ;;=> (5 6 7 8 9)\n(drop 5 (range 10)) ;;=> (5 6 7 8 9)\n\n;; here is a case where the results differ\n(nthnext [] 3) ;;=> nil\n(drop 3 []) ;;=> () ; a lazy sequence", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1420737401357, :updated-at 1420737401357, :_id "54aebb79e4b0e2ac61831c97"}], :notes [{:updated-at 1306331938000, :body "`nthnext` is similar to `drop`.\r\nBut `nthnext` is eager, while `drop` is lazy.

    \r\nAlso parameters are in opposite order.", :created-at 1306324912000, :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :_id "542692ecf6e94c6970521fbd"}], :arglists ["coll n"], :doc "Returns the nth next of coll, (seq coll) when n is 0.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/nthnext"} {:added "1.0", :ns "clojure.core", :name "and", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1286508452000, :author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "or", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eb2"} {:created-at 1334293964000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "if", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eb3"} {:created-at 1592404851986, :author {:login "lunik1", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/13547699?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "every-pred", :ns "clojure.core"}, :_id "5eea2b73e4b0b1e3652d7305"}], :line 842, :examples [{:updated-at 1479826446023, :created-at 1286508448000, :body "user=> (and true true)\ntrue\n\nuser=> (and true false)\nfalse\n\nuser=> (and false false)\nfalse\n\nuser=> (and '() '())\n()\n\nuser=> (and '[] '[])\n[]\n\nuser=> (and 0 1) ; Note that this is *not* bitwise 'and'\n1\n\nuser=> (and 1 0)\n0\n", :editors [{:login "mlanza", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/39192?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon", :account-source "clojuredocs", :login "dakrone"}, :_id "542692cdc026201cdc326d0a"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; See examples for \"if\" explaining Clojure's idea of logical true\n;; and logical false.", :created-at 1334293968000, :updated-at 1334293968000, :_id "542692d2c026201cdc326f49"} {:updated-at 1569963753241, :created-at 1472792960038, :author {:login "Lacty", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7412474?v=3"}, :body "; Note that, and does not evaluate if the first value is false\nuser=> (and false nil)\nfalse\n\nuser=> (and nil false)\nnil\n\nuser=> (and false (println \"foo\"))\nfalse\n\nuser=> (and (println \"foo\") false)\nfoo\nnil\n\nuser=> (and nil nil)\nnil", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/5894926?v=3", :account-source "github", :login "slipset"} {:login "allmonty", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/4502764?v=4"}], :_id "57c90980e4b0709b524f04e0"} {:updated-at 1490369604947, :created-at 1490369604947, :author {:login "Rovanion", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/632775?v=3"}, :body "; From the Clojure 1.9 source code.\n(defn qualified-keyword?\n \"Return true if x is a keyword with a namespace\"\n [x] (and (keyword? x) (namespace x) true))\n\n; Note how the return value of and is value of the last expression.\nuser=> (qualified-keyword? :hi/there)\ntrue\n\n; If we instead define the function as:\n(defn qualified-keyword?\n [x] (and (keyword? x) (namespace x)))\n; we get the namespace as return value:\nuser=> (qualified-keyword? :hi/there)\n\"hi\"", :_id "58d53c44e4b01f4add58fe78"}], :macro true, :notes [{:updated-at 1305106125000, :body "Note add is a macro, so you cannot apply it. For example, there is a vector of some Boolean values [true true false true], which you want to test to see if they are all true. The code below will not work:

    (apply add [true true false true]) ;won't work
    \r\nInstead, use this:
    (every? identity [true  true false true])
    More discussion can be found at http://osdir.com/ml/clojure/2010-01/msg01242.html", :created-at 1305106125000, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=2"}, :_id "542692ecf6e94c6970521fbb"} {:author {:login "dilipd", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/164585?v=4"}, :updated-at 1635725779315, :created-at 1635725779315, :body "typo: 'and' instead of 'add'?", :_id "617f31d3e4b0b1e3652d7568"}], :arglists ["" "x" "x & next"], :doc "Evaluates exprs one at a time, from left to right. If a form\n returns logical false (nil or false), and returns that value and\n doesn't evaluate any of the other expressions, otherwise it returns\n the value of the last expr. (and) returns true.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/and"} {:added "1.0", :ns "clojure.core", :name "create-struct", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1468878705351, :author {:login "bradcypert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1455979?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "struct", :ns "clojure.core"}, :_id "578d4f71e4b0bafd3e2a04a5"} {:created-at 1468878716309, :author {:login "bradcypert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1455979?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defstruct", :ns "clojure.core"}, :_id "578d4f7ce4b0bafd3e2a04a6"} {:created-at 1468878831043, :author {:login "bradcypert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1455979?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defrecord", :ns "clojure.core"}, :_id "578d4fefe4b0bafd3e2a04a8"}], :line 4038, :examples [{:updated-at 1468878648375, :created-at 1468878648375, :author {:login "bradcypert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1455979?v=3"}, :body ";;Creates a person structure\n(def person (create-struct :name :age))\n\n;;Creates a structure with the given values associated with the structure keys\n(struct person \"Brad Cypert\" 23)\n{:name \"Brad Cypert\", :age 23}", :_id "578d4f38e4b0bafd3e2a04a4"}], :notes [{:author {:login "bradcypert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1455979?v=3"}, :updated-at 1468878818445, :created-at 1468878818445, :body "Structs are becoming obsolete. Use records instead. See defrecord.", :_id "578d4fe2e4b0bafd3e2a04a7"} {:author {:login "metasoarous", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/88556?v=4"}, :updated-at 1605646130347, :created-at 1605646130347, :body "In _general_, records should be preferred over structs. However, structs aren't _entirely_ obsolete.\n\nThey can still be useful when you need/want to create record-like objects dynamically; That is, when you don't know the field names at compile time. A typical example of this might be loading rows from a CSV (as [semantic-csv](https://github.com/metasoarous/semantic-csv) does). The advantage in this case over using regular maps is significantly improved performance creating and using these objects.", :_id "5fb43732e4b0b1e3652d740c"}], :arglists ["& keys"], :doc "Returns a structure basis object.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/create-struct"} {:added "1.0", :ns "clojure.core", :name "get-validator", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1553694544702, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "set-validator!", :ns "clojure.core"}, :_id "5c9b7f50e4b0ca44402ef6e3"}], :line 2400, :examples [{:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body "(require '[clojure.repl :refer [demunge]])\n\n(def a 1)\n\n(get-validator #'a) ; no validator set yet\n;; nil\n\n(set-validator! #'a pos?) ; \"a\" should be positive number\n\n(-> (get-validator #'a) ; get-validator returns the function object\n class ; get the Class instance\n .getSimpleName ; access the inner class name, no package\n demunge ; demunge is the opposite of munge\n symbol) ; back to a symbol\n;; core/pos?\n\n(def a 0) ; this is now unacceptable\n;; IllegalStateException Invalid reference state\n\n(set-validator! #'a nil) ; make it ok again", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1553694538283, :updated-at 1553771408277, :_id "5c9b7f4ae4b0ca44402ef6e2"}], :notes nil, :arglists ["iref"], :doc "Gets the validator-fn for a var/ref/agent/atom.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/get-validator"} {:added "1.0", :ns "clojure.core", :name "number?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "num", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342917515000, :_id "542692eaf6e94c6970521b4d"} {:created-at 1440146030366, :author {:login "muhuk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/40178?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "integer?", :ns "clojure.core"}, :_id "55d6e26ee4b0831e02cddf16"}], :line 3559, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "benjiiiiii", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd1adaf32d9dc6531d6041dbc379efb0?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "xantheon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10231554?v=3"}], :body "user=> (number? 1)\ntrue\nuser=> (number? 1.0)\ntrue\nuser=> (number? :a)\nfalse\nuser=> (number? nil)\nfalse\nuser=> (number? \"23\")\nfalse\n\n", :created-at 1279074614000, :updated-at 1421848806945, :_id "542692c8c026201cdc326a1e"} {:body ";; map number? over the vector\n(map number? [1 0.44 3e6 0xFF])\n;;=> (true true true true)\n\n;; map number? over the vector created by converting a list into a vector \n;; with the function \"into\"\n(map number? (into [] '(1 0.44 3e6 0xFF)))\n;;=> (true true true true)\n\n", :author {:login "xantheon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10231554?v=3"}, :created-at 1421848794036, :updated-at 1421850409437, :editors [{:login "xantheon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10231554?v=3"}], :_id "54bfb0dae4b0e2ac61831cc5"} {:editors [{:login "sixofhearts", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/283702?v=4"}], :body ";; Works for rationals\nuser=> (number? (/ 2 3))\ntrue", :author {:avatar-url "https://avatars.githubusercontent.com/u/283702?v=4", :account-source "github", :login "sixofhearts"}, :created-at 1638921869968, :updated-at 1638921911526, :_id "61aff68de4b0b1e3652d7584"}], :notes nil, :arglists ["x"], :doc "Returns true if x is a Number", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/number_q"} {:added "1.0", :ns "clojure.core", :name "await-for", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1298860372000, :author {:login "ninjudd", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7ced25585a7556e9b9b975c1f9e136e3?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "await", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ced"}], :line 3296, :examples [{:updated-at 1616191765486, :created-at 1616191540527, :author {:login "gs", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/79596?v=4"}, :body ";; construct simple agent\n(def agnt (agent 5))\n\n;; increment agent\n(send agnt inc) \n\n;; system does not wait for the value change\n(println @agnt) \n;; => 5 \n\n;; increment agent\n(send agnt inc)\n\n;; wait for maximum 1000 ms\n(await-for 1000 agnt) \n\n;; print out the value of the agent \n(println @agnt) \n;; => 7", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/79596?v=4", :account-source "github", :login "gs"}], :_id "60552034e4b0b1e3652d74a4"}], :notes nil, :arglists ["timeout-ms & agents"], :doc "Blocks the current thread until all actions dispatched thus\n far (from this thread or agent) to the agents have occurred, or the\n timeout (in milliseconds) has elapsed. Returns logical false if\n returning due to timeout, logical true otherwise.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/await-for"} {:ns "clojure.core", :name "chunk-next", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1443933552687, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-first", :ns "clojure.core"}, :_id "5610ad70e4b0686557fcbd40"} {:created-at 1443933558893, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-rest", :ns "clojure.core"}, :_id "5610ad76e4b08e404b6c1c8e"} {:created-at 1443933581024, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-cons", :ns "clojure.core"}, :_id "5610ad8de4b08e404b6c1c90"} {:created-at 1443933589741, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-buffer", :ns "clojure.core"}, :_id "5610ad95e4b0686557fcbd41"} {:created-at 1443933597715, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk", :ns "clojure.core"}, :_id "5610ad9de4b0686557fcbd42"} {:created-at 1443933620082, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-append", :ns "clojure.core"}, :_id "5610adb4e4b08e404b6c1c91"} {:created-at 1443933691622, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunked-seq?", :ns "clojure.core"}, :_id "5610adfbe4b08e404b6c1c92"}], :line 707, :examples [{:updated-at 1443934272580, :created-at 1443934272580, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :body "(let [chunked-cons (seq (range 1 42))]\n\n (class chunked-cons)\n ;; => clojure.lang.ChunkedCons\n\n ;; Returns the next chunk when there are more than 32 elements\n ;; in the ChunkedCons.\n (chunk-next chunked-cons)\n ;; => (33 34 35 36 37 38 39 40 41)\n\n)", :_id "5610b040e4b0686557fcbd43"}], :notes nil, :tag "clojure.lang.ISeq", :arglists ["s"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/chunk-next"} {:added "1.0", :ns "clojure.core", :name "print-str", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1297554870000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "println-str", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f5d"} {:created-at 1374264258000, :author {:login "lbeschastny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/416170465e4045f810f09a9300dda4dd?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "print", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f5e"}], :line 4754, :examples [{:author {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"}, :editors [{:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"} {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"} {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"} {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Miles", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bbb26d2a5e856c4fba0f72c3f7250f3f?r=PG&default=identicon"} {:login "matthewg", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b29dd31d183124d9e87d8037bb30e326?r=PG&default=identicon"}], :body ";; Create a string from the given items and store it in x.\nuser=> (def x (print-str 1 \"foo\" \\b \\a \\r {:a 2}))\n#'user/x\n\n;; It's a string.\nuser=> (string? x)\ntrue\n\n;; Notice that each item is separated by a space.\nuser=> x\n\"1 foo b a r {:a 2}\"\n\n", :created-at 1284257174000, :updated-at 1323233208000, :_id "542692c9c026201cdc326aea"}], :notes nil, :tag "java.lang.String", :arglists ["& xs"], :doc "print to a string, returning it", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/print-str"} {:added "1.0", :ns "clojure.core", :name "not-any?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1330526858000, :author {:login "kisielk", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/55fd56dfef815d7aa543be09ad3ed3e9?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "some", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d5b"} {:created-at 1369837609000, :author {:login "avasenin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/154699?v=3"}, :to-var {:ns "clojure.core", :name "every?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d5c"}], :line 2703, :examples [{:updated-at 1566222779775, :created-at 1279074514000, :body "user=> (not-any? odd? '(2 4 6))\ntrue\n\nuser=> (not-any? odd? '(1 2 3))\nfalse\n\nuser=> (not-any? nil? [true false false])\ntrue\n\nuser=> (not-any? nil? [true false nil])\nfalse\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "cromptone", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11131392?v=4"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/147981?v=3", :account-source "github", :login "dpritchett"}, :_id "542692cbc026201cdc326ba8"}], :notes [{:author {:login "bsima", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/200617?v=3"}, :updated-at 1454193022420, :created-at 1454193022420, :body "Why is there a `not-any?` but no `any?`?", :_id "56ad397ee4b0ceed88ce8d1f"} {:author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :updated-at 1454445515187, :created-at 1454445515187, :body "You can use this for any?:\n\n(def any?\n (complement not-any?))", :_id "56b113cbe4b0ceed88ce8d20"} {:author {:login "chendesheng", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2094891?v=3"}, :updated-at 1459589289487, :created-at 1459589289487, :body "You can also use some for any?", :_id "56ff90a9e4b09295d75dbf44"} {:body "`some` is not quite the same as `any?` because the latter returns a Boolean\n\n```\nuser> (def any? (complement not-any?))\n#'user/any?\nuser> (some #{:a} [:a :b :c])\n:a\nuser> (any? #{:a} [:a :b :c])\ntrue\nuser> (some #{:d} [:a :b :c])\nnil\nuser> (any? #{:d} [:a :b :c])\nfalse\n```\n\nI also find `one-of?` handy:\n\n```\n(defn one-of? [x coll]\n (any? #{x} coll))\n```", :created-at 1464895655850, :updated-at 1464895698716, :author {:avatar-url "https://avatars.githubusercontent.com/u/200617?v=3", :account-source "github", :login "bsima"}, :_id "575088a7e4b0bafd3e2a0473"} {:body "
     \n(not-any?   #(= \"query\"  %)   (list \"hola\" \"query\" \"fin\"))   ;false\n(not-any?   #(= \"query\"  %)   (list \"hola\" \"fin\"))           ;true\n(not-any?   #(= \"query\"  %)   (list))                        ;true\n(not-any?   #(= \"query\"  %)   nil)                           ;true\n(not-any?   #(= \"query\"  %)   '())                           ;true\n", :created-at 1505952377693, :updated-at 1505952747406, :author {:avatar-url "https://avatars0.githubusercontent.com/u/31183833?v=4", :account-source "github", :login "abibilonilombardi"}, :_id "59c30279e4b03026fe14ea47"} {:author {:login "naxels", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3195443?v=4"}, :updated-at 1674408880024, :created-at 1674408880024, :body "Here's another version for `any?`\n\n
    (def any? (comp boolean some))
    ", :_id "63cd73b0e4b08cf8563f4b69"}], :tag "java.lang.Boolean", :arglists ["pred coll"], :doc "Returns false if (pred x) is logical true for any x in coll,\n else true.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/not-any_q"} {:added "1.0", :ns "clojure.core", :name "into-array", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1374150173000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "to-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aa7"} {:created-at 1374150354000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "make-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aa8"}], :line 3443, :examples [{:author {:login "ysph", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/eed512f3595f1baa31fd91f3b297ebbf?r=PG&default=identicon"}, :editors [{:login "ysph", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/eed512f3595f1baa31fd91f3b297ebbf?r=PG&default=identicon"} {:login "Ambrose Bonnaire-Sergeant", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f4b6f2ea0cd9cac02ecd8101c482a41f?r=PG&default=identicon"} {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"} {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"} {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"} {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"}], :body ";; Array's component type is set to (class 2), cannot add Strings.\n;; This will result in an IllegalArgumentException\nuser=> (into-array [2 \"4\" \"8\" 5])\n;; Evaluation aborted.\n\n;; However, if the common type is specified, aforementioned values can be put into an array\nuser=> (into-array Object [2 \"4\" \"8\" 5])\n#\n\nuser=> (into-array (range 4))\n#\n\n;; if you assign a type, you still have to coerce values\nuser=> (into-array Byte/TYPE (range 4))\n;; Evaluation aborted.\n\nuser=> (into-array Byte/TYPE (map byte (range 4)))\n#", :created-at 1294395323000, :updated-at 1368810887000, :_id "542692c8c026201cdc326a25"} {:author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :editors [], :body ";; java.nio.file.Paths#get takes (String, String...)\nuser=> (java.nio.file.Paths/get \"/Users\" (into-array [\"username\" \"dev\" \"clojure\"]))\n#", :created-at 1337936915000, :updated-at 1337936915000, :_id "542692d3c026201cdc326fda"} {:author {:login "Phalphalak", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a684c0fd4f27597437de953e92a15d4b?r=PG&default=identicon"}, :editors [], :body ";; Creating an empty array defaults to Object[]\nuser=> (into-array [])\n#\n\n;; However, the type of an empty array can be coerced\nuser=> (into-array String [])\n#\n", :created-at 1368810750000, :updated-at 1368810750000, :_id "542692d3c026201cdc326fdb"}], :notes nil, :arglists ["aseq" "type aseq"], :doc "Returns an array with components set to the values in aseq. The array's\n component type is type if provided, or the type of the first value in\n aseq if present, or Object. All values in aseq must be compatible with\n the component type. Class objects for the primitive types can be obtained\n using, e.g., Integer/TYPE.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/into-array"} {:added "1.9", :ns "clojure.core", :name "qualified-symbol?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495715117333, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "symbol?", :ns "clojure.core"}, :_id "5926cd2de4b093ada4d4d75f"} {:created-at 1495715125414, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "simple-symbol?", :ns "clojure.core"}, :_id "5926cd35e4b093ada4d4d760"} {:created-at 1507247303395, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "namespace", :ns "clojure.core"}, :_id "59d6c4c7e4b03026fe14ea50"}], :line 1632, :examples [{:updated-at 1495723309613, :created-at 1495723309613, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body "(qualified-symbol? 'clojure.core/symbol)\n;;=> true\n\n(qualified-symbol? 'symbol)\n;;=> nil\n\n(qualified-symbol? \"string\")\n;;=> false\n(qualified-symbol? 42)\n;;=> false\n(qualified-symbol? nil)\n;;=> false", :_id "5926ed2de4b093ada4d4d76b"}], :notes nil, :arglists ["x"], :doc "Return true if x is a symbol with a namespace", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/qualified-symbol_q"} {:added "1.0", :ns "clojure.core", :name "init-proxy", :file "clojure/core_proxy.clj", :type "function", :column 1, :see-alsos [{:created-at 1539824483366, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "construct-proxy", :ns "clojure.core"}, :_id "5bc7db63e4b00ac801ed9ee2"} {:created-at 1539824665309, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "update-proxy", :ns "clojure.core"}, :_id "5bc7dc19e4b00ac801ed9ee3"}], :line 297, :examples [{:updated-at 1539824459461, :created-at 1539824459461, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Used as a one-off initialization for the proxy overrides when the\n;; instance was built with \"construct-proxy\".\n\n(import 'clojure.lang.IDeref)\n\n(def MyException (get-proxy-class Exception IDeref))\n\n(defn bail\n ([ex s]\n (-> ex\n (construct-proxy s)\n (init-proxy\n {\"deref\" (fn [this] (str \"Cause: \" s))})))\n ([ex s e]\n (-> ex\n (construct-proxy s e)\n (init-proxy\n {\"deref\" (fn [this] (str \"Root: \" (.getMessage e)))}))))\n\n@(bail MyException \"error\")\n;; \"Cause: error\"\n\n@(bail MyException \"s\" (RuntimeException. \"caused by root\"))\n;; \"Root: caused by root\"", :_id "5bc7db4be4b00ac801ed9ee1"}], :notes nil, :arglists ["proxy mappings"], :doc "Takes a proxy instance and a map of strings (which must\n correspond to methods of the proxy superclass/superinterfaces) to\n fns (which must take arguments matching the corresponding method,\n plus an additional (explicit) first arg corresponding to this, and\n sets the proxy's fn map. Returns the proxy.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/init-proxy"} {:ns "clojure.core", :name "chunk-buffer", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1443936382766, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk-append", :ns "clojure.core"}, :_id "5610b87ee4b08e404b6c1ca1"} {:created-at 1443936387934, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chunk", :ns "clojure.core"}, :_id "5610b883e4b0686557fcbd4f"}], :line 692, :examples [{:updated-at 1443936790331, :created-at 1443936790331, :author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :body "(chunk-buffer 32)\n;; => #\n\n;; Coerce to an ArrayChunk via clojure.core/chunk, cons\n;; a chunked sequence onto it resulting in a\n;; clojure.lang.PersistentVector$ChunkedSeq, grab the first\n;; chunk to get an ArrayChunk, and pull the first element out\n;; using .nth/nth.\n(-> (chunk-buffer 32)\n (chunk)\n (chunk-cons (seq [1 2 3]))\n (chunk-first)\n (.nth 0))\n;; => 1", :_id "5610ba16e4b08e404b6c1ca2"}], :notes nil, :tag "clojure.lang.ChunkBuffer", :arglists ["capacity"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core/chunk-buffer"} {:added "1.9", :ns "clojure.core", :name "seqable?", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1495638669315, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "seq", :ns "clojure.core"}, :_id "5925a28de4b093ada4d4d725"} {:created-at 1495638679916, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "seq?", :ns "clojure.core"}, :_id "5925a297e4b093ada4d4d726"}], :line 6225, :examples [{:editors [{:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}], :body ";;;; nil is seqable\n\n(seqable? nil)\n;;=> true\n\n;;;; Anything that implements CharSequence is seqable\n\n(seqable? \"\")\n;;=> true\n(seqable? (java.lang.StringBuilder.))\n;;=> true\n(seqable? (java.lang.StringBuffer.))\n;;=> true\n\n;;;; Anything that implements Seqable is seqable\n\n(seqable? [])\n;;=> true\n(seqable? {})\n;;=> true\n(seqable? #{})\n;;=> true\n(seqable? '())\n;;=> true\n(seqable? (lazy-seq))\n;;=> true\n\n;;;; Anything that implements Iterable is seqable\n\n(seqable? (java.util.ArrayList.))\n;;=> true\n(seqable? (java.util.HashMap.))\n;;=> true\n(seqable? (java.util.HashSet.))\n;;=> true\n\n;;;; Arrays are seqable\n\n(seqable? (int-array 5 1))\n;;=> true\n(seqable? (double-array 5 1.0))\n;;=> true\n(seqable? (char-array 5 \\c))\n;;=> true\n\n;;;; Some stuff that isn't seqable\n\n(seqable? true)\n;;=> false\n(seqable? \\c)\n;;=> false\n(seqable? 1)\n;;=> false\n(seqable? 1.0)\n;;=> false\n(seqable? (fn f []))\n;;=> false\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3", :account-source "github", :login "svenschoenung"}, :created-at 1495638659807, :updated-at 1495638914391, :_id "5925a283e4b093ada4d4d724"}], :notes nil, :arglists ["x"], :doc "Return true if the seq function is supported for x", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/seqable_q"} {:added "1.0", :ns "clojure.core", :name "symbol?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1495715056369, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "simple-symbol?", :ns "clojure.core"}, :_id "5926ccf0e4b093ada4d4d75b"} {:created-at 1495715063170, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "qualified-symbol?", :ns "clojure.core"}, :_id "5926ccf7e4b093ada4d4d75c"}], :line 562, :examples [{:author {:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"}, :editors [{:login "dpritchett", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/147981?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (symbol? 'a)\ntrue\nuser=> (symbol? 1)\nfalse\nuser=> (symbol? :a)\nfalse", :created-at 1279075212000, :updated-at 1332949799000, :_id "542692c8c026201cdc3269e7"}], :notes nil, :arglists ["x"], :doc "Return true if x is a Symbol", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/symbol_q"} {:added "1.6", :ns "clojure.core", :name "when-some", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1417641526852, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:ns "clojure.core", :name "if-some", :library-url "https://github.com/clojure/clojure"}, :_id "547f7e36e4b0dc573b892fea"} {:created-at 1440455751477, :author {:login "brunchboy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2228869?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "when-let", :ns "clojure.core"}, :_id "55db9c47e4b072d7f27980ee"} {:created-at 1602614544032, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "some", :ns "clojure.core"}, :_id "5f85f510e4b0b1e3652d73e0"} {:created-at 1602614575703, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "let", :ns "clojure.core"}, :_id "5f85f52fe4b0b1e3652d73e1"}], :line 1896, :examples [{:body "user=> (when-some [x 1] [x :ok])\n[1 :ok]\n\nuser=> (when-some [x nil] [x :ok])\nnil", :author {:login "Dimagog", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/138993?v=3"}, :created-at 1423524396612, :updated-at 1423524396612, :_id "54d9422ce4b0e2ac61831d3f"} {:body "user=> (when-some [x \"Hello\"] (println x))\n\"Hello\"\nnil\n\nuser=> (when-some [x nil] (println x))\nnil", :author {:login "viper110110", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1243583?v=3"}, :created-at 1432756309762, :updated-at 1432756318672, :editors [{:login "viper110110", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1243583?v=3"}], :_id "55662055e4b01ad59b65f4db"} {:editors [{:login "brunchboy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2228869?v=3"}], :body ";; In contrast with when-let, when-some evaluates the body for false values:\n(when-some [x false] {:x x}) ; => {:x false}\n\n;; While when-let suppresses evaluation for false values:\n(when-let [x false] {:x x}) ; => nil", :author {:avatar-url "https://avatars.githubusercontent.com/u/2228869?v=3", :account-source "github", :login "brunchboy"}, :created-at 1440455542027, :updated-at 1440455687597, :_id "55db9b76e4b0831e02cddf20"}], :macro true, :notes nil, :arglists ["bindings & body"], :doc "bindings => binding-form test\n\n When test is not nil, evaluates body with binding-form bound to the\n value of test", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/when-some"} {:added "1.3", :ns "clojure.core", :name "unchecked-char", :file "clojure/core.clj", :type "function", :column 1, :see-alsos nil, :line 3528, :examples nil, :notes nil, :arglists ["x"], :doc "Coerce to char. Subject to rounding or truncation.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/unchecked-char"} {:added "1.1", :ns "clojure.core", :name "->>", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1293436689000, :author {:login "0x89", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/56bc4acd59315ed4dc1cb99c3be71102?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "->", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521deb"} {:created-at 1436359153901, :author {:login "jw-00000", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2936?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "some->>", :ns "clojure.core"}, :_id "559d19f1e4b00f9508fd66fe"} {:created-at 1510096703930, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "comp", :ns "clojure.core"}, :_id "5a023f3fe4b0a08026c48c9a"} {:created-at 1526843259499, :author {:login "boxxxie", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/440034?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "cond->>", :ns "clojure.core"}, :_id "5b01c77be4b045c27b7fac71"} {:created-at 1526843274587, :author {:login "boxxxie", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/440034?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "cond->", :ns "clojure.core"}, :_id "5b01c78ae4b045c27b7fac72"} {:created-at 1526843342457, :author {:login "boxxxie", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/440034?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "as->", :ns "clojure.core"}, :_id "5b01c7cee4b045c27b7fac73"}], :line 1693, :examples [{:author {:login "tomoj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/854f0ed52f56be27c9919c2afaa665c2?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "tomoj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/854f0ed52f56be27c9919c2afaa665c2?r=PG&default=identicon"} {:login "tomoj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/854f0ed52f56be27c9919c2afaa665c2?r=PG&default=identicon"} {:login "uvtc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/34f159f89cbd1d9beac0276f5a7af552?r=PG&default=identicon"}], :body ";; An example of using the \"thread-last\" macro to get\n;; the sum of the first 10 even squares.\nuser=> (->> (range)\n (map #(* % %))\n (filter even?)\n (take 10)\n (reduce +))\n1140\n\n;; This expands to:\nuser=> (reduce +\n (take 10\n (filter even?\n (map #(* % %)\n (range)))))\n1140\n", :created-at 1279952064000, :updated-at 1347320971000, :_id "542692c8c026201cdc326a52"} {:author {:login "BertrandDechoux", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/528360?v=3"}, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"} {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"} {:login "zenog", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8528397254e98a159c68bb0ce20eae71?r=PG&default=identicon"}], :body "user=> (def c 5)\nuser=> (->> c (+ 3) (/ 2) (- 1)) \n3/4\n\n;; and if you are curious why\nuser=> (use 'clojure.walk)\nuser=> (macroexpand-all '(->> c (+ 3) (/ 2) (- 1)))\n(- 1 (/ 2 (+ 3 c)))\n\n", :created-at 1339250191000, :updated-at 1343663486000, :_id "542692d1c026201cdc326f40"} {:body ";; let's compare thread first (->) and thread last ( ->> )\nuser=> (macroexpand '(-> 0 (+ 1) (+ 2) (+ 3)))\n(+ (+ (+ 0 1) 2) 3)\nuser=> (macroexpand '(->> 0 (+ 1) (+ 2) (+ 3)))\n(+ 3 (+ 2 (+ 1 0)))", :author {:login "deddu", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3534263?v=3"}, :created-at 1430351285440, :updated-at 1430351388761, :editors [{:login "deddu", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3534263?v=3"}], :_id "55416db5e4b01bb732af0a8c"} {:updated-at 1447795396746, :created-at 1447795396746, :author {:login "rsachdeva", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/232903?v=3"}, :body ";; ->> and -> by simple string concatenation\n\n;; Effectively (str \" jmd\" \"hello\")\nuser=> (->> \"hello\" (str \" jmd\"))\n\" jmdhello\"\n\n;; Effectively (str \"hello\" \" jmd\")\nuser=> (-> \"hello\" (str \" jmd\"))\n=> \"hello jmd\"", :_id "564b9ac4e4b0538444398271"} {:editors [{:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=3"}], :body ";; It is OK to omit the parentheses if a function takes only one argument\n(->> [1 2 [3 4] 5]\n flatten ; no parenthesis\n (map inc))\n=> (2 3 4 5 6)\n ", :author {:avatar-url "https://avatars.githubusercontent.com/u/889685?v=3", :account-source "github", :login "huahaiy"}, :created-at 1464376531961, :updated-at 1464377329122, :_id "57489cd3e4b0bafd3e2a0468"} {:editors [{:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=3"}], :body ";; It's OK to include anonymous function in the thread, but don't forget\n;; to put in an extra pair of parentheses to call the function\n(->> [1 2 3 4 5]\n ((fn [coll] (map inc coll))) ; double parentheses\n (apply +)) \n=> 20\n\n;; the short hand form of the anonymous function works the same\n(->> [1 2 3 4 5]\n (#(map inc %)) ; double parentheses\n (apply +)) ", :author {:avatar-url "https://avatars.githubusercontent.com/u/889685?v=3", :account-source "github", :login "huahaiy"}, :created-at 1464378181434, :updated-at 1465362467394, :_id "5748a345e4b0bafd3e2a046a"} {:editors [{:login "rafmagana", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/92894?v=3"}], :body ";; For large threads you can use commas (interpreted as whitespaces) \n;; to visualize where the items are going to be inserted.\n\n;; Takes the first 5 even numbers\nuser=> (->> (range)\n (filter even?)\n (take 5))\n=> (0 2 4 6 8)\n\n;; with two commas (you can use one if you prefer)\nuser=> (->> (range)\n (filter even? ,,)\n (take 5 ,,))\n=> (0 2 4 6 8)\n\n;; For instance:\n;; (filter even? ,,)\n;; means\n;; (filter even? (range))", :author {:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"}, :created-at 1464761492810, :updated-at 1464761589711, :_id "574e7c94e4b0bafd3e2a046f"} {:editors [{:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}], :body ";;practical example\n\n(def entries [{:month 1 :val 12}\n {:month 2 :val 3}\n {:month 3 :val 32}\n {:month 4 :val 18}\n {:month 5 :val 32}\n {:month 6 :val 62}\n {:month 7 :val 12}\n {:month 8 :val 142}\n {:month 9 :val 52}\n {:month 10 :val 18}\n {:month 11 :val 23}\n {:month 12 :val 56}])\n(defn get-result\n [coll m]\n (->> coll\n (take-while\n #(<= (:month %) m))))\n\n(defn get-total\n [coll m]\n (->>\n (get-result coll m)\n (map #(:val %))\n (reduce +)))\n\n(get-total entries 3)\n", :author {:avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4", :account-source "github", :login "ibercode"}, :created-at 1517039587642, :updated-at 1517039791585, :_id "5a6c2fe3e4b076dac5a728a9"} {:updated-at 1518895069987, :created-at 1518895069987, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body "(defn new-map\n [coll]\n (->>\n coll\n (map\n (fn [[k v]]\n [k (inc v)]))\n (into {})))\n\n(new-map {:a 1 :b 2 :c 3})\n", :_id "5a887fdde4b0316c0f44f8ca"} {:updated-at 1561789924650, :created-at 1561789924650, :author {:login "ningDr", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/38251752?v=4"}, :body "(defn f [front a1 a2 end] (str front \"-\" a1 \"-\" a2 \"-\" end))\n(println (f 1 2 3 4))\n;; => 1-2-3-4\n(println (-> 1 (f 2 3 4)))\n;; => 1-2-3-4\n(println (->> 1 (f 2 3 4)))\n;; => 2-3-4-1", :_id "5d1705e4e4b0ca44402ef77b"} {:updated-at 1630497911164, :created-at 1630497911164, :author {:login "harelix", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2310608?v=4"}, :body "(->> (str \"A\") (str \"B\") (str \"C\"))\n;; => \"CBA\"\n(-> (str \"A\") (str \"B\") (str \"C\"))\n;; => \"ABC\"\n", :_id "612f6c77e4b0b1e3652d7537"}], :macro true, :notes [{:updated-at 1280212250000, :body "I'm getting: `Exception in thread \"main\" java.lang.Exception: Unable to resolve symbol: ->> in this context (11.clj:25)`\r\n\r\nIt's also extremely hard to Google this method. It'd be nice if there was a non-symbol name for this that one could search for.\r\n\r\n**Update**\r\n\r\nThe name of this operator is called a thrush.", :created-at 1280193441000, :author {:login "Jacolyte", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f8b"} {:updated-at 1280208986000, :body "See also -> which is similar but threads the first expr as the second argument of the forms.", :created-at 1280208986000, :author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f8f"} {:updated-at 1280211630000, :body "My error was due to using an old version of Clojure. I was using 1.0.0.", :created-at 1280211630000, :author {:login "Jacolyte", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f90"} {:updated-at 1400187256000, :body "There is something I don't get : in the case \"form\" is a seq, why should we write\r\n... (with-meta `(~(first form) ~@(next form) ~x) (meta form))\r\n\r\nand not \r\n... (with-meta `(~@form ~x) (meta form))\r\n\r\nas items order in \"form\" is not changed ?\r\n\r\n", :created-at 1400187256000, :author {:login "nmichel", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7c68edbc73c1d48f86e5c5f642fff93f?r=PG&default=identicon"}, :_id "542692edf6e94c6970522026"} {:author {:login "nzl-nott", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/458621?v=3"}, :updated-at 1445935991335, :created-at 1445935991335, :body "\"See also -> which is similar but threads the first expr as the second argument of the forms.\"\n\nThis is incorrect, it is not the second ARGUMENT, but the second ITEM.", :_id "562f3b77e4b04b157a6648da"}], :arglists ["x & forms"], :doc "Threads the expr through the forms. Inserts x as the\n last item in the first form, making a list of it if it is not a\n list already. If there are more forms, inserts the first form as the\n last item in second form, etc.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/->>"} {:added "1.1", :ns "clojure.core", :name "future-cancel", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "future", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1339252235000, :_id "542692eaf6e94c6970521afb"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "future?", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1339252240000, :_id "542692eaf6e94c6970521afc"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "future-cancelled?", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1339252246000, :_id "542692eaf6e94c6970521afd"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "future-done?", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1339252256000, :_id "542692eaf6e94c6970521afe"}], :line 7000, :examples [{:updated-at 1339252267000, :created-at 1339252267000, :body "\nuser=> (def f (future (Thread/sleep 5000) (inc 0)))\n#'user/f\n\nuser=> (future-cancel f) \ntrue\n\nuser=> (future-cancelled? f) \ntrue", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :_id "542692d3c026201cdc326fb3"} {:updated-at 1339252313000, :created-at 1339252313000, :body "\nuser=> (def f (future (inc 0)))\n#'user/f\n\nuser=> (future-cancel f) \nfalse\n\nuser=> (future-cancelled? f) \nfalse", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :_id "542692d3c026201cdc326fb4"}], :notes nil, :arglists ["f"], :doc "Cancels the future, if possible.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/future-cancel"} {:added "1.0", :ns "clojure.core", :name "var-get", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1331249138000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "with-local-vars", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521da4"} {:created-at 1461815751940, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "var-set", :ns "clojure.core"}, :_id "572189c7e4b0fc95a97eab5d"} {:created-at 1550004152087, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "var", :ns "clojure.core"}, :_id "5c632fb8e4b0ca44402ef67e"}], :line 4327, :examples [{:editors [{:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}], :updated-at 1550004271931, :created-at 1423523052402, :author {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"}, :body "user=> map\n#\n\nuser=> #'map ;; The reader macro #'x expands to (var x).\n#'clojure.core/map\n\nuser=> (var-get #'map)\n#", :_id "54d93cece4b0e2ac61831d3a"} {:updated-at 1550004358930, :created-at 1550004358930, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :body "user=> ((var-get (var inc)) 1)\n2", :_id "5c633086e4b0ca44402ef680"} {:updated-at 1648664740399, :created-at 1648664740399, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=4"}, :body ";; var-get is the same as @\nuser> (def a-var 1)\n#'user/a-var\nuser> (var-get #'a-var)\n1\nuser> @#'a-var\n1\nuser> (var-get (resolve 'a-var))\n1\nuser> @(resolve 'a-var)\n1", :_id "6244a0a4e4b0b1e3652d75c5"}], :notes nil, :arglists ["x"], :doc "Gets the value in the var object", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/var-get"} {:added "1.0", :ns "clojure.core", :name "commute", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1364879943000, :author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ref", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b4c"} {:created-at 1432239819741, :author {:login "Kejia", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1039073?v=3"}, :to-var {:ns "clojure.core", :name "alter", :library-url "https://github.com/clojure/clojure"}, :_id "555e3ecbe4b03e2132e7d16a"} {:created-at 1432239835490, :author {:login "Kejia", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1039073?v=3"}, :to-var {:ns "clojure.core", :name "dosync", :library-url "https://github.com/clojure/clojure"}, :_id "555e3edbe4b03e2132e7d16b"}], :line 2422, :examples [{:author {:login "leifp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d2f37720f063404ef83b987d2824353d?r=PG&default=identicon"}, :editors [], :body "user=> (def counter (ref 0))\n#'user/counter\n\n;; deciding whether to increment the counter takes the terribly long time\n;; of 100 ms -- it is decided by committee.\nuser=> (defn commute-inc! [counter]\n (dosync (Thread/sleep 100) (commute counter inc)))\n#'user/commute-inc!\nuser=> (defn alter-inc! [counter]\n (dosync (Thread/sleep 100) (alter counter inc)))\n#'user/alter-inc!\n\n;; what if n people try to hit the counter at once?\nuser=> (defn bombard-counter! [n f counter]\n (apply pcalls (repeat n #(f counter))))\n#'user/bombard-counter!\n\n;; first, use alter. Everyone is trying to update the counter, and\n;; stepping on each other's toes, so almost every transaction is getting \n;; retried lots of times:\nuser=> (dosync (ref-set counter 0))\n0\nuser=> (time (doall (bombard-counter! 20 alter-inc! counter)))\n\"Elapsed time: 2007.049224 msecs\"\n(3 1 2 4 7 10 5 8 6 9 13 14 15 12 11 16 17 20 18 19)\n;; note that it took about 2000 ms = (20 workers * 100 ms / update)\n\n;; now, since it doesn't matter what order people update a counter in, we\n;; use commute:\nuser=> (dosync (ref-set counter 0))\n0\nuser=> (time (doall (bombard-counter! 20 commute-inc! counter)))\n\"Elapsed time: 401.748181 msecs\"\n(1 2 3 4 5 9 10 6 7 8 11 15 13 12 14 16 19 17 18 20)\n;; notice that we got actual concurrency this time.", :created-at 1342530933000, :updated-at 1342530933000, :_id "542692d2c026201cdc326f63"} {:editors [{:login "danielgerigk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/9052027?v=3"}], :body "; Note that commute will ALWAYS run the update function TWICE. \n; Example courtesy of \"Clojure for the Brave and True\"\n; https://github.com/flyingmachine/brave-clojure-web\n\n(defn sleep-print-update\n [sleep-time thread-name update-fn]\n (fn [state]\n (Thread/sleep sleep-time)\n (println (str thread-name \": \" state))\n (update-fn state)))\n\n(def counter (ref 0))\n(future (dosync (commute counter (sleep-print-update 100 \"Commute Thread A\" inc))))\n(future (dosync (commute counter (sleep-print-update 150 \"Commute Thread B\" inc))))\n\n; printed output is:\nCommute Thread A: 0 ; (after 100ms)\nCommute Thread B: 0 ; (after 150ms)\nCommute Thread A: 0 ; (after 200ms)\nCommute Thread B: 1 ; (after 300ms)\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3", :account-source "github", :login "cloojure"}, :created-at 1446615365082, :updated-at 1451344876442, :_id "56399945e4b04b157a6648e5"}], :notes [{:updated-at 1295818063000, :body "Note to understand the difference to 'alter':\r\n\r\nCommute should be used when it doesn't matter whether anyone else has changed (altered or commuted) the ref using a successful transaction. This often implies that this ref is not affected by any conditions, i.e. it should be changed the same way no matter what. (thanks to raek for clarifying that for me)", :created-at 1295818063000, :author {:login "dedeibel", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e89e54d864f1e584c5ef4102f98bc83?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fb1"} {:updated-at 1316668674000, :body "In the concurrency video RH explains that commute is useful for actions where the order in which they alter the value doesn't matter, e.g. incrementing a counter.", :created-at 1316668674000, :author {:login "m0wfo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/f4e90ce9fdf9e968587c7f9bec94721e?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fcd"}], :arglists ["ref fun & args"], :doc "Must be called in a transaction. Sets the in-transaction-value of\n ref to:\n\n (apply fun in-transaction-value-of-ref args)\n\n and returns the in-transaction-value of ref.\n\n At the commit point of the transaction, sets the value of ref to be:\n\n (apply fun most-recently-committed-value-of-ref args)\n\n Thus fun should be commutative, or, failing that, you must accept\n last-one-in-wins behavior. commute allows for more concurrency than\n ref-set.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/commute"} {:added "1.0", :ns "clojure.core", :name "coll?", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1357786211000, :author {:login "juan.facorro", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d6f59d93cc17c698f16e550034a2d1ad?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "seq?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f37"} {:created-at 1357786229000, :author {:login "juan.facorro", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d6f59d93cc17c698f16e550034a2d1ad?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "list?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f38"} {:created-at 1357786244000, :author {:login "juan.facorro", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d6f59d93cc17c698f16e550034a2d1ad?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "sequential?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f39"} {:created-at 1414509285263, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "map?", :library-url "https://github.com/clojure/clojure"}, :_id "544fb2e5e4b0dc573b892fae"} {:created-at 1414509297944, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "vector?", :library-url "https://github.com/clojure/clojure"}, :_id "544fb2f1e4b03d20a1024289"} {:created-at 1414509320242, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "set?", :library-url "https://github.com/clojure/clojure"}, :_id "544fb308e4b0dc573b892faf"}], :line 6213, :examples [{:updated-at 1444295715914, :created-at 1280775820000, :body ";; a map is a collection\n(coll? {})\n;;=> true\n\n;; a set is a collection\n(coll? #{})\n;;=> true\n\n;; a vector is a collection\n(coll? [])\n;;=> true\n\n;; a list is a collection \n(coll? '())\n;;=> true\n\n;; a number (long) is not a collection\n(coll? 4)\n;;=> false\n\n;; a string is not a collection\n(coll? \"fred\")\n;;=> false\n\n;; ...but a string sequence is a collection\n(coll? (seq \"fred\"))\n;;=> true\n\n;; a boolean is not a collection\n(coll? true)\n;;=> false\n\n;; nil is not a collection\n(coll? nil)\n;;=> false\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars2.githubusercontent.com/u/22608?v=4", :account-source "github", :login "MrHus"} {:avatar-url "https://avatars.githubusercontent.com/u/138993?v=3", :account-source "github", :login "Dimagog"} {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=2", :account-source "github", :login "phreed"} {:avatar-url "https://avatars.githubusercontent.com/u/40178?v=3", :account-source "github", :login "muhuk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692cfc026201cdc326e40"} {:author {:login "kumarshantanu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/39f90a6c0ffe4995fb9dff4fb6b6bad6?r=PG&default=identicon"}, :editors [], :body "user=> (coll? {:a 10 :b 20}) ; map is a collection of map-entries\ntrue", :created-at 1290278420000, :updated-at 1290278420000, :_id "542692cfc026201cdc326e44"} {:author {:login "gregginca", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bad5f5cb177b0968d4288596691ec3cd?r=PG&default=identicon"}, :editors [{:login "dcj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c18c35f1747ce57b4c1114cb12d600b1?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=3"}], :body ";; contrast to example code for sequential?\n;;\nuser> (coll? '(1 2 3))\ntrue\nuser> (coll? [1 2 3])\ntrue\nuser> (coll? (range 1 5))\ntrue\nuser> (coll? 1)\nfalse\nuser> (coll? {:a 2 :b 1}) \ntrue\nuser> (coll? {:a 2 :b 1}) ; in contrast to sequential?, coll? returns true for\n ; a hash map\ntrue\nuser> (sequential? {:a 2 :b 1})\nfalse", :created-at 1334018852000, :updated-at 1423811493909, :_id "542692d2c026201cdc326f61"} {:editors [{:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/19522656?v=4"}], :body ";; I had major bugs before I realized `seq?` doesn't like vectors.\n\nuser=> (seq? [1 2 3])\nfalse\nuser=> (coll? [1 2 3])\ntrue\n", :author {:avatar-url "https://avatars0.githubusercontent.com/u/19522656?v=4", :account-source "github", :login "Crowbrammer"}, :created-at 1611002403798, :updated-at 1611002470366, :_id "6005f223e4b0b1e3652d7436"}], :notes nil, :arglists ["x"], :doc "Returns true if x implements IPersistentCollection", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/coll_q"} {:added "1.2", :ns "clojure.core", :name "get-in", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1318010512000, :author {:login "jks", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/de50bee3396570d25f900873303c98f1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "assoc-in", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ce6"} {:created-at 1318010548000, :author {:login "jks", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/de50bee3396570d25f900873303c98f1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "update-in", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ce7"} {:created-at 1360286942000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "find", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ce8"} {:created-at 1360286946000, :author {:login "AtKaaZ", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e10dfa345f44b0fe72bbe081fd51b83?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "get", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ce9"} {:created-at 1412262512260, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "->", :library-url "https://github.com/clojure/clojure"}, :_id "542d6a70e4b05f4d257a2989"} {:created-at 1602017675512, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "some->", :ns "clojure.core"}, :_id "5f7cd98be4b0b1e3652d73ca"}], :line 6142, :examples [{:author {:login "tomoj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/854f0ed52f56be27c9919c2afaa665c2?r=PG&default=identicon"}, :editors [{:login "tomoj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/854f0ed52f56be27c9919c2afaa665c2?r=PG&default=identicon"} {:login "tomoj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/854f0ed52f56be27c9919c2afaa665c2?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; We can use get-in for reaching into nested maps:\nuser=> (def m {:username \"sally\"\n :profile {:name \"Sally Clojurian\"\n :address {:city \"Austin\" :state \"TX\"}}})\n#'user/m\n\nuser=> (get-in m [:profile :name])\n\"Sally Clojurian\"\nuser=> (get-in m [:profile :address :city])\n\"Austin\"\nuser=> (get-in m [:profile :address :zip-code])\nnil\nuser=> (get-in m [:profile :address :zip-code] \"no zip code!\")\n\"no zip code!\"\n\n\n;; Vectors are also associative:\nuser=> (def v [[1 2 3]\n [4 5 6]\n [7 8 9]])\n#'user/v\nuser=> (get-in v [0 2])\n3\nuser=> (get-in v [2 1])\n8\n\n\n;; We can mix associative types:\nuser=> (def mv {:username \"jimmy\"\n :pets [{:name \"Rex\"\n :type :dog}\n {:name \"Sniffles\"\n :type :hamster}]})\n#'user/mv\nuser=> (get-in mv [:pets 1 :type])\n:hamster\n", :created-at 1279953166000, :updated-at 1285497184000, :_id "542692c7c026201cdc3269af"} {:author {:login "octopusgrabbus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon"}, :editors [], :body "(def s1 [[:000-00-0000 \"TYPE 1\" \"JACKSON\" \"FRED\"]\n [:000-00-0001 \"TYPE 2\" \"SIMPSON\" \"HOMER\"]\n [:000-00-0002 \"TYPE 4\" \"SMITH\" \"SUSAN\"]])\n\n(def cols [0 2 3])\n\n(defn f1 \n [s1 col] \n (map #(get-in s1 [% col] nil) (range (count s1))))\n\n(apply interleave (map (partial f1 s1) cols))\n\n(:000-00-0000 \"JACKSON\" \"FRED\" :000-00-0001 \"SIMPSON\" \"HOMER\" :000-00-0002 \"SMITH\" \"SUSAN\")", :created-at 1334887763000, :updated-at 1334887763000, :_id "542692d3c026201cdc326fc1"} {:author {:login "fitswell", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/12550cf0cd2d5a801d70ec1bf282e8ba?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; spam link removed", :created-at 1377540628000, :updated-at 1379291978000, :_id "542692d3c026201cdc326fc2"} {:body ";; Introduction of references is jarring to get-in usage\n\n(def owners [{:owner \"Jimmy\"\n :pets (ref [{:name \"Rex\"\n :type :dog}\n {:name \"Sniffles\"\n :type :hamster}])} \n {:owner \"Jacky\" \n :pets (ref [{:name \"Spot\" \n :type :mink}\n {:name \"Puff\" \n :type :magic-dragon}])}])\n;;=> 'user/owners\n\n(get-in owners [0 :pets])\n;;=> #\n\n;; In order to go deeper the get needs to be split \n;; as the deref cannot be used as part of the get.\n(-> (get-in owners [0 :pets]) deref (get-in [1 :type]))\n;;=> :hamster\n\n;; At this point it clear that the thread operator \n;; can be used to produce similar results. \n(-> owners (nth 0) :pets deref (nth 1) :type)\n;;=> :hamster", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1412262392950, :updated-at 1412262454783, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :_id "542d69f8e4b05f4d257a2986"} {:body ";; If the nested structure contains list, it does not work, because list is \n;; not an associative structure.\n(def a {:a '({:b1 2} {:b2 4}) :c 3})\n;;=> 'user/a\n(get-in a [:a 0 :b1])\n;;=> nil\n\n;; However, if the nested structure contains a vector then it does work.\n(def a1 {:a [{:b1 2} {:b2 4}] :c 3})\n;; => 'user/a1\n\n(get-in a1 [:a 0 :b1])\n;; => 2", :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=3"}, :created-at 1416104154689, :updated-at 1583283192336, :editors [{:login "huahaiy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/889685?v=3"} {:avatar-url "https://avatars2.githubusercontent.com/u/4922694?v=4", :account-source "github", :login "Jeel-Shah"}], :_id "546808dae4b03d20a10242a7"} {:updated-at 1514431489291, :created-at 1514431489291, :author {:login "titonbarua", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/13497834?v=4"}, :body ";; If an empty sequence is used as keys, the whole structure is returned.\n(get-in {:a 1 :b 2} [])\n;;=> {:a 1, :b 2}\n(get-in {:a 1, :b 2} '())\n;;=> {:a 1, :b 2}\n\n;; nil also counts as an empty sequence!\n(get-in {:a 1 :b 2} nil)\n;;=> {:a 1, :b 2}\n\n;; Be careful if you use a nill-able key sequence with not-found value.\n;; This can be a source of bug.\n(get-in {:a 1 :b 2} nil :nothing)\n;;=> {:a 1, :b 2}", :_id "5a446401e4b0a08026c48ce3"} {:editors [{:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}], :body ";;practical example\n\n(def employee\n {:name \"John\"\n :details {:email \"info@domain.com\"\n :phone \"555-144-300\"}})\n\n(get-in employee [:details :email])\n;;\"info@domain.com\"", :author {:avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4", :account-source "github", :login "ibercode"}, :created-at 1518296458140, :updated-at 1524762235792, :_id "5a7f5d8ae4b0316c0f44f8b6"} {:editors [{:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}], :body ";; Difference between nil values vs non-existing keys, and default values\n;; In this case, we don't know what will be the `:b` in our map,\n;; so attempting to guard with a 0 default value.\n(pos? (get-in {:a {:b 42}} [:a :b] 0)) ;=> 42 -> true (as expected)\n(pos? (get-in {:a nil} [:a :b] 0)) ;=> 0 -> false, no key (as expected)\n(pos? (get-in {:a {:b nil}} [:a :b] 0)) ;=> nil -> NPE (misleading code)\n(pos? (or (get-in {:a {:b nil}} [:a :b]) 0)) ;=> false (works but ugly)\n\n;; Better to use `some->` for such situations\n(some-> {:a {:b nil}} :a :b pos?) ;=> nil (YAY!)\n(some-> {:a {}} :a :b pos?) ;=> nil\n(some-> {:a {:b 42}} :a :b pos?) ;=> true\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4", :account-source "github", :login "MicahElliott"}, :created-at 1602017645815, :updated-at 1602017774458, :_id "5f7cd96de4b0b1e3652d73c9"}], :notes nil, :arglists ["m ks" "m ks not-found"], :doc "Returns the value in a nested associative structure,\n where ks is a sequence of keys. Returns nil if the key\n is not present, or the not-found value if supplied.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/get-in"} {:added "1.0", :ns "clojure.core", :name "fnext", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1348637428000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "ffirst", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d68"} {:created-at 1374512076000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "second", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d69"} {:created-at 1437661659830, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "next", :ns "clojure.core"}, :_id "55b0f9dbe4b0080a1b79cda9"} {:created-at 1482183723442, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nnext", :ns "clojure.core"}, :_id "5858542be4b004d3a355e2bd"} {:created-at 1482183735219, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "nfirst", :ns "clojure.core"}, :_id "58585437e4b004d3a355e2be"} {:created-at 1482184193486, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "first", :ns "clojure.core"}, :_id "58585601e4b004d3a355e2c7"}], :line 112, :examples [{:author {:login "zmila", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/68dd6f50915854aa04fefcf4d6fa5c8e?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (fnext ['(a b c) '(b a c)])\n(b a c) \n\nuser=> (fnext '([a b c] [b a c]))\n[b a c] \n\nuser=> (fnext {:a 1 :b 2 :c 3})\n[:b 2] \n\nuser=> (fnext [])\nnil \n\nuser=> (fnext [1])\nnil", :created-at 1280347120000, :updated-at 1332952453000, :_id "542692ccc026201cdc326ca5"}], :notes [{:author {:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}, :updated-at 1520169710053, :created-at 1520169710053, :body "Synonym of `second`.", :_id "5a9bf2eee4b0316c0f44f90a"}], :arglists ["x"], :doc "Same as (first (next x))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/fnext"} {:added "1.2", :ns "clojure.core", :name "denominator", :file "clojure/core.clj", :static true, :type "function", :column 1, :see-alsos [{:created-at 1401510175000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.core", :name "numerator", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b91"}], :line 3590, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; denominator always returns the denominator of the reduced fraction\n;;\nuser=> (denominator (/ 2 3))\n3\nuser=> (denominator (/ 3 6))\n2\nuser=> (map denominator [(/ 3 2) (/ 2 3) (/ 4 5) (/ 4 6)])\n(2 3 5 3)\nuser=>", :created-at 1313489509000, :updated-at 1313489509000, :_id "542692ccc026201cdc326c35"}], :notes nil, :tag "java.math.BigInteger", :arglists ["r"], :doc "Returns the denominator part of a Ratio.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/denominator"} {:added "1.1", :ns "clojure.core", :name "bytes", :file "clojure/core.clj", :type "function", :column 1, :see-alsos [{:created-at 1334358122000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "byte-array", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c11"} {:created-at 1590885248124, :author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "bytes?", :ns "clojure.core"}, :_id "5ed2fb80e4b087629b5a1921"}], :line 5353, :examples [{:author {:login "leifp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d2f37720f063404ef83b987d2824353d?r=PG&default=identicon"}, :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"} {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; for fast interop\n(bytes (byte-array (map (comp byte int) \"ascii\")))\n;=> #\n(def the-bytes *1)\n;=> #'user/the-bytes\n(set! *warn-on-reflection* true)\n(defn get-byte [the-bytes i] (aget the-bytes i))\n;=> #'user/get-byte Reflection warning, NO_SOURCE_PATH:1 - call to aget can't be resolved.\n\n(defn get-byte [the-bytes i] \n (let [the-bytes (bytes the-bytes)] \n (aget the-bytes i)))\n;=> #'user/get-byte\n(get-byte the-bytes 0)\n;=> 97\n", :created-at 1342528870000, :updated-at 1683029591856, :_id "542692d2c026201cdc326f5e"} {:updated-at 1656674284283, :created-at 1656674284283, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; byte-array will convert where possible\n(byte-array [127 128 129]);; => [127, -128, -127]\n\n;; bytes will not\n(try (bytes [127 128 129])\n (catch ClassCastException e (ex-message e)))\n;; => \"clojure.lang.PersistentVector cannot be cast to [B\"\n", :_id "62bed7ece4b0b1e3652d7618"}], :notes [{:updated-at 1369546475000, :body "Why is the `(comp byte int)` required in the example? This seems to work just as well:\r\n\r\n
    \r\nuser=> (def b (bytes (byte-array (map byte \"ascii\"))))\r\nuser=> (String. b)\r\n\"ascii\"\r\n
    ", :created-at 1369546475000, :author {:login "Brian Marick", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon"}, :_id "542692edf6e94c6970522002"} {:updated-at 1369546620000, :body "For that matter, why is the `bytes` needed? Consider:\r\n\r\n
    \r\nuser=> (String. (byte-array (map byte \"ascii\")))\r\n\"ascii\"\r\n
    \r\n", :created-at 1369546620000, :author {:login "Brian Marick", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon"}, :_id "542692edf6e94c6970522003"} {:updated-at 1402388003000, :body "AFAIK, `bytes` is used for referring to `bytes[].class` from JAVA\r\n\r\nExample (midje):\r\n\r\n (fact (class (.getBytes \"test\")) => bytes) ; true\r\n", :created-at 1402388003000, :author {:login "xcthulhu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81c9adff485c35b7fdbbefe29589585a?r=PG&default=identicon"}, :_id "542692edf6e94c6970522028"}], :arglists ["xs"], :doc "Casts to bytes[]", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/bytes"} {:added "1.0", :ns "clojure.core", :name "refer-clojure", :file "clojure/core.clj", :type "macro", :column 1, :see-alsos [{:created-at 1327515371000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "refer", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f4c"}], :line 5822, :examples [{:author {:login "juergenhoetzel", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2736dfffc803c704dcf25b45ff63cede?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Prevent namespace conflicts like:\n\n;; `WARNING: time already refers to: #'clojure.core/time in namespace: \n;; time, being replaced by: #'time/time`\n\nuser=> (ns time\n (:refer-clojure :exclude [time]))\n\n(defn time []\n (System/nanoTime))\n", :created-at 1279945839000, :updated-at 1285497447000, :_id "542692c8c026201cdc326a5f"} {:updated-at 1472145548582, :created-at 1472145548582, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}, :body ";; Copied from https://gist.github.com/jkk/284230 (ns-cheatsheet.clj):\n\n;; Excludes built-in print\n(:refer-clojure :exclude [print])\n\n;; Excludes all built-ins except print\n(:refer-clojure :only [print])\n\n;; Renames built-in print to core-print\n(:refer-clojure :rename {print core-print})", :_id "57bf288ce4b0709b524f04d4"}], :macro true, :notes nil, :arglists ["& filters"], :doc "Same as (refer 'clojure.core )", :library-url "https://github.com/clojure/clojure", :href "/clojure.core/refer-clojure"} {:ns "clojure.core.async", :name "Pub", :file "clojure/core/async.clj", :type "var", :column 1, :see-alsos nil, :line 838, :examples nil, :notes nil, :arglists [], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/Pub"} {:ns "clojure.core.async", :name "reduce", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1449944303196, :author {:login "jhn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/678798?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "merge", :ns "clojure.core.async"}, :_id "566c64efe4b08a3916795379"} {:created-at 1449944322632, :author {:login "jhn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/678798?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "map", :ns "clojure.core.async"}, :_id "566c6502e4b08a391679537a"} {:created-at 1449944389839, :author {:login "jhn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/678798?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "into", :ns "clojure.core.async"}, :_id "566c6545e4b09a2675a0ba75"}], :line 596, :examples [{:editors [{:login "jhn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/678798?v=3"}], :body "(require '[clojure.core.async :as async])\n\n;; some expensive io call\n(defn expensive-call [m] \n (Thread/sleep 2000) m)\n\n(->> [{:a 1} {:b 2} {:c 3} {:d 4}]\n (map (fn [m] \n (async/thread \n (expensive-call m)))) ; creates a thread per call\n (async/merge) ; merges the 4 chans returned into 1\n (async/reduce merge {}) ; reduces items in chan with merge\n (async/ {:a 1, :c 3, :b 2, :d 4}", :author {:avatar-url "https://avatars.githubusercontent.com/u/678798?v=3", :account-source "github", :login "jhn"}, :created-at 1449944130683, :updated-at 1449944487124, :_id "566c6442e4b09a2675a0ba74"} {:updated-at 1449945764111, :created-at 1449945764111, :author {:login "jhn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/678798?v=3"}, :body "(require '[clojure.core.async :as async])\n\n(def c \n (async/to-chan (range 10)))\n\n(async/ 45", :_id "566c6aa4e4b08a391679537b"} {:updated-at 1528275453855, :created-at 1528275453855, :author {:login "agodde", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/18694682?v=4"}, :body "(require '[clojure.core.async :as async])\n\n; define a channel which yields a predefined value after a timeout\n; (function 'f' of async/reduce won't be called)\n(def c\n (async/reduce f :predefined-value (async/timeout 10000)))\n\n(async/ :predefined-value", :_id "5b17a1fde4b00ac801ed9e0e"}], :notes nil, :arglists ["f init ch"], :doc "f should be a function of 2 arguments. Returns a channel containing\n the single result of applying f to init and the first item from the\n channel, then applying f to that result and the 2nd item, etc. If\n the channel closes without yielding items, returns init and f is not\n called. ch must close before reduce produces a result.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/reduce"} {:ns "clojure.core.async", :name "remove>", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 1065, :examples nil, :deprecated "0.1.319.0-6b1aca-alpha", :notes nil, :arglists ["p ch"], :doc "Deprecated - this function will be removed. Use transducer instead", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/remove>"} {:ns "clojure.core.async", :name "timeout", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 101, :examples [{:body "user=> (go-loop [seconds (atom 0)\n add-seconds! #(swap! seconds + %)]\n (println \"Waiting 1 second\")\n (\n\n;; Waiting 1 second\n\n;; Waiting 2 seconds\n\n;; Waited 3 seconds\n", :author {:login "runexec", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1487241?v=2"}, :created-at 1412204562718, :updated-at 1412204562718, :_id "542c8812e4b05f4d257a2979"} {:body "user=> (doseq [n (range 10)\n :let [i (-> n\n inc\n range\n rand-nth)]] \n (go\n ( #'user/t \n(poll! t) ;; before AND after timeout\n;;=> nil\n\n(a/put! t 'foo) ;; before timeout\n=> true\n(a/poll! t)\n=> foo\n(a/poll! t)\n=> nil\n(a/put! t 'foo) ;; after timeout\n=> false\n\n;; You COULD use a timeout-channel as a normal channel.\n;; The preferred option however would be using alts!!\n(let [timout-chan (timeout 1000)\n comms-chan (chan 10 (map inc) #(log/error % \"whoops\")) ;; genuine channel\n [val port] (alts!! [timeout-chan\n some-other-chan])]\n (cond\n (= port timeout-chan)\n (throw (TimeoutException. \"Tooooo late.\"))\n\n (and (= port comms-chan) (int? val))\n (log/infof \"SMOOOoooth %d\" val)\n \n :else\n (throw (IllegalStateException. \"Well.. shit.\")))))", :_id "619ba064e4b0b1e3652d7579"}], :notes [{:body "*Never* close! the channel returned by timeout -- this is an unwritten rule. \n\nThe implementation sometimes will use an existing timeout channel, if it is within a few ms of the desired timeout. Closing the channel will affect multiple otherwise unrelated CSPs that may be blocked/parked waiting for the channel to close.\n\nIn our application, we saw this as spurious \"timed out after waiting X ms\" messages when the logged timestamps didn't support this possibility.\n\nThanks to Ryan Neufeld for identifying this!", :created-at 1418342154119, :updated-at 1418342154119, :author {:login "hlship", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/52660?v=3"}, :_id "548a2f0ae4b04e93c519ffa3"} {:author {:login "raymcdermott", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/120437?v=3"}, :updated-at 1454937406809, :created-at 1454937406809, :body "Might be obvious but this construct is preferred in go blocks over Thread/sleep as it does not block", :_id "56b8953ee4b060004fc217be"}], :arglists ["msecs"], :doc "Returns a channel that will close after msecs", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/timeout"} {:ns "clojure.core.async", :name "unsub*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["p v ch"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/unsub*"} {:ns "clojure.core.async", :name "admix*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["m ch"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/admix*"} {:ns "clojure.core.async", :name "unmix*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["m ch"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/unmix*"} {:ns "clojure.core.async", :name "mix", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1414157132485, :author {:login "jw-00000", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2936?v=2"}, :to-var {:ns "clojure.core.async", :name "merge", :library-url "https://github.com/clojure/clojure"}, :_id "544a534ce4b03d20a1024278"} {:created-at 1477622634105, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "admix", :ns "clojure.core.async"}, :_id "5812bb6ae4b024b73ca35a17"} {:created-at 1477622639828, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unmix", :ns "clojure.core.async"}, :_id "5812bb6fe4b024b73ca35a18"} {:created-at 1477622650504, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unmix-all", :ns "clojure.core.async"}, :_id "5812bb7ae4b024b73ca35a19"} {:created-at 1477622656517, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "toggle", :ns "clojure.core.async"}, :_id "5812bb80e4b024b73ca35a1a"} {:created-at 1477622662278, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "solo-mode", :ns "clojure.core.async"}, :_id "5812bb86e4b024b73ca35a1b"}], :line 736, :examples [{:body "user=> (def ch-out (chan))\n#'user/ch-out\n\nuser=> (def mix-out (mix ch-out))\n#'user/mix-out\n\nuser=> (def ch-example1 (chan))\n#'user/ch-example1\n\nuser=> (def ch-example2 (chan))\n#'user/ch-example2\n\nuser=> (admix mix-out ch-example1)\ntrue\n\nuser=> (admix mix-out ch-example2)\ntrue\n\nuser=> (put! ch-example1 \"sent to chan 1\")\ntrue\n\nuser=> (put! ch-example2 \"sent to chan 2\")\ntrue\n\nuser=> ( ( (def c (chan 1))\n#'user/c\n\nuser=> (def sub-c (pub c :route))\n#'user/sub-c\n\nuser=> (def cx (chan 1))\n#'user/cx\n\nuser=> (sub sub-c :up-stream cx)\n#\n\nuser=> (def cy (chan 1))\n#'user/cy\n\nuser=> (sub sub-c :down-stream cy)\n#\n\nuser=> (go-loop [_ (\n\nuser=> (go-loop [_ (\n\nuser=> (put! c {:route :up-stream :data 123})\ntrue\nGot something coming up!\n\nuser=> (put! c {:route :down-stream :data 123})\nGot something going down!\ntrue\n", :author {:login "runexec", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1487241?v=2"}, :created-at 1412174292506, :updated-at 1412188913552, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :_id "542c11d4e4b05f4d257a2964"} {:updated-at 1475768259165, :created-at 1475768259165, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :body "(def news (chan 1))\n(def shouter (pub news :topics))\n\n(def alice (chan 1))\n(def bob (chan 1))\n(def clyde (chan 1))\n\n(sub shouter :celebrity-gossip alice)\n(sub shouter :space-x bob)\n(sub shouter :space-x clyde)\n\n(go-loop [heard ( nil\n:alice - Alice says Hi!\n:bob - Bob says Hi!\n:alice - Alice says Hi again", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/156290?v=4", :account-source "github", :login "milelo"}], :_id "5f93ef45e4b0b1e3652d73ed"} {:editors [{:login "jdf-id-au", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/9016301?v=4"}], :body "(defn pub-test\n \"Check how one topic subscription can block others.\"\n [bufsize]\n (let [out (chan)\n out-pub (if (zero? bufsize)\n (async/pub out first)\n (async/pub out first (fn [topic] (async/buffer bufsize))))\n blocking-sub (chan)\n blocked-sub (chan)]\n (async/sub out-pub :blocking blocking-sub)\n (async/sub out-pub :blocked blocked-sub)\n ; no sub so doesn't block pub:\n (doseq [n (range 5)] (async/put! out [:ignored n]))\n ; blocking-sub blocks blocked-sub until consumed or buffered:\n (doseq [n (range 5)] (async/put! out [:blocking n]))\n (doseq [n (range 5)] (async/put! out [:blocked n]))\n ; don't consume last three put!s on blocking-sub:\n (dotimes [n 2] (async/take! blocking-sub tap>))\n ; close!ing blocking-sub here unblocks blocked-sub\n ; (async/close! blocking-sub)\n (dotimes [n 5] (async/take! blocked-sub tap>))))\n\n(pub-test 0) ; blocks because 5 pub - 0 buffer - 1 on inner chan - 2 take > 0 left\n[:blocking 0]\n[:blocking 1]\n=> nil\n(pub-test 1) ; blocks because 5 - 1 - 1 - 2 > 0\n[:blocking 0]\n[:blocking 1]\n=> nil\n(pub-test 2) ; doesn't block because 5 - 2 - 1 - 2 = 0\n[:blocking 0]\n[:blocking 1]\n[:blocked 0]\n[:blocked 1]\n[:blocked 2]\n[:blocked 3]\n[:blocked 4]\n=> nil", :author {:avatar-url "https://avatars.githubusercontent.com/u/9016301?v=4", :account-source "github", :login "jdf-id-au"}, :created-at 1618977551159, :updated-at 1618977807505, :_id "607fa30fe4b0b1e3652d74c7"} {:updated-at 1655787209524, :created-at 1655787209524, :author {:login "CalebMacdonaldBlack", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5868450?v=4"}, :body "(def news (chan 1))\n\n(def shouter (pub news :topics))\n\n(def alice (chan 1))\n(def bob (chan 1))\n(def clyde (chan 1))\n\n(sub shouter :gossip alice)\n(sub shouter :space bob)\n(sub shouter :space clyde)\n\n(go-loop []\n (prn \"Alice heard: \" (!", :ns "clojure.core.async"}, :_id "571e7b43e4b0fc95a97eab56"}], :line 116, :examples [{:body "user=> (def c (chan 1))\n#'user/c\n\nuser=> (go-loop [data ( \" data)\n (println \"No recur. Won't print again\"))\n\n#\n\nuser=> (put! c \"Example Async Data\")\n\nnil\n\nWaited for => Example Async Data\nNo recur. Won't print again\n\nuser=> (put! c \"Example Async Data\")\nnil\n", :author {:login "runexec", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1487241?v=2"}, :created-at 1412145281681, :updated-at 1412197165245, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :_id "542ba081e4b05f4d257a2956"} {:body ";; Clojure 1.7\nuser=> (let [c (chan 1 (filter pos?))]\n \n (go-loop []\n (let [nums ( (def cx\n (to-chan\n (range 10)))\n#'user/cx\n\nuser=> (def cy\n (to-chan\n (range -10 0)))\n#'user/cy\n\nuser=> (def mapped-chans\n (clojure.core.async/map + [cx cy]))\n#'user/mapped-chans\n\n;;\nuser=> ( ( ( ( ( ( ( ( ( ( (", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 1111, :examples nil, :deprecated "0.1.319.0-6b1aca-alpha", :notes nil, :arglists ["f out" "f out buf-or-n"], :doc "Deprecated - this function will be removed. Use transducer instead", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/mapcat>"} {:ns "clojure.core.async", :name "buffer", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1451399869777, :author {:login "ljosa", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/197881?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "dropping-buffer", :ns "clojure.core.async"}, :_id "56829abde4b01f598e267e96"} {:created-at 1464291617409, :author {:login "eduardobull", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6353416?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "sliding-buffer", :ns "clojure.core.async"}, :_id "57475121e4b0bafd3e2a0460"} {:created-at 1464291767701, :author {:login "eduardobull", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6353416?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chan", :ns "clojure.core.async"}, :_id "574751b7e4b0bafd3e2a0463"}], :line 49, :examples [{:body "user=> (def c (chan (buffer 3)))\n#'user/c\n\nuser=> (go (\n\nuser=> (doseq [_ (range 5)] (println (>!! c true)))\ntrue\ntrue\ntrue\nUnblocking buffer\ntrue\ntrue\nnil", :author {:login "runexec", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1487241?v=2"}, :created-at 1412149213685, :updated-at 1412188866844, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :_id "542bafdde4b05f4d257a295d"}], :notes nil, :arglists ["n"], :doc "Returns a fixed buffer of size n. When full, puts will block/park.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/buffer"} {:ns "clojure.core.async", :name "close!", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1464291803969, :author {:login "eduardobull", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6353416?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chan", :ns "clojure.core.async"}, :_id "574751dbe4b0af2c9436d1f7"}], :line 177, :examples [{:editors [{:login "cloojure", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/7083783?v=4"}], :body "(let [c (chan 2) ]\n (>!! c 1)\n (>!! c 2)\n (close! c)\n (println (!! c 1))", :author {:avatar-url "https://avatars1.githubusercontent.com/u/8271291?v=4", :account-source "github", :login "ertugrulcetin"}, :created-at 1521203986699, :updated-at 1537832241555, :_id "5aabbb12e4b0316c0f44f927"} {:editors [{:login "nvseenu", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4986865?v=4"}], :body ";; Below example demonstrates go processes can take values (which were already put)\n;; from the unbuffered channel even after closing it.\n\n (let [c (chan)]\n (go (>! c 1))\n (go (>! c 2))\n ;; channel is closed even before \"2\" value is taken out. \n (go ( nil (it does not block even though there is no buffer!)\n\n(let [c (chan 1)]\n (offer! c 42))\n;;=> true", :author {:avatar-url "https://avatars1.githubusercontent.com/u/8271291?v=4", :account-source "github", :login "ertugrulcetin"}, :created-at 1521204479205, :updated-at 1569062333646, :_id "5aabbcffe4b0316c0f44f929"}], :notes nil, :arglists ["port val"], :doc "Puts a val into port if it's possible to do so immediately.\n nil values are not allowed. Never blocks. Returns true if offer succeeds.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/offer!"} {:ns "clojure.core.async", :name "chan", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1412171784700, :author {:login "halgari", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/654621?v=2"}, :to-var {:ns "clojure.core.async", :name "buffer", :library-url "https://github.com/clojure/clojure"}, :_id "542c0808e4b05f4d257a295f"} {:created-at 1412171799578, :author {:login "halgari", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/654621?v=2"}, :to-var {:ns "clojure.core.async", :name "dropping-buffer", :library-url "https://github.com/clojure/clojure"}, :_id "542c0817e4b05f4d257a2960"} {:created-at 1412171810126, :author {:login "halgari", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/654621?v=2"}, :to-var {:ns "clojure.core.async", :name "sliding-buffer", :library-url "https://github.com/clojure/clojure"}, :_id "542c0822e4b05f4d257a2961"} {:created-at 1632011320526, :author {:login "didibus", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/601540?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "promise-chan", :ns "clojure.core.async"}, :_id "61468438e4b0b1e3652d7541"}], :line 73, :examples [{:body "user=> (def c (chan))\n#'user/c\nuser=> (def c (chan 1))\n#'user/c\nuser=> (def c (chan (buffer 2)))\n#'user/c\n;; Clojure 1.7\nuser=> (def c (chan 1 (filter string?)))\n#'user/c\n\n", :author {:login "runexec", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1487241?v=2"}, :created-at 1412149437066, :updated-at 1412149437066, :_id "542bb0bde4b05f4d257a295e"} {:updated-at 1521204822665, :created-at 1521204822665, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/8271291?v=4"}, :body "(let [c (chan 3 (map inc))] ;; providing transducer which increments values by one\n (>!! c 1)\n (>!! c 2)\n (>!! c 3)\n (println ( nil", :_id "5aabbe56e4b0316c0f44f92c"} {:updated-at 1611141061096, :created-at 1611141061096, :author {:login "liuchong", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/236058?v=4"}, :body "(def c (chan (buffer 1)\n (fn [xf] (fn [_ data]\n (throw (Exception. (when (= data \"hehe\")\n \"xform error\")))))\n (fn [e] (.getMessage e))))\n\n(>!! c \"hehe\")\n;;=> true\n\n;; any non-nil return value from transducer will be placed in the channel\n( \"xform error\"\n\n(>!! c \"haha\")\n;;=> true\n\n;; nil return value from transducer will NOT be placed in the channel\n( #'user/c\n(>!! c (range 3))\n;;=> true\n\n(loop [x ( #object[clojure.core.async.impl.channels.ManyToManyChannel...\n\n;; When provisioning more items than the channel buffer allows,\n;; mapcat will still put all items\n\n(>!! c (range 5))\n;;=> true\n;;0\n;;1\n;;2\n;;3\n;;4\n\n;; Avoid that with a dropping/sliding buffer:\n(def c (chan (sliding-buffer 3) (mapcat identity)))\n;;=> #'user/c\n(go-loop ...)\n;;=> #object[clojure.core.async.impl.channels.ManyToManyChannel...\n(>!! c (range 5))\n;;=> true\n;;2\n;;3\n;;4", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4", :account-source "github", :login "loeschzwerg"}], :_id "617ac388e4b0b1e3652d755d"}], :notes nil, :arglists ["" "buf-or-n" "buf-or-n xform" "buf-or-n xform ex-handler"], :doc "Creates a channel with an optional buffer, an optional transducer\n (like (map f), (filter p) etc or a composition thereof), and an\n optional exception-handler. If buf-or-n is a number, will create\n and use a fixed buffer of that size. If a transducer is supplied a\n buffer must be specified. ex-handler must be a fn of one argument -\n if an exception occurs during transformation it will be called with\n the Throwable as an argument, and any non-nil return value will be\n placed in the channel.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/chan"} {:ns "clojure.core.async", :name "solo-mode*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["m mode"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/solo-mode*"} {:ns "clojure.core.async", :name "tap", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1420501362780, :author {:login "schmee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3405586?v=3"}, :to-var {:ns "clojure.core.async", :name "mult", :library-url "https://github.com/clojure/clojure"}, :_id "54ab2172e4b09260f767ca88"} {:created-at 1420501451535, :author {:login "schmee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3405586?v=3"}, :to-var {:ns "clojure.core.async", :name "untap", :library-url "https://github.com/clojure/clojure"}, :_id "54ab21cbe4b09260f767ca8b"}], :line 712, :examples [{:body "user=> (def sz 20)\n#'user/sz\n\nuser=> (def c (chan sz))\n#'user/c\n\nuser=> (def mult-c (mult c))\n#'user/mult-c\n\nuser=> (def cx (chan sz))\n#'user/cx\n\nuser=> (def cy (chan sz))\n#'user/cy\n\nuser=> (def cz (chan sz))\n#'user/cz\n\nuser=> (tap mult-c cx)\n#\n\nuser=> (tap mult-c cy)\n#\n\nuser=> (tap mult-c cz)\n#\n\nuser=> (put! c \"sent to all\")\ntrue\n\nuser=> ( ( ( (doseq [n (range 10)\n :let [i (-> n\n inc\n range\n rand-nth)]] \n (go\n ( (.getPlacePredictions ^js/google.maps.places.AutocompleteService \n svc {:input x})\n (get-place-predictions {:input x})\n ! and alt!/alts!\n channel operations within the body will block (if necessary) by\n 'parking' the calling thread rather than tying up an OS thread (or\n the only JS thread when in ClojureScript). Upon completion of the\n operation, the body will be resumed.\n\n Returns a channel which will receive the result of the body when\n completed", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/go"} {:ns "clojure.core.async", :name "admix", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1477622395408, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unmix", :ns "clojure.core.async"}, :_id "5812ba7be4b024b73ca35a0b"} {:created-at 1477622401065, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unmix-all", :ns "clojure.core.async"}, :_id "5812ba81e4b024b73ca35a0c"} {:created-at 1477622405500, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "mix", :ns "clojure.core.async"}, :_id "5812ba85e4b024b73ca35a0d"}], :line 806, :examples [{:body "user=> (def ch-out (chan))\n#'user/ch-out\n\nuser=> (def mix-out (mix ch-out))\n#'user/mix-out\n\nuser=> (def ch-example1 (chan))\n#'user/ch-example1\n\nuser=> (def ch-example2 (chan))\n#'user/ch-example2\n\nuser=> (admix mix-out ch-example1)\ntrue\n\nuser=> (admix mix-out ch-example2)\ntrue\n\nuser=> (put! ch-example1 \"sent to chan 1\")\ntrue\n\nuser=> (put! ch-example2 \"sent to chan 2\")\ntrue\n\nuser=> ( ( 11\n\n;; Similar to `promise` and `future`, after a value has been delivered to the\n;; promise-chan, taking from it will continue to return that value immediately\n;; over and over\n\n(def inc-promise (inc-async 10))\n\n( 11\n( 11\n( 11\n\n;; That means unlike other channels, only one value can be put into a promise-chan, and \n;; taking from it afterwards will always return that value which is cached by the \n;; promise-chan, similar to what a promise or a future would.\n\n;; This makes using `promise-chan` very similar to async/await style of programming.\n;; You can create an async function by having a function return a promise-chan\n;; where it will `put!` (deliver) the value to it asynchronously as I showed with\n;; inc-async.\n\n;; You can then use `go` blocks like you'd mark `async` functions, and inside them\n;; use ` (def c (chan))\n#'user/c\n\nuser=> (onto-chan c (range 100))\n#\n\nuser=> ( ( ( false\n(identical? in-ch out-ch)\n;; => false\n", :author {:avatar-url "https://avatars1.githubusercontent.com/u/590297?v=4", :account-source "github", :login "jayzawrotny"}, :created-at 1516398991682, :updated-at 1516399003356, :_id "5a62698fe4b0a08026c48d05"}], :notes nil, :arglists ["ch coll" "ch coll close?"], :doc "Puts the contents of coll into the supplied channel.\n\n By default the channel will be closed after the items are copied,\n but can be determined by the close? parameter.\n\n Returns a channel which will close after the items are copied.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/onto-chan"} {:ns "clojure.core.async", :name "to-chan", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 648, :examples [{:body "user=> (def c (to-chan (range 10)))\n#'user/c\nuser=> ( ( ( (!! c x)\n (println \"Sent: \" x)))\n (println \"Done\")\n (future (dotimes [x 3]\n (println \"Got: \" ( (def c\n (clojure.core.async/into [:a :b :c]\n (to-chan\n (range 10))))\n#'user/c\n\nuser=> (!!", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1458597749932, :author {:login "royalaid", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2439803?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name ">!", :ns "clojure.core.async"}, :_id "56f06f75e4b09295d75dbf39"} {:created-at 1458597770460, :author {:login "royalaid", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2439803?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "put!", :ns "clojure.core.async"}, :_id "56f06f8ae4b07ac9eeceed12"} {:created-at 1461615278468, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name " (>!! c \"Blocking - not in go-block\")\ntrue\nuser=> (!!:\n\"...Use the clojure.core.async.go-checking flag to detect invalid use (see\n namespace docs).\" see [github](https://github.com/clojure/core.async/blob/6450a57caa69b0eabee2e648893ee8f44ed7ac33/src/main/clojure/clojure/core/async.clj#L303)", :_id "63055985e4b0b1e3652d764a"}], :arglists ["port val"], :doc "puts a val into port. nil values are not allowed. Will block if no\n buffer space is available. Returns true unless port is already closed.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/>!!"} {:ns "clojure.core.async", :name "alt!", :file "clojure/core/async.clj", :type "macro", :column 1, :see-alsos [{:created-at 1417715418353, :author {:login "hlship", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/52660?v=3"}, :to-var {:ns "clojure.core.async", :name "alts!", :library-url "https://github.com/clojure/clojure"}, :_id "54809edae4b03d20a10242c1"}], :line 347, :examples [{:body ";; attempts to put trade on channel trade-ch within 1 second.\n;; yields :timed-out or :sent.\n\n(let [timeout-ch (timeout 1000)]\n (alt!\n timeout-ch :timed-out\n ;; note use of double-nested vector; [trade-ch trade]\n ;; would be interpreted as two channels to take from, resulting\n ;; in an odd error.\n [[trade-ch trade]] :sent))", :author {:login "hlship", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/52660?v=3"}, :created-at 1415724033428, :updated-at 1415724033428, :_id "54623c01e4b0dc573b892fc3"} {:body "(def trade-ch (chan))\n\n(go-loop []\n (\n (alt!\n [[trade-ch trade]] :sent\n timeout-ch :timed-out)\n print))) ;;eval this at will\n\n\n;;printout example\ncore.js[38]:\t\n:sent\ncore.js[38]:\t\n100\ncore.js[38]:\t\n100\ncore.js[38]:\t\n:sent\ncore.js[38]:\t\n:timed-out\ncore.js[38]:\t\n:timed-out\ncore.js[38]:\t\n:timed-out\ncore.js[38]:\t\n:timed-out\ncore.js[38]:\t\n:timed-out\ncore.js[38]:\t\n:timed-out\ncore.js[38]:\t\n:sent\ncore.js[38]:\t\n100\n\n\n\n", :author {:login "boxxxie", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/440034?v=3"}, :created-at 1418228084201, :updated-at 1418228084201, :_id "54887174e4b09260f767ca75"} {:editors [{:avatar-url "https://avatars.githubusercontent.com/u/1293832?v=3", :account-source "github", :login "spiralman"} {:login "liuchong", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/236058?v=4"}], :updated-at 1636540050398, :created-at 1420914102914, :author {:avatar-url "https://avatars.githubusercontent.com/u/1293832?v=3", :account-source "github", :login "spiralman"}, :body ";; Reading from multiple channels, handling whichever gets data first\n(use 'clojure.core.async)\n\n(def result-chan (chan))\n\n(def error-chan (chan))\n\n(def dont-care-chan (chan))\n\n(go\n (alt!\n result-chan ([result] (println (str \"Success: \" result)))\n error-chan ([error] (println (str \"Error: \" error)))\n dont-care-chan (println \"Don't care about the value!\")))\n\n;; Given\n(put! result-chan \"Some result\")\n\n;; Output\n;; Success: Some result\n\n;; Given\n(put! error-chan \"Some error\")\n\n;; Output\n;; Error: Some error\n\n;; Given\n(put! dont-care-chan \"Some value\")\n\n;; Output\n;; Don't care about the value!", :_id "54b16db6e4b0e2ac61831ca5"}], :macro true, :notes [{:author {:login "jzwolak", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/285725?v=4"}, :updated-at 1661540240745, :created-at 1661540240745, :body "alt! does not take a vector of ports as per alts!. alts! takes a vector of ports. alt! takes a _literal_ vector of ports _only_. Any symbol containing a value that is a vector of ports will not work with alt! even though such a value will work with alts!.\n\n
    \n(ns examples.failing-async\n  (:require [clojure.core.async :refer [chan go alt! >! alts!]]))\n\n(def c1 (chan))\n(def c2 (chan))\n(def two-chans [c1 c2])\n\n(println (vector? two-chans))\n\n; Fails\n(go (loop []\n      (alt! two-chans ([v c] (println \"got v =\" v)))\n      (recur)))\n\n(go (>! c1 \"hi on alt! two-chans\"))\n\n; Succeeds (must comment out above failing code for this to work)\n(go (loop []\n      (alt! [c1 c2] ([v c] (println \"got v =\" v)))\n      (recur)))\n\n(go (>! c1 \"hi on alt! [c1 c2]\"))\n\n; Succeeds\n(go (loop []\n      (let [[v c] (alts! two-chans)]\n        (println \"got v =\" v))\n      (recur)))\n\n(go (>! c1 \"hi on alts! two-chans\"))\n
    \n", :_id "63091790e4b0b1e3652d7653"}], :arglists ["& clauses"], :doc "Makes a single choice between one of several channel operations,\n as if by alts!, returning the value of the result expr corresponding\n to the operation completed. Must be called inside a (go ...) block.\n\n Each clause takes the form of:\n\n channel-op[s] result-expr\n\n where channel-ops is one of:\n\n take-port - a single port to take\n [take-port | [put-port put-val] ...] - a vector of ports as per alts!\n :default | :priority - an option for alts!\n\n and result-expr is either a list beginning with a vector, whereupon that\n vector will be treated as a binding for the [val port] return of the\n operation, else any other expression.\n\n (alt!\n [c t] ([val ch] (foo ch val))\n x ([v] v)\n [[out val]] :wrote\n :default 42)\n\n Each option may appear at most once. The choice and parking\n characteristics are those of alts!.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/alt!"} {:ns "clojure.core.async", :name "pipeline", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1462612004334, :author {:login "tyano", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/271573?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pipeline-async", :ns "clojure.core.async"}, :_id "572db024e4b0b27c121b214b"} {:created-at 1462612021225, :author {:login "tyano", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/271573?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pipeline-blocking", :ns "clojure.core.async"}, :_id "572db035e4b039e78aadabfa"}], :line 536, :examples [{:editors [{:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}], :body ";; SIMPLE EXAMPLE -----------------------\n\n(def ca (chan 1))\n(def cb (chan 1))\n\n(pipeline\n 4 ; thread count, i prefer egyptian cotton\n cb ; to\n (filter even?) ; transducer\n ca ; from\n )\n\n(doseq [i (range 10)]\n (go (>! ca i)))\n(go-loop []\n (println ( prints even numbers in 0-10, note: not necessarily in order\n\n\n\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3", :account-source "github", :login "freckletonj"}, :created-at 1475709906229, :updated-at 1475710233062, :_id "57f58bd2e4b0709b524f0521"} {:editors [{:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}], :body ";; EXTENDED EXAMPLE ---------------------------\n\n(def ca (chan 1))\n(def cb (chan 1))\n\n(pipeline\n 4 \n cb \n (filter (fn [x]\n (if (> x 100)\n (throw (Throwable. \"too big!\"))\n (even? x)))) \n ca \n false ; should it close when `from` runs out?\n (fn [error] (println \"ahhh: \" (.getMessage error))))\n\n\n(doseq [i (range 10)]\n (go (>! ca i)))\n(go-loop []\n (println (! ca 101)) ; this one throws an error\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3", :account-source "github", :login "freckletonj"}, :created-at 1475710315800, :updated-at 1475710444653, :_id "57f58d6be4b0709b524f0523"}], :notes nil, :arglists ["n to xf from" "n to xf from close?" "n to xf from close? ex-handler"], :doc "Takes elements from the from channel and supplies them to the to\n channel, subject to the transducer xf, with parallelism n. Because\n it is parallel, the transducer will be applied independently to each\n element, not across elements, and may produce zero or more outputs\n per input. Outputs will be returned in order relative to the\n inputs. By default, the to channel will be closed when the from\n channel closes, but can be determined by the close? parameter. Will\n stop consuming the from channel if the to channel closes. Note this\n should be used for computational parallelism. If you have multiple\n blocking operations to put in flight, use pipeline-blocking instead,\n If you have multiple asynchronous operations to put in flight, use\n pipeline-async instead.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/pipeline"} {:ns "clojure.core.async", :name "sub", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1414157561892, :author {:login "jw-00000", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2936?v=2"}, :to-var {:ns "clojure.core.async", :name "pub", :library-url "https://github.com/clojure/clojure"}, :_id "544a54f9e4b03d20a1024279"}], :line 898, :examples [{:body "user=> (def c (chan 1))\n#'user/c\n\nuser=> (def sub-c (pub c :route))\n#'user/sub-c\n\nuser=> (def cx (chan 1))\n#'user/cx\n\nuser=> (sub sub-c :up-stream cx)\n#\n\nuser=> (def cy (chan 1))\n#'user/cy\n\nuser=> (sub sub-c :down-stream cy)\n#\n\nuser=> (go-loop [_ (\n\nuser=> (go-loop [_ (\n\nuser=> (put! c {:route :up-stream :data 123})\ntrue\nGot something coming up!\n\nuser=> (put! c {:route :down-stream :data 123})\nGot something going down!\ntrue\n", :author {:login "runexec", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1487241?v=2"}, :created-at 1412174270351, :updated-at 1412188965721, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :_id "542c11bee4b05f4d257a2963"} {:updated-at 1603550036673, :created-at 1603550036673, :author {:login "milelo", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/156290?v=4"}, :body "(defn monitor! [publisher topic]\n (let [ nil\n:alice - Alice says Hi!\n:bob - Bob says Hi!\n:alice - Alice says Hi again", :_id "5f943b54e4b0b1e3652d73f4"}], :notes nil, :arglists ["p topic ch" "p topic ch close?"], :doc "Subscribes a channel to a topic of a pub.\n\n By default the channel will be closed when the source closes,\n but can be determined by the close? parameter.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/sub"} {:ns "clojure.core.async", :name "go-loop", :file "clojure/core/async.clj", :type "macro", :column 1, :see-alsos [{:created-at 1435079791878, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:ns "clojure.core", :name "loop", :library-url "https://github.com/clojure/clojure"}, :_id "5589946fe4b05f167dcf2340"} {:created-at 1506702187689, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "go", :ns "clojure.core.async"}, :_id "59ce736be4b03026fe14ea4e"}], :line 457, :examples [{:body "(go-loop [seconds 1]\n ( (def c (chan 1))\n#'user/c\n\nuser=> (go-loop []\n (let [x (\n\nuser=> (doseq [n (range 3)] (put! c n))\nnil\nGot a value in this loop: 0\nGot a value in this loop: 1\nGot a value in this loop: 2\n", :author {:login "runexec", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1487241?v=2"}, :created-at 1412204771239, :updated-at 1412204771239, :_id "542c88e3e4b05f4d257a297b"}], :macro true, :notes nil, :arglists ["bindings & body"], :doc "Like (go (loop ...))", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/go-loop"} {:ns "clojure.core.async", :name "map>", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 1031, :examples nil, :deprecated "0.1.319.0-6b1aca-alpha", :notes nil, :arglists ["f ch"], :doc "Deprecated - this function will be removed. Use transducer instead", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/map>"} {:ns "clojure.core.async", :name "pipe", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 462, :examples [{:body "user=> (def cx (chan 1))\n#'user/cx\n\nuser=> (def cy (chan 1))\n#'user/cy\n\nuser=> (pipe cx cy)\n#\n\nuser=> (put! cx \"Going into CX\")\ntrue\n\nuser=> ( (def ch-1 (async/chan 10))\n#'user/ch-1\n\nuser> (def ch-2 (async/chan 10))\n#'user/ch-2\n\n;; start a thread that takes from channel 1, sleeping after each take\nuser> (async/thread\n (loop []\n (when-let [v (async/ (async/thread\n (loop []\n (when-let [v (async/ (async/pipe ch-1 ch-2)\n#object[clojure.core.async.impl.channels.ManyToManyChannel ...]\n\n;; lets try to add a new listener to channel 1.\nuser> (async/thread\n (loop []\n (when-let [v (async/ (async/thread\n (doseq [x (range 10)]\n (async/>!! ch-1 x)\n (Thread/sleep 500)))\n#object[clojure.core.async.impl.channels.ManyToManyChannel ...]\n\nch-1 taker got 0\nch-2 taker got 1\nsecond ch-1 taker got 2\nch-2 taker got 3\nch-1 taker got 4\nch-2 taker got 5\nsecond ch-1 taker got 6\nch-2 taker got 7\nch-1 taker got 8\nch-2 taker got 9\n\n;; so a pipe is just a listener that tries to take from the from channel\n;; and put onto the to channel, a pipe does dot restrict the ability to \n;; *take* from the *from* channel.", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/1413969?v=4", :account-source "github", :login "beoliver"}], :_id "59f59c41e4b0a08026c48c85"} {:editors [{:login "ferdinand-beyer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/23474334?v=4"}], :body ";;;; pipe is especially useful in combination with channel transducers,\n;;;; to transform items in a channel.\n\n;; Some input channel.\n(def input (to-chan (range 10)))\n\n;; Create a channel with all items from input transformed. Here, we\n;; create a transducer that multiplies by 5.\n;; Note that pipe returns the to channel.\n(def transformed (pipe input (chan 1 (map (partial * 5)))))\n\n;; Read transformed channel into a vector.\n(as/ [0 5 10 15 20 25 30 35 40 45]", :author {:avatar-url "https://avatars.githubusercontent.com/u/23474334?v=4", :account-source "github", :login "ferdinand-beyer"}, :created-at 1627285655574, :updated-at 1627285703564, :_id "60fe6897e4b0b1e3652d751e"}], :notes [{:author {:login "jayzawrotny", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/590297?v=4"}, :updated-at 1517207457129, :created-at 1517207457129, :body "Returns the `to` channel argument.", :_id "5a6ebfa1e4b0c974fee49d12"}], :arglists ["from to" "from to close?"], :doc "Takes elements from the from channel and supplies them to the to\n channel. By default, the to channel will be closed when the from\n channel closes, but can be determined by the close? parameter. Will\n stop consuming the from channel if the to channel closes", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/pipe"} {:ns "clojure.core.async", :name "unmix", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1477622125589, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unmix-all", :ns "clojure.core.async"}, :_id "5812b96de4b024b73ca35a08"} {:created-at 1477622170416, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "admix", :ns "clojure.core.async"}, :_id "5812b99ae4b024b73ca35a09"} {:created-at 1477622241225, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "mix", :ns "clojure.core.async"}, :_id "5812b9e1e4b024b73ca35a0a"} {:created-at 1477622605184, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "toggle", :ns "clojure.core.async"}, :_id "5812bb4de4b024b73ca35a15"} {:created-at 1477622612305, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "solo-mode", :ns "clojure.core.async"}, :_id "5812bb54e4b024b73ca35a16"}], :line 811, :examples nil, :notes nil, :arglists ["mix ch"], :doc "Removes ch as an input to the mix", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/unmix"} {:ns "clojure.core.async", :name "filter<", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 1071, :examples nil, :deprecated "0.1.319.0-6b1aca-alpha", :notes [{:author {:login "jngbng", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/552977?v=4"}, :updated-at 1642583596457, :created-at 1642583596457, :body "For posterity's sake, below is an alternative implementation.\nSee https://stackoverflow.com/questions/31286167/how-to-create-a-channel-from-another-with-transducers\n
    \n(defn filter< [p ch]\n (let [co (chan 1 (filter p)]\n    (pipe ch co)\n    co))\n
    ", :_id "61e7d62ce4b0b1e3652d759f"}], :arglists ["p ch" "p ch buf-or-n"], :doc "Deprecated - this function will be removed. Use transducer instead", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/filter<"} {:ns "clojure.core.async", :name "sub*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["p v ch close?"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/sub*"} {:ns "clojure.core.async", :name "remove<", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 1086, :examples nil, :deprecated "0.1.319.0-6b1aca-alpha", :notes nil, :arglists ["p ch" "p ch buf-or-n"], :doc "Deprecated - this function will be removed. Use transducer instead", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/remove<"} {:ns "clojure.core.async", :name "alt!!", :file "clojure/core/async.clj", :type "macro", :column 1, :see-alsos [{:created-at 1465302937238, :author {:login "Kejia", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1039073?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "alt!", :ns "clojure.core.async"}, :_id "5756bf99e4b0bafd3e2a0479"} {:created-at 1465302967905, :author {:login "Kejia", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1039073?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "alts!!", :ns "clojure.core.async"}, :_id "5756bfb7e4b0bafd3e2a047a"} {:created-at 1465302980860, :author {:login "Kejia", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1039073?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "alts!", :ns "clojure.core.async"}, :_id "5756bfc4e4b0bafd3e2a047b"}], :line 340, :examples [{:updated-at 1469659872470, :created-at 1469659872470, :author {:login "xiongtx", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1624090?v=3"}, :body ";; This example is taken from Timothy Baldridge's `core.async` course on Udemy\n;; https://www.udemy.com/communicating-sequential-processes-with-coreasync/learn/v4/overview\n\n;; Create two channels, c1 and c2\n(let [c1 (chan 1)\n c2 (chan 1)]\n ;; Put a value in each channel\n (>!! c1 42)\n (>!! c2 44)\n (thread\n ;; Take a value from one of the channels.\n ;; - If the value is taken from c1, return the keyword :c1 and channel c1\n ;; - Analogously for c2\n (let [[v c] (alt!! [c1] [:c1 c1]\n [c2] [:c2 c2])]\n ;; Print the returned keyword and whether the value was taken from c1 or c2\n (println \"Value: \" v)\n (println \"Chan 1?: \" (= c1 c))\n (println \"Chan 1?: \" (= c2 c)))))", :_id "57993ae0e4b0bafd3e2a04c2"}], :macro true, :notes nil, :arglists ["& clauses"], :doc "Like alt!, except as if by alts!!, will block until completed, and\n not intended for use in (go ...) blocks.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/alt!!"} {:ns "clojure.core.async", :name "untap*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["m ch"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/untap*"} {:ns "clojure.core.async", :name "!!", :ns "clojure.core.async"}, :_id "571e7ad5e4b012fe4fb18b39"}], :line 106, :examples [{:body "user=> (>!! c \"Blocking - not in go-block\")\ntrue\nuser=> ( channel-state-map. A\n channel-state-map is a map of attrs -> boolean, where attr is one or\n more of :mute, :pause or :solo. Any states supplied are merged with\n the current state.\n\n Note that channels can be added to a mix via toggle, which can be\n used to add channels in a particular (e.g. paused) state.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/toggle"} {:ns "clojure.core.async", :name "untap-all*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["m"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/untap-all*"} {:ns "clojure.core.async", :name "sliding-buffer", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1464291652174, :author {:login "eduardobull", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6353416?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "buffer", :ns "clojure.core.async"}, :_id "57475144e4b0af2c9436d1f5"} {:created-at 1464291665676, :author {:login "eduardobull", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6353416?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "dropping-buffer", :ns "clojure.core.async"}, :_id "57475151e4b0af2c9436d1f6"} {:created-at 1464291782443, :author {:login "eduardobull", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6353416?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "chan", :ns "clojure.core.async"}, :_id "574751c6e4b0bafd3e2a0465"}], :line 60, :examples [{:updated-at 1448692514966, :created-at 1448692514966, :author {:login "srazzaque", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/810842?v=3"}, :body "(require '[clojure.core.async :refer [go-loop !! sliding-buffer chan]])\n\n;; Sliding buffers can be used to discard old values on a chan\n\n;; Define a chan with a sliding buffer of 1 (i.e. we care mainly\n;; about the latest value)\n(def sliding-chan (chan (sliding-buffer 1)))\n\n;; Print the values on the chan forever\n(go-loop []\n (println \"Received:\" (!! sliding-chan n))\n\n;;=> Received: 0 ;; <-- see note below\n;;=> Received: 99\n\n;; Results may vary for values from 0 to n-1\n;; but you should ALWAYS see 'Received: '", :_id "56594b22e4b0be225c0c479f"}], :notes nil, :arglists ["n"], :doc "Returns a buffer of size n. When full, puts will complete, and be\n buffered, but oldest elements in buffer will be dropped (not\n transferred).", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/sliding-buffer"} {:ns "clojure.core.async", :name "partition", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 1138, :examples nil, :deprecated "0.1.319.0-6b1aca-alpha", :notes nil, :arglists ["n ch" "n ch buf-or-n"], :doc "Deprecated - this function will be removed. Use transducer instead", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/partition"} {:ns "clojure.core.async", :name "Mult", :file "clojure/core/async.clj", :type "var", :column 1, :see-alsos nil, :line 664, :examples nil, :notes nil, :arglists [], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/Mult"} {:ns "clojure.core.async", :name "merge", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1414157124197, :author {:login "jw-00000", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2936?v=2"}, :to-var {:ns "clojure.core.async", :name "mix", :library-url "https://github.com/clojure/clojure"}, :_id "544a5344e4b0dc573b892fa7"}], :line 954, :examples [{:body "user=> (def cx (chan))\n#'user/cx\n\nuser=> (def cy (chan))\n#'user/cy\n\nuser=> (def mc (clojure.core.async/merge [cx cy]))\n#'user/mc\n\nuser=> (put! cx \"Going to x\")\ntrue\n\nuser=> (put! cy \"Goint to y\")\ntrue\n\nuser=> ( ( ((1 1) (2) (1 1 1) (3 3))", :author {:login "princesspanda", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/120405?v=3"}, :created-at 1426133159296, :updated-at 1426133187178, :editors [{:login "princesspanda", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/120405?v=3"}], :_id "550110a7e4b08a4fe1ef7150"}], :deprecated "0.1.319.0-6b1aca-alpha", :notes nil, :arglists ["f ch" "f ch buf-or-n"], :doc "Deprecated - this function will be removed. Use transducer instead", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/partition-by"} {:ns "clojure.core.async", :name "unsub-all", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 911, :examples nil, :notes nil, :arglists ["p" "p topic"], :doc "Unsubscribes all channels from a pub, or a topic of a pub", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/unsub-all"} {:ns "clojure.core.async", :name ">!", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1461613777584, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name ">!!", :ns "clojure.core.async"}, :_id "571e74d1e4b012fe4fb18b36"} {:created-at 1461614301689, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "put!", :ns "clojure.core.async"}, :_id "571e76dde4b0fc95a97eab53"} {:created-at 1461615245628, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name " (let [c (chan 1)]\n #_=> (go (>! c 1)\n #_=> (println \"Got => \" ( 1\n\n#\n", :author {:login "runexec", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1487241?v=2"}, :created-at 1412147143085, :updated-at 1412147143085, :_id "542ba7c7e4b05f4d257a2958"}], :notes nil, :arglists ["port val"], :doc "puts a val into port. nil values are not allowed. Must be called\n inside a (go ...) block. Will park if no buffer space is available.\n Returns true unless port is already closed.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/>!"} {:ns "clojure.core.async", :name "unmix-all*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["m"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/unmix-all*"} {:ns "clojure.core.async", :name "split", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 575, :examples [{:updated-at 1457189785017, :created-at 1457189785017, :author {:login "ryoakg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/23413?v=3"}, :body "(require '[clojure.core.async :refer :all])\n\n(def c (chan))\n\n(let [[c1 c2] (split odd? c)]\n (go-loop []\n (println \"c1: \" (!! c n))\n\n;; will prints\nc2: c1: 01\nc2: 2\nc1: 3\nc2: 4\nc1: 5\nc2: 6\nc1: 7\nc2: 8\nc1: 9", :_id "56daf399e4b0b41f39d96cdc"}], :notes nil, :arglists ["p ch" "p ch t-buf-or-n f-buf-or-n"], :doc "Takes a predicate and a source channel and returns a vector of two\n channels, the first of which will contain the values for which the\n predicate returned true, the second those for which it returned\n false.\n\n The out channels will be unbuffered by default, or two buf-or-ns can\n be supplied. The channels will close after the source channel has\n closed.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/split"} {:ns "clojure.core.async", :name "unmix-all", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1477622473868, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unmix", :ns "clojure.core.async"}, :_id "5812bac9e4b024b73ca35a0f"} {:created-at 1477622482943, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "admix", :ns "clojure.core.async"}, :_id "5812bad2e4b024b73ca35a10"} {:created-at 1477622487430, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "mix", :ns "clojure.core.async"}, :_id "5812bad7e4b024b73ca35a11"} {:created-at 1477622570483, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "toggle", :ns "clojure.core.async"}, :_id "5812bb2ae4b024b73ca35a12"} {:created-at 1477622582934, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "solo-mode", :ns "clojure.core.async"}, :_id "5812bb36e4b024b73ca35a14"}], :line 816, :examples nil, :notes nil, :arglists ["mix"], :doc "removes all inputs from the mix", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/unmix-all"} {:ns "clojure.core.async", :name "filter>", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 1047, :examples nil, :deprecated "0.1.319.0-6b1aca-alpha", :notes nil, :arglists ["p ch"], :doc "Deprecated - this function will be removed. Use transducer instead", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/filter>"} {:ns "clojure.core.async", :name "tap*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["m ch close?"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/tap*"} {:ns "clojure.core.async", :name "untap", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1420501460660, :author {:login "schmee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3405586?v=3"}, :to-var {:ns "clojure.core.async", :name "tap", :library-url "https://github.com/clojure/clojure"}, :_id "54ab21d4e4b04e93c519ffb4"} {:created-at 1420501464732, :author {:login "schmee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3405586?v=3"}, :to-var {:ns "clojure.core.async", :name "mult", :library-url "https://github.com/clojure/clojure"}, :_id "54ab21d8e4b09260f767ca8c"} {:created-at 1420501510125, :author {:login "schmee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3405586?v=3"}, :to-var {:ns "clojure.core.async", :name "untap-all", :library-url "https://github.com/clojure/clojure"}, :_id "54ab2206e4b09260f767ca8d"}], :line 720, :examples [{:body "(def c (chan))\n(def m (mult c))\n\n(def d (chan))\n(tap m d)\n\n\n(put! c 5)\n(go (println ( (let [chans (partition-all 2\n (interleave\n [\"Bob\"\n \"Jane\"\n \"GuyGirl22\"]\n (repeatedly 3 chan)))]\n (go\n (let [[owner port] (rand-nth chans)\n chans-only (mapv second chans)]\n\n (go\n (! port\n (str owner \": First!!!\")))\n\n (let [[v p] (alts! chans-only)]\n (println \"Message: \" v \"\\nFrom Object: \" p)))))\n\n;; Returns => #\n\n;; 1.5 seconds later =>\n;; Message: Bob: First!!! \n;; From Object: #\n", :_id "543232b4e4b0e5600098acc3"} {:editors [{:login "harrigan", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/140753?v=4"}], :body ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;;\n;; THIS example shows `:default`s and `:priority`s\n\n(let [f (fn [x ch] (go (Thread/sleep (rand 100))\n (>! ch x)))\n a (chan)\n b (chan)\n c (chan)]\n (println \"----------\")\n (f 1 a)\n (f 2 b)\n (f 3 c)\n (Thread/sleep 200) ; if this is commented out, it returns the\n ; `:default` every time. If the thread *does*\n ; sleep, then it returns the `a` channel's `1`\n ; every time\n (let [[n ch2] (alts!! [a b c]\n :default 42\n :priority true\n )]\n (println \"received: \" n)))", :author {:avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3", :account-source "github", :login "freckletonj"}, :created-at 1478496465164, :updated-at 1504778601998, :_id "582010d1e4b024b73ca35a23"}], :notes nil, :arglists ["ports & {:as opts}"], :doc "Completes at most one of several channel operations. Must be called\n inside a (go ...) block. ports is a vector of channel endpoints,\n which can be either a channel to take from or a vector of\n [channel-to-put-to val-to-put], in any combination. Takes will be\n made as if by !. Unless\n the :priority option is true, if more than one port operation is\n ready a non-deterministic choice will be made. If no operation is\n ready and a :default value is supplied, [default-val :default] will\n be returned, otherwise alts! will park until the first operation to\n become ready completes. Returns [val port] of the completed\n operation, where val is the value taken for takes, and a\n boolean (true unless already closed, as per put!) for puts.\n\n opts are passed as :key val ... Supported options:\n\n :default val - the value to use if none of the operations are immediately ready\n :priority true - (default nil) when true, the operations will be tried in order.\n\n Note: there is no guarantee that the port exps or val exprs will be\n used, nor in what order should they be, so they should not be\n depended upon for side effects.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/alts!"} {:ns "clojure.core.async", :name "unsub", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 906, :examples nil, :notes nil, :arglists ["p topic ch"], :doc "Unsubscribes a channel from a topic of a pub", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/unsub"} {:ns "clojure.core.async", :name "poll!", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1464291718503, :author {:login "eduardobull", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6353416?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "offer!", :ns "clojure.core.async"}, :_id "57475186e4b0bafd3e2a0462"}], :line 396, :examples [{:updated-at 1521204570897, :created-at 1521204570897, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/8271291?v=4"}, :body "(let [c (chan)]\n (println (poll! c)))\n\n;; nil\n;;=> nil (it does not block even though there is no buffer!)\n\n(let [c (chan 1)]\n (println (offer! c 10))\n (println (poll! c)))\n;; true\n;; 10\n;;=> nil", :_id "5aabbd5ae4b0316c0f44f92a"}], :notes nil, :arglists ["port"], :doc "Takes a val from port if it's possible to do so immediately.\n Never blocks. Returns value if successful, nil otherwise.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/poll!"} {:ns "clojure.core.async", :name "thread", :file "clojure/core/async.clj", :type "macro", :column 1, :see-alsos [{:created-at 1477621753853, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "thread-call", :ns "clojure.core.async"}, :_id "5812b7f9e4b024b73ca35a05"} {:created-at 1477621759508, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "go", :ns "clojure.core.async"}, :_id "5812b7ffe4b024b73ca35a06"}], :line 448, :examples [{:editors [{:login "fmnoise", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/4033391?v=4"} {:login "saitouena", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/40712240?v=4"}], :body "(defn fake-fetch []\n (thread \n (Thread/sleep 5000) \n \"Ready!\"))\n\n;; returns immediately, prints \"Ready!\" after 5 secs\n(let [c (fake-fetch)]\n (go (println ( (chan 1))\n(def cb> (chan 1))\n(defn c-af [val result] ; notice the signature is different for `pipeline-async`, it includes a channel\n (go (! result (str val \"!!!\"))\n (close! result)))\n(pipeline-async\n 1\n cb>\n c-af\n ca>)\n(go (println ()))\n(go (>! ca> \"hello\"))", :_id "57f66c0ee4b0709b524f0528"}], :notes [{:author {:login "dmarkhas", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/16191105?v=4"}, :updated-at 1575466231681, :created-at 1575466231681, :body "I think the phrase `af must close! the channel before returning.` is confusing, and should be changed to something along the lines of `af must close! the channel before the async operation completes`.", :_id "5de7b4f7e4b0ca44402ef7f0"}], :arglists ["n to af from" "n to af from close?"], :doc "Takes elements from the from channel and supplies them to the to\n channel, subject to the async function af, with parallelism n. af\n must be a function of two arguments, the first an input value and\n the second a channel on which to place the result(s). af must close!\n the channel before returning. The presumption is that af will\n return immediately, having launched some asynchronous operation\n (i.e. in another thread) whose completion/callback will manipulate\n the result channel. Outputs will be returned in order relative to\n the inputs. By default, the to channel will be closed when the from\n channel closes, but can be determined by the close? parameter. Will\n stop consuming the from channel if the to channel closes. See also\n pipeline, pipeline-blocking.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/pipeline-async"} {:ns "clojure.core.async", :name "Mix", :file "clojure/core/async.clj", :type "var", :column 1, :see-alsos nil, :line 729, :examples nil, :notes nil, :arglists [], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/Mix"} {:ns "clojure.core.async", :name "toggle*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["m state-map"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/toggle*"} {:ns "clojure.core.async", :name "mult", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1420501383575, :author {:login "schmee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3405586?v=3"}, :to-var {:ns "clojure.core.async", :name "tap", :library-url "https://github.com/clojure/clojure"}, :_id "54ab2187e4b09260f767ca89"} {:created-at 1420501439113, :author {:login "schmee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3405586?v=3"}, :to-var {:ns "clojure.core.async", :name "untap", :library-url "https://github.com/clojure/clojure"}, :_id "54ab21bfe4b09260f767ca8a"} {:created-at 1653095539882, :author {:login "rgkirch", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6143833?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "mix", :ns "clojure.core.async"}, :_id "62883c73e4b0b1e3652d75f0"}], :line 669, :examples [{:body "user=> (def sz 20)\n#'user/sz\n\nuser=> (def c (chan sz))\n#'user/c\n\nuser=> (def mult-c (mult c))\n#'user/mult-c\n\nuser=> (def cx (chan sz))\n#'user/cx\n\nuser=> (def cy (chan sz))\n#'user/cy\n\nuser=> (def cz (chan sz))\n#'user/cz\n\nuser=> (tap mult-c cx)\n#\n\nuser=> (tap mult-c cy)\n#\n\nuser=> (tap mult-c cz)\n#\n\nuser=> (put! c \"sent to all\")\ntrue\n\nuser=> ( ( ( (def a (chan))\nuser> (def m (mult a))\nuser> (def b (chan))\nuser> (tap m b)\nuser> (go-loop [] (when-let [v ( (go-loop [] (when-let [v ( (put! a \"Hello \")\nb got Hello \nuser> (put! a \" World\")\na(source) got World\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/5214601?v=3", :account-source "github", :login "cuneoPauloCesar"}], :_id "563432f8e4b0290a56055d17"}], :notes nil, :arglists ["ch"], :doc "Creates and returns a mult(iple) of the supplied channel. Channels\n containing copies of the channel can be created with 'tap', and\n detached with 'untap'.\n\n Each item is distributed to all taps in parallel and synchronously,\n i.e. each tap must accept before the next item is distributed. Use\n buffering/windowing to prevent slow taps from holding up the mult.\n\n Items received when there are no taps get dropped.\n\n If a tap puts to a closed channel, it will be removed from the mult.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/mult"} {:ns "clojure.core.async", :name "thread-call", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1477621565889, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "thread", :ns "clojure.core.async"}, :_id "5812b73de4b024b73ca35a03"} {:created-at 1477621729989, :author {:login "aaronj1331", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/349712?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "go", :ns "clojure.core.async"}, :_id "5812b7e1e4b024b73ca35a04"}], :line 430, :examples [{:editors [{:login "earthfail", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/21296448?v=4"}], :body "(defn fake-fetch []\n (Thread/sleep 5000) \n \"Ready!\")\n\n;; returns immediately, prints \"Ready!\" after 5 secs\n(let [c (thread-call fake-fetch)]\n (println ( (let [chans (partition-all 2\n (interleave\n [\"Bob\"\n \"Jane\"\n \"GuyGirl22\"]\n (for [_ (range 3)] \n (chan))))\n [owner port] (rand-nth chans)\n chans-only (mapv second chans)]\n \n (go\n (! port\n (str owner \": First!!!\")))\n\n (let [[v p] (alts!! chans-only)]\n (println \"Message: \" v \"\\nFrom Object: \" p)))\n\n;; Message: Bob: First!!! \n;; From Object: #\n;; nil\n", :author {:login "runexec", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1487241?v=2"}, :created-at 1412576406866, :updated-at 1412576646175, :editors [{:login "runexec", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1487241?v=2"}], :_id "54323496e4b0e5600098acc4"} {:editors [{:login "quackingduck", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/9556?v=3"}], :body "(require '[clojure.core.async :as async])\n\n;; n.b. alts!! returns a *pair* of [value channel-where-value-came-from]\n\n; a channel with a single value ready in the queue\n(def c (async/chan))\n(async/put! c \"foo\")\n\n(println (async/alts!! [(async/timeout 2000) c]))\n;; => [\"foo\" ]\n\n; no more values, so we will timeout\n(println (async/alts!! [(async/timeout 2000) c]))\n;; => [nil ]\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/9556?v=3", :account-source "github", :login "quackingduck"}, :created-at 1466646608720, :updated-at 1466812798643, :_id "576b4050e4b0bafd3e2a048e"}], :notes nil, :arglists ["ports & {:as opts}"], :doc "Like alts!, except takes will be made as if by !!, will block until completed, and not intended\n for use in (go ...) blocks.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/alts!!"} {:ns "clojure.core.async", :name "mapcat<", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 1102, :examples nil, :deprecated "0.1.319.0-6b1aca-alpha", :notes nil, :arglists ["f in" "f in buf-or-n"], :doc "Deprecated - this function will be removed. Use transducer instead", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/mapcat<"} {:ns "clojure.core.async", :name "ioc-alts!", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 378, :examples nil, :notes nil, :arglists ["state cont-block ports & {:as opts}"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/ioc-alts!"} {:ns "clojure.core.async", :name "unblocking-buffer?", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 67, :examples nil, :notes nil, :arglists ["buff"], :doc "Returns true if a channel created with buff will never block. That is to say,\n puts into this buffer will never cause the buffer to be full. ", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/unblocking-buffer_q"} {:ns "clojure.core.async", :name "do-alt", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos nil, :line 302, :examples nil, :notes nil, :arglists ["alts clauses"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/do-alt"} {:ns "clojure.core.async", :name "put!", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1458597697805, :author {:login "royalaid", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2439803?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "take!", :ns "clojure.core.async"}, :_id "56f06f41e4b09295d75dbf38"} {:created-at 1458597821489, :author {:login "royalaid", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2439803?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name ">!", :ns "clojure.core.async"}, :_id "56f06fbde4b09295d75dbf3b"} {:created-at 1458597828313, :author {:login "royalaid", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2439803?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name ">!!", :ns "clojure.core.async"}, :_id "56f06fc4e4b07ac9eeceed14"}], :line 157, :examples [{:body "user=> (def c (chan 1))\n#'user/c\n\nuser=> (take! c\n (fn [x]\n (println \"Clojure callback value \" x)))\nnil\n\nuser=> (put! c \"XYZ\") ; return true unless the channel is closed.\nClojure callback value XYZ\ntrue\n\nuser=> (put! c \"XYZ\")\ntrue\n", :author {:login "runexec", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1487241?v=2"}, :created-at 1412203179922, :updated-at 1451943835304, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/1039073?v=3", :account-source "github", :login "Kejia"}], :_id "542c82abe4b05f4d257a2975"}], :notes [{:author {:login "hlship", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/52660?v=3"}, :updated-at 1437168807833, :created-at 1437168807833, :body "The documentation here is somewhat out of date, the real documentation for more recent versions of core.async (0.1.346.0-17112a-alpha, at the time of this note) removes the bit about throwing when the channel is closed. \n\nInstead, put! returns true unless the port is already closed, in which case false is returned.\n\nAn exception *is* thrown is you attempt to put! nil.", :_id "55a974a7e4b0080a1b79cda7"}], :arglists ["port val" "port val fn1" "port val fn1 on-caller?"], :doc "Asynchronously puts a val into port, calling fn1 (if supplied) when\n complete, passing false iff port is already closed. nil values are\n not allowed. If on-caller? (default true) is true, and the put is\n immediately accepted, will call fn1 on calling thread. Returns\n true unless port is already closed.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/put!"} {:ns "clojure.core.async", :name "take!", :file "clojure/core/async.clj", :type "function", :column 1, :see-alsos [{:created-at 1458597672855, :author {:login "royalaid", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2439803?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "put!", :ns "clojure.core.async"}, :_id "56f06f28e4b09295d75dbf37"} {:created-at 1458597792127, :author {:login "royalaid", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2439803?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name " (def c (chan 1))\n#'user/c\n\nuser=> (take! c\n (fn [x]\n (println \"Clojure callback value \" x)))\nnil\n\nuser=> (put! c \"XYZ\")\nClojure callback value XYZ\ntrue\n\nuser=> (put! c \"XYZ\")\ntrue\n", :author {:login "runexec", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1487241?v=2"}, :created-at 1412203153682, :updated-at 1412203153682, :_id "542c8291e4b05f4d257a2974"} {:updated-at 1516398462305, :created-at 1516398462305, :author {:login "jayzawrotny", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/590297?v=4"}, :body "(require '[clojure.core.async :refer [chan take! put!]])\n\n(def input-channel (chan 1))\n\n;; Take the first message from a channel and print it\n(take! input-channel println)\n\n(put! input-channel \"A\")\n;; => \"A\"\n\n(put! input-channel \"B\")\n;; Does not output anything because take only takes the first message\n", :_id "5a62677ee4b0a08026c48d04"}], :notes nil, :arglists ["port fn1" "port fn1 on-caller?"], :doc "Asynchronously takes a val from port, passing to fn1. Will pass nil\n if closed. If on-caller? (default true) is true, and value is\n immediately available, will call fn1 on calling thread.\n Returns nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.async/take!"} {:ns "clojure.core.logic", :name "run-db*", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1252, :examples nil, :macro true, :notes nil, :arglists ["db bindings & goals"], :doc "Executes goals until results are exhausted. Uses a specified logic database.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/run-db*"} {:ns "clojure.core.logic", :name "choice", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1102, :examples nil, :notes nil, :arglists ["a f"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/choice"} {:ns "clojure.core.logic", :name "-conjo", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2768, :examples nil, :notes nil, :arglists ["coll args out"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/-conjo"} {:ns "clojure.core.logic", :name "to-subst-val", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 604, :examples nil, :notes nil, :arglists ["v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/to-subst-val"} {:ns "clojure.core.logic", :name "conde", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos [{:created-at 1651392672424, :author {:login "shenlebantongying", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20123683?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "conda", :ns "clojure.core.logic"}, :_id "626e40a0e4b0b1e3652d75dd"}], :line 1175, :examples [{:updated-at 1562865825354, :created-at 1562865825354, :author {:login "kannangce", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/8754040?v=4"}, :body ";; conde accepts vectors of goals.\n;; makes 'or' of all the goals represented by each vector\n;; Where within each of those goals all condition must be met \n\n(run*\n [x y]\n (conde\n \t [(conso x y [1 2 3 4]) (== x 1)] ;; (conso x y [1 2 3 4]) and (== x 1)\n \t \t ;; OR\n \t [(== x y) (== x 2)])) \t ;; (== x y) and (== x 2)\n\n;; ([1 (2 3 4)] [2 2])", :_id "5d2770a1e4b0ca44402ef781"}], :macro true, :notes nil, :arglists ["& clauses"], :doc "Logical disjunction of the clauses. The first goal in\n a clause is considered the head of that clause. Interleaves the\n execution of the clauses.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/conde"} {:ns "clojure.core.logic", :name "master", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1976, :examples nil, :notes nil, :arglists ["argv cache"], :doc "Take the argument to the goal and check that we don't\n have an alpha equivalent cached answer term in the cache.\n If it doesn't already exist in the cache add the new\n answer term.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/master"} {:ns "clojure.core.logic", :name "sort-by-member-count", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2218, :examples nil, :notes nil, :arglists ["a"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/sort-by-member-count"} {:ns "clojure.core.logic", :name "matche", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos [{:created-at 1612485988783, :author {:login "cheukyin699", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6824907?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "conde", :ns "clojure.core.logic"}, :_id "601c9564e4b0b1e3652d7448"}], :line 1705, :examples [{:updated-at 1460222471941, :created-at 1460222150971, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :body ";; Taken from: https://github.com/frenchy64/Logic-Starter/wiki#matche\n;; These are equivalent:\n(run* [q]\n (conde\n ((== 'extra q) succeed)\n ((== 'virgin q) succeed)\n ((== 'olive q) succeed)\n ((== 'oil q) succeed)))\n;=> (extra virgin olive oil)\n\n(run* [q]\n (matche [q]\n (['extra] succeed)\n (['virgin] succeed)\n (['olive] succeed)\n (['oil] succeed)))\n;=> (extra virgin olive oil)\n\n;; Wild Cards and destructuring: https://github.com/frenchy64/Logic-Starter/wiki#matche-sugar-combining-wildcards-and-destructuring\n(run* [q]\n (fresh [a o]\n (== a [1 2 3 4 5])\n (matche [a]\n ([ [1 . _] ]\n (== q \"first\"))\n ([ [_ . o] ]\n (== q [\"second\" o])))))\n;=> (\"first\" \n; [\"second\" (2 3 4 5)])\n\n;; Implicit Variables: https://github.com/frenchy64/Logic-Starter/wiki#matche-sugar-implicit-variables\n(run* [q]\n (fresh [a o]\n (== a [1 2 3 4 5])\n (matche [a]\n ([ [1 . o] ]\n (== q [\"one\" o]))\n ([ [1 2 . ?o] ]\n (== q [\"two\" ?o]))\n ([ [o . ?o] ]\n (== q [\"third\" o ?o])))))\n;=> ([\"one\" (2 3 4 5)] \n; [\"two\" (3 4 5)] \n; [\"third\" 1 (2 3 4 5)] ", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3", :account-source "github", :login "freckletonj"}], :_id "570938c6e4b075f5b2c864db"}], :macro true, :notes nil, :arglists ["xs & cs"], :doc "Pattern matching macro. All patterns will be tried.\n See conde.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/matche"} {:ns "clojure.core.logic", :name "appendo", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1772, :examples [{:editors [{:login "lenw", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/339388?v=3"}], :body "(run* [q]\n (appendo [:a :b] [:c :d :e] q)) ;; ((:a :b :c :d :e))\n(run* [q]\n (appendo [:a :b] q [:a :b :c :d :e])) ;; ((:c :d :e))\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3", :account-source "github", :login "freckletonj"}, :created-at 1460064833781, :updated-at 1460410120788, :_id "5706d241e4b0fc95a97eab33"}], :notes nil, :arglists ["x y z"], :doc "A relation where x, y, and z are proper collections,\n such that z is x appended to y", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/appendo"} {:ns "clojure.core.logic", :name "nafc", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2725, :examples nil, :notes nil, :arglists ["c & args"], :doc "EXPERIMENTAL: negation as failure constraint. All arguments to the goal c\n must be ground. If some argument is not ground the execution of this constraint\n will be delayed.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/nafc"} {:ns "clojure.core.logic", :name "fnu", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1723, :examples nil, :macro true, :notes nil, :arglists ["& rest"], :doc "Define an anonymous committed choice goal. See condu.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/fnu"} {:ns "clojure.core.logic", :name "!=c", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2409, :examples nil, :notes nil, :arglists ["p"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/!=c"} {:ns "clojure.core.logic", :name "composeg*", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1060, :examples nil, :macro true, :notes nil, :arglists ["g0" "g0 & gs"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/composeg*"} {:ns "clojure.core.logic", :name "addcg", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2036, :examples nil, :notes nil, :arglists ["c"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/addcg"} {:ns "clojure.core.logic", :name "dissoc-meta", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 27, :examples nil, :notes nil, :arglists ["x k"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/dissoc-meta"} {:ns "clojure.core.logic", :name "rem-attr", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 440, :examples nil, :notes nil, :arglists ["s x attr"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/rem-attr"} {:ns "clojure.core.logic", :name "fk", :file "clojure/core/logic.clj", :type "var", :column 1, :see-alsos nil, :line 19, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/fk"} {:ns "clojure.core.logic", :name "-predc", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2659, :examples nil, :notes nil, :arglists ["x p" "x p pform"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/-predc"} {:ns "clojure.core.logic", :name "recover-vars-from-term", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2389, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/recover-vars-from-term"} {:ns "clojure.core.logic", :name "defna", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos [{:created-at 1460136622465, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defnc", :ns "clojure.core.logic"}, :_id "5707eaaee4b075f5b2c864d6"} {:created-at 1460136638290, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defne", :ns "clojure.core.logic"}, :_id "5707eabee4b0fc95a97eab3a"} {:created-at 1460136644492, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defnu", :ns "clojure.core.logic"}, :_id "5707eac4e4b0fc95a97eab3b"}], :line 1728, :examples nil, :macro true, :notes nil, :arglists ["& rest"], :doc "Define a soft cut goal. See conda.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/defna"} {:ns "clojure.core.logic", :name "recover-vars", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2398, :examples nil, :notes nil, :arglists ["p"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/recover-vars"} {:ns "clojure.core.logic", :name "defnu", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos [{:created-at 1460137178241, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defna", :ns "clojure.core.logic"}, :_id "5707ecdae4b075f5b2c864d8"} {:created-at 1460137189155, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defne", :ns "clojure.core.logic"}, :_id "5707ece5e4b0fc95a97eab3c"} {:created-at 1460137194453, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defnc", :ns "clojure.core.logic"}, :_id "5707eceae4b075f5b2c864da"} {:created-at 1490672152735, :author {:login "tkocmathla", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/183459?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "condu", :ns "clojure.core.logic"}, :_id "58d9da18e4b01f4add58fe7c"}], :line 1733, :examples nil, :macro true, :notes nil, :arglists ["& rest"], :doc "Define a committed choice goal. See condu.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/defnu"} {:ns "clojure.core.logic", :name "cgoal", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2187, :examples nil, :notes nil, :arglists ["c"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/cgoal"} {:ns "clojure.core.logic", :name "seqc", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2887, :examples nil, :notes nil, :arglists ["v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/seqc"} {:ns "clojure.core.logic", :name "log", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1288, :examples [{:updated-at 1668940522609, :created-at 1668940522609, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=4"}, :body "(run* [q]\n (log \"* running program\")\n (fresh [c d]\n (conde\n [(log \"** in first clause\")\n (== c 0)]\n [(log \"** in second clause\")\n (== c 10)]\n [(log \"** in third clause\")\n (== d 2)\n (is c d (fn [a] (* a 2)))])\n (log \"ok finishing. \")\n (== c q)))\n;; =>\n;; * running program\n;; ** in first clause\n;; ok finishing. \n;; ** in second clause\n;; ok finishing. \n;; ** in third clause\n;; ok finishing. \n", :_id "637a02eae4b0b1e3652d7689"}], :macro true, :notes nil, :arglists ["& s"], :doc "Goal for println", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/log"} {:ns "clojure.core.logic", :name "-reify*", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 259, :examples nil, :notes nil, :arglists ["s v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/-reify*"} {:ns "clojure.core.logic", :name "bind*", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1067, :examples nil, :macro true, :notes nil, :arglists ["a g" "a g & g-rest"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/bind*"} {:ns "clojure.core.logic", :name "reifyg", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2175, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/reifyg"} {:ns "clojure.core.logic", :name "distincto", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2472, :examples [{:updated-at 1581848182644, :created-at 1581848182644, :author {:login "mdzaebel", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/415392?v=4"}, :body "(run* [a b] (membero a [1 2]) (membero b [1 2]) (distincto [a b]))\n;;=> ([1 2] [2 1])\n\n;; Without 'distincto':\n\n(run* [a b] (membero a [1 2]) (membero b [1 2]))\n;;=>([1 1] [1 2] [2 1] [2 2])", :_id "5e491676e4b0ca44402ef83b"}], :notes nil, :arglists ["l"], :doc "A relation which guarantees no element of l will unify\n with another element of l.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/distincto"} {:ns "clojure.core.logic", :name "assoc-dom", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 30, :examples nil, :notes nil, :arglists ["x k v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/assoc-dom"} {:ns "clojure.core.logic", :name "get-dom", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 515, :examples nil, :notes nil, :arglists ["s x dom"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/get-dom"} {:ns "clojure.core.logic", :name "condu", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1425, :examples nil, :macro true, :notes nil, :arglists ["& clauses"], :doc "Committed choice. Once the head (first goal) of a clause\n has succeeded, remaining goals of the clause will only\n be run once. Non-relational.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/condu"} {:ns "clojure.core.logic", :name "constrain-tree", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2839, :examples nil, :notes nil, :arglists ["t fc"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/constrain-tree"} {:ns "clojure.core.logic", :name "run-nc*", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1263, :examples nil, :macro true, :notes nil, :arglists ["& goals"], :doc "Executes goals until results are exhausted. Does not occurs-check.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/run-nc*"} {:ns "clojure.core.logic", :name "empty-s", :file "clojure/core/logic.clj", :type "var", :column 1, :see-alsos nil, :line 537, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/empty-s"} {:ns "clojure.core.logic", :name "var-rands", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 91, :examples nil, :notes nil, :arglists ["a c"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/var-rands"} {:ns "clojure.core.logic", :name "merge-with-root", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 579, :examples nil, :notes nil, :arglists ["s x root"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/merge-with-root"} {:ns "clojure.core.logic", :name "waiting-stream-check", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1863, :examples nil, :notes nil, :arglists ["w success-cont failure-cont"], :doc "Take a waiting stream, a success continuation, and a failure continuation.\n If we don't find any ready suspended streams, invoke the failure continuation.\n If we find a ready suspended stream calculate the remainder of the waiting\n stream. If we've reached the fixpoint just call the thunk of the suspended\n stream, otherwise call mplus on the result of the thunk and the remainder\n of the waiting stream. Pass this result to the success contination.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/waiting-stream-check"} {:ns "clojure.core.logic", :name "tabled-s", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 529, :examples nil, :notes nil, :arglists ["" "oc" "oc meta"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/tabled-s"} {:ns "clojure.core.logic", :name "fresh", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1207, :examples [{:updated-at 1651390083912, :created-at 1651390083912, :author {:login "shenlebantongying", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20123683?v=4"}, :body "(run* [q]\n (fresh [a]\n (membero a [2 3])\n (== a q)))\n; => (2 3)\n\n;; a is a member of [2 3]\n;; a and q are unified.\n;; Note that only q will occur in the result.", :_id "626e3683e4b0b1e3652d75dc"}], :macro true, :notes nil, :arglists ["[& lvars] & goals"], :doc "Creates fresh variables. Goals occuring within form a logical\n conjunction.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/fresh"} {:ns "clojure.core.logic", :name "treec", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2876, :examples nil, :notes nil, :arglists ["x fc reifier"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/treec"} {:ns "clojure.core.logic", :name "partial-map", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos [{:created-at 1450638666311, :author {:login "qneo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5214601?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "featurec", :ns "clojure.core.logic"}, :_id "5676fd4ae4b08a391679537f"}], :line 2536, :examples nil, :notes nil, :arglists ["m"], :doc "Given map m, returns partial map that unifies with maps even if it\n doesn't share all of the keys of that map.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/partial-map"} {:ns "clojure.core.logic", :name "*logic-dbs*", :file "clojure/core/logic.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 1235, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/*logic-dbs*"} {:ns "clojure.core.logic", :name "and*", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1273, :examples nil, :notes nil, :arglists ["goals"], :doc "A function version of all, which takes a list of goals and succeeds only fi they all succeed.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/and*"} {:ns "clojure.core.logic", :name "unify-with-map*", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 911, :examples nil, :notes nil, :arglists ["u v s"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/unify-with-map*"} {:ns "clojure.core.logic", :name "runcg", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2053, :examples nil, :notes nil, :arglists ["c"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/runcg"} {:ns "clojure.core.logic", :name "matcha", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1738, :examples nil, :macro true, :notes nil, :arglists ["xs & cs"], :doc "Define a soft cut pattern match. See conda.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/matcha"} {:ns "clojure.core.logic", :name "ientailed?", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2061, :examples nil, :notes nil, :arglists ["c"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/ientailed_q"} {:ns "clojure.core.logic", :name "lcons?", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 875, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/lcons_q"} {:ns "clojure.core.logic", :name "ext-run-csg", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1152, :examples nil, :notes nil, :arglists ["u v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/ext-run-csg"} {:ns "clojure.core.logic", :name "emptyo", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1654, :examples nil, :notes nil, :arglists ["a"], :doc "A relation where a is the empty list", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/emptyo"} {:ns "clojure.core.logic", :name "unbound-rands", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 97, :examples nil, :notes nil, :arglists ["a c"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/unbound-rands"} {:ns "clojure.core.logic", :name "updatecg", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2045, :examples nil, :notes nil, :arglists ["c"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/updatecg"} {:ns "clojure.core.logic", :name "reify-lvar-name", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 253, :examples nil, :notes nil, :arglists ["s"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/reify-lvar-name"} {:ns "clojure.core.logic", :name "reify-constraints", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2164, :examples nil, :notes nil, :arglists ["v r a"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/reify-constraints"} {:ns "clojure.core.logic", :name "lvar", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 706, :examples [{:updated-at 1480022982266, :created-at 1480022982266, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :body "(let [x (lvar 'x)]\n (run 10 [q]\n (membero x [1 2 3])\n (== q x)))", :_id "58375bc6e4b0782b632278cb"}], :notes nil, :arglists ["" "name" "name unique"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/lvar"} {:ns "clojure.core.logic", :name "unify", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 236, :examples nil, :notes nil, :arglists ["s u v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/unify"} {:ns "clojure.core.logic", :name "to-stream", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1794, :examples nil, :notes nil, :arglists ["aseq"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/to-stream"} {:ns "clojure.core.logic", :name "s#", :file "clojure/core/logic.clj", :type "var", :column 1, :see-alsos nil, :line 1148, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/s#"} {:ns "clojure.core.logic", :name "trace-s", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos [{:created-at 1668965882210, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "log", :ns "clojure.core.logic"}, :_id "637a65fae4b0b1e3652d768b"}], :line 1295, :examples [{:updated-at 1668965824190, :created-at 1668965824190, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=4"}, :body "\n(run* [q u v]\n (log \"no bindings:\")\n (trace-s)\n (== u 1)\n (log \"one binding:\")\n (trace-s)\n (== q 2)\n (== v 3)\n (log \"three bindings:\")\n (trace-s))\n\n;; => ([2 1 3])\n\n;; this is what gets printed from the run:\n\nno bindings:\n{ \n [ \n \n ]}\n\none binding:\n{ \n [ \n \n ], \n 1}\n\nthree bindings:\n{ \n [\n \n ],\n 1, \n 2, \n 3}", :_id "637a65c0e4b0b1e3652d768a"}], :macro true, :notes nil, :arglists [""], :doc "Goal that prints the current substitution", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/trace-s"} {:ns "clojure.core.logic", :name "->Substitutions", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 287, :examples nil, :notes nil, :arglists ["s vs ts cs cq cqs oc _meta"], :doc "Positional factory function for class clojure.core.logic.Substitutions.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/->Substitutions"} {:ns "clojure.core.logic", :name "enforce-constraints", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2156, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/enforce-constraints"} {:ns "clojure.core.logic", :name "rembero", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2483, :examples [{:editors [{:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}], :body ";;https://github.com/clojure/core.logic/blob/master/src/main/clojure/clojure/core/logic.clj#L2483\n;; (rembero x l o)\n;; my simple reminder is: x+o=l (L, not 1)\n\n(run* [q]\n (fresh [a b x y]\n (== q [a b])\n (rembero a [:apple :banana :carrot] x)\n (rembero b x y)))\n;; ([:apple :banana] [:apple :carrot] [:banana :apple] [:banana :carrot] [:carrot :apple] [:carrot :banana])", :author {:avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3", :account-source "github", :login "freckletonj"}, :created-at 1460390058189, :updated-at 1460390756178, :_id "570bc8aae4b075f5b2c864e4"}], :notes nil, :arglists ["x l o"], :doc "A relation between l and o where x is removed from\n l exactly one time.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/rembero"} {:ns "clojure.core.logic", :name "permuteo", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1781, :examples [{:editors [{:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}], :body "(run* [q]\n (permuteo [:c q :a] [:b :a :c])) ;; :b", :author {:avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3", :account-source "github", :login "freckletonj"}, :created-at 1460065748768, :updated-at 1460065872775, :_id "5706d5d4e4b075f5b2c864d0"}], :notes nil, :arglists ["xl yl"], :doc "A relation that will permute xl into the yl. May not\n terminate if xl is not ground.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/permuteo"} {:ns "clojure.core.logic", :name "llist", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos [{:created-at 1460389651286, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "lcons", :ns "clojure.core.logic"}, :_id "570bc713e4b0fc95a97eab43"}], :line 878, :examples [{:editors [{:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}], :body "(run* [q]\n (fresh [a d]\n (== [1 2 3 4] (llist a d))\n (== q d))) ;; ((2 3 4))\n\n(run* [q]\n (fresh [a d r]\n (== [1 2 3 4] (llist a d r))\n (== q r))) ;; a=1, d=2, r=(3 4)", :author {:avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3", :account-source "github", :login "freckletonj"}, :created-at 1460389406664, :updated-at 1460389513893, :_id "570bc61ee4b075f5b2c864e0"}], :macro true, :notes nil, :arglists ["f s" "f s & rest"], :doc "Constructs a sequence from 2 or more arguments, with the last argument as the\n tail. The tail is improper if the last argument is a logic variable.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/llist"} {:ns "clojure.core.logic", :name "ext", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 220, :examples nil, :notes nil, :arglists ["s u v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/ext"} {:ns "clojure.core.logic", :name "onceo", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1434, :examples nil, :notes nil, :arglists ["g"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/onceo"} {:ns "clojure.core.logic", :name "run", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1237, :examples [{:updated-at 1593353821796, :created-at 1593353821796, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/8271291?v=4"}, :body ";; Solves 3X + 2Y + Z = 3 equation\n(let [symbols '[X Y Z]\n vars (repeatedly (count symbols) lvar)\n [x y z] vars\n sum 3]\n (run 1 [q]\n (everyg #(fd/in % (fd/interval 0 sum)) vars)\n (fresh [pro-x pro-y pro-z sum-x-y]\n (fd/* 3 x pro-x)\n (fd/* 2 y pro-y)\n (fd/* 1 z pro-z)\n (fd/+ pro-x pro-y sum-x-y)\n (fd/+ sum-x-y pro-z sum))\n (== q (zipmap symbols vars))))\n\n;;=> ({X 0, Y 0, Z 3})\n;; since we limit number of results with 1, only one solution is returned\n;; if we replace (run 1 ...) with (run* ...) then we get 3 (all) results\n", :_id "5ef8a65de4b0b1e3652d7317"}], :macro true, :notes nil, :arglists ["n bindings & goals"], :doc "Executes goals until a maximum of n results are found.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/run"} {:ns "clojure.core.logic", :name "unify-with-pmap*", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2497, :examples nil, :notes nil, :arglists ["u v s"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/unify-with-pmap*"} {:ns "clojure.core.logic", :name "defnc", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos [{:created-at 1460136453300, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defnu", :ns "clojure.core.logic"}, :_id "5707ea05e4b0fc95a97eab38"} {:created-at 1460136464708, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defna", :ns "clojure.core.logic"}, :_id "5707ea10e4b075f5b2c864d4"} {:created-at 1460136479959, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defne", :ns "clojure.core.logic"}, :_id "5707ea1fe4b0fc95a97eab39"} {:created-at 1571647061473, :author {:login "svdo", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/4028554?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "fnc", :ns "clojure.core.logic"}, :_id "5dad6e55e4b0ca44402ef7d0"}], :line 2653, :examples [{:updated-at 1460067011666, :created-at 1460067011666, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :body ";; I'm not exactly sure what `defnc` is, but I know a little how to use it\n;; The following gets all multiples of 3 in the `(range 50)`\n\n(defnc dev3c [x]\n (zero? (mod x 3)))\n\n(run* [x]\n (membero x (range 50))\n (dev3c x))", :_id "5706dac3e4b075f5b2c864d1"}], :macro true, :notes nil, :arglists ["name args & body"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/defnc"} {:ns "clojure.core.logic", :name "tramp", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2695, :examples nil, :notes nil, :arglists ["f"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/tramp"} {:ns "clojure.core.logic", :name "->Pair", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 43, :examples nil, :notes nil, :arglists ["lhs rhs"], :doc "Positional factory function for class clojure.core.logic.Pair.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/->Pair"} {:ns "clojure.core.logic", :name "mplus*", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1072, :examples nil, :macro true, :notes nil, :arglists ["e" "e & e-rest"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/mplus*"} {:ns "clojure.core.logic", :name "fnc", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 2611, :examples nil, :macro true, :notes nil, :arglists ["args & body"], :doc "Define an anonymous constraint that can be used with the unifier:\n\n (let [oddc (fnc [x] (odd? x))]\n\n (unifier {:a '?a} {:a 1} :when {'?a oddc})\n ;;=> {:a 1}\n\n (unifier {:a '?a} {:a 2} :when {'?a oddc})\n ;;=> nil\n )\n\n Note, the constraint will not run until all arguments are fully ground.\n\n Use defnc to define a constraint and assign a toplevel var.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/fnc"} {:ns "clojure.core.logic", :name "run-nc", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1257, :examples nil, :macro true, :notes nil, :arglists ["n bindings & goals"], :doc "Executes goals until a maximum of n results are found. Does not\n occurs-check.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/run-nc"} {:ns "clojure.core.logic", :name "lcons", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos [{:created-at 1460389630764, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "llist", :ns "clojure.core.logic"}, :_id "570bc6fee4b075f5b2c864e3"}], :line 868, :examples [{:updated-at 1460389621203, :created-at 1460389621203, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :body "(run* [q]\n (fresh [a d]\n (== [1 2 3 4] (lcons a d))\n (== q d))) ;; ((2 3 4))", :_id "570bc6f5e4b075f5b2c864e2"} {:updated-at 1581848387951, :created-at 1581286402438, :author {:login "mdzaebel", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/415392?v=4"}, :body "(run* [t] (== [1 2 3] (lcons 1 t)))\n;;=> ((2 3))", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/415392?v=4", :account-source "github", :login "mdzaebel"}], :_id "5e408402e4b0ca44402ef82e"}], :notes nil, :arglists ["a d"], :doc "Constructs a sequence a with an improper tail d if d is a logic variable.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/lcons"} {:ns "clojure.core.logic", :name "solutions", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1279, :examples nil, :notes nil, :arglists ["s g" "s q g"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/solutions"} {:ns "clojure.core.logic", :name "stopcg", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2057, :examples nil, :notes nil, :arglists ["c"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/stopcg"} {:ns "clojure.core.logic", :name "copy-term", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1439, :examples nil, :notes nil, :arglists ["u v"], :doc "Copies a term u into v. Non-relational.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/copy-term"} {:ns "clojure.core.logic", :name "disunify", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2290, :examples nil, :notes nil, :arglists ["s u v" "s u v cs"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/disunify"} {:ns "clojure.core.logic", :name "sort-by-strategy", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2223, :examples nil, :notes nil, :arglists ["v x a"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/sort-by-strategy"} {:ns "clojure.core.logic", :name "add-dom", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 467, :examples nil, :notes nil, :arglists ["s x dom domv" "s x dom domv seenset"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/add-dom"} {:ns "clojure.core.logic", :name "fnm", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1632, :examples nil, :macro true, :notes nil, :arglists ["t as tabled? & cs"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/fnm"} {:ns "clojure.core.logic", :name "pred", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1336, :examples [{:updated-at 1450639518107, :created-at 1450639518107, :author {:login "qneo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5214601?v=3"}, :body "user> (run* [q] (pred q symbol?))\n()\nuser> (run* [q] (== q 'x) (pred q symbol?))\n(x)\nuser> (run* [q] (== q 1) (pred q symbol?))\n()\nuser> (run* [q] (== q 1) (pred q number?))\n(1)", :_id "5677009ee4b08a3916795380"} {:updated-at 1640474969522, :created-at 1640474969522, :author {:login "hank-lenzi", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/48740267?v=4"}, :body "Example From PC3\n\nuser> (defn indexed [coll] (map-indexed vector coll))\n#'user/indexed\n\nuser> (indexed \"abcde\")\n([0 \\a] [1 \\b] [2 \\c] [3 \\d] [4 \\e])\n\n(defn index-filter [pred coll]\n (when pred\n (for [[idx elt] (indexed coll) :when (pred elt)] idx)))\n\n(index-filter #{\\a \\b} \"abcdbbb\")\n-> (0 1 4 5 6)\n\n;;; NOTES\n;; 'for' used destructuring above. 'for' is not a loop - \n;; it's 'list comprehension'.\n;; 'pred' is a predicate and a lisp form (i.e., 'keyword') in core.logic\n;; - https://clojuredocs.org/clojure.core.logic/pred\n;; It's from https://clojuredocs.org/clojure.core.logic\n;; and NOT included in core\n;; https://github.com/clojure/core.logic\n;; for forms accept bindings (':let') , filters (with ':when')\n;; and restraints (':when') .\n", :_id "61c7a959e4b0b1e3652d758d"} {:editors [{:login "wactbprot", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/113518?v=4"}], :body "user> (use '[clojure.core.logic :only [run* membero pred]])\n\n;; The position of the pred expression matters:\n\nuser> (run* [q]\n (pred q keyword?)\n (membero q [1 :a :b])\n (membero q [1 :a :c]))\n;; => ()\n\nuser> (run* [q]\n (membero q [1 :a :b])\n (membero q [1 :a :c])\n (pred q keyword?))\n;; => (:a)\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/113518?v=4", :account-source "github", :login "wactbprot"}, :created-at 1640857443937, :updated-at 1640858964293, :_id "61cd7f63e4b0b1e3652d7590"}], :macro true, :notes nil, :arglists ["v f"], :doc "Check a predicate against the value logic var. Non-relational.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/pred"} {:ns "clojure.core.logic", :name "sync-eset", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 455, :examples nil, :notes nil, :arglists ["s v seenset f"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/sync-eset"} {:ns "clojure.core.logic", :name "is", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1344, :examples [{:updated-at 1668939955671, :created-at 1668939955671, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=4"}, :body ";; assign v == 3, q == v * 10 (and, really, use clojure.core.logic.fd for this particular operation)\n\n(run* [q v]\n (== v 3)\n (is q v (fn [a] (* a 10))))", :_id "637a00b3e4b0b1e3652d7688"}], :macro true, :notes nil, :arglists ["u v op"], :doc "Set the value of a var to value of another var with the operation\n applied. Non-relational.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/is"} {:ns "clojure.core.logic", :name "->LCons", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 755, :examples nil, :notes nil, :arglists ["a d cache meta"], :doc "Positional factory function for class clojure.core.logic.LCons.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/->LCons"} {:ns "clojure.core.logic", :name "umi", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 741, :examples nil, :macro true, :notes nil, :arglists ["& args"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/umi"} {:ns "clojure.core.logic", :name "assoc-meta", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 24, :examples nil, :notes nil, :arglists ["x k v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/assoc-meta"} {:ns "clojure.core.logic", :name "conda", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos [{:created-at 1468922820940, :author {:login "freaxmind", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3929438?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "condu", :ns "clojure.core.logic"}, :_id "578dfbc4e4b0bafd3e2a04a9"} {:created-at 1468922827794, :author {:login "freaxmind", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3929438?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "conde", :ns "clojure.core.logic"}, :_id "578dfbcbe4b0bafd3e2a04aa"} {:created-at 1468922837244, :author {:login "freaxmind", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3929438?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defna", :ns "clojure.core.logic"}, :_id "578dfbd5e4b0bafd3e2a04ab"} {:created-at 1468922843584, :author {:login "freaxmind", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3929438?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "fna", :ns "clojure.core.logic"}, :_id "578dfbdbe4b0bafd3e2a04ac"}], :line 1417, :examples [{:updated-at 1468925514081, :created-at 1468925514081, :author {:login "freaxmind", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3929438?v=3"}, :body ";; Mind the order:\n\n(defn logic-test-1 []\n (run* [q r]\n (membero q [\"linux\" \"windows\" \"mac\" \"android\" \"\"])\n (conda\n [(membero q [\"linux\" \"windows\"]) (== r 1)]\n [(== q \"mac\") (== r 2)]\n [succeed (== q \"\") (== r 3)])))\n;; => ([\"linux\" 1] [\"windows\" 1] [\"mac\" 2] [\"\" 3])\n;; conda takes ground values and matches them one by one against its clauses. \n\n(defn logic-test-2 []\n (run* [q r]\n (conda\n [(membero q [\"linux\" \"windows\"]) (== r 1)]\n [(== q \"mac\") (== r 2)]\n [succeed (== q \"\") (== r 3)])\n (membero q [\"linux\" \"windows\" \"mac\" \"android\" \"\"])))\n;; ([\"linux\" 1] [\"windows\" 1])\n;; conda takes a fresh variable and associates it to the head of its first clause.\n;; only the rest of the first clause (== r 1) is considered", :_id "578e064ae4b0bafd3e2a04ad"} {:updated-at 1651392808446, :created-at 1651392808446, :author {:login "shenlebantongying", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20123683?v=4"}, :body ";; The order of \"cond\"s matters\n\n(run* [q]\n (conda\n [(membero 1 [q 2 3])]\n [(membero q [4 5 6])]))\n;; => (1)\n\n\n(run* [q]\n (conda\n [(membero q [4 5 6])]\n [(membero 1 [q 2 3])]))\n;; => (4 5 6)", :_id "626e4128e4b0b1e3652d75de"}], :macro true, :notes nil, :arglists ["& clauses"], :doc "Soft cut. Once the head of a clause has succeeded\n all other clauses will be ignored. Non-relational.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/conda"} {:ns "clojure.core.logic", :name "run-constraints*", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2115, :examples nil, :notes nil, :arglists ["xs cs ws"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/run-constraints*"} {:ns "clojure.core.logic", :name "let-dom", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 2211, :examples nil, :macro true, :notes nil, :arglists ["a vars & body"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/let-dom"} {:ns "clojure.core.logic", :name "-reify", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 263, :examples nil, :notes nil, :arglists ["s v" "s v r"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/-reify"} {:ns "clojure.core.logic", :name "run-constraint", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2070, :examples nil, :notes nil, :arglists ["c"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/run-constraint"} {:ns "clojure.core.logic", :name "->ConstraintStore", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 109, :examples nil, :notes nil, :arglists ["km cm cid running"], :doc "Positional factory function for class clojure.core.logic.ConstraintStore.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/->ConstraintStore"} {:ns "clojure.core.logic", :name "make-suspended-stream", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1854, :examples nil, :notes nil, :arglists ["cache ansv* f"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/make-suspended-stream"} {:ns "clojure.core.logic", :name "tree-term?", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 884, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/tree-term_q"} {:ns "clojure.core.logic", :name "fna", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1718, :examples nil, :macro true, :notes nil, :arglists ["& rest"], :doc "Define an anonymous soft cut goal. See conda.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/fna"} {:ns "clojure.core.logic", :name "*locals*", :file "clojure/core/logic.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 17, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/*locals*"} {:ns "clojure.core.logic", :name "unbound-names", :file "clojure/core/logic.clj", :type "var", :column 1, :see-alsos nil, :line 249, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/unbound-names"} {:ns "clojure.core.logic", :name "member1o", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1762, :examples nil, :notes nil, :arglists ["x l"], :doc "Like membero but uses to disequality further constraining\n the results. For example, if x and l are ground and x occurs\n multiple times in l, member1o will succeed only once.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/member1o"} {:ns "clojure.core.logic", :name "pair", :file "clojure/core/logic.clj", :type "var", :column 1, :see-alsos nil, :line 214, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/pair"} {:ns "clojure.core.logic", :name "walk-record-term", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 969, :examples nil, :notes nil, :arglists ["v f"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/walk-record-term"} {:ns "clojure.core.logic", :name "lvaro", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1448, :examples nil, :macro true, :notes nil, :arglists ["v"], :doc "A goal that succeeds if the argument is fresh. v must be a logic\n variable. Non-relational.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/lvaro"} {:ns "clojure.core.logic", :name "map->PMap", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2518, :examples nil, :notes nil, :arglists ["m__8876__auto__"], :doc "Factory function for class clojure.core.logic.PMap, taking a map of keywords to field values.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/map->PMap"} {:ns "clojure.core.logic", :name "annotate", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 547, :examples nil, :notes nil, :arglists ["k v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/annotate"} {:ns "clojure.core.logic", :name "empty-f", :file "clojure/core/logic.clj", :type "var", :column 1, :see-alsos nil, :line 538, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/empty-f"} {:ns "clojure.core.logic", :name "->LVar", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 621, :examples nil, :notes nil, :arglists ["id unique name oname hash meta"], :doc "Positional factory function for class clojure.core.logic.LVar.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/->LVar"} {:ns "clojure.core.logic", :name "update-pvars!", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1492, :examples nil, :notes nil, :arglists ["x vars"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/update-pvars!"} {:ns "clojure.core.logic", :name "tabled", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1997, :examples nil, :macro true, :notes nil, :arglists ["args & grest"], :doc "Macro for defining a tabled goal. Prefer ^:tabled with the\n defne/a/u forms over using this directly.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/tabled"} {:ns "clojure.core.logic", :name "resto", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos [{:created-at 1490671466023, :author {:login "tkocmathla", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/183459?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "firsto", :ns "clojure.core.logic"}, :_id "58d9d76ae4b01f4add58fe7a"}], :line 1671, :examples nil, :notes nil, :arglists ["l d"], :doc "A relation where l is a collection, such that d is the rest of l", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/resto"} {:ns "clojure.core.logic", :name "ifu*", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1369, :examples nil, :macro true, :notes nil, :arglists ["" "[e & gs] & grest"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/ifu*"} {:ns "clojure.core.logic", :name "unify-with-sequential*", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 893, :examples nil, :notes nil, :arglists ["u v s"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/unify-with-sequential*"} {:ns "clojure.core.logic", :name "add-attr", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 432, :examples nil, :notes nil, :arglists ["s x attr attrv"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/add-attr"} {:ns "clojure.core.logic", :name "walk*", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 227, :examples nil, :notes nil, :arglists ["s v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/walk*"} {:ns "clojure.core.logic", :name "->AnswerCache", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1818, :examples nil, :notes nil, :arglists ["ansl anss _meta"], :doc "Positional factory function for class clojure.core.logic.AnswerCache.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/->AnswerCache"} {:ns "clojure.core.logic", :name "enforceable-constrained", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2140, :examples nil, :notes nil, :arglists ["a"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/enforceable-constrained"} {:ns "clojure.core.logic", :name "bindable?", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 732, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/bindable_q"} {:ns "clojure.core.logic", :name "->Choice", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1084, :examples nil, :notes nil, :arglists ["a f"], :doc "Positional factory function for class clojure.core.logic.Choice.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/->Choice"} {:ns "clojure.core.logic", :name "defne", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos [{:created-at 1460136376057, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defna", :ns "clojure.core.logic"}, :_id "5707e9b8e4b0fc95a97eab36"} {:created-at 1460136395724, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defnu", :ns "clojure.core.logic"}, :_id "5707e9cbe4b075f5b2c864d3"} {:created-at 1460136407118, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "defnc", :ns "clojure.core.logic"}, :_id "5707e9d7e4b0fc95a97eab37"} {:created-at 1460143705697, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "fne", :ns "clojure.core.logic"}, :_id "57080659e4b0fc95a97eab3f"} {:created-at 1490672610441, :author {:login "tkocmathla", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/183459?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "conde", :ns "clojure.core.logic"}, :_id "58d9dbe2e4b01f4add58fe7d"}], :line 1699, :examples [{:updated-at 1444345575973, :created-at 1444345575973, :author {:login "stewSquared", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4022813?v=3"}, :body "(defne match1 [x y]\n ([:foo :bar])\n ([:baz :qux]))\n\n(run* [x y] (match1 x y)) ;; => ([:foo :bar] [:baz :qux])\n\n(defne match2 [x y]\n ([[a b . tail] [b a . tail]]))\n\n(run* [r] (match2 '(a b c d) r)) ;; => ((b a c d))\n\n(defne match3 [x y]\n ([[a . _] [a . _]]))\n\n(run* [r] (match3 [3 2 1] [3 4 5])) ;; => (_0)", :_id "5616f6e7e4b084e61c76ecbe"} {:editors [{:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}], :body ";; adapted from:\n;; http://stackoverflow.com/questions/11964055/constraining-two-vectors-to-be-in-the-same-domain-but-not-be-members-of-each-ot\n\n(defne not-membero [x l]\n ([_ []])\n ([_ [?y . ?r]]\n (!= x ?y)\n (not-membero x ?r)))\n\n(run* [q]\n (not-membero q [:a :b :c])) ;; ((_0 :- (!= (_0 :a)) (!= (_0 :b)) (!= (_0 :c))) \n\n(run* [q]\n (membero q [1 2 3 4 5])\n (not-membero q [2 4])) ;; (1 3 5)", :author {:avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3", :account-source "github", :login "freckletonj"}, :created-at 1460087200380, :updated-at 1460143693913, :_id "570729a0e4b075f5b2c864d2"}], :macro true, :notes nil, :arglists ["& rest"], :doc "Define a goal fn. Supports pattern matching. All\n patterns will be tried. See conde.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/defne"} {:ns "clojure.core.logic", :name "featurec", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos [{:created-at 1450637745267, :author {:login "qneo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5214601?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "conjo", :ns "clojure.core.logic"}, :_id "5676f9b1e4b01f598e267e8e"}], :line 2579, :examples [{:updated-at 1450637709624, :created-at 1450637709624, :author {:login "qneo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5214601?v=3"}, :body "user> (run 1 [q] (featurec q {1 2}) (== q {2 4}))\n() ;; {2 4} does not cointain k-v 1 2\nuser> (run 1 [q] (featurec q {1 2}) (== q {1 2 2 4}))\n({1 2, 2 4}) ;; {1 2 2 4} does contain k-v 1 2", :_id "5676f98de4b01f598e267e8c"} {:updated-at 1460576267720, :created-at 1460576267720, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :body ";; http://michaelrbernste.in/2013/05/12/featurec-and-maps.html\n;; http://stackoverflow.com/questions/15821718/how-do-i-de-structure-a-map-in-core-logic\n\n(is (= (run* [q]\n (featurec q {:foo 1})\n (== q {:foo 1 :bar 2}))\n '({:foo 1 :bar 2})))", :_id "570ea00be4b0fc95a97eab4b"} {:updated-at 1596504989470, :created-at 1596503615103, :author {:login "owenRiddy", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/8080718?v=4"}, :body ";;\n;; Using featurec rather than == can trigger bugs.\n;; \n\n(run* [p]\n (featurec p {:a 1})\n (fresh [m]\n (== p {:a m})))\n;; => Error printing return value (IllegalArgumentException) at \n;; => clojure.lang.RT/seqFrom (RT.java:557).\n;; => Don't know how to create ISeq from: java.lang.Long\n\n(run* [p]\n (== p {:a 1})\n (featurec p {:a 1})\n (fresh [m]\n (== p {:a m})))\n;; => ({:a 1})", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/8080718?v=4", :account-source "github", :login "owenRiddy"}], :_id "5f28b63fe4b0b1e3652d7341"}], :notes nil, :arglists ["x fs"], :doc "Ensure that a map contains at least the key-value pairs\n in the map fs. fs must be partially instantiated - that is,\n it may contain values which are logic variables to support\n feature extraction.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/featurec"} {:ns "clojure.core.logic", :name "force-ans", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2273, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/force-ans"} {:ns "clojure.core.logic", :name "normalize-store", :file "clojure/core/logic.clj", :type "var", :column 1, :see-alsos nil, :line 2407, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/normalize-store"} {:ns "clojure.core.logic", :name "update-dom", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 480, :examples nil, :notes nil, :arglists ["s x dom f" "s x dom f seenset"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/update-dom"} {:ns "clojure.core.logic", :name "membero", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1755, :examples [{:editors [{:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}], :body ";; Usage: (membero x l)\n\n(run* [q]\n (membero :a [q :b :c])) ;; :a\n(run* [q]\n (membero q [:a :b :c])) ;; [:a :b :c]\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3", :account-source "github", :login "freckletonj"}, :created-at 1460065964061, :updated-at 1460139875793, :_id "5706d6ace4b0fc95a97eab35"} {:updated-at 1654526190348, :created-at 1654526190348, :author {:login "zackteo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7510179?v=4"}, :body " (run* [q]\n (membero q [1 2 3])\n (membero q [2 3 4])) ;;=> (2 3)", :_id "629e10eee4b0b1e3652d75f9"}], :notes nil, :arglists ["x l"], :doc "A relation where l is a collection, such that l contains x.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/membero"} {:ns "clojure.core.logic", :name "merge-doms", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 558, :examples nil, :notes nil, :arglists ["s x doms"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/merge-doms"} {:ns "clojure.core.logic", :name "matchu", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1744, :examples nil, :macro true, :notes nil, :arglists ["xs & cs"], :doc "Define a committed choice goal. See condu.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/matchu"} {:ns "clojure.core.logic", :name "fixc", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2871, :examples nil, :notes nil, :arglists ["x f reifier" "x f runnable reifier"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/fixc"} {:ns "clojure.core.logic", :name "lvar?", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 726, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/lvar_q"} {:ns "clojure.core.logic", :name "answer-cache", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1844, :examples nil, :notes nil, :arglists [""], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/answer-cache"} {:ns "clojure.core.logic", :name "run-constraints", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2105, :examples nil, :notes nil, :arglists ["xcs"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/run-constraints"} {:ns "clojure.core.logic", :name "all", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos [{:created-at 1571658725931, :author {:login "svdo", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/4028554?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "fresh", :ns "clojure.core.logic"}, :_id "5dad9be5e4b0ca44402ef7d1"} {:created-at 1680599621892, :author {:login "port19x", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/82055622?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "every?", :ns "clojure.core"}, :_id "642bea45e4b08cf8563f4b8c"}], :line 1268, :examples nil, :macro true, :notes nil, :arglists ["" "& goals"], :doc "Like fresh but does does not create logic variables.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/all"} {:ns "clojure.core.logic", :name "or*", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1185, :examples nil, :notes nil, :arglists ["goals"], :doc "A function version of conde, which takes a list of goals and tries them as if via conde.\n Note that or* only does disjunction, ie (or* [a b c]) is the same as (conde [a] [b] [c]).\n If you need something like (conde [a b] [c]), you can use and*, or all:\n (or* [(and* a b) c]).", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/or*"} {:ns "clojure.core.logic", :name "->PMap", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2518, :examples nil, :notes nil, :arglists [""], :doc "Positional factory function for class clojure.core.logic.PMap.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/->PMap"} {:ns "clojure.core.logic", :name "u#", :file "clojure/core/logic.clj", :type "var", :column 1, :see-alsos nil, :line 1150, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/u#"} {:ns "clojure.core.logic", :name "trace-lvar", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1302, :examples nil, :notes nil, :arglists ["a lvar"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/trace-lvar"} {:ns "clojure.core.logic", :name "add-var", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 178, :examples nil, :notes nil, :arglists ["cs x c"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/add-var"} {:ns "clojure.core.logic", :name "to-s", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 543, :examples nil, :notes nil, :arglists ["v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/to-s"} {:ns "clojure.core.logic", :name "waiting-stream?", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1860, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/waiting-stream_q"} {:ns "clojure.core.logic", :name "-fnm", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1628, :examples nil, :macro true, :notes nil, :arglists ["fn-gen t as & cs"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/-fnm"} {:ns "clojure.core.logic", :name "distribute", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2283, :examples nil, :notes nil, :arglists ["v* strategy"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/distribute"} {:ns "clojure.core.logic", :name "occurs-check", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 216, :examples nil, :notes nil, :arglists ["s u v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/occurs-check"} {:ns "clojure.core.logic", :name "predc", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2687, :examples nil, :notes nil, :arglists ["x p" "x p pform"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/predc"} {:ns "clojure.core.logic", :name "entailed?", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2064, :examples nil, :notes nil, :arglists ["c c' a"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/entailed_q"} {:ns "clojure.core.logic", :name "->SubstValue", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 197, :examples nil, :notes nil, :arglists ["v doms eset"], :doc "Positional factory function for class clojure.core.logic.SubstValue.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/->SubstValue"} {:ns "clojure.core.logic", :name "-featurec", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2549, :examples nil, :notes nil, :arglists ["x fs"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/-featurec"} {:ns "clojure.core.logic", :name "rem-dom", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 494, :examples nil, :notes nil, :arglists ["s x dom" "s x dom seenset"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/rem-dom"} {:ns "clojure.core.logic", :name "update-eset", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 572, :examples nil, :notes nil, :arglists ["s doms eset"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/update-eset"} {:ns "clojure.core.logic", :name "conso", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos [{:created-at 1562862235221, :author {:login "kannangce", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/8754040?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "cons", :ns "clojure.core"}, :_id "5d27629be4b0ca44402ef780"}], :line 1659, :examples [{:updated-at 1562862221958, :created-at 1562862221958, :author {:login "kannangce", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/8754040?v=4"}, :body ";; conso for 1 lvar\n\n(run* [x] (conso 1 x [1 2 3 4]))\n\n;; ((2 3 4))\n\n\n;; conso for 2 lvar\n\n(run* [x y] (conso x y [1 2 3 4]))\n\n;; ([1 (2 3 4)])", :_id "5d27628de4b0ca44402ef77f"}], :notes nil, :arglists ["a d l"], :doc "A relation where l is a collection, such that a is the first of l\n and d is the rest of l. If ground d must be bound to a proper tail.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/conso"} {:ns "clojure.core.logic", :name "nilo", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1649, :examples nil, :notes nil, :arglists ["a"], :doc "A relation where a is nil", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/nilo"} {:ns "clojure.core.logic", :name "nonlvaro", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1456, :examples nil, :macro true, :notes nil, :arglists ["v"], :doc "A goal that succeeds if the argument is not fresh. v must be a\n logic variable. Non-relational.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/nonlvaro"} {:ns "clojure.core.logic", :name "uai", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 747, :examples nil, :macro true, :notes nil, :arglists ["& args"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/uai"} {:ns "clojure.core.logic", :name "fail", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1144, :examples nil, :notes nil, :arglists ["a"], :doc "A goal that always fails.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/fail"} {:ns "clojure.core.logic", :name "get-attr", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 450, :examples nil, :notes nil, :arglists ["s x attr"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/get-attr"} {:ns "clojure.core.logic", :name "-fixc", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2843, :examples nil, :notes nil, :arglists ["x f reifier" "x f runnable reifier"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/-fixc"} {:ns "clojure.core.logic", :name "build", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 271, :examples nil, :notes nil, :arglists ["s u"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/build"} {:ns "clojure.core.logic", :name "everyg", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1677, :examples [{:editors [{:login "zackteo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7510179?v=4"}], :body "\n;; everyg takes a goal and a seq of lvars and \n;; applies the goal for each of the lvars.\n\n;; For ex,\n\n(run* [x y]\n (fd/in x (fd/domain 1 2))\n (fd/in y (fd/domain 1 2)))\n\n;; can be rewritten as \n\n(run* [x y]\n (everyg #(fd/in % (fd/domain 1 2)) [x y]))\n\n;; For O/P\n;; ([1 1] [2 1] [1 2] [2 2])", :author {:avatar-url "https://avatars0.githubusercontent.com/u/8754040?v=4", :account-source "github", :login "kannangce"}, :created-at 1563388435865, :updated-at 1655422626875, :_id "5d2f6a13e4b0ca44402ef786"}], :notes nil, :arglists ["g coll"], :doc "A pseudo-relation that takes a coll and ensures that the goal g\n succeeds on every element of the collection.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/everyg"} {:ns "clojure.core.logic", :name "project", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1327, :examples [{:editors [{:login "originalhat", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/579630?v=4"}], :body ";; convert lvars into values\nuser=> (cl/project [a b] (cl/== % (str a \" proposed to \" b)))\n\"Jack proposed to Mira\"", :author {:avatar-url "https://avatars1.githubusercontent.com/u/579630?v=4", :account-source "github", :login "originalhat"}, :created-at 1605047817834, :updated-at 1605047863927, :_id "5fab1609e4b0b1e3652d7402"}], :macro true, :notes nil, :arglists ["[& vars] & goals"], :doc "Extract the values bound to the specified logic vars. Non-relational.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/project"} {:ns "clojure.core.logic", :name "-run", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1218, :examples nil, :macro true, :notes nil, :arglists ["opts [x :as bindings] & goals"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/-run"} {:ns "clojure.core.logic", :name "get-dom-fd", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2205, :examples nil, :notes nil, :arglists ["a x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/get-dom-fd"} {:ns "clojure.core.logic", :name "-nafc", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2701, :examples nil, :notes nil, :arglists ["c args"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/-nafc"} {:ns "clojure.core.logic", :name "ifa*", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1361, :examples nil, :macro true, :notes nil, :arglists ["" "[e & gs] & grest"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/ifa*"} {:ns "clojure.core.logic", :name "trace-lvars", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1305, :examples [{:editors [{:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=4"}], :body "(run* [q]\n (fresh [v]\n (conde\n [(trace-lvars \"1:A clause\" q v)\n (== q 1)\n (== v 23)\n (trace-lvars \"1:B clause\" q v)]\n [(== q 2)\n (trace-lvars \"2:A clause\" q v)\n (== q v)\n (trace-lvars \"2:B clause\" q v)])))\n\n\n;; => (1 _0)\n\n1:A clause\n q = _0\n v = _0\n1:B clause\n q = 1\n v = 23\n2:A clause\n q = 2\n v = _0\n2:B clause\n q = 2\n v = 2", :author {:avatar-url "https://avatars.githubusercontent.com/u/353113?v=4", :account-source "github", :login "claj"}, :created-at 1669159763379, :updated-at 1669757615161, :_id "637d5b53e4b0b1e3652d7690"}], :macro true, :notes nil, :arglists ["title & lvars"], :doc "Goal for tracing the values of logic variables.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/trace-lvars"} {:ns "clojure.core.logic", :name "make-cs", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 188, :examples nil, :notes nil, :arglists [""], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/make-cs"} {:ns "clojure.core.logic", :name "-inc", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1077, :examples nil, :macro true, :notes nil, :arglists ["& rest"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/-inc"} {:ns "clojure.core.logic", :name "fne", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1693, :examples [{:editors [{:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}], :body "(run 10 [q]\n ((fne [x y]\n ([[h . t] t]))\n [1 2 3] q)) ; => ((2 3))\n\n(run 10 [q]\n ((fne [x y]\n ([[o? 2 _ 4 5]] (== y o?))\n ([[1 2 _ . o?]] (== y o?)))\n [1 2 3 4 5] q))", :author {:avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3", :account-source "github", :login "freckletonj"}, :created-at 1480021319437, :updated-at 1480023049650, :_id "58375547e4b0782b632278ca"}], :macro true, :notes nil, :arglists ["& rest"], :doc "Define an anonymous goal fn. Supports pattern matching. All\n patterns will be tried. See conde.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/fne"} {:ns "clojure.core.logic", :name "lvars", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 729, :examples nil, :notes nil, :arglists ["n"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/lvars"} {:ns "clojure.core.logic", :name "subst?", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 540, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/subst_q"} {:ns "clojure.core.logic", :name "!=", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos [{:created-at 1577762515984, :author {:login "yuhan0", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/22216124?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "==", :ns "clojure.core.logic"}, :_id "5e0abed3e4b0ca44402ef802"}], :line 2458, :examples [{:editors [{:login "yuhan0", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/22216124?v=4"}], :body ";; Do not confuse with not= from clojure.core!\n\n(run* [a b]\n (membero a [1 2 3])\n (membero b [1 2 3])\n (!= a b))\n;; => ([1 2] [2 1] [1 3] [3 1] [2 3] [3 2])\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/7733800?v=3", :account-source "github", :login "clojurehunter"}, :created-at 1437906067367, :updated-at 1576168878662, :_id "55b4b493e4b0080a1b79cdad"}], :notes nil, :arglists ["u v"], :doc "Disequality constraint. Ensures that u and v will never\n unify. u and v can be complex terms.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/!="} {:ns "clojure.core.logic", :name "==", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1156, :examples [{:updated-at 1648391340255, :created-at 1648391340255, :author {:login "vimfun", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/851484?v=4"}, :body "(require '[clojure.core.logic :as logic :refer [run* ==])\n\n(run* [q]\n (== q 1))\n;; (1)\n\n(run* [q]\n (== q [1 2 3]))\n;; ([1 2 3])\n\n(run* [q]\n (== [1 q 3] [1 2 3]))\n;; (2)", :_id "624074ace4b0b1e3652d75c1"}], :notes [{:author {:login "zackteo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7510179?v=4"}, :updated-at 1654864972133, :created-at 1654864972133, :body "==, or unify", :_id "62a33c4ce4b0b1e3652d75fb"}], :arglists ["u v"], :doc "A goal that attempts to unify terms u and v.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/=="} {:ns "clojure.core.logic", :name "env-locals", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1625, :examples nil, :notes nil, :arglists ["& syms"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/env-locals"} {:ns "clojure.core.logic", :name "conjo", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2802, :examples [{:body "(use 'clojure.core.logic)\n\n;; Like conj, but result is the last argument\n\n(run* [q] (conjo [1 2 3] 4 q))\n;;=> ([1 2 3 4])\n(run* [q] (conjo [1 2 3] 4 5 6 q))\n;;=> ([1 2 3 4 5 6])\n(run* [q] (conjo {:a 0} {:a 123 :b 345} q))\n;;=> ({:a 123, :b 345})\n\n;; Partially relational:\n(run* [q] (conjo [1 2] q [1 2 3]))\n;;=> (3)\n\n;; but the same doesn't work for maps\n(run* [q] (conjo {} q {:a 1}))\n;; java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.core.logic.LVar\n\n;; This case works:\n(run* [q] (conjo {} {:a q} {:a 12345}))\n;;=> (12345)", :author {:login "kolen", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/24191?v=2"}, :created-at 1414160050597, :updated-at 1414160050597, :_id "544a5eb2e4b0dc573b892fa8"}], :notes nil, :arglists ["coll & args"], :doc "A constraint version of conj", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/conjo"} {:ns "clojure.core.logic", :name "remcg", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2049, :examples nil, :notes nil, :arglists ["c"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/remcg"} {:ns "clojure.core.logic", :name "dissoc-dom", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 33, :examples nil, :notes nil, :arglists ["x k"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/dissoc-dom"} {:ns "clojure.core.logic", :name "suspended-stream?", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1857, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/suspended-stream_q"} {:ns "clojure.core.logic", :name "firsto", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos [{:created-at 1490671476774, :author {:login "tkocmathla", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/183459?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "resto", :ns "clojure.core.logic"}, :_id "58d9d774e4b01f4add58fe7b"}], :line 1665, :examples nil, :notes nil, :arglists ["l a"], :doc "A relation where l is a collection, such that a is the first of l", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/firsto"} {:ns "clojure.core.logic", :name "map->SuspendedStream", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1849, :examples nil, :notes nil, :arglists ["m__8876__auto__"], :doc "Factory function for class clojure.core.logic.SuspendedStream, taking a map of keywords to field values.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/map->SuspendedStream"} {:ns "clojure.core.logic", :name "entangle", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 609, :examples nil, :notes nil, :arglists ["s x y"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/entangle"} {:ns "clojure.core.logic", :name "run*", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1242, :examples [{:updated-at 1593353431525, :created-at 1593353431525, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/8271291?v=4"}, :body ";; Solves 3X + 2Y + Z = 3 equation\n(let [symbols '[X Y Z]\n vars (repeatedly (count symbols) lvar)\n [x y z] vars\n sum 3]\n (run* [q]\n (everyg #(fd/in % (fd/interval 0 sum)) vars)\n (fresh [pro-x pro-y pro-z sum-x-y]\n (fd/* 3 x pro-x)\n (fd/* 2 y pro-y)\n (fd/* 1 z pro-z)\n (fd/+ pro-x pro-y sum-x-y)\n (fd/+ sum-x-y pro-z sum))\n (== q (zipmap symbols vars))))\n\n;;=> ({X 0, Y 0, Z 3} \n;; {X 1, Y 0, Z 0} \n;; {X 0, Y 1, Z 1})", :_id "5ef8a4d7e4b0b1e3652d7314"}], :macro true, :notes nil, :arglists ["bindings & goals"], :doc "Executes goals until results are exhausted.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/run*"} {:ns "clojure.core.logic", :name "->SuspendedStream", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1849, :examples nil, :notes nil, :arglists ["cache ansv* f"], :doc "Positional factory function for class clojure.core.logic.SuspendedStream.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/->SuspendedStream"} {:ns "clojure.core.logic", :name "run-db", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1247, :examples nil, :macro true, :notes nil, :arglists ["n db bindings & goals"], :doc "Executes goals until a maximum of n results are found. Uses a specified logic database.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/run-db"} {:ns "clojure.core.logic", :name "ground-term?", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2590, :examples nil, :notes nil, :arglists ["x s"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/ground-term_q"} {:ns "clojure.core.logic", :name "verify-all-bound", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2129, :examples nil, :notes nil, :arglists ["a constrained"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/verify-all-bound"} {:ns "clojure.core.logic", :name "defnm", :file "clojure/core/logic.clj", :type "macro", :column 1, :see-alsos nil, :line 1639, :examples nil, :macro true, :notes nil, :arglists ["t n & rest"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/defnm"} {:ns "clojure.core.logic", :name "fix-constraints", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2088, :examples nil, :notes nil, :arglists ["a"], :doc "A goal to run the constraints in cq until it is empty. Of\n course running a constraint may grow cq so this function\n finds the fixpoint.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/fix-constraints"} {:ns "clojure.core.logic", :name "subst-val?", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 202, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/subst-val_q"} {:ns "clojure.core.logic", :name "map->SubstValue", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 197, :examples nil, :notes nil, :arglists ["m__8876__auto__"], :doc "Factory function for class clojure.core.logic.SubstValue, taking a map of keywords to field values.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/map->SubstValue"} {:ns "clojure.core.logic", :name "partial-map?", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 2542, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/partial-map_q"} {:ns "clojure.core.logic", :name "succeed", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1140, :examples nil, :notes nil, :arglists ["a"], :doc "A goal that always succeeds.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/succeed"} {:ns "clojure.core.logic", :name "subst-val", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 205, :examples nil, :notes nil, :arglists ["x" "x doms" "x doms _meta" "x doms eset _meta"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/subst-val"} {:ns "clojure.core.logic", :name "composeg", :file "clojure/core/logic.clj", :type "function", :column 1, :see-alsos nil, :line 1053, :examples nil, :notes nil, :arglists ["" "g0 g1"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic/composeg"} {:ns "clojure.core.logic.fd", :name "interval", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 357, :examples [{:updated-at 1632545550940, :created-at 1632545550940, :author {:login "jngbng", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/552977?v=4"}, :body "(cl/run* [x]\n (fd/in x (fd/interval 1 3)))\n;; => (1 2 3)", :_id "614eab0ee4b0b1e3652d7545"}], :notes nil, :arglists ["ub" "lb ub"], :doc "Construct an interval for an assignment to a var. intervals may\n be more efficient that the domain type when the range of possiblities\n is large.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/interval"} {:ns "clojure.core.logic.fd", :name "domain", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 155, :examples [{:updated-at 1596510435368, :created-at 1596510395370, :author {:login "owenRiddy", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/8080718?v=4"}, :body ";; The docs are truthful but highly misleading. \n;; Although integers can be passed as arguments\n;; a domain can only be constructed over the\n;; Natural numbers.\n\n\ndirect> (fd/domain 1 2 3)\n;; => \ndirect> (fd/domain -1 -2 -3)\n;; => nil\ndirect> (fd/domain -3 -2 -1 0 1 2 3)\n;; => ", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/8080718?v=4", :account-source "github", :login "owenRiddy"}], :_id "5f28d0bbe4b0b1e3652d7346"}], :notes nil, :arglists ["& args"], :doc "Construct a domain for assignment to a var. Arguments should \n be integers given in sorted order. domains may be more efficient \n than intervals when only a few values are possible.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/domain"} {:ns "clojure.core.logic.fd", :name "interval?", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 351, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/interval_q"} {:ns "clojure.core.logic.fd", :name "->FiniteDomain", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 64, :examples nil, :notes nil, :arglists ["s min max"], :doc "Positional factory function for class clojure.core.logic.fd.FiniteDomain.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/->FiniteDomain"} {:ns "clojure.core.logic.fd", :name "!=c", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 755, :examples nil, :notes nil, :arglists ["u v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/!=c"} {:ns "clojure.core.logic.fd", :name "domc", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 718, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/domc"} {:ns "clojure.core.logic.fd", :name "-member?", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["this n"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/-member_q"} {:ns "clojure.core.logic.fd", :name "->MultiIntervalFD", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 477, :examples nil, :notes nil, :arglists ["min max is"], :doc "Positional factory function for class clojure.core.logic.fd.MultiIntervalFD.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/->MultiIntervalFD"} {:ns "clojure.core.logic.fd", :name "<", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 825, :examples nil, :notes nil, :arglists ["u v"], :doc "A finite domain constraint. u must be less than v. u and v\n must eventually be given domains if vars.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/<"} {:ns "clojure.core.logic.fd", :name "get-dom", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 591, :examples nil, :notes nil, :arglists ["a x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/get-dom"} {:ns "clojure.core.logic.fd", :name "expand", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 1113, :examples nil, :notes nil, :arglists ["form"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/expand"} {:ns "clojure.core.logic.fd", :name "dom", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 631, :examples nil, :notes nil, :arglists ["x dom"], :doc "Assign a var x a domain.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/dom"} {:ns "clojure.core.logic.fd", :name "->IntervalFD", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 231, :examples nil, :notes nil, :arglists ["lb ub"], :doc "Positional factory function for class clojure.core.logic.fd.IntervalFD.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/->IntervalFD"} {:ns "clojure.core.logic.fd", :name "resolve-storable-dom", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 607, :examples nil, :notes nil, :arglists ["a x dom domp"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/resolve-storable-dom"} {:ns "clojure.core.logic.fd", :name "difference*", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 408, :examples nil, :notes nil, :arglists ["is js"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/difference*"} {:ns "clojure.core.logic.fd", :name "bounded-listo", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 1085, :examples nil, :notes nil, :arglists ["l n"], :doc "Ensure that the list l never grows beyond bound n.\n n must have been assigned a domain.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/bounded-listo"} {:ns "clojure.core.logic.fd", :name "map-sum", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 658, :examples nil, :notes nil, :arglists ["f"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/map-sum"} {:ns "clojure.core.logic.fd", :name "ext-dom-fd", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 597, :examples nil, :notes nil, :arglists ["a x dom domp"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/ext-dom-fd"} {:ns "clojure.core.logic.fd", :name "in", :file "clojure/core/logic/fd.clj", :type "macro", :column 1, :see-alsos [{:created-at 1655305783395, :author {:login "zackteo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7510179?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "domain", :ns "clojure.core.logic.fd"}, :_id "62a9f637e4b0b1e3652d7602"} {:created-at 1655305802408, :author {:login "zackteo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7510179?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "interval", :ns "clojure.core.logic.fd"}, :_id "62a9f64ae4b0b1e3652d7603"} {:created-at 1679493250018, :author {:login "port19x", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/82055622?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "contains?", :ns "clojure.core"}, :_id "641b0882e4b08cf8563f4b82"}], :line 646, :examples [{:editors [{:login "zackteo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7510179?v=4"}], :body "(logic/run* [x y]\n (fd/in x y (fd/interval 0 5))\n (fd/+ x y 5))\n;; => ([0 5] [1 4] [2 3] [3 2] [4 1] [5 0])", :author {:avatar-url "https://avatars.githubusercontent.com/u/552977?v=4", :account-source "github", :login "jngbng"}, :created-at 1632547487519, :updated-at 1655305031162, :_id "614eb29fe4b0b1e3652d7546"} {:updated-at 1655305396793, :created-at 1655305396793, :author {:login "zackteo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7510179?v=4"}, :body ";; Modelling the possible combination of values of 2 coin tosses\n;; heads - 1, tails - 0; or vice-versa\n(logic/run* [coin-1 coin-2]\n (let [coin (fd/domain 0 1)]\n (fd/in coin-1 coin-2 coin)))\n;; => ([0 0] [1 0] [0 1] [1 1])", :_id "62a9f4b4e4b0b1e3652d7600"}], :macro true, :notes [{:author {:login "port19x", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/82055622?v=4"}, :updated-at 1679493347028, :created-at 1679493347028, :body "If you're looking to do simple membership tests, such a function isn't builtin\n\n`(defn in? [xs el] (some #(= % el) xs))`", :_id "641b08e3e4b08cf8563f4b83"}], :arglists ["& xs-and-dom"], :doc "Assign vars to domain. The domain must come last.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/in"} {:ns "clojure.core.logic.fd", :name "distinctc", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 1042, :examples nil, :notes nil, :arglists ["v*"], :doc "The real distinct constraint. v* can be seq of logic vars and\n values or it can be a logic var itself. This constraint does not \n run until v* has become ground. When it has become ground we group\n v* into a set of logic vars and a sorted set of known singleton \n values. We then construct the individual constraint for each var.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/distinctc"} {:ns "clojure.core.logic.fd", :name "multi-interval", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 573, :examples nil, :notes nil, :arglists ["" "i0" "i0 i1" "i0 i1 & ir"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/multi-interval"} {:ns "clojure.core.logic.fd", :name "-intervals", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["this"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/-intervals"} {:ns "clojure.core.logic.fd", :name "-intersection", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["this that"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/-intersection"} {:ns "clojure.core.logic.fd", :name "<=", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 819, :examples nil, :notes nil, :arglists ["u v"], :doc "A finite domain constraint. u must be less than or equal to v.\n u and v must eventually be given domains if vars.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/<="} {:ns "clojure.core.logic.fd", :name "normalize-intervals", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 561, :examples nil, :notes nil, :arglists ["is"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/normalize-intervals"} {:ns "clojure.core.logic.fd", :name "intersection*", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 369, :examples nil, :notes nil, :arglists ["is js"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/intersection*"} {:ns "clojure.core.logic.fd", :name "*", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos [{:created-at 1591806367061, :author {:login "jogo3000", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/7455939?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "eq", :ns "clojure.core.logic.fd"}, :_id "5ee1099fe4b0b1e3652d7301"}], :line 976, :examples [{:editors [{:login "jogo3000", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/7455939?v=4"}], :body ";; Solve q in 2 * q = 10\n(use 'clojure.core.logic)\n(require '[clojure.core.logic.fd :as fd])\n\n(run* [q] (fd/* 2 q 10)) ; => (5)\n\n;; Gotcha: it can only really find integer solutions\n(run* [q] (fd/* 2 q 5)) ; => ()", :author {:avatar-url "https://avatars1.githubusercontent.com/u/7455939?v=4", :account-source "github", :login "jogo3000"}, :created-at 1591806163866, :updated-at 1591806328350, :_id "5ee108d3e4b0b1e3652d72ff"}], :notes nil, :arglists ["x y product"], :doc "A finite domain constraint for multiplication and\n thus division. x, y & product must be eventually be given \n domains if vars.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/*"} {:ns "clojure.core.logic.fd", :name "-drop-one", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["this"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/-drop-one"} {:ns "clojure.core.logic.fd", :name "interval-<", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 42, :examples nil, :notes nil, :arglists ["i j"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/interval-<"} {:ns "clojure.core.logic.fd", :name "-distinct", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 1028, :examples nil, :notes nil, :arglists ["x y* n*"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/-distinct"} {:ns "clojure.core.logic.fd", :name "singleton-dom?", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 604, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/singleton-dom_q"} {:ns "clojure.core.logic.fd", :name "<=c", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 792, :examples nil, :notes nil, :arglists ["u v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/<=c"} {:ns "clojure.core.logic.fd", :name "quot", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 983, :examples nil, :notes nil, :arglists ["u v w"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/quot"} {:ns "clojure.core.logic.fd", :name "binops->fd", :file "clojure/core/logic/fd.clj", :type "var", :column 1, :see-alsos nil, :line 1099, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/binops->fd"} {:ns "clojure.core.logic.fd", :name "eq", :file "clojure/core/logic/fd.clj", :type "macro", :column 1, :see-alsos nil, :line 1156, :examples [{:editors [{:login "jngbng", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/552977?v=4"}], :body ";; from https://github.com/clojure/core.logic/wiki/Features#clpfd\n\n;; fd/eq is a macro that allows you to write arithmetic expressions \n;; in normal Lisp syntax which will be expanded into the appropriate\n;; series of CLP(FD) operators. It will create the transient intermediate\n;; vars for you and domain inference will be applied.\n\n(logic/run* [q]\n (logic/fresh [x y]\n (fd/in x y (fd/interval 0 9))\n (fd/eq\n (= (+ x y) 9)\n (= (+ (* x 2) (* y 4)) 24))\n (== q [x y]))) ; => ([6 3])", :author {:avatar-url "https://avatars.githubusercontent.com/u/552977?v=4", :account-source "github", :login "jngbng"}, :created-at 1632547827870, :updated-at 1632553103427, :_id "614eb3f3e4b0b1e3652d7548"}], :macro true, :notes nil, :arglists ["& forms"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/eq"} {:ns "clojure.core.logic.fd", :name "eq-form", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 1151, :examples nil, :notes nil, :arglists ["form"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/eq-form"} {:ns "clojure.core.logic.fd", :name ">", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 833, :examples nil, :notes nil, :arglists ["u v"], :doc "A finite domain constraint. u must be greater than v. u and v\n must eventually be given domains if vars.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/>"} {:ns "clojure.core.logic.fd", :name "IInterval", :file "clojure/core/logic/fd.clj", :type "var", :column 1, :see-alsos nil, :line 16, :examples nil, :notes nil, :arglists [], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/IInterval"} {:ns "clojure.core.logic.fd", :name "eq*", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 1122, :examples nil, :notes nil, :arglists ["form vars" "form vars out"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/eq*"} {:ns "clojure.core.logic.fd", :name "-drop-before", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["this n"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/-drop-before"} {:ns "clojure.core.logic.fd", :name "process-dom", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 616, :examples nil, :notes nil, :arglists ["x dom domp"], :doc "If x is a var we update its domain. If it's an integer\n we check that it's a member of the given domain. dom is\n then new domain, it should have already been calculated from\n domp which was the previous domain.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/process-dom"} {:ns "clojure.core.logic.fd", :name "ISet", :file "clojure/core/logic/fd.clj", :type "var", :column 1, :see-alsos nil, :line 28, :examples nil, :notes nil, :arglists [], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/ISet"} {:ns "clojure.core.logic.fd", :name "-", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 906, :examples nil, :notes nil, :arglists ["u v w"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/-"} {:ns "clojure.core.logic.fd", :name "sorted-set->domain", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 148, :examples nil, :notes nil, :arglists ["s"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/sorted-set->domain"} {:ns "clojure.core.logic.fd", :name "interval-<=", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 45, :examples nil, :notes nil, :arglists ["i j"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/interval-<="} {:ns "clojure.core.logic.fd", :name "-domc", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 692, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/-domc"} {:ns "clojure.core.logic.fd", :name "list-sorted?", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 1031, :examples nil, :notes nil, :arglists ["pred ls"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/list-sorted_q"} {:ns "clojure.core.logic.fd", :name "-lb", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["this"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/-lb"} {:ns "clojure.core.logic.fd", :name "==c", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 721, :examples nil, :notes nil, :arglists ["u v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/==c"} {:ns "clojure.core.logic.fd", :name "extend-to-fd", :file "clojure/core/logic/fd.clj", :type "macro", :column 1, :see-alsos nil, :line 169, :examples nil, :macro true, :notes nil, :arglists ["t"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/extend-to-fd"} {:ns "clojure.core.logic.fd", :name "-disjoint?", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["this that"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/-disjoint_q"} {:ns "clojure.core.logic.fd", :name "disjoint?*", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 449, :examples nil, :notes nil, :arglists ["is js"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/disjoint_q*"} {:ns "clojure.core.logic.fd", :name ">=", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 839, :examples nil, :notes nil, :arglists ["u v"], :doc "A finite domain constraint. u must be greater than or equal to v.\n u and v must eventually be given domains if vars.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/>="} {:ns "clojure.core.logic.fd", :name "distinct", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 1077, :examples [{:editors [{:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/8271291?v=4"}], :body "(run* [q]\n (fresh [x y]\n (fd/in x y (fd/interval 1 10))\n (fd/+ x y 10)\n (fd/distinct [x y])\n (== q [x y])))\n\n;;=> ([1 9] [2 8] [3 7] [4 6] [6 4] [7 3] [8 2] [9 1])\n;; because of fd/distinct there is no [5 5] in result list.", :author {:avatar-url "https://avatars1.githubusercontent.com/u/8271291?v=4", :account-source "github", :login "ertugrulcetin"}, :created-at 1593353632149, :updated-at 1593353660081, :_id "5ef8a5a0e4b0b1e3652d7315"}], :notes nil, :arglists ["v*"], :doc "A finite domain constraint that will guarantee that \n all vars that occur in v* will be unified with unique \n values. v* need not be ground. Any vars in v* should\n eventually be given a domain.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/distinct"} {:ns "clojure.core.logic.fd", :name "-distinctc", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 986, :examples nil, :notes nil, :arglists ["x y* n*"], :doc "The real *individual* distinct constraint. x is a var that now is bound to\n a single value. y* were the non-singleton bound vars that existed at the\n construction of the constraint. n* is the set of singleton domain values \n that existed at the construction of the constraint. We use categorize to \n determine the current non-singleton bound vars and singleton vlaues. if x\n is in n* or the new singletons we have failed. If not we simply remove \n the value of x from the remaining non-singleton domains bound to vars.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/-distinctc"} {:ns "clojure.core.logic.fd", :name "bounds", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 39, :examples nil, :notes nil, :arglists ["i"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/bounds"} {:ns "clojure.core.logic.fd", :name "interval->=", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 51, :examples nil, :notes nil, :arglists ["i j"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/interval->="} {:ns "clojure.core.logic.fd", :name "to-vals", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 668, :examples nil, :notes nil, :arglists ["dom"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/to-vals"} {:ns "clojure.core.logic.fd", :name "-difference", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["this that"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/-difference"} {:ns "clojure.core.logic.fd", :name "->fd", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 1147, :examples nil, :notes nil, :arglists ["vars exprs"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/->fd"} {:ns "clojure.core.logic.fd", :name "interval->", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 48, :examples nil, :notes nil, :arglists ["i j"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/interval->"} {:ns "clojure.core.logic.fd", :name "+", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 900, :examples [{:updated-at 1582534477216, :created-at 1582534477216, :author {:login "mdzaebel", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/415392?v=4"}, :body "(run* [sum] (fd/+ 1 2 sum))\n;;=> (3)", :_id "5e538f4de4b087629b5a18a0"}], :notes nil, :arglists ["x y sum"], :doc "A finite domain constraint for addition and subtraction.\n x, y & sum must eventually be given domains if vars.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/+"} {:ns "clojure.core.logic.fd", :name "-ub", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["this"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/-ub"} {:ns "clojure.core.logic.fd", :name "binops", :file "clojure/core/logic/fd.clj", :type "var", :column 1, :see-alsos nil, :line 1111, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/binops"} {:ns "clojure.core.logic.fd", :name "unify-with-domain*", :file "clojure/core/logic/fd.clj", :type "var", :column 1, :see-alsos nil, :line 34, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/unify-with-domain*"} {:ns "clojure.core.logic.fd", :name "finite-domain?", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 145, :examples [{:updated-at 1655306137177, :created-at 1655306137177, :author {:login "zackteo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7510179?v=4"}, :body "(fd/finite-domain? (fd/domain 0 1));; => true\n(fd/finite-domain? (fd/interval 0 1));; => false", :_id "62a9f799e4b0b1e3652d7604"}], :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/finite-domain_q"} {:ns "clojure.core.logic.fd", :name "!=", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 786, :examples nil, :notes nil, :arglists ["u v"], :doc "A finite domain constraint. u and v must not be equal. u and v\n must eventually be given domains if vars.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/!="} {:ns "clojure.core.logic.fd", :name "==", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 749, :examples nil, :notes nil, :arglists ["u v"], :doc "A finite domain constraint. u and v must be equal. u and v must\n eventually be given domains if vars.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/=="} {:ns "clojure.core.logic.fd", :name "*c", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 913, :examples nil, :notes nil, :arglists ["u v w"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/*c"} {:ns "clojure.core.logic.fd", :name "ISortedDomain", :file "clojure/core/logic/fd.clj", :type "var", :column 1, :see-alsos nil, :line 23, :examples nil, :notes nil, :arglists [], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/ISortedDomain"} {:ns "clojure.core.logic.fd", :name "-keep-before", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["this n"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/-keep-before"} {:ns "clojure.core.logic.fd", :name "IIntervals", :file "clojure/core/logic/fd.clj", :type "var", :column 1, :see-alsos nil, :line 20, :examples nil, :notes nil, :arglists [], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/IIntervals"} {:ns "clojure.core.logic.fd", :name "+c", :file "clojure/core/logic/fd.clj", :type "function", :column 1, :see-alsos nil, :line 849, :examples nil, :notes nil, :arglists ["u v w"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.fd/+c"} {:ns "clojure.core.logic.pldb", :name "with-dbs", :file "clojure/core/logic/pldb.clj", :type "macro", :column 1, :see-alsos nil, :line 8, :examples nil, :macro true, :notes nil, :arglists ["dbs & body"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/with-dbs"} {:ns "clojure.core.logic.pldb", :name "db", :file "clojure/core/logic/pldb.clj", :type "function", :column 1, :see-alsos nil, :line 125, :examples nil, :notes nil, :arglists ["& facts"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/db"} {:ns "clojure.core.logic.pldb", :name "index-for-query", :file "clojure/core/logic/pldb.clj", :type "function", :column 1, :see-alsos nil, :line 41, :examples nil, :notes nil, :arglists ["s q indexes"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/index-for-query"} {:ns "clojure.core.logic.pldb", :name "indexed?", :file "clojure/core/logic/pldb.clj", :type "function", :column 1, :see-alsos nil, :line 31, :examples nil, :notes nil, :arglists ["v"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/indexed_q"} {:ns "clojure.core.logic.pldb", :name "db-facts", :file "clojure/core/logic/pldb.clj", :type "function", :column 1, :see-alsos nil, :line 122, :examples nil, :notes nil, :arglists ["base-db & facts"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/db-facts"} {:ns "clojure.core.logic.pldb", :name "facts-for", :file "clojure/core/logic/pldb.clj", :type "function", :column 1, :see-alsos nil, :line 16, :examples nil, :notes nil, :arglists ["dbs kname"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/facts-for"} {:ns "clojure.core.logic.pldb", :name "contains-lvar?", :file "clojure/core/logic/pldb.clj", :type "function", :column 1, :see-alsos nil, :line 35, :examples nil, :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/contains-lvar_q"} {:ns "clojure.core.logic.pldb", :name "empty-db", :file "clojure/core/logic/pldb.clj", :type "var", :column 1, :see-alsos nil, :line 6, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/empty-db"} {:ns "clojure.core.logic.pldb", :name "ground?", :file "clojure/core/logic/pldb.clj", :type "function", :column 1, :see-alsos nil, :line 38, :examples nil, :notes nil, :arglists ["s term"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/ground_q"} {:ns "clojure.core.logic.pldb", :name "rel-key", :file "clojure/core/logic/pldb.clj", :type "function", :column 1, :see-alsos nil, :line 23, :examples nil, :notes nil, :arglists ["rel"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/rel-key"} {:ns "clojure.core.logic.pldb", :name "db-rel", :file "clojure/core/logic/pldb.clj", :type "macro", :column 1, :see-alsos nil, :line 48, :examples [{:updated-at 1616351269886, :created-at 1616351269886, :author {:login "brown131", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2651342?v=4"}, :body ";; To defined an indexed argument for a relation.\n\n(db-rel direction ^:index d p)\n", :_id "60579025e4b0b1e3652d74a7"}], :macro true, :notes nil, :arglists ["name & args"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/db-rel"} {:ns "clojure.core.logic.pldb", :name "rel-indexes", :file "clojure/core/logic/pldb.clj", :type "function", :column 1, :see-alsos nil, :line 28, :examples nil, :notes nil, :arglists ["rel"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/rel-indexes"} {:ns "clojure.core.logic.pldb", :name "facts-using-index", :file "clojure/core/logic/pldb.clj", :type "function", :column 1, :see-alsos nil, :line 19, :examples nil, :notes nil, :arglists ["dbs kname index val"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/facts-using-index"} {:ns "clojure.core.logic.pldb", :name "db-retractions", :file "clojure/core/logic/pldb.clj", :type "function", :column 1, :see-alsos nil, :line 128, :examples nil, :notes nil, :arglists ["base-db & retractions"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/db-retractions"} {:ns "clojure.core.logic.pldb", :name "db-fact", :file "clojure/core/logic/pldb.clj", :type "function", :column 1, :see-alsos nil, :line 79, :examples nil, :notes nil, :arglists ["db rel & args"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/db-fact"} {:ns "clojure.core.logic.pldb", :name "with-db", :file "clojure/core/logic/pldb.clj", :type "macro", :column 1, :see-alsos nil, :line 12, :examples nil, :macro true, :notes nil, :arglists ["db & body"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/with-db"} {:ns "clojure.core.logic.pldb", :name "db-retraction", :file "clojure/core/logic/pldb.clj", :type "function", :column 1, :see-alsos [{:created-at 1515676308690, :author {:login "fhur", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/6452323?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "db-fact", :ns "clojure.core.logic.pldb"}, :_id "5a576294e4b0a08026c48cef"}], :line 100, :examples [{:updated-at 1515676270032, :created-at 1515676270032, :author {:login "fhur", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/6452323?v=4"}, :body "; db-retraction is the reverse operation to db-fact. \n; You can think of db-rel as learning a fact and db-retraction as unlearning it.\n\n; Step 1: define a relation\n(db-rel user x)\n\n; Step 2: create a simple DB\n(def my-db (-> empty-db\n (db-fact user \"me\")\n (db-fact user \"you\")))\n;; => {\"user/user_1\" {:clojure.core.logic.pldb/unindexed #{(\"you\") (\"me\")}}}\n\n;; Step 3: retract from \"me\" being a user.\n(db-retraction my-db user \"me\")\n;; => {\"user/user_1\" {:clojure.core.logic.pldb/unindexed #{(\"you\")}}}", :_id "5a57626ee4b0a08026c48cee"}], :notes nil, :arglists ["db rel & args"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.logic.pldb/db-retraction"} {:ns "clojure.core.protocols", :name "IKVReduce", :file "clojure/core/protocols.clj", :type "var", :column 1, :see-alsos nil, :line 175, :examples nil, :notes nil, :arglists [], :doc "Protocol for concrete associative types that can reduce themselves\n via a function of key and val faster than first/next recursion over map\n entries. Called by clojure.core/reduce-kv, and has same\n semantics (just different arg order).", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.protocols/IKVReduce"} {:ns "clojure.core.protocols", :name "Navigable", :file "clojure/core/protocols.clj", :type "var", :column 1, :see-alsos nil, :line 194, :examples nil, :notes nil, :arglists [], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.protocols/Navigable"} {:ns "clojure.core.protocols", :name "nav", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["coll k v"], :doc "return (possibly transformed) v in the context of coll and k (a key/index or nil),\ndefaults to returning v.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.protocols/nav"} {:ns "clojure.core.protocols", :name "Datafiable", :file "clojure/core/protocols.clj", :type "var", :column 1, :see-alsos nil, :line 182, :examples nil, :notes nil, :arglists [], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.protocols/Datafiable"} {:ns "clojure.core.protocols", :name "CollReduce", :file "clojure/core/protocols.clj", :type "var", :column 1, :see-alsos nil, :line 13, :examples nil, :notes nil, :arglists [], :doc "Protocol for collection types that can implement reduce faster than\n first/next recursion. Called by clojure.core/reduce. Baseline\n implementation defined in terms of Iterable.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.protocols/CollReduce"} {:ns "clojure.core.protocols", :name "datafy", :type "function", :see-alsos nil, :examples nil, :notes [{:body "Sean Corfiled gives an overview of the usage of `datafy` and `nav` in the blog post [Clojure 1.10's datafy and nav](https://corfield.org/blog/2018/12/03/datafy-nav/) (3 december 2018).", :created-at 1641131137516, :updated-at 1641131295668, :author {:avatar-url "https://avatars.githubusercontent.com/u/353113?v=4", :account-source "github", :login "claj"}, :_id "61d1ac81e4b0b1e3652d7594"} {:author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=4"}, :updated-at 1641131282256, :created-at 1641131282256, :body "Stuart Halloway gives an example of `datafy` usage in the [Cognitect REBL](https://docs.datomic.com/cloud/other-tools/REBL.html).", :_id "61d1ad12e4b0b1e3652d7595"} {:author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=4"}, :updated-at 1641132127831, :created-at 1641132127831, :body "A full example of a datafy application is [jedi-time](https://github.com/jimpil/jedi-time), which adds datafy- and navigation on the `java.time` objects.", :_id "61d1b05fe4b0b1e3652d7596"}], :arglists ["o"], :doc "return a representation of o as data (default identity)", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.protocols/datafy"} {:ns "clojure.core.protocols", :name "coll-reduce", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["coll f" "coll f val"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.protocols/coll-reduce"} {:ns "clojure.core.protocols", :name "internal-reduce", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["seq f start"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.protocols/internal-reduce"} {:ns "clojure.core.protocols", :name "InternalReduce", :file "clojure/core/protocols.clj", :type "var", :column 1, :see-alsos nil, :line 19, :examples nil, :notes [{:updated-at 1386465477000, :body "http://muhammadkhojaye.blogspot.com", :created-at 1386465477000, :author {:login "peternortan", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c7d95a3a7a7090ffdc29428a2c424b17?r=PG&default=identicon"}, :_id "542692edf6e94c6970522014"}], :arglists [], :doc "Protocol for concrete seq types that can reduce themselves\n faster than first/next recursion. Called by clojure.core/reduce.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.protocols/InternalReduce"} {:ns "clojure.core.protocols", :name "kv-reduce", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["amap f init"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.protocols/kv-reduce"} {:ns "clojure.core.reducers", :name "reduce", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos nil, :line 38, :examples nil, :notes nil, :arglists ["f coll" "f init coll"], :doc "Like core/reduce except:\n When init is not provided, (f) is used.\n Maps are reduced with reduce-kv", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/reduce"} {:added "1.5", :ns "clojure.core.reducers", :name "take", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos nil, :line 201, :examples nil, :notes nil, :arglists ["n" "n coll"], :doc "Ends the reduction of coll after consuming n values.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/take"} {:added "1.5", :ns "clojure.core.reducers", :name "map", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos [{:created-at 1493965139204, :author {:login "chbrown", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/360279?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "mapcat", :ns "clojure.core.reducers"}, :_id "590c1953e4b01f4add58feae"}], :line 128, :examples nil, :notes nil, :arglists ["f" "f coll"], :doc "Applies f to every value in the reduction of coll. Foldable.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/map"} {:added "1.5", :ns "clojure.core.reducers", :name "foldcat", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos [{:created-at 1493963884640, :author {:login "chbrown", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/360279?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "fold", :ns "clojure.core.reducers"}, :_id "590c146ce4b01f4add58feac"}], :line 281, :examples [{:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; Worth remembering that parallel fold in Clojure is enabled for: \n;; vectors, maps and clojure.core.reducers.Cat objects.\n;; r/foldcat returns a \"Cat\", so it can be parallel folded again:\n\n(r/fold + \n (r/foldcat \n (r/filter even? \n (r/foldcat \n (r/map inc (into [] (range 100000)))))))\n;; 2500050000", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1510328583520, :updated-at 1510328990875, :_id "5a05c907e4b0a08026c48cac"} {:updated-at 1522594338253, :created-at 1522594338253, :author {:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}, :body ";; One non-obvious thing about clojure.core.reducers/foldcat is its return type,\n;; which is either clojure.core.reducers.Cat or java.util.ArrayList (!)\n;; depending on the size of the source collection.\n\n(require '[clojure.core.reducers :as r])\n\n(def small-vector (vec (range 10)))\n(def big-vector (vec (range 100000)))\n\n(type (r/foldcat (r/filter odd? small-vector))) ;;=> java.util.ArrayList\n(type (r/foldcat (r/filter odd? big-vector))) ;;=> clojure.core.reducers.Cat\n\n;; Both return types are suited for further reduce-like processing, but they are\n;; not general-purpose data types like proper Clojure collections.\n", :_id "5ac0f222e4b045c27b7fac2d"}], :notes nil, :arglists ["coll"], :doc "Equivalent to (fold cat append! coll)", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/foldcat"} {:added "1.5", :ns "clojure.core.reducers", :name "reducer", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos nil, :line 67, :examples nil, :notes [{:body ";;Beware of this bug\n\n;;These two suppose to be the same:\n\n(transduce (comp (take 10) (partition-all 3)) conj (range))\n;; => [[0 1 2] [3 4 5] [6 7 8] [9]]\n\n\n(reduce conj (r/reducer (range) (comp (take 10) (partition-all 3))))\n;; => [[0 1 2] [3 4 5] [6 7 8]]\n\n;;See https://dev.clojure.org/jira/browse/CLJ-2338\n", :created-at 1521749493579, :updated-at 1522047651605, :author {:avatar-url "https://avatars0.githubusercontent.com/u/132936?v=4", :account-source "github", :login "gzmask"}, :_id "5ab40df5e4b045c27b7fac1e"} {:author {:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}, :updated-at 1522096119969, :created-at 1522096119969, :body "As far as I can see, `clojure.core.reducers/reducer` (since 1.5) is made obsolete by `eduction` (since 1.7), which can do the same and more.", :_id "5ab957f7e4b045c27b7fac26"}], :arglists ["coll xf"], :doc "Given a reducible collection, and a transformation function xf,\n returns a reducible collection, where any supplied reducing\n fn will be transformed by xf. xf is a function of reducing fn to\n reducing fn.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/reducer"} {:added "1.5", :ns "clojure.core.reducers", :name "mapcat", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos [{:created-at 1493965130702, :author {:login "chbrown", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/360279?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "map", :ns "clojure.core.reducers"}, :_id "590c194ae4b01f4add58fead"}], :line 138, :examples nil, :notes nil, :arglists ["f" "f coll"], :doc "Applies f to every value in the reduction of coll, concatenating the result\n colls of (f val). Foldable.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/mapcat"} {:added "1.5", :ns "clojure.core.reducers", :name "cat", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos [{:created-at 1462880260219, :author {:login "achesnais", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6626105?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "cat", :ns "clojure.core"}, :_id "5731c804e4b0b27c121b2154"} {:created-at 1510328149020, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "foldcat", :ns "clojure.core.reducers"}, :_id "5a05c755e4b0a08026c48cab"} {:created-at 1685378209827, :author {:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "concat", :ns "clojure.core"}, :_id "6474d4a1e4b08cf8563f4bc2"}], :line 255, :examples [{:updated-at 1510257522103, :created-at 1510096162999, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; The example showcase use of r/cat to build HashSets (instead \n;; of the default ArrayList) of distinct words in parallel \n;; and then merge all together walking the binary tree produced by r/fold.\n(require '[clojure.core.reducers :as r])\n(require '[clojure.string :refer [lower-case blank? split split-lines]])\n(import 'java.util.HashSet)\n\n(def book\n (-> \"http://www.gutenberg.org/files/2600/2600-0.txt\"\n slurp\n split-lines))\n\n(def r-word (comp\n (r/map lower-case)\n (r/remove blank?)\n (r/map #(re-find #\"\\w+\" %))\n (r/mapcat #(split % #\"\\s+\"))))\n\n(def btree\n (r/fold\n (r/cat #(HashSet.))\n r/append!\n (r-word book)))\n\n(defn merge-tree [root res]\n (cond\n (instance? clojure.core.reducers.Cat root)\n (do (merge-tree (.left root) res) (merge-tree (.right root) res))\n (instance? HashSet root)\n (doto res (.addAll root))\n :else res))\n\n(def distinct-words (merge-tree btree (HashSet.)))\n(count distinct-words)\n;; 17200", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5a023d22e4b0a08026c48c99"}], :notes nil, :arglists ["" "ctor" "left right"], :doc "A high-performance combining fn that yields the catenation of the\n reduced values. The result is reducible, foldable, seqable and\n counted, providing the identity collections are reducible, seqable\n and counted. The single argument version will build a combining fn\n with the supplied identity constructor. Tests for identity\n with (zero? (count x)). See also foldcat.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/cat"} {:added "1.5", :ns "clojure.core.reducers", :name "take-while", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos nil, :line 189, :examples nil, :notes nil, :arglists ["pred" "pred coll"], :doc "Ends the reduction of coll when (pred val) returns logical false.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/take-while"} {:added "1.5", :ns "clojure.core.reducers", :name "remove", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos nil, :line 167, :examples nil, :notes nil, :arglists ["pred" "pred coll"], :doc "Removes values in the reduction of coll for which (pred val)\n returns logical true. Foldable.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/remove"} {:ns "clojure.core.reducers", :name "pool", :file "clojure/core/reducers.clj", :type "var", :column 1, :see-alsos nil, :line 22, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/pool"} {:ns "clojure.core.reducers", :name "CollFold", :file "clojure/core/reducers.clj", :type "var", :column 1, :see-alsos nil, :line 48, :examples nil, :notes nil, :arglists [], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/CollFold"} {:added "1.5", :ns "clojure.core.reducers", :name "folder", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos nil, :line 81, :examples [{:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body "(require '[clojure.core.reducers :as r])\n(r/fold\n (r/monoid merge (constantly {}))\n (fn [m k v] (assoc m k (+ 3 v)))\n (r/folder\n (zipmap (range 100) (range 100))\n (fn [rf] (fn [m k v] (if (zero? (mod k 10)) (rf m k v) m)))))\n;; {0 3, 70 73, 20 23, 60 63, 50 53, 40 43, 90 93, 30 33, 10 13, 80 83}", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1505064428954, :updated-at 1505064553043, :_id "59b575ece4b09f63b945ac6e"}], :notes nil, :arglists ["coll xf"], :doc "Given a foldable collection, and a transformation function xf,\n returns a foldable collection, where any supplied reducing\n fn will be transformed by xf. xf is a function of reducing fn to\n reducing fn.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/folder"} {:added "1.5", :ns "clojure.core.reducers", :name "append!", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos nil, :line 275, :examples nil, :notes nil, :arglists ["acc x"], :doc ".adds x to acc and returns acc", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/append!"} {:ns "clojure.core.reducers", :name "->Cat", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos nil, :line 230, :examples nil, :notes nil, :arglists ["cnt left right"], :doc "Positional factory function for class clojure.core.reducers.Cat.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/->Cat"} {:added "1.5", :ns "clojure.core.reducers", :name "drop", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos nil, :line 215, :examples [{:updated-at 1621653290675, :created-at 1621653290675, :author {:login "andreasguther", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/9425214?v=4"}, :body "Clojure 1.10.3\nuser=> (def coll (range 10))\n#'user/coll\nuser=> coll\n(0 1 2 3 4 5 6 7 8 9)\nuser=> (drop 4 coll)\n(4 5 6 7 8 9)", :_id "60a8772ae4b0b1e3652d7503"}], :notes nil, :arglists ["n" "n coll"], :doc "Elides the first n values from the reduction of coll.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/drop"} {:added "1.5", :ns "clojure.core.reducers", :name "fold", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos [{:created-at 1505066414445, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pmap", :ns "clojure.core"}, :_id "59b57daee4b09f63b945ac70"} {:created-at 1514410031569, :author {:login "jcburley", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/430319?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reduce", :ns "clojure.core"}, :_id "5a44102fe4b0a08026c48ce0"}], :line 51, :examples [{:editors [{:login "xfcjscn", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/4743082?v=4"}], :body "(require '[clojure.core.reducers :as reducers])\n(defn diddly ([xs x] (conj xs x)) ([] []))\n(reducers/fold diddly '(1 2 3 4 5 6)) \n;; [1 2 3 4 5 6] \n\n\n;; CAUTION! This example is buggy, as diddly can NOT be used as combinef\n;; Correct combinef can be `into` as combinef is operating on 2 vectors", :author {:avatar-url "https://avatars.githubusercontent.com/u/5030667?v=3", :account-source "github", :login "davidsiefert"}, :created-at 1463744297516, :updated-at 1524749191933, :_id "573ef729e4b00a9b70be566a"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; word-frequencies on large text\n(require '[clojure.core.reducers :as r] '[clojure.string :as s])\n\n(defn count-occurrences [words]\n (r/fold\n (r/monoid #(merge-with + %1 %2) (constantly {}))\n (fn [m [k cnt]] (assoc m k (+ cnt (get m k 0))))\n (r/map #(vector % 1) words)))\n\n(defn word-count [s]\n (count-occurrences (s/split s #\"\\s+\")))\n\n(def war-and-peace \"http://www.gutenberg.org/files/2600/2600-0.txt\")\n(def book (slurp war-and-peace))\n\n(def freqs (word-count book))\n(freqs \"Andrew\")\n;; 700", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1518468936868, :updated-at 1518469083350, :_id "5a81ff48e4b0316c0f44f8b9"} {:updated-at 1522439008885, :created-at 1522439008885, :author {:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}, :body ";; One pitfall of clojure.core.reducers/fold is that the reducing function must\n;; take either three or two arguments according to whether the foldable\n;; collection is a map or not!\n\n(require '[clojure.core.reducers :as r])\n\n(def my-vector (vec (range 10000)))\n(def my-map (into {} (map (juxt (comp keyword str) identity)) my-vector))\n\n;; Identity folds for vector and map. Notice the differing arities of reducef.\n\n(->> my-vector\n (r/fold (r/monoid into vector)\n (fn [ret v] (conj ret v))) ; <- arity 2\n (= my-vector))\n\n(->> my-map\n (r/fold (r/monoid merge hash-map)\n (fn [ret k v] (assoc ret k v))) ; <- arity 3\n (= my-map))\n\n;; Caution: this behaviour is not documented. It breaks down as soon as you wrap\n;; the map in a reducer/folder.\n", :_id "5abe9360e4b045c27b7fac2b"} {:editors [{:login "enforser", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/5402402?v=4"}], :body ";; This example demonstrates how the partition size used to parallelize\n;; fold can be modified. \n(require '[clojure.core.reducers :as r])\n\n(defn simple-fold \n [partition-size]\n (r/fold partition-size\n + ;; function that returns the init value. (x) => 0\n +\n (r/filter odd?\n (r/map inc\n (r/filter number?\n (range 10000))))))\n\n;; Default partition size.\n(simple-fold 512) \n;;=> 25000000\n\n;; Raises the number of elements from coll that will be processed in each partition.\n(simple-fold 1000) \n;; => 25000000\n\n;; Partition each element to be processed separately.\n(simple-fold 1) \n;; =>> 25000000\n\n;; All of the above return the same result, but they utilize different\n;; sized partitions to achieve parallelization.", :author {:avatar-url "https://avatars1.githubusercontent.com/u/5402402?v=4", :account-source "github", :login "enforser"}, :created-at 1537920358727, :updated-at 1537920400365, :_id "5baacd66e4b00ac801ed9ea8"}], :notes nil, :arglists ["reducef coll" "combinef reducef coll" "n combinef reducef coll"], :doc "Reduces a collection using a (potentially parallel) reduce-combine\n strategy. The collection is partitioned into groups of approximately\n n (default 512), each of which is reduced with reducef (with a seed\n value obtained by calling (combinef) with no arguments). The results\n of these reductions are then reduced with combinef (default\n reducef). combinef must be associative, and, when called with no\n arguments, (combinef) must produce its identity element. These\n operations may be performed in parallel, but the results will\n preserve order.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/fold"} {:added "1.5", :ns "clojure.core.reducers", :name "flatten", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos nil, :line 174, :examples [{:updated-at 1477678517441, :created-at 1477678517441, :author {:login "lifehug", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/689626?v=3"}, :body "user=> (require '[clojure.core.reducers :as r])\n\nuser=> (into [] (r/flatten [1 [2 3 4 5 6 7] 8]))\n[1 2 3 4 5 6 7 8]\n\nuser=> (into [] (r/flatten [0 2 [[2 3] 8 [[100]] nil [[nil]]] -2]))\n[0 2 2 3 8 100 nil nil -2]\n\nuser=> (into [] (r/flatten nil))\n[]\n", :_id "581395b5e4b024b73ca35a1f"}], :notes nil, :arglists ["" "coll"], :doc "Takes any nested combination of sequential things (lists, vectors,\n etc.) and returns their contents as a single, flat foldable\n collection.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/flatten"} {:added "1.5", :ns "clojure.core.reducers", :name "filter", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos nil, :line 154, :examples [{:updated-at 1667792431871, :created-at 1667792431871, :author {:login "iatenine", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4423088?v=4"}, :body ";; lambda provided as predicate: (fn [n] (< n 4))\n;; collection to filter: [1, 2, 3, 4, 5]\n\n(filter (fn [n] (< n 4)) [1, 2, 3, 4, 5]) ;; => (1 2 3)", :_id "63687e2fe4b0b1e3652d7681"}], :notes nil, :arglists ["pred" "pred coll"], :doc "Retains values in the reduction of coll for which (pred val)\n returns logical true. Foldable.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/filter"} {:ns "clojure.core.reducers", :name "fjtask", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos nil, :line 24, :examples nil, :notes nil, :arglists ["f"], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/fjtask"} {:added "1.5", :ns "clojure.core.reducers", :name "monoid", :file "clojure/core/reducers.clj", :type "function", :column 1, :see-alsos nil, :line 287, :examples [{:editors [{:login "danielcompton", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/811954?v=3"}], :body "(require '[clojure.core.reducers :as reducers])\n\n(reducers/fold\n (reducers/monoid + (constantly 0))\n (range 10000))\n;; => 49995000\n\n(reducers/fold\n (reducers/monoid max (constantly Long/MIN_VALUE))\n [1 2 7 10 3 -5])\n;; => 10", :author {:avatar-url "https://avatars1.githubusercontent.com/u/811954?v=3", :account-source "github", :login "danielcompton"}, :created-at 1496113685577, :updated-at 1496113867385, :_id "592ce215e4b0bebe93300ecb"}], :notes nil, :arglists ["op ctor"], :doc "Builds a combining fn out of the supplied operator and identity\n constructor. op must be associative and ctor called with no args\n must return an identity value for it.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/monoid"} {:ns "clojure.core.reducers", :name "coll-fold", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["coll n combinef reducef"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.core.reducers/coll-fold"} {:ns "clojure.core.server", :name "stop-server", :file "clojure/core/server.clj", :type "function", :column 1, :see-alsos nil, :line 125, :examples nil, :notes nil, :arglists ["" "name"], :doc "Stop server with name or use the server-name from *session* if none supplied.\n Returns true if server stopped successfully, nil if not found, or throws if\n there is an error closing the socket.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.server/stop-server"} {:ns "clojure.core.server", :name "repl-init", :file "clojure/core/server.clj", :type "function", :column 1, :see-alsos nil, :line 163, :examples nil, :notes nil, :arglists [""], :doc "Initialize repl in user namespace and make standard repl requires.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.server/repl-init"} {:ns "clojure.core.server", :name "start-server", :file "clojure/core/server.clj", :type "function", :column 1, :see-alsos nil, :line 84, :examples nil, :notes nil, :arglists ["opts"], :doc "Start a socket server given the specified opts:\n :address Host or address, string, defaults to loopback address\n :port Port, integer, required\n :name Name, required\n :accept Namespaced symbol of the accept function to invoke, required\n :args Vector of args to pass to accept function\n :bind-err Bind *err* to socket out stream?, defaults to true\n :server-daemon Is server thread a daemon?, defaults to true\n :client-daemon Are client threads daemons?, defaults to true\n Returns server socket.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.server/start-server"} {:ns "clojure.core.server", :name "start-servers", :file "clojure/core/server.clj", :type "function", :column 1, :see-alsos nil, :line 157, :examples nil, :notes nil, :arglists ["system-props"], :doc "Start all servers specified in the system properties.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.server/start-servers"} {:ns "clojure.core.server", :name "stop-servers", :file "clojure/core/server.clj", :type "function", :column 1, :see-alsos nil, :line 139, :examples nil, :notes nil, :arglists [""], :doc "Stop all servers ignores all errors, and returns nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.server/stop-servers"} {:ns "clojure.core.server", :name "repl-read", :file "clojure/core/server.clj", :type "function", :column 1, :see-alsos nil, :line 169, :examples nil, :notes nil, :arglists ["request-prompt request-exit"], :doc "Enhanced :read hook for repl supporting :repl/quit.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.server/repl-read"} {:ns "clojure.core.server", :name "*session*", :file "clojure/core/server.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 23, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.core.server/*session*"} {:added "1.10", :ns "clojure.core.server", :name "io-prepl", :file "clojure/core/server.clj", :type "function", :column 1, :see-alsos nil, :line 272, :examples nil, :notes nil, :arglists ["& {:keys [valf], :or {valf pr-str}}"], :doc "prepl bound to *in* and *out*, suitable for use with e.g. server/repl (socket-repl).\n :ret and :tap vals will be processed by valf, a fn of one argument\n or a symbol naming same (default pr-str)\n\n Alpha, subject to change.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.server/io-prepl"} {:added "1.10", :ns "clojure.core.server", :name "prepl", :file "clojure/core/server.clj", :type "function", :column 1, :see-alsos nil, :line 191, :examples nil, :notes nil, :arglists ["in-reader out-fn & {:keys [stdin]}"], :doc "a REPL with structured output (for programs)\n reads forms to eval from in-reader (a LineNumberingPushbackReader)\n Closing the input or passing the form :repl/quit will cause it to return\n\n Calls out-fn with data, one of:\n {:tag :ret\n :val val ;;eval result\n :ns ns-name-string\n :ms long ;;eval time in milliseconds\n :form string ;;iff successfully read\n :clojure.error/phase (:execution et al per clojure.main/ex-triage) ;;iff error occurred\n }\n {:tag :out\n :val string} ;chars from during-eval *out*\n {:tag :err\n :val string} ;chars from during-eval *err*\n {:tag :tap\n :val val} ;values from tap>\n\n You might get more than one :out or :err per eval, but exactly one :ret\n tap output can happen at any time (i.e. between evals)\n If during eval an attempt is made to read *in* it will read from in-reader unless :stdin is supplied\n\n Alpha, subject to change.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.server/prepl"} {:ns "clojure.core.server", :name "repl", :file "clojure/core/server.clj", :type "function", :column 1, :see-alsos nil, :line 180, :examples nil, :notes nil, :arglists [""], :doc "REPL with predefined hooks for attachable socket server.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.server/repl"} {:added "1.10", :ns "clojure.core.server", :name "remote-prepl", :file "clojure/core/server.clj", :type "function", :column 1, :see-alsos nil, :line 295, :examples nil, :notes nil, :arglists ["host port in-reader out-fn & {:keys [valf readf], :or {valf read-string, readf (fn* [p1__8961# p2__8962#] (read p1__8961# false p2__8962#))}}"], :doc "Implements a prepl on in-reader and out-fn by forwarding to a\n remote [io-]prepl over a socket. Messages will be read by readf, a\n fn of a LineNumberingPushbackReader and EOF value or a symbol naming\n same (default #(read %1 false %2)),\n :ret and :tap vals will be processed by valf, a fn of one argument\n or a symbol naming same (default read-string). If that function\n throws, :val will be unprocessed.\n\n Alpha, subject to change.", :library-url "https://github.com/clojure/clojure", :href "/clojure.core.server/remote-prepl"} {:added "1.3", :ns "clojure.data", :name "diff", :file "clojure/data.clj", :type "function", :column 1, :see-alsos nil, :line 120, :examples [{:author {:login "joshrotenberg", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/aa968cafce96d1810cb1014c7545d4a5?r=PG&default=identicon"}, :editors [], :body "(use 'clojure.data)\n(def uno {:same \"same\", :different \"one\"})\n(def dos {:same \"same\", :different \"two\", :onlyhere \"whatever\"})\n(diff uno dos)\n=> ({:different \"one\"} {:onlyhere \"whatever\", :different \"two\"} {:same \"same\"})\n;; {different in uno} { different or unique in dos } {same in both}\n(diff {:a 1} {:a 1 :b 2})\n=> (nil {:b 2} {:a 1})\n;; the first contains nothing unique, but only the second contains :b\n;; and both contain :a", :created-at 1321070124000, :updated-at 1321070124000, :_id "542692d6c026201cdc3270d7"} {:body "(diff [1 2 3] [5 9 3 2 3 7]) ;;=> [[1 2] [5 9 nil 2 3 7] [nil nil 3]]\n(diff (set [1 2 3]) (set [5 9 3 2 3 7])) ;;=> [#{1} #{7 9 5} #{3 2}]", :author {:login "vede1", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8151095?v=2"}, :created-at 1414076160639, :updated-at 1414076160639, :_id "54491700e4b03d20a1024276"} {:updated-at 1455883330938, :created-at 1455883167587, :author {:login "zootalures", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4050521?v=3"}, :body ";; To invert a diff you can re-apply diff to its output and then merge this back with the prior state \n;; This works in almost all cases (with the exception of preserving empty maps) \n\n(defn- seqzip\n \"returns a sequence of [[ value-left] [value-right]....] padding with nulls for shorter sequences \"\n [left right]\n (loop [list [] a left b right]\n (if (or (seq a) (seq b))\n (recur (conj list [(first a) (first b)] ) (rest a) (rest b))\n list)))\n\n(defn- recursive-diff-merge\n \" Merge two structures recusively , taking non-nil values from sequences and maps and merging sets\" \n [part-state original-state]\n (cond\n (sequential? part-state) (map (fn [[l r]] (recursive-diff-merge l r)) (seqzip part-state original-state))\n (map? part-state) (merge-with recursive-diff-merge part-state original-state)\n (set? part-state) (set/union part-state original-state)\n (nil? part-state ) original-state\n :default part-state))\n\n(defn undiff\n \"returns the state of x after reversing the changes described by a diff against\n an earlier state (where before and after are the first two elements of the diff)\"\n [x before after]\n (let [[a _ _] (clojure.data/diff x after)]\n (recursive-diff-merge a before)))\n\n;; examples: \n\n;; Simple data types\n(clojure.data/diff :before :after )\n=> [:before :after nil]\n\n(undiff :after :before :after)\n=> :before\n\n;; Lists \n(clojure.data/diff [1 2 3 4] [1 2 3 5] )\n=> [[nil nil nil 4] [nil nil nil 5] [1 2 3]]\n(undiff [1 2 3 5] [nil nil nil 4] [nil nil nil 5] )\n=> (1 2 3 4)\n\n;; Nested complex data structures; \n(clojure.data/diff {:a 1 :b [1 2 3] :c {:d 4}}\n {:a 2 :b [1 2 3 4] :c {:d 3 :e 10}})\n=> ({:c {:d 4}, :a 1} {:c {:d 3, :e 10}, :b [nil nil nil 4], :a 2} {:b [1 2 3]})\n\n(undiff {:a 2 :b [1 2 3 4] :c {:d 3 :e 10}} ; State after diff \n {:c {:d 4}, :a 1} ; first element of diff against previous state\n {:c {:d 3, :e 10}, :b [nil nil nil 4], :a 2}) ; second element of diff \n ; against previous state \n=> {:b [1 2 3], :c {:d 4}, :a 1}\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/4050521?v=3", :account-source "github", :login "zootalures"}], :_id "56c7039fe4b0b41f39d96cce"} {:updated-at 1589309791553, :created-at 1589309791553, :author {:login "Biserkov", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/49756?v=4"}, :body ";; Beware that empty maps get turned into nil\n(clojure.data/diff {:a {:b 1} :c 2} {:a {} :c 2})\n=> ({:a {:b 1}} {:a nil} {:c 2})", :_id "5ebaf15fe4b087629b5a190b"} {:editors [{:login "marcoslimagon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8239564?v=4"}], :body ";; The diff also applies for nested structures\n\n;; Example creating a function that evaluates if a given value is subset of a map\n(defn map-subset? [map subset]\n (let [[_ subset_diff _] (clojure.data/diff map subset)]\n (nil? subset_diff)))\n\n(def a {\"KEY\" {\n :kv1 {:nested \"X\"}\n :kv2 \"Y\"\n }} )\n(def b {\"KEY\" {\n :kv1 {:nested \"X\"}\n }})\n(map-subset? a b)\n\n=> true", :author {:avatar-url "https://avatars.githubusercontent.com/u/8239564?v=4", :account-source "github", :login "marcoslimagon"}, :created-at 1674505567719, :updated-at 1674505657687, :_id "63ceed5fe4b08cf8563f4b6a"}], :notes [{:author {:login "Bost", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/1174677?v=4"}, :updated-at 1585396974568, :created-at 1585396974568, :body "See also https://github.com/lambdaisland/deep-diff2 \"Deep diff Clojure data structures and pretty print the result\"", :_id "5e7f3ceee4b087629b5a18c7"} {:author {:login "huahaiy", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/889685?v=4"}, :updated-at 1594482387999, :created-at 1594482387999, :body "See https://github.com/juji-io/editscript \"Editscript is a library designed to extract the differences between two Clojure/Clojurescript data structures as an 'editscript', which represents the minimal modification necessary to transform one to another\"", :_id "5f09ded3e4b0b1e3652d731e"}], :arglists ["a b"], :doc "Recursively compares a and b, returning a tuple of\n [things-only-in-a things-only-in-b things-in-both].\n Comparison rules:\n\n * For equal a and b, return [nil nil a].\n * Maps are subdiffed where keys match and values differ.\n * Sets are never subdiffed.\n * All sequential things are treated as associative collections\n by their indexes, with results returned as vectors.\n * Everything else (including strings!) is treated as\n an atom and compared for equality.", :library-url "https://github.com/clojure/clojure", :href "/clojure.data/diff"} {:added "1.3", :ns "clojure.data", :name "equality-partition", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["x"], :doc "Implementation detail. Subject to change.", :library-url "https://github.com/clojure/clojure", :href "/clojure.data/equality-partition"} {:added "1.3", :ns "clojure.data", :name "EqualityPartition", :file "clojure/data.clj", :type "var", :column 1, :see-alsos nil, :line 67, :examples nil, :notes nil, :arglists [], :doc "Implementation detail. Subject to change.", :library-url "https://github.com/clojure/clojure", :href "/clojure.data/EqualityPartition"} {:added "1.3", :ns "clojure.data", :name "diff-similar", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["a b"], :doc "Implementation detail. Subject to change.", :library-url "https://github.com/clojure/clojure", :href "/clojure.data/diff-similar"} {:added "1.3", :ns "clojure.data", :name "Diff", :file "clojure/data.clj", :type "var", :column 1, :see-alsos nil, :line 71, :examples nil, :notes nil, :arglists [], :doc "Implementation detail. Subject to change.", :library-url "https://github.com/clojure/clojure", :href "/clojure.data/Diff"} {:ns "clojure.datafy", :name "nav", :file "clojure/datafy.clj", :type "function", :column 1, :see-alsos nil, :line 30, :examples nil, :notes nil, :arglists ["coll k v"], :doc "Returns (possibly transformed) v in the context of coll and k (a\n key/index or nil). Callers should attempt to provide the key/index\n context k for Indexed/Associative/ILookup colls if possible, but not\n to fabricate one e.g. for sequences (pass nil). nav returns the\n value of clojure.core.protocols/nav.", :library-url "https://github.com/clojure/clojure", :href "/clojure.datafy/nav"} {:ns "clojure.datafy", :name "datafy", :file "clojure/datafy.clj", :type "function", :column 1, :see-alsos nil, :line 15, :examples [{:updated-at 1641146617559, :created-at 1641146617559, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=4"}, :body ";; default impl is the identity\n(datafy {:message \"Hello\"})\n=>\n{:message \"Hello\"}\n\n;; exceptions default datafy impl is `Throwable->map`\n(datafy (ex-info \"An Exception\" {:msg \"something went wrong\"}))\n{:cause \"An Exception\",\n :data {:msg \"something went wrong\"}\n :via\n [{:type clojure.lang.ExceptionInfo,\n :message \"An Exception\",\n :data {:msg \"something went wrong\"},\n :at [user$eval16337 invokeStatic \"form-init3462716552974711523.clj\" 120]}],\n :trace\n [[user$eval16337 invokeStatic \"form-init3462716552974711523.clj\" 120]\n [user$eval16337 invoke \"form-init3462716552974711523.clj\" 120]\n [clojure.lang.Compiler eval \"Compiler.java\" 7181]\n ,,,\n [clojure.lang.AFn run \"AFn.java\" 22]\n [java.lang.Thread run \"Thread.java\" 833]]}", :_id "61d1e8f9e4b0b1e3652d7597"} {:editors [{:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=4"}], :body ";; add a (bogus) Datafy implementation for java.util.Date\n\n(require '[clojure.core.protocols :as p])\n(require '[clojure.datafy :as d])\n\n(extend-protocol p/Datafiable\n java.util.Date\n (datafy [d]\n {:type 'Date\n :timestamp (.getTime d)}))\n\n(d/datafy (java.util.Date.))\n;;=> {:type Date, :timestamp 1641145865991}\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/353113?v=4", :account-source "github", :login "claj"}, :created-at 1641147412716, :updated-at 1641219235911, :_id "61d1ec14e4b0b1e3652d7598"} {:updated-at 1671991609458, :created-at 1641147941988, :author {:login "claj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/353113?v=4"}, :body ";; adding a data representation to a java.io.File\n\n(require '[clojure.core.protocols :as p])\n(require '[clojure.datafy :as d])\n\n(extend-protocol p/Datafiable\n java.io.File\n (datafy [f]\n ;; keep the file-object as the metadata\n\n ;; This actually doesn't work\n ;; with-meta throws following exception\n ;; class java.io.File cannot be cast to class clojure.lang.IPersistentMap\n ;; see with-meta docs -> https://clojuredocs.org/clojure.datafy/datafy\n (with-meta \n {:exists (.exists f)\n :length (.length f)\n :last-modified (.lastModified f)\n :path (.toString f)}\n f)))\n\n(d/datafy (java.io.File. \"/home/alfred/todo.txt\"))\n;;=> {:exists true,\n;; :length 28850,\n;; :last-modified 1641082627553,\n;; :path \"/home/alfred/todo.txt\"}", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/353113?v=4", :account-source "github", :login "claj"} {:login "siddharthjain-in", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6537820?v=4"} {:avatar-url "https://avatars.githubusercontent.com/u/1427311?v=4", :account-source "github", :login "SergeyKozachenko"} {:login "rgkirch", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6143833?v=4"}], :_id "61d1ee25e4b0b1e3652d7599"}], :notes nil, :arglists ["x"], :doc "Attempts to return x as data.\n datafy will return the value of clojure.core.protocols/datafy. If\n the value has been transformed and the result supports\n metadata, :clojure.datafy/obj will be set on the metadata to the\n original value of x, and :clojure.datafy/class to the name of the\n class of x, as a symbol.", :library-url "https://github.com/clojure/clojure", :href "/clojure.datafy/datafy"} {:added "1.5", :ns "clojure.edn", :name "read", :file "clojure/edn.clj", :type "function", :column 1, :see-alsos [{:created-at 1582146666132, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "read-string", :ns "clojure.edn"}, :_id "5e4da46ae4b0ca44402ef83f"}], :line 14, :examples [{:editors [{:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}], :body ";; See one of the examples for clojure.core/pr for some uncommon Clojure values\n;; that cannot be printed then read back to get the original values (or in\n;; some cases, cannot be read back at all).\n\n;; If you wish to transmit data that may contain such values, one suggestion\n;; is to use the transit library: https://github.com/cognitect/transit-format", :author {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}, :created-at 1470508582724, :updated-at 1470754331719, :_id "57a62e26e4b0bafd3e2a04cb"} {:editors [{:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}], :body ";; Note that it is not possible to pass the result of (clojure.java.io/reader) \n;; directly to (clojure.edn/read):\n(require '[clojure.java.io :as io] '[clojure.edn :as edn])\n=> nil\n(edn/read (io/reader (.getBytes \":edn\")))\nClassCastException java.io.BufferedReader cannot be cast to java.io.PushbackReader\n\n;; Instead, you need to construct a java.io.PushbackReader instance\n;; and pass that to (edn/read):\n(edn/read (java.io.PushbackReader. (io/reader (.getBytes \":edn\"))))\n=> :edn\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/94482?v=3", :account-source "github", :login "timgilbert"}, :created-at 1470759663495, :updated-at 1470842100437, :_id "57aa02efe4b0bafd3e2a04d1"} {:editors [{:login "elias94", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8095533?v=4"}], :body ";; If you need to distinguish between I/O errors (permission denied, etc)\n;; and syntax errors in the EDN itself (eg, unbalanced parentheses), you'll\n;; want to catch different exceptions from (edn/read):\n\n(defn load-edn\n \"Load edn from an io/reader source (filename or io/resource).\"\n [source]\n (try\n (with-open [r (io/reader source)]\n (edn/read (java.io.PushbackReader. r)))\n\n (catch java.io.IOException e\n (printf \"Couldn't open '%s': %s\\n\" source (.getMessage e)))\n (catch RuntimeException e\n (printf \"Error parsing edn file '%s': %s\\n\" source (.getMessage e)))))", :author {:avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4", :account-source "github", :login "timgilbert"}, :created-at 1516827524686, :updated-at 1629516163850, :_id "5a68f384e4b09621d9f53a79"} {:updated-at 1619537620688, :created-at 1619111247295, :author {:login "seltzer1717", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1911117?v=4"}, :body ";; At some point you'll want to serialize and deserialize java.time.LocalDate.\n;; Here's how:\n\n(defn localdate-rdr\n \"Takes serialized Java object, tests for LocalDate, and returns LocalDate object.\"\n [[clazz _ object-string :as input]] ;; [java.time.LocalDate 861096493 \"2021-04-22\"]\n (if (= 'java.time.LocalDate clazz)\n ;; LocalDate string will be of form yyyy-mm-dd\n ;; which also matches the parse function.\n (java.time.LocalDate/parse object-string)\n ;; just returns input if serialized object is not LocalDate\n input))\n\n(defn test-localdate-rdr\n []\n (let [today (java.time.LocalDate/now)\n ;; seralized -> \"#object[java.time.LocalDate 0x4479783b \\\"2021-04-22\\\"]\"\n serialized (pr-str today)\n deserialized (clojure.edn/read {:readers {'object localdate-rdr}}\n (java.io.PushbackReader.\n (java.io.StringReader. serialized)))]\n (.toString (.plusDays deserialized 1))))\n\nuser=> (test-localdate-rdr) \n\"2021-04-23\" ;; Today was 2021-04-22\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/1911117?v=4", :account-source "github", :login "seltzer1717"}], :_id "6081ad4fe4b0b1e3652d74cf"}], :notes [{:author {:login "rmoehn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/311879?v=3"}, :updated-at 1436251602311, :created-at 1436251602311, :body "For everyone struggling to provide custom reader functions to\n`clojure.edn/read`: _you cannot do that through `data_readers.clj`_.\n`data_readers.clj` can be used to provide custom reader functions for\n`clojure.core/read` and `clojure.core/read-string`, but not `clojure.edn/read`\nand `clojure.edn/read-string`.\n\nYou look carefully and you'll find that the official documentation does say so:\nif you don't supply a map of `:readers`, ‘only the `default-data-readers` will\nbe used’. But the information from `data_readers.clj` ends up in\n`*data-readers*` not `default-data-readers`. However, you'd have to look\n_very_ carefully to find this out.\n\n(If you're not interested in silly stories, you can skip the following two\nparagraphs and continue with the last.)\n\nNow you might think: ‘then I'll just say `(edn/read-string {:readers\n*data-readers*} )`’. On the first try this will probably fail, because\nyou forgot to `require` the namespaces where the reader functions live. Okay,\nyou've fixed that………\n\nBrowsing from your smartphone now? I know, your home directory just got wiped.\nAnd the external drive with the backups that's always plugged in to your machine\nas well. Why's that? Well, the procedures from `clojure.edn` are supposed to be\nsafe, to not execute any code, so that you can use them with data from untrusted\nsources. If you do want to have code executed (only from trusted sources, of\ncourse), you use the corresponding procedures from `clojure.core`. Now, there\nare people who know about `data_readers.clj` only being used by\n`clojure.core/read` and `clojure.core/read-string`, which aren't safe. So they\ndon't make their reader functions safe either. `guten-tag.core/read-tagged-val`\nis such an example. It calls `eval` on the data it is passed. That means, if you\nuse it with `clojure.edn/read` or `clojure.edn/read-string`, those will become\nas unsafe as their `clojure.core` counterparts.\n\nSorry for the long story. The moral is: have a very careful look at the reader\nfunctions you provide to the procedures from `clojure.edn`. If they execute code\nthat's passed to them, all safety is lost.\n", :_id "559b75d2e4b020189d740549"}], :arglists ["" "stream" "opts stream"], :doc "Reads the next object from stream, which must be an instance of\n java.io.PushbackReader or some derivee. stream defaults to the\n current value of *in*.\n\n Reads data in the edn format (subset of Clojure data):\n http://edn-format.org\n\n opts is a map that can include the following keys:\n :eof - value to return on end-of-file. When not supplied, eof throws an exception.\n :readers - a map of tag symbols to data-reader functions to be considered before default-data-readers.\n When not supplied, only the default-data-readers will be used.\n :default - A function of two args, that will, if present and no reader is found for a tag,\n be called with the tag and the value.", :library-url "https://github.com/clojure/clojure", :href "/clojure.edn/read"} {:added "1.5", :ns "clojure.edn", :name "read-string", :file "clojure/edn.clj", :type "function", :column 1, :see-alsos [{:created-at 1412284709546, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.edn", :name "read", :library-url "https://github.com/clojure/clojure"}, :_id "542dc125e4b05f4d257a2994"} {:created-at 1412284813516, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.core", :name "prn-str", :library-url "https://github.com/clojure/clojure"}, :_id "542dc18de4b05f4d257a2998"} {:created-at 1422653108103, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=2"}, :to-var {:ns "clojure.core", :name "read-string", :library-url "https://github.com/clojure/clojure"}, :_id "54cbf6b4e4b0e2ac61831cf1"} {:created-at 1422653117945, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=2"}, :to-var {:ns "clojure.main", :name "load-script", :library-url "https://github.com/clojure/clojure"}, :_id "54cbf6bde4b081e022073c3d"} {:created-at 1661550967348, :author {:login "djblue", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1986211?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "tagged-literal", :ns "clojure.core"}, :_id "63094177e4b0b1e3652d7657"}], :line 37, :examples [{:body ";; The following code is a subset of that found at\n;; http://www.compoundtheory.com/clojure-edn-walkthrough\n;; It illustrates the fact that the readers \n;; 'read' and 'read-string' have symmetric writers\n;; 'prn' and 'prn-str'.\n\n(ns edn-example.core\n (require [clojure.edn :as edn]))\n \n(def sample-map {:foo \"bar\" :bar \"foo\"})\n \n;; Here you can see that the 'prn-str' is the writer...\n(defn convert-sample-map-to-edn\n \"Converting a Map to EDN\"\n []\n ;; yep, converting a map to EDN is that simple\"\n (prn-str sample-map))\n \n(println \"Let's convert a map to EDN: \" (convert-sample-map-to-edn))\n;=> Let's convert a map to EDN: {:foo \"bar\", :bar \"foo\"}\n \n;; ...and the reader is 'read-string'\n(println \"Now let's covert the map back: \" (edn/read-string (convert-sample-map-to-edn)))\n;=> Now let's covert the map back: {:foo bar, :bar foo}", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1412284690591, :updated-at 1412285328892, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}], :_id "542dc112e4b05f4d257a2993"} {:updated-at 1504691868756, :created-at 1504691868756, :author {:login "humorless", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/3061798?v=4"}, :body ";; The following demonstrates the use case of edn built-in tagged elements\nuser=> (class (clojure.edn/read-string \"#inst \\\"1985-04-12T23:20:50.52Z\\\"\"))\njava.util.Date\n\n", :_id "59afc69ce4b09f63b945ac60"} {:updated-at 1604505958870, :created-at 1510500744747, :author {:login "Atsman", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/3405704?v=4"}, :body ";; if you want to specify custom processing of some field add tag and function which process it\n;; let's assume we have edn with some relative paths and want to make them absolute\n\n(def config \"{:k8s-path #path \\\"./infra/k8s\\\"}\")\n\n(defn absolute [path] \"/users/some_user/project/k8s-path\")\n\n(edn/read-string {:readers {'path absolute}} config)\n\n{:k8s-path \"/users/some_user/project/k8s-path\"}", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/3405704?v=4", :account-source "github", :login "Atsman"} {:login "dosbol", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/6149147?v=4"}], :_id "5a086988e4b0a08026c48cb4"} {:editors [{:login "manojarya", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/2968153?v=4"}], :body ";; following example adds a custom data-reader which dynamically resolves value\n;; of a property from a lookup map. Falls back on default value if specified.\n\n(defn lookup-reader [lookup-map]\n (fn [v]\n (let [[k default-value] (if (sequential? v)\n v\n [v nil])]\n (get lookup-map k default-value))))\n\n;; returns readers map of tag symbols and handler functions\n(defn readers [lookup-map]\n {:readers {'prop (lookup-reader lookup-map)}})\n\n;; DB_HOST value is resolved while DB_PORT will be default\n(edn/read-string (readers {\"DB_HOST\" \"db-server1\"}) \"{:host #prop [\\\"DB_HOST\\\" \\\"localhost\\\"] :port #prop [\\\"DB_PORT\\\" 42]}\")\n;; {:host \"db-server1\", :port 42}", :author {:avatar-url "https://avatars0.githubusercontent.com/u/2968153?v=4", :account-source "github", :login "manojarya"}, :created-at 1569410505522, :updated-at 1569568738213, :_id "5d8b4dc9e4b0ca44402ef7c0"}], :notes nil, :arglists ["s" "opts s"], :doc "Reads one object from the string s. Returns nil when s is nil or empty.\n\n Reads data in the edn format (subset of Clojure data):\n http://edn-format.org\n\n opts is a map as per clojure.edn/read", :library-url "https://github.com/clojure/clojure", :href "/clojure.edn/read-string"} {:added "1.0", :ns "clojure.inspector", :name "inspect-table", :file "clojure/inspector.clj", :type "function", :column 1, :see-alsos [{:created-at 1331449134000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.pprint", :name "print-table", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aff"} {:created-at 1331449142000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.inspector", :name "inspect-tree", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b00"}], :line 100, :examples [{:updated-at 1438202947024, :created-at 1438202947024, :author {:login "lildata", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7280019?v=3"}, :body "(use 'clojure.inspector)\n(inspect-table [{:a 1 :b 2 :c 3}{:a 4 :b 5 :c 6}])", :_id "55b93c43e4b03580923b00d8"} {:updated-at 1545395763248, :created-at 1545395763248, :author {:login "sanel", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/213914?v=4"}, :body ";; display every element type alongside value in table\nuser=> (inspect-table\n (map #(vector (type %) %)\n [1 \"something\" \\c (java.io.File. \"/tmp/x\") 0.12 1234]))", :_id "5c1cde33e4b0ca44402ef5f3"}], :notes nil, :arglists ["data"], :doc "creates a graphical (Swing) inspector on the supplied regular\n data, which must be a sequential data structure of data structures\n of equal length", :library-url "https://github.com/clojure/clojure", :href "/clojure.inspector/inspect-table"} {:ns "clojure.inspector", :name "atom?", :file "clojure/inspector.clj", :type "function", :column 1, :see-alsos [{:created-at 1341044327000, :author {:login "klauern", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/76c55292df5e9df9042eaf89ac35954b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "isa?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d24"}], :line 19, :examples [{:author {:login "OnesimusUnbound", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fa4c391db0d2d1744cc2cd0d787dd3d?r=PG&default=identicon"}, :editors [], :body ";; atom? returns true if the form passed does not \n;; implement IPersistentCollection. The atom referred \n;; here is not the atom used in managing mutable state \n\nuser=> (use `[clojure.inspector :include (atom?)])\n\nuser=> (atom? 1)\ntrue\n\nuser=> (atom? \\a)\ntrue\n\nuser=> (atom? \"hello world\")\ntrue\n\nuser=> (atom? :keyword)\ntrue\n\nuser=> (atom? nil)\ntrue\n\nuser=> (atom? '())\nfalse\n\nuser=> (atom? [1, 3, 5])\nfalse\n\nuser=> (atom? #{\\a \\e \\i \\o \\u})\nfalse\n\nuser=> (atom? {:x 16 :y 25})\nfalse", :created-at 1313787533000, :updated-at 1313787533000, :_id "542692d0c026201cdc326eb1"}], :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.inspector/atom_q"} {:ns "clojure.inspector", :name "list-provider", :file "clojure/inspector.clj", :type "var", :column 1, :see-alsos nil, :line 112, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.inspector/list-provider"} {:ns "clojure.inspector", :name "is-leaf", :file "clojure/inspector.clj", :type "var", :column 1, :see-alsos nil, :line 31, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.inspector/is-leaf"} {:ns "clojure.inspector", :name "old-table-model", :file "clojure/inspector.clj", :type "function", :column 1, :see-alsos nil, :line 72, :examples nil, :notes nil, :arglists ["data"], :library-url "https://github.com/clojure/clojure", :href "/clojure.inspector/old-table-model"} {:ns "clojure.inspector", :name "tree-model", :file "clojure/inspector.clj", :type "function", :column 1, :see-alsos nil, :line 56, :examples nil, :notes nil, :arglists ["data"], :library-url "https://github.com/clojure/clojure", :href "/clojure.inspector/tree-model"} {:added "1.0", :ns "clojure.inspector", :name "inspect", :file "clojure/inspector.clj", :type "function", :column 1, :see-alsos nil, :line 154, :examples [{:updated-at 1545395525526, :created-at 1545395525526, :author {:login "sanel", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/213914?v=4"}, :body ";; display Swing table with value and value type\nuser=> (inspect \"something\")\n\n;; display every element (with index) in separate Swing table row\nuser=> (inspect [1 2 3])", :_id "5c1cdd45e4b0ca44402ef5f2"} {:updated-at 1586829405546, :created-at 1586829405546, :author {:login "staypufd", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/10730?v=4"}, :body ";; display all the attributes of the complex Java object (Swing JFrame in \n;; the example).\nuser=> \n(clojure.inspector/inspect \n (bean \n (javax.swing.JFrame. \"hello\")))\n\n", :_id "5e95185de4b087629b5a18d3"}], :notes nil, :arglists ["x"], :doc "creates a graphical (Swing) inspector on the supplied object", :library-url "https://github.com/clojure/clojure", :href "/clojure.inspector/inspect"} {:ns "clojure.inspector", :name "collection-tag", :file "clojure/inspector.clj", :type "function", :column 1, :see-alsos nil, :line 22, :examples [{:updated-at 1477012162986, :created-at 1477012162986, :author {:login "dalzony", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/562341?v=3"}, :body "user=> (clojure.inspector/collection-tag (first {:a 1 :b 2}))\n;;=> :entry\nuser=> (clojure.inspector/collection-tag {:a 1})\n;;=> :seqable\nuser=> (clojure.inspector/collection-tag #{:a 1})\n;;=> :seqable\nuser=> (clojure.inspector/collection-tag [1 2])\n;;=> :seq\nuser=> (clojure.inspector/collection-tag :a)\n;;=> :atom\n", :_id "58096ac2e4b001179b66bdd8"}], :notes nil, :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.inspector/collection-tag"} {:ns "clojure.inspector", :name "get-child-count", :file "clojure/inspector.clj", :type "var", :column 1, :see-alsos nil, :line 33, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.inspector/get-child-count"} {:added "1.0", :ns "clojure.inspector", :name "inspect-tree", :file "clojure/inspector.clj", :type "function", :column 1, :see-alsos [{:created-at 1331449151000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.inspector", :name "inspect-table", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f47"}], :line 91, :examples [{:updated-at 1545395305082, :created-at 1545395305082, :author {:login "sanel", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/213914?v=4"}, :body ";; opens Swing window with interactive tree component\nuser=> (inspect-tree '(a (1 2) b (3 4) c (5 6)))\n\n;; you can also visualize complex nested maps\nuser=> (inspect-tree {:a {:aa [1 2 3]\n :ab 3}\n :b 1\n :c {:ca {:caa [{:foo 1}\n {:foo 2}]}}})\n", :_id "5c1cdc69e4b0ca44402ef5f1"}], :notes nil, :arglists ["data"], :doc "creates a graphical (Swing) inspector on the supplied hierarchical data", :library-url "https://github.com/clojure/clojure", :href "/clojure.inspector/inspect-tree"} {:ns "clojure.inspector", :name "get-child", :file "clojure/inspector.clj", :type "var", :column 1, :see-alsos nil, :line 32, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.inspector/get-child"} {:ns "clojure.inspector", :name "list-model", :file "clojure/inspector.clj", :type "function", :column 1, :see-alsos nil, :line 129, :examples nil, :notes nil, :arglists ["provider"], :library-url "https://github.com/clojure/clojure", :href "/clojure.inspector/list-model"} {:ns "clojure.inspector", :name "table-model", :file "clojure/inspector.clj", :type "var", :column 1, :see-alsos nil, :line 139, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.inspector/table-model"} {:ns "clojure.instant", :name "validated", :file "clojure/instant.clj", :type "function", :column 1, :see-alsos nil, :line 139, :examples nil, :notes nil, :arglists ["new-instance"], :doc "Return a function which constructs an instant by calling constructor\nafter first validating that those arguments are in range and otherwise\nplausible. The resulting function will throw an exception if called\nwith invalid arguments.", :library-url "https://github.com/clojure/clojure", :href "/clojure.instant/validated"} {:ns "clojure.instant", :name "read-instant-timestamp", :file "clojure/instant.clj", :type "function", :column 1, :see-alsos [{:created-at 1617958817276, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "read-instant-date", :ns "clojure.instant"}, :_id "607017a1e4b0b1e3652d74bd"}], :line 288, :examples [{:updated-at 1583436804622, :created-at 1583436804622, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body "(clojure.instant/read-instant-date \"2020-03-23T01:17Z\")\n;=> #inst \"2020-03-23T01:17:00.000-00:00\"", :_id "5e615404e4b087629b5a18ba"}], :notes nil, :arglists ["cs"], :doc "To read an instant as a java.sql.Timestamp, bind *data-readers* to a\nmap with this var as the value for the 'inst key. Timestamp preserves\nfractional seconds with nanosecond precision. The timezone offset will\nbe used to convert into UTC.", :library-url "https://github.com/clojure/clojure", :href "/clojure.instant/read-instant-timestamp"} {:ns "clojure.instant", :name "read-instant-calendar", :file "clojure/instant.clj", :type "function", :column 1, :see-alsos nil, :line 281, :examples nil, :notes nil, :arglists ["cs"], :doc "To read an instant as a java.util.Calendar, bind *data-readers* to a map with\nthis var as the value for the 'inst key. Calendar preserves the timezone\noffset.", :library-url "https://github.com/clojure/clojure", :href "/clojure.instant/read-instant-calendar"} {:ns "clojure.instant", :name "read-instant-date", :file "clojure/instant.clj", :type "function", :column 1, :see-alsos [{:created-at 1587829080311, :author {:login "kyptin", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/254619?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "parse-timestamp", :ns "clojure.instant"}, :_id "5ea45958e4b087629b5a18e8"} {:created-at 1617958825769, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "read-instant-timestamp", :ns "clojure.instant"}, :_id "607017a9e4b0b1e3652d74be"}], :line 274, :examples [{:editors [{:login "cassc", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1858231?v=4"}], :body ";; Parse a string with RFC3339-like timestamp to get a java.util.Date object\n\n(use 'clojure.instant)\n(read-instant-date \"2017-08-23T10:22:22\")\n;; #inst \"2017-08-23T10:22:22.000-00:00\"\n\n;; If no timezone info is included in the input string, GMT is assumed.\n;; See clojure.instant/parse-timestamp for the timestamp pattern supported.", :author {:avatar-url "https://avatars2.githubusercontent.com/u/1858231?v=4", :account-source "github", :login "cassc"}, :created-at 1504252223491, :updated-at 1504252436727, :_id "59a9113fe4b09f63b945ac5c"}], :notes nil, :arglists ["cs"], :doc "To read an instant as a java.util.Date, bind *data-readers* to a map with\nthis var as the value for the 'inst key. The timezone offset will be used\nto convert into UTC.", :library-url "https://github.com/clojure/clojure", :href "/clojure.instant/read-instant-date"} {:ns "clojure.instant", :name "parse-timestamp", :file "clojure/instant.clj", :type "function", :column 1, :see-alsos [{:created-at 1583436680072, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "read-instant-timestamp", :ns "clojure.instant"}, :_id "5e615388e4b087629b5a18b8"} {:created-at 1583436695565, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "read-instant-date", :ns "clojure.instant"}, :_id "5e615397e4b087629b5a18b9"}], :line 53, :examples [{:editors [{:login "kyptin", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/254619?v=4"}], :body "(require '[clojure.instant :as instant])\n(instant/parse-timestamp vector \"2020-04-25T15:09:16.437Z\")\n;; => [2020 4 25 15 9 16 437000000 0 0 0]\n\n;; But the other functions in this namespace might be more convenient, e.g.:\n(instant/read-instant-date \"2020-04-25T15:09:16.437Z\")\n;; => #inst \"2020-04-25T15:09:16.437-00:00\"", :author {:avatar-url "https://avatars1.githubusercontent.com/u/254619?v=4", :account-source "github", :login "kyptin"}, :created-at 1587829024785, :updated-at 1587956901157, :_id "5ea45920e4b087629b5a18e7"}], :notes nil, :arglists ["new-instant cs"], :doc "Parse a string containing an RFC3339-like like timestamp.\n\nThe function new-instant is called with the following arguments.\n\n min max default\n --- ------------ -------\n years 0 9999 N/A (s must provide years)\n months 1 12 1\n days 1 31 1 (actual max days depends\n hours 0 23 0 on month and year)\n minutes 0 59 0\n seconds 0 60 0 (though 60 is only valid\n nanoseconds 0 999999999 0 when minutes is 59)\n offset-sign -1 1 0\n offset-hours 0 23 0\n offset-minutes 0 59 0\n\nThese are all integers and will be non-nil. (The listed defaults\nwill be passed if the corresponding field is not present in s.)\n\nGrammar (of s):\n\n date-fullyear = 4DIGIT\n date-month = 2DIGIT ; 01-12\n date-mday = 2DIGIT ; 01-28, 01-29, 01-30, 01-31 based on\n ; month/year\n time-hour = 2DIGIT ; 00-23\n time-minute = 2DIGIT ; 00-59\n time-second = 2DIGIT ; 00-58, 00-59, 00-60 based on leap second\n ; rules\n time-secfrac = '.' 1*DIGIT\n time-numoffset = ('+' / '-') time-hour ':' time-minute\n time-offset = 'Z' / time-numoffset\n\n time-part = time-hour [ ':' time-minute [ ':' time-second\n [time-secfrac] [time-offset] ] ]\n\n timestamp = date-year [ '-' date-month [ '-' date-mday\n [ 'T' time-part ] ] ]\n\nUnlike RFC3339:\n\n - we only parse the timestamp format\n - timestamp can elide trailing components\n - time-offset is optional (defaults to +00:00)\n\nThough time-offset is syntactically optional, a missing time-offset\nwill be treated as if the time-offset zero (+00:00) had been\nspecified.\n", :library-url "https://github.com/clojure/clojure", :href "/clojure.instant/parse-timestamp"} {:added "1.2", :ns "clojure.java.browse", :name "browse-url", :file "clojure/java/browse.clj", :type "function", :column 1, :see-alsos [{:created-at 1420901028632, :author {:login "AeroNotix", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/975962?v=3"}, :to-var {:ns "clojure.java.browse", :name "*open-url-script*", :library-url "https://github.com/clojure/clojure"}, :_id "54b13aa4e4b081e022073bfe"}], :line 66, :examples [{:author {:login "abhin4v", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4d29918c109bc75d2a1fd8420660d72b?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (use 'clojure.java.browse)\n\nuser=> (browse-url \"http://clojuredocs.org\")\n", :created-at 1283270758000, :updated-at 1285494149000, :_id "542692d0c026201cdc326eb2"} {:body ";;It's funny.... Open bash\n\n(browse-url \"/bin/bash\")", :author {:login "LMSlay", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8565224?v=3"}, :created-at 1427832992939, :updated-at 1427832992939, :_id "551b00a0e4b056ca16cfecfd"}], :notes nil, :arglists ["url"], :doc "Open url in a browser", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.browse/browse-url"} {:ns "clojure.java.browse", :name "*open-url-script*", :file "clojure/java/browse.clj", :type "var", :column 1, :see-alsos [{:created-at 1420901010720, :author {:login "AeroNotix", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/975962?v=3"}, :to-var {:ns "clojure.java.browse", :name "browse-url", :library-url "https://github.com/clojure/clojure"}, :_id "54b13a92e4b081e022073bfd"}], :dynamic true, :line 40, :examples [{:body ";; Sets the script used when calling browse-url\n;;\n;; It needs to be an atom because internally the browse-url function\n;; dereferences *open-url-script*\n(binding [clojure.java.browse/*open-url-script* (atom \"/usr/bin/ls\")]\n (clojure.java.browse/browse-url \"http://google.com\"))", :author {:login "AeroNotix", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/975962?v=3"}, :created-at 1420900983542, :updated-at 1420900983542, :_id "54b13a77e4b0e2ac61831ca4"}], :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.java.browse/*open-url-script*"} {:ns "clojure.java.io", :name "default-streams-impl", :file "clojure/java/io.clj", :type "var", :column 1, :see-alsos nil, :line 164, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/default-streams-impl"} {:added "1.2", :ns "clojure.java.io", :name "make-output-stream", :type "function", :see-alsos [{:created-at 1435101653324, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:ns "clojure.java.io", :name "writer", :library-url "https://github.com/clojure/clojure"}, :_id "5589e9d5e4b0fad27b85f921"}], :examples nil, :notes nil, :arglists ["x opts"], :doc "Creates a BufferedOutputStream. See also IOFactory docs.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/make-output-stream"} {:added "1.2", :ns "clojure.java.io", :name "make-parents", :file "clojure/java/io.clj", :type "function", :column 1, :see-alsos [{:created-at 1507587681180, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "file", :ns "clojure.java.io"}, :_id "59dbf661e4b03026fe14ea59"}], :line 438, :examples [{:body "(let [file-name \"path/to/whatever.txt\"]\n (make-parents file-name)\n (spit file-name \"whatever\"))", :author {:login "mattvvhat", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/367789?v=3"}, :created-at 1434030825430, :updated-at 1434030825430, :_id "557992e9e4b01ad59b65f4f0"}], :notes nil, :arglists ["f & more"], :doc "Given the same arg(s) as for file, creates all parent directories of\n the file they represent.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/make-parents"} {:added "1.2", :ns "clojure.java.io", :name "delete-file", :file "clojure/java/io.clj", :type "function", :column 1, :see-alsos [{:created-at 1329988386000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "file", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cb9"} {:created-at 1329988390000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "copy", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cba"}], :line 430, :examples [{:author {:login "shockbob", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/16046bb426a0fd26cbc876970fd8f746?r=PG&default=identicon"}, :editors [], :body ";; create a file using spit, then show its contents using slurp\n;; delete it and verify that it has been deleted by trying to print its\n;; contents again\n\nuser=> (require '[clojure.java.io :as io])\nnil\nuser=> (spit \"stuff.txt\" \"blurp\")\nnil\nuser=> (println (slurp \"stuff.txt\"))\nblurp\nnil\nuser=> (io/delete-file \"stuff.txt\")\ntrue\nuser=> (println (slurp \"stuff.txt\"))\njava.io.FileNotFoundException: stuff.txt (The system cannot find the file specif\nied) (NO_SOURCE_FILE:0)\nuser=>", :created-at 1313906436000, :updated-at 1313906436000, :_id "542692d0c026201cdc326eb9"} {:editors [{:login "zjliu1984", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1556007?v=3"}], :body "(require '[clojure.java.io :as io])\n\nuser> (io/delete-file \"d:/code/python/file-which-does-not-exist.py\")\nIOException Couldn't delete d:/code/python/exist.py \nclojure.java.io/delete-file (io.clj:426)\n\nuser> (io/delete-file \"d:/code/python/file-which-does-not-exist.py\" true)\ntrue", :author {:avatar-url "https://avatars.githubusercontent.com/u/1556007?v=3", :account-source "github", :login "zjliu1984"}, :created-at 1482289924813, :updated-at 1482289948834, :_id "5859f304e4b004d3a355e2d2"}], :notes nil, :arglists ["f & [silently]"], :doc "Delete file f. If silently is nil or false, raise an exception on failure, else return the value of silently.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/delete-file"} {:added "1.2", :ns "clojure.java.io", :name "input-stream", :file "clojure/java/io.clj", :type "function", :column 1, :see-alsos [{:created-at 1329988244000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "reader", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a9b"} {:created-at 1329988273000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "output-stream", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a9c"} {:created-at 1329988761000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "IOFactory", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a9d"} {:created-at 1331903198000, :author {:login "Pierre", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/dc0590890ca22fee047f8e2598c2568d?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-open", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a9e"} {:created-at 1331903424000, :author {:login "Pierre", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/dc0590890ca22fee047f8e2598c2568d?r=PG&default=identicon"}, :to-var {:ns "clojure.java.io", :name "make-input-stream", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a9f"}], :line 121, :examples [{:editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}], :updated-at 1507926708504, :created-at 1430431281427, :author {:avatar-url "https://avatars.githubusercontent.com/u/211644?v=3", :account-source "github", :login "phreed"}, :body "(require '(clojure.java [io :as io]))\n\n;; A common task it to load a file into a byte array.\n(defn file->bytes [file]\n (with-open [xin (io/input-stream file)\n xout (java.io.ByteArrayOutputStream.)]\n (io/copy xin xout)\n (.toByteArray xout)))\n;=> #'boot.user/file->bytes\n\n(file->bytes (io/file \"/foo-pc\" \"junk.txt\"))\n;=> #object[\"[B\" 0x7813db81 \"[B@7813db81\"]\n\n\n", :_id "5542a631e4b01bb732af0a8f"} {:updated-at 1458914936478, :created-at 1458914936478, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10583730?v=3"}, :body "(require '[clojure.java.io :as io])\n\n;; these return a java.io.BufferedInputStream for a local file:\n(io/input-stream \"file.txt\")\n(io/input-stream \"/home/user/file.txt\")\n(io/input-stream \"file:///home/user/file.txt\")\n(io/input-stream (java.io.File. \"/home/user/file.txt\"))\n(io/input-stream (java.io.FileInputStream. \"file.txt\"))\n(io/input-stream (java.net.URL. \"file:///home/user/file.txt\"))\n(io/input-stream (java.net.URI. \"file:///home/user/file.txt\"))\n\n;; these return a java.io.BufferedInputStream for a remote resource:\n(io/input-stream \"http://clojuredocs.org/\")\n(io/input-stream (java.net.URL. \"http://clojuredocs.org\"))\n(io/input-stream (java.net.URI. \"http://clojuredocs.org\"))\n(let [socket (java.net.Socket. \"clojuredocs.org\" 80)\n out (java.io.PrintStream. (.getOutputStream socket))]\n (.println out \"GET /index.html HTTP/1.0\")\n (.println out \"Host: clojuredocs.org\\n\\n\")\n (io/input-stream socket))\n\n;; these return a java.io.BufferedInputStream from an in-memory source:\n(io/input-stream (.getBytes \"text\"))\n(io/input-stream (java.io.ByteArrayInputStream. (.getBytes \"text\")))\n(io/input-stream (byte-array [116 101 120 116]))\n", :_id "56f54678e4b09295d75dbf3f"}], :notes nil, :tag "java.io.InputStream", :arglists ["x & opts"], :doc "Attempts to coerce its argument into an open java.io.InputStream.\n Default implementations always return a java.io.BufferedInputStream.\n\n Default implementations are defined for InputStream, File, URI, URL,\n Socket, byte array, and String arguments.\n\n If the argument is a String, it tries to resolve it first as a URI, then\n as a local file name. URIs with a 'file' protocol are converted to\n local file names.\n\n Should be used inside with-open to ensure the InputStream is properly\n closed.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/input-stream"} {:added "1.2", :ns "clojure.java.io", :name "make-writer", :type "function", :see-alsos [{:created-at 1435099993554, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:ns "clojure.java.io", :name "writer", :library-url "https://github.com/clojure/clojure"}, :_id "5589e359e4b05f167dcf2342"}], :examples nil, :notes nil, :arglists ["x opts"], :doc "Creates a BufferedWriter. See also IOFactory docs.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/make-writer"} {:added "1.2", :ns "clojure.java.io", :name "as-relative-path", :file "clojure/java/io.clj", :type "function", :column 1, :see-alsos nil, :line 408, :examples [{:editors [{:login "zjliu1984", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1556007?v=3"}], :body "(require '[clojure.java.io :as io])\n\n; on windows\nuser> (io/as-relative-path \"this/is\")\n\"this\\\\is\n\nuser> (io/as-relative-path \"c:/code\")\nIllegalArgumentException c:\\code is not a relative path clojure.java.io/as-relative-path (io.clj:405)", :author {:avatar-url "https://avatars.githubusercontent.com/u/1556007?v=3", :account-source "github", :login "zjliu1984"}, :created-at 1482288709426, :updated-at 1482288737304, :_id "5859ee45e4b004d3a355e2d0"}], :notes nil, :tag "java.lang.String", :arglists ["x"], :doc "Take an as-file-able thing and return a string if it is\n a relative path, else IllegalArgumentException.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/as-relative-path"} {:added "1.2", :ns "clojure.java.io", :name "copy", :file "clojure/java/io.clj", :type "function", :column 1, :see-alsos [{:created-at 1329988342000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "file", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ccd"}], :line 391, :examples [{:updated-at 1561584738124, :created-at 1306503567000, :body "(ns your-project\n (:require [clojure.java.io :as io]))\n\n(defn copy-file [source-path dest-path]\n (io/copy (io/file source-path) (io/file dest-path)))\n\n(copy-file \"/home/username/squirrel.txt\" \"/home/username/burt-reynolds.txt\")\n\n;; Or, after extending the related multimethod:\n\n(defmethod @#'io/do-copy [String String] [in out opts]\n (apply io/copy (io/file in) (io/file out) opts))\n\n(io/copy \"/home/username/squirrel.txt\" \"/home/username/burt-reynolds.txt\")", :editors [{:avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon", :account-source "clojuredocs", :login "boxie"} {:avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon", :account-source "clojuredocs", :login "boxie"} {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692d0c026201cdc326eb4"} {:updated-at 1577094940425, :created-at 1577094940425, :author {:login "Hindol", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/705227?v=4"}, :body ";; Can be used to save a URL to disk. See: https://stackoverflow.com/a/19297746/1019491\n\n(defn copy-uri-to-file [uri file]\n (with-open [in (clojure.java.io/input-stream uri)\n out (clojure.java.io/output-stream file)]\n (clojure.java.io/copy in out)))", :_id "5e008f1ce4b0ca44402ef7fe"} {:updated-at 1676155296789, :created-at 1676155296789, :author {:login "wedesoft", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/28663?v=4"}, :body ";; Concatenate two files.\n\n(with-open [out (clojure.java.io/output-stream \"output.txt\")]\n (clojure.java.io/copy (clojure.java.io/file \"input1.txt\") out)\n (clojure.java.io/copy (clojure.java.io/file \"input2.txt\") out))", :_id "63e819a0e4b08cf8563f4b6d"}], :notes nil, :arglists ["input output & opts"], :doc "Copies input to output. Returns nil or throws IOException.\n Input may be an InputStream, Reader, File, byte[], char[], or String.\n Output may be an OutputStream, Writer, or File.\n\n Options are key/value pairs and may be one of\n\n :buffer-size buffer size to use, default is 1024.\n :encoding encoding to use if converting between\n byte and char streams. \n\n Does not close any streams except those it opens itself \n (on a File).", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/copy"} {:added "1.2", :ns "clojure.java.io", :name "as-file", :type "function", :see-alsos [{:created-at 1332830735000, :author {:login "eric", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2b0c9ae6f1da9716451e7c86bc87230b?r=PG&default=identicon"}, :to-var {:ns "clojure.java.io", :name "file", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eb4"}], :examples [{:updated-at 1482262177780, :created-at 1285050867000, :body "; It returns a java.io.File object\n> (require '[clojure.java.io :as io] )\n> (class (io/as-file \".\"))\njava.io.File\n\n; You can call java methods such as File/exists\n> (.exists (io/as-file \"dummy.txt\"))\nfalse\n> (.exists (io/as-file \"project.clj\"))\ntrue\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon", :account-source "clojuredocs", :login "gstamp"}, :_id "542692d0c026201cdc326eba"}], :notes [{:author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :updated-at 1516410057934, :created-at 1516410057934, :body "This is a low-level function for getting a file object from a single string.\nIn contrast, `(clojure.java.io/file)` is a higher-level API that will let you do \nthings like construct paths to files using strings and other file objects, \nas in `(io/file root-dir \"subdir\" \"filename.ext\")`.", :_id "5a6294c9e4b0a08026c48d08"}], :tag "java.io.File", :arglists ["x"], :doc "Coerce argument to a file.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/as-file"} {:added "1.2", :ns "clojure.java.io", :name "output-stream", :file "clojure/java/io.clj", :type "function", :column 1, :see-alsos [{:created-at 1329988282000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "writer", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b21"} {:created-at 1329988289000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "input-stream", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b22"} {:created-at 1329988768000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "IOFactory", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b23"} {:created-at 1418120263796, :author {:login "alilee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/16739?v=3"}, :to-var {:ns "clojure.java.io", :name "make-output-stream", :library-url "https://github.com/clojure/clojure"}, :_id "5486cc47e4b09260f767ca74"}], :line 138, :examples [{:updated-at 1619977096473, :created-at 1338273014000, :body "(:use [clojure.java.io :as io])\n\n(defn use-output-stream []\n (with-open [o (io/output-stream \"test.txt\")]\n (.write o 65))) ; Writes 'A'", :editors [{:avatar-url "https://www.gravatar.com/avatar/dae0f434afde5246ccb030cdec81fb71?r=PG&default=identicon", :account-source "clojuredocs", :login "Omer"} {:login "drewverlee", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1130688?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/dae0f434afde5246ccb030cdec81fb71?r=PG&default=identicon", :account-source "clojuredocs", :login "Omer"}, :_id "542692d6c026201cdc3270d9"}], :notes nil, :tag "java.io.OutputStream", :arglists ["x & opts"], :doc "Attempts to coerce its argument into an open java.io.OutputStream.\n Default implementations always return a java.io.BufferedOutputStream.\n\n Default implementations are defined for OutputStream, File, URI, URL,\n Socket, and String arguments.\n\n If the argument is a String, it tries to resolve it first as a URI, then\n as a local file name. URIs with a 'file' protocol are converted to\n local file names.\n\n Should be used inside with-open to ensure the OutputStream is\n properly closed.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/output-stream"} {:added "1.2", :ns "clojure.java.io", :name "make-reader", :type "function", :see-alsos nil, :examples nil, :notes [{:updated-at 1393559963000, :body "Don't use this. You probably want [reader](reader) instead.", :created-at 1393559963000, :author {:login "TheAlchemist", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/43b98f8119f22e58791a57950145b051?r=PG&default=identicon"}, :_id "542692edf6e94c697052201e"}], :arglists ["x opts"], :doc "Creates a BufferedReader. See also IOFactory docs.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/make-reader"} {:added "1.2", :ns "clojure.java.io", :name "Coercions", :file "clojure/java/io.clj", :type "var", :column 1, :see-alsos nil, :line 35, :examples nil, :notes nil, :arglists [], :doc "Coerce between various 'resource-namish' things.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/Coercions"} {:added "1.2", :ns "clojure.java.io", :name "file", :file "clojure/java/io.clj", :type "function", :column 1, :see-alsos [{:created-at 1329988433000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "file-seq", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dfc"} {:created-at 1329988641000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "reader", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dfd"} {:created-at 1329988645000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "writer", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dfe"} {:created-at 1330337356000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "delete-file", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dff"} {:created-at 1507587660510, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "make-parents", :ns "clojure.java.io"}, :_id "59dbf64ce4b03026fe14ea58"} {:created-at 1550262589878, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "as-file", :ns "clojure.java.io"}, :_id "5c67213de4b0ca44402ef686"} {:created-at 1550262611875, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "load-file", :ns "clojure.core"}, :_id "5c672153e4b0ca44402ef687"}], :line 418, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [], :body "user> (clojure.java.io/file \"/tmp/foo\")\n#\n\nuser> (clojure.java.io/file \"http://asdf.com\")\n#\n\nuser> (clojure.java.io/file \"/tmp/foo\" \"bar\")\n#", :created-at 1293673542000, :updated-at 1293673542000, :_id "542692d0c026201cdc326eb7"} {:updated-at 1462995759891, :created-at 1399010194000, :body "; Use clojure.java.io to read in resources from the classpath\n\n(ns rescue.core\n (:require [clojure.java.io :as io] ))\n\n; Populate the file on the command line: \n; echo \"Hello Resources!\" > resources/hello.txt\n(def data-file (io/resource \n \"hello.txt\" ))\n(defn -main []\n (println (slurp data-file)) )\n; When do \"lein run\"\n; => Hello Resources!", :editors [{:login "slipset", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5894926?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon", :account-source "clojuredocs", :login "cloojure"}, :_id "542692d6c026201cdc3270d8"} {:body "; slurp can be used directly on value of io/resource\n\n(ns rescue.core\n (require [clojure.java.io :as io]))\n\n; echo \"hello world\" > resources/hello.txt\n(def data (io/resource \"hello.txt\"))\n\n(defn -main []\n (println (slurp data-file))\n; when do \"lein run\"\n; => hello world", :author {:login "m00nlight", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/5475472?v=3"}, :created-at 1422524528923, :updated-at 1422524528923, :_id "54ca0070e4b0e2ac61831ce8"}], :notes nil, :tag "java.io.File", :arglists ["arg" "parent child" "parent child & more"], :doc "Returns a java.io.File, passing each arg to as-file. Multiple-arg\n versions treat the first argument as parent and subsequent args as\n children relative to the parent.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/file"} {:added "1.2", :ns "clojure.java.io", :name "make-input-stream", :type "function", :see-alsos [{:created-at 1331903445000, :author {:login "Pierre", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/dc0590890ca22fee047f8e2598c2568d?r=PG&default=identicon"}, :to-var {:ns "clojure.java.io", :name "IOFactory", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d61"}], :examples nil, :notes nil, :arglists ["x opts"], :doc "Creates a BufferedInputStream. See also IOFactory docs.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/make-input-stream"} {:added "1.2", :ns "clojure.java.io", :name "IOFactory", :file "clojure/java/io.clj", :type "var", :column 1, :see-alsos [{:created-at 1329988722000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "reader", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bdc"} {:created-at 1329988725000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "writer", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bdd"} {:created-at 1329988729000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "input-stream", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bde"} {:created-at 1329988733000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "output-stream", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bdf"}], :line 69, :examples nil, :notes nil, :arglists [], :doc "Factory functions that create ready-to-use, buffered versions of\n the various Java I/O stream types, on top of anything that can\n be unequivocally converted to the requested kind of stream.\n\n Common options include\n \n :append true to open stream in append mode\n :encoding string name of encoding to use, e.g. \"UTF-8\".\n\n Callers should generally prefer the higher level API provided by\n reader, writer, input-stream, and output-stream.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/IOFactory"} {:added "1.2", :ns "clojure.java.io", :name "resource", :file "clojure/java/io.clj", :type "function", :column 1, :see-alsos [{:created-at 1529009753028, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "slurp", :ns "clojure.core"}, :_id "5b22d659e4b00ac801ed9e15"} {:created-at 1529010567539, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reader", :ns "clojure.java.io"}, :_id "5b22d987e4b00ac801ed9e17"} {:created-at 1529010728887, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "line-seq", :ns "clojure.core"}, :_id "5b22da28e4b00ac801ed9e18"}], :line 446, :examples [{:author {:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"}, :editors [{:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"} {:avatar-url "https://avatars.githubusercontent.com/u/11081351?v=3", :account-source "github", :login "rauhs"} {:login "flyboarder", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/147004?v=3"}], :body "; Use clojure.java.io/resource to read resources from the classpath:\n\n(ns rescue.core\n (:require [clojure.java.io :as io] ))\n\n; Populate the file on the command line: \n; echo \"Hello Resources!\" > resources/hello.txt\n(def data-file (io/resource \n \"hello.txt\" ))\n(defn -main []\n (println (slurp data-file)) )\n; When do \"lein run\"\n; => Hello Resources!", :created-at 1399010149000, :updated-at 1494456807781, :_id "542692d6c026201cdc3270dc"} {:body "(require '(clojure.java.io :as io))\n\n;; If the resource does not exist on the classpath a nil is returned.\n(io/resource \"I_do_not_exist.txt\")\n;;=> nil", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1435094542239, :updated-at 1435094573241, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :_id "5589ce0ee4b0fad27b85f91e"}], :notes [{:body "If you need to `slurp` a file from a JAR file, don't call `io/file` on the result of calling `io/resource`, or you will get an exception that says the resource is \"not a file\". Instead, call `slurp` directly on the result of `io/resource`.", :created-at 1435260445537, :updated-at 1435260445537, :author {:login "kyptin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/254619?v=3"}, :_id "558c561de4b0fad27b85f927"} {:author {:login "benwhorwood", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/17282487?v=3"}, :updated-at 1469616475473, :created-at 1469616313988, :body "If you need to copy a **binary** file from a running JAR (or WAR), don't call `slurp` as it will try and decode the file. Instead, extract similarily to:\n\n
    \n(with-open [in (io/input-stream (io/resource \"file.dat\"))] ;; resources/file.dat\n    (io/copy in (io/file \"/path/to/extract/file.dat\"))))\n
    ", :_id "579890b9e4b0bafd3e2a04be"}], :tag "java.net.URL", :arglists ["n" "n loader"], :doc "Returns the URL for a named resource. Use the context class loader\n if no loader is specified.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/resource"} {:added "1.2", :ns "clojure.java.io", :name "writer", :file "clojure/java/io.clj", :type "function", :column 1, :see-alsos [{:created-at 1324516890000, :author {:login "cgray", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7fe6255dbe4806a588cc06a5ba4a5d82?r=PG&default=identicon"}, :to-var {:ns "clojure.java.io", :name "reader", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e40"} {:created-at 1329988746000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "IOFactory", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e41"} {:created-at 1330170599000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "output-stream", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e42"} {:created-at 1334795963000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "spit", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e43"}], :line 104, :examples [{:author {:login "weiyongqing123", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8341059515e9e257bbb8da3c9fc158c2?r=PG&default=identicon"}, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :body ";; This example shows the use of the ':append' option\n(defn write-file []\n (with-open [w (clojure.java.io/writer \"f:/w.txt\" :append true)]\n (.write w (str \"hello\" \"world\"))))", :created-at 1329302480000, :updated-at 1434481428515, :_id "542692d6c026201cdc3270de"} {:body ";; This example shows the use of the ':encoding' option.\n(require '(clojure.data.xml :as xml))\n\n(let [tags (xml/element :foo {:foo-attr \"foo value\"}\n (xml/element :bar {:bar-attr \"bar value\"}\n (xml/element :baz {} \"The baz value\")))]\n (with-open [out-file (clojure.java.io/writer \"/temp/bar.xml\" :encoding \"UTF-8\")]\n (xml/emit tags out-file))\n (with-open [input (clojure.java.io/reader \"/temp/bar.xml\")]\n (xml/parse input)))\n;;=> #clojure.data.xml.Element{:tag :foo, :attrs {:foo-attr \"foo value\"}, \n;; :content \n;; (#clojure.data.xml.Element{:tag :bar, :attrs {:bar-attr \"bar value\"},\n;; :content \n;; (#clojure.data.xml.Element{:tag :baz, :attrs {}, :content (\"The baz value\")})})}", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1434481387584, :updated-at 1434481476334, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}], :_id "558072ebe4b01ad59b65f4fa"} {:updated-at 1495636148152, :created-at 1495636148152, :author {:login "jasonmm", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/2171623?v=3"}, :body ";; When a Writer is created from a Socket using `with-open`, the \n;; underlying Socket is closed along with the Writer.\n\n;; Create the Socket.\n(require '[clojure.java.io :as io])\n(def socket (java.net.Socket.))\n(.connect socket (java.net.InetSocketAddress. \"www.google.com\" 80))\n(.isClosed socket)\n;;=> false\n\n;; Write to the Socket.\n(with-open [w (io/writer socket)]\n (.write w \"GET / HTTP/1.0\\n\\n\")\n (.flush w))\n(.isClosed socket)\n;;=> true\n\n;; Attempt to read from the Socket.\n(with-open [r (io/reader socket)\n s (java.io.StringWriter.)]\n (io/copy r s))\n;;=> java.net.SocketException: Socket is closed\n", :_id "592598b4e4b093ada4d4d722"}], :notes nil, :tag "java.io.Writer", :arglists ["x & opts"], :doc "Attempts to coerce its argument into an open java.io.Writer.\n Default implementations always return a java.io.BufferedWriter.\n\n Default implementations are provided for Writer, BufferedWriter,\n OutputStream, File, URI, URL, Socket, and String.\n\n If the argument is a String, it tries to resolve it first as a URI, then\n as a local file name. URIs with a 'file' protocol are converted to\n local file names.\n\n Should be used inside with-open to ensure the Writer is properly\n closed.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/writer"} {:added "1.2", :ns "clojure.java.io", :name "as-url", :type "function", :see-alsos [{:created-at 1561545843452, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "file", :ns "clojure.java.io"}, :_id "5d134c73e4b0ca44402ef76b"}], :examples [{:updated-at 1561545860751, :created-at 1306270061000, :body "(use '[clojure.java.io :only (as-url)])\n(import 'java.io.File)\n\nuser=> (as-url nil)\nnil\n\nuser=> (as-url (File. \"/tmp\"))\n#\n\nuser=> (as-url \"http://clojuredocs.org\")\n#\n\nuser=> (as-url \"http://clojuredocs.org:8080\")\n#\n\nuser=> (as-url \"clojuredocs.org\")\n#", :editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/567898c496278341be69087507d5ed24?r=PG&default=identicon", :account-source "clojuredocs", :login "Jeff Rose"}, :_id "542692d0c026201cdc326ebc"} {:updated-at 1561545787852, :created-at 1561545787852, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; How to extend \"io/as-url\" or \"io/file\" to handle additional types,\n;; for example \"java.nio.file.Path\":\n\n(require '[clojure.java.io :as io])\n(import '[java.nio.file Path FileSystems])\n\n(extend-protocol io/Coercions\n Path\n (as-file [path] (io/file (.toUri path)))\n (as-url [path] (io/as-url (.toUri path))))\n\n(def path\n (.. FileSystems\n getDefault\n (getPath \"/usr\" \n (into-array String [\"share\" \"dict\" \"words\"]))))\n\n(io/as-url path)\n;; #object[java.net.URL 0x1255fa42 \"file:\"/usr/share/dict/words\"]\n\n(io/file path)\n;; #object[java.io.File 0x1c80a235 \"/usr/share/dict/words\"]", :_id "5d134c3be4b0ca44402ef76a"}], :notes nil, :tag "java.net.URL", :arglists ["x"], :doc "Coerce argument to a URL.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/as-url"} {:added "1.2", :ns "clojure.java.io", :name "reader", :file "clojure/java/io.clj", :type "function", :column 1, :see-alsos [{:created-at 1324516916000, :author {:login "cgray", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7fe6255dbe4806a588cc06a5ba4a5d82?r=PG&default=identicon"}, :to-var {:ns "clojure.java.io", :name "writer", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cce"} {:created-at 1329988254000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "input-stream", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ccf"} {:created-at 1329988703000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.io", :name "IOFactory", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cd0"} {:created-at 1334796117000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "slurp", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cd1"}], :line 86, :examples [{:author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :editors [], :body "(with-open [rdr (clojure.java.io/reader \"/tmp/foo.txt\")]\n (reduce conj [] (line-seq rdr)))", :created-at 1290297729000, :updated-at 1290297729000, :_id "542692d0c026201cdc326eb8"} {:updated-at 1507915508004, :created-at 1324315042000, :body "(with-open [rdr (clojure.java.io/reader \"http://www.google.com\")]\n (printf \"%s\\n\" (clojure.string/join \"\\n\" (line-seq rdr))))\n;; nil", :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}, :_id "542692d6c026201cdc3270db"} {:updated-at 1561057591570, :created-at 1561057591570, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Sometimes it's useful to create a reader from a string, but strings\n;; are locations for \"reader\", so we turn them into char-arrays first:\n\n(require '[clojure.java.io :as io])\n\n(with-open [r (io/reader (char-array \"hello\"))] (slurp r))\n;; \"hello\"", :_id "5d0bd937e4b0ca44402ef75a"}], :notes [{:updated-at 1387185171000, :body "Java documentation links for the listed argument types that have “default implementationsâ€�:\r\n\r\n* [`Reader`](http://docs.oracle.com/javase/7/docs/api/java/io/Reader.html)\r\n* [`BufferedReader`](http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html)\r\n* [`InputStream`](http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html)\r\n* [`File`](http://docs.oracle.com/javase/7/docs/api/java/io/File.html)\r\n* [`URI`](http://docs.oracle.com/javase/7/docs/api/java/net/URI.html)\r\n* [`URL`](http://docs.oracle.com/javase/7/docs/api/java/net/URL.html)\r\n* [`Socket`](http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html)\r\n* byte arrays (`byte[]`)\r\n* character arrays (`char[]`)\r\n* [`String`](http://docs.oracle.com/javase/7/docs/api/java/lang/String.html) (resolved as a URI or a local file name)", :created-at 1387185171000, :author {:login "roryokane", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5b2b185c814bb25f2f95a1152e58f033?r=PG&default=identicon"}, :_id "542692edf6e94c6970522016"} {:author {:login "jakubholynet", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/624958?v=3"}, :updated-at 1436102372053, :created-at 1436102372053, :body "`opts` depend on the type of the reader but [common ones include](https://github.com/clojure/clojure/blob/cc69d19bd471c48d441071fff43e768ffa7eb8e5/src/clj/clojure/java/io.clj) `:encoding` and, where applicable, `:buffer-size`.", :_id "55992ee4e4b020189d740547"}], :tag "java.io.Reader", :arglists ["x & opts"], :doc "Attempts to coerce its argument into an open java.io.Reader.\n Default implementations always return a java.io.BufferedReader.\n\n Default implementations are provided for Reader, BufferedReader,\n InputStream, File, URI, URL, Socket, byte arrays, character arrays,\n and String.\n\n If argument is a String, it tries to resolve it first as a URI, then\n as a local file name. URIs with a 'file' protocol are converted to\n local file names.\n\n Should be used inside with-open to ensure the Reader is properly\n closed.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.io/reader"} {:added "1.2", :ns "clojure.java.javadoc", :name "javadoc", :file "clojure/java/javadoc.clj", :type "function", :column 1, :see-alsos [{:created-at 1332796364000, :author {:login "Olivenmann", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d5b1703fb08dd81e4cb2f653a3aaf10b?r=PG&default=identicon"}, :to-var {:ns "clojure.repl", :name "doc", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cb0"} {:created-at 1619379527003, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "*local-javadocs*", :ns "clojure.java.javadoc"}, :_id "6085c547e4b0b1e3652d74e8"} {:created-at 1619379537456, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "*remote-javadocs*", :ns "clojure.java.javadoc"}, :_id "6085c551e4b0b1e3652d74e9"}], :line 77, :examples [{:author {:login "abhin4v", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4d29918c109bc75d2a1fd8420660d72b?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (use 'clojure.java.javadoc)\nnil\n\nuser=> (javadoc String)\n\"http://java.sun.com/javase/6/docs/api/java/lang/String.html\"\n\nuser=> (javadoc (java.util.Date.))\n\"http://java.sun.com/javase/6/docs/api/java/util/Date.html\"\n", :created-at 1283270938000, :updated-at 1285492232000, :_id "542692d0c026201cdc326ebd"} {:author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :editors [], :body "user> (javadoc 1)\n\"http://java.sun.com/javase/7/docs/api/java/lang/Long.html\"\n\n(javadoc \"abc\")\n\"http://java.sun.com/javase/7/docs/api/java/lang/String.html\"", :created-at 1397981916000, :updated-at 1397981916000, :_id "542692d6c026201cdc3270e0"} {:author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :editors [], :body "user> (javadoc org.joda.time.DateTime)\n\"http://www.google.com/search?btnI=I%27m%20Feeling%20Lucky&q=allinurl:org/joda/time/DateTime.html\"", :created-at 1397981945000, :updated-at 1397981945000, :_id "542692d6c026201cdc3270e1"}], :notes nil, :arglists ["class-or-object"], :doc "Opens a browser window displaying the javadoc for the argument.\n Tries *local-javadocs* first, then *remote-javadocs*.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.javadoc/javadoc"} {:added "1.2", :ns "clojure.java.javadoc", :name "add-local-javadoc", :file "clojure/java/javadoc.clj", :type "function", :column 1, :see-alsos [{:created-at 1619379450941, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "javadoc", :ns "clojure.java.javadoc"}, :_id "6085c4fae4b0b1e3652d74e6"} {:created-at 1619379489484, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "*local-javadocs*", :ns "clojure.java.javadoc"}, :_id "6085c521e4b0b1e3652d74e7"}], :line 43, :examples [{:updated-at 1619379433450, :created-at 1619379433450, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :body "(require '[clojure.java.javadoc :as javadoc])\n\n;; After extracting JDK 11 Javadocs into ~/javadocs/jdk11\n(javadoc/add-local-javadoc \n (str (System/getProperty \"user.home\")\n \"/javadocs/jdk11/api/java.base\"))\n\n;; Open default browser showing java.io.PrintStream\n(javadoc/javadoc System/out)\n", :_id "6085c4e9e4b0b1e3652d74e5"}], :notes nil, :arglists ["path"], :doc "Adds to the list of local Javadoc paths.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.javadoc/add-local-javadoc"} {:ns "clojure.java.javadoc", :name "*core-java-api*", :file "clojure/java/javadoc.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 21, :examples nil, :notes [{:author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :updated-at 1619367585052, :created-at 1619367585052, :body "Effectively read-only. `*core-java.api*` returns the JDK 7 version of Javadoc by default (unless you run Clojure with the JDK 6). This is the version of the documentation that the rest of `clojure.java.javadoc` uses for the Java core API.", :_id "608596a1e4b0b1e3652d74e4"}], :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.java.javadoc/*core-java-api*"} {:ns "clojure.java.javadoc", :name "*feeling-lucky-url*", :file "clojure/java/javadoc.clj", :type "var", :column 1, :see-alsos [{:created-at 1534516213976, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "*feeling-lucky*", :ns "clojure.java.javadoc"}, :_id "5b76dbf5e4b00ac801ed9e67"}], :dynamic true, :line 16, :examples [{:updated-at 1534515944915, :created-at 1534515944915, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :body ";; If `clojure.java.javadoc/*feeling-lucky*` is true,\n;; clojure.java.javadoc/javadoc opens a browser with this URL if it can’t\n;; find the proper documentation URL (e.g. if it’s a custom class).\n\n;; Default value\n*feeling-lucky-url*\n; => \"http://www.google.com/search?btnI=I%27m%20Feeling%20Lucky&q=allinurl:\"\n\n;; Use DuckDuckGo instead of Google\n(binding [clojure.java.javadoc/*feeling-lucky-url* \"https://duckduckgo.com/?q=\\\\\"]\n (clojure.java.javadoc/javadoc your-class))", :_id "5b76dae8e4b00ac801ed9e65"}], :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.java.javadoc/*feeling-lucky-url*"} {:ns "clojure.java.javadoc", :name "*local-javadocs*", :file "clojure/java/javadoc.clj", :type "var", :column 1, :see-alsos [{:created-at 1619365716926, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "add-local-javadoc", :ns "clojure.java.javadoc"}, :_id "60858f54e4b0b1e3652d74e0"}], :dynamic true, :line 19, :examples [{:updated-at 1619365889369, :created-at 1619365824236, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :body "(require '[clojure.java.javadoc :as javadoc])\n\n;; Assuming \"~/javadocs/jdk11/api/java.base\" exists:\n\n(def jdk11-javadoc\n (str (System/getProperty \"user.home\")\n \"/javadocs/jdk11/api/java.base\"))\n\n;; Alter the local Javadoc folders for the current thread.\n;; Use javadoc/add-local-javadoc to alter permanently.\n;; Opens java.lang.Object.html for Java 11 instead of 7 (default).\n\n(binding [javadoc/*local-javadocs* (ref [jdk11-javadoc])]\n (javadoc/javadoc (Object.)))\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "60858fc0e4b0b1e3652d74e1"}], :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.java.javadoc/*local-javadocs*"} {:added "1.2", :ns "clojure.java.javadoc", :name "add-remote-javadoc", :file "clojure/java/javadoc.clj", :type "function", :column 1, :see-alsos [{:created-at 1561982333040, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "add-local-javadoc", :ns "clojure.java.javadoc"}, :_id "5d19f57de4b0ca44402ef77d"}], :line 49, :examples [{:author {:login "linxiangyu", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2c7492645426ece4ae86fde83d61bd03?r=PG&default=identicon"}, :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}], :body "user=> (use 'clojure.java.javadoc)\nnil\n\nuser=> (add-remote-javadoc \"org.apache.commons.csv.\"\n \"http://commons.apache.org/proper/commons-csv/apidocs/index.html\")\n{\"java.\" \"http://java.sun.com/javase/6/docs/api/\",\n \"javax.\" \"http://java.sun.com/javase/6/docs/api/\",\n \"org.apache.commons.codec.\" \"http://commons.apache.org/codec/api-release/\",\n \"org.apache.commons.csv.\" \"http://commons.apache.org/proper/commons-csv/apidocs/index.html\",\n \"org.apache.commons.io.\" \"http://commons.apache.org/io/api-release/\",\n \"org.apache.commons.lang.\" \"http://commons.apache.org/lang/api-release/\",\n \"org.ietf.jgss.\" \"http://java.sun.com/javase/6/docs/api/\",\n \"org.omg.\" \"http://java.sun.com/javase/6/docs/api/\",\n \"org.w3c.dom.\" \"http://java.sun.com/javase/6/docs/api/\",\n \"org.xml.sax.\" \"http://java.sun.com/javase/6/docs/api/\"}", :created-at 1369812981000, :updated-at 1497949372886, :_id "542692d6c026201cdc3270df"} {:updated-at 1561982312102, :created-at 1561982312102, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Replace the JavaDoc URLs for the current JDK version.\n\n(require '[clojure.java.javadoc :as browse])\n\n(def java-version\n (let [jsv (System/getProperty \"java.specification.version\")]\n (if-let [single-digit (last (re-find #\"^\\d\\.(\\d+).*\" jsv))]\n single-digit jsv)))\n\n(def jdocs-template\n (format \"https://docs.oracle.com/javase/%s/docs/api/\" java-version))\n\n(def known-prefix\n [\"java.\" \"javax.\" \"org.ietf.jgss.\" \"org.omg.\"\n \"org.w3c.dom.\" \"org.xml.sax.\"])\n\n(doseq [prefix known-prefix]\n (browse/add-remote-javadoc prefix jdocs-template))", :_id "5d19f568e4b0ca44402ef77c"}], :notes nil, :arglists ["package-prefix url"], :doc "Adds to the list of remote Javadoc URLs. package-prefix is the\n beginning of the package name that has docs at this URL.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.javadoc/add-remote-javadoc"} {:ns "clojure.java.javadoc", :name "*remote-javadocs*", :file "clojure/java/javadoc.clj", :type "var", :column 1, :see-alsos [{:created-at 1619365573969, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "add-remote-javadoc", :ns "clojure.java.javadoc"}, :_id "60858ec5e4b0b1e3652d74de"}], :dynamic true, :line 29, :examples [{:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}], :body "(require '[clojure.java.javadoc :as javadoc])\n\n(def clojure-javadoc\n \"https://javadoc.io/doc/org.clojure/clojure/latest/\")\n\n;; Altering the Javadoc remote locations for the current thread.\n;; Use javadoc/add-remote-javadoc to alter permanently.\n\n(binding [javadoc/*remote-javadocs*\n (ref {\"clojure.\" clojure-javadoc})]\n (javadoc/javadoc []))", :author {:avatar-url "https://avatars.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1619365561620, :updated-at 1619365626070, :_id "60858eb9e4b0b1e3652d74dd"}], :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.java.javadoc/*remote-javadocs*"} {:ns "clojure.java.javadoc", :name "*feeling-lucky*", :file "clojure/java/javadoc.clj", :type "var", :column 1, :see-alsos [{:created-at 1534516222829, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "*feeling-lucky-url*", :ns "clojure.java.javadoc"}, :_id "5b76dbfee4b00ac801ed9e68"}], :dynamic true, :line 17, :examples [{:updated-at 1534516142907, :created-at 1534516142907, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :body ";; If true, clojure.java.javadoc/javadoc opens a browser using\n;; *feeling-lucky-url* when it can’t find the proper documentation URL\n;; for a class.\n\n;; opens a browser with *feeling-lucky-url*\n(clojure.java.javadoc/javadoc inc)\n\n;; prints \"Could not find Javadoc for clojure.core$inc\"\n(binding [clojure.java.javadoc/*feeling-lucky* false] \n (clojure.java.javadoc/javadoc inc))", :_id "5b76dbaee4b00ac801ed9e66"}], :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.java.javadoc/*feeling-lucky*"} {:added "1.2", :ns "clojure.java.shell", :name "sh", :file "clojure/java/shell.clj", :type "function", :column 1, :see-alsos [{:created-at 1332915179000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.shell", :name "with-sh-dir", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e1b"} {:created-at 1332915183000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.shell", :name "with-sh-env", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e1c"} {:created-at 1336536810000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "future", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e1d"} {:created-at 1661552183304, :author {:login "djblue", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1986211?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "shutdown-agents", :ns "clojure.core"}, :_id "63094637e4b0b1e3652d765c"}], :line 79, :examples [{:author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :editors [{:login "juergenhoetzel", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2736dfffc803c704dcf25b45ff63cede?r=PG&default=identicon"} {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (use '[clojure.java.shell :only [sh]])\n\n;; Note: The actual output you see from a command like this will look messier.\n;; The output below has had all newline characters replaced with line\n;; breaks. You would see a big long string with \\n characters in the middle.\nuser=> (sh \"ls\" \"-aul\")\n\n{:exit 0, \n :out \"total 64\ndrwxr-xr-x 11 zkim staff 374 Jul 5 13:21 .\ndrwxr-xr-x 25 zkim staff 850 Jul 5 13:02 ..\ndrwxr-xr-x 12 zkim staff 408 Jul 5 13:02 .git\n-rw-r--r-- 1 zkim staff 13 Jul 5 13:02 .gitignore\n-rw-r--r-- 1 zkim staff 12638 Jul 5 13:02 LICENSE.html\n-rw-r--r-- 1 zkim staff 4092 Jul 5 13:02 README.md\ndrwxr-xr-x 2 zkim staff 68 Jul 5 13:15 classes\ndrwxr-xr-x 5 zkim staff 170 Jul 5 13:15 lib\n-rw-r--r--@ 1 zkim staff 3396 Jul 5 13:03 pom.xml\n-rw-r--r--@ 1 zkim staff 367 Jul 5 13:15 project.clj\ndrwxr-xr-x 4 zkim staff 136 Jul 5 13:15 src\n\", :err \"\"}", :created-at 1278383022000, :updated-at 1332916119000, :_id "542692d0c026201cdc326ebf"} {:author {:login "secondplanet", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/6c3417477c007600db59c4a94718ee43?r=PG&default=identicon"}, :editors [], :body "user=> (use '[clojure.java.shell :only [sh]])\n\nuser=> (println (:out (sh \"cowsay\" \"Printing a command-line output\")))\n\n _________________________________ \n< Printing a command-line output. >\n --------------------------------- \n \\ ^__^\n \\ (oo)\\_______\n (__)\\ )\\/\\\n ||----w |\n || ||\n\nnil", :created-at 1313622736000, :updated-at 1313622736000, :_id "542692d0c026201cdc326ec4"} {:author {:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"}, :editors [{:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"} {:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"} {:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"} {:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"}], :body "user=> (use '[clojure.java.shell :only [sh]])\nnil\n\n;; note that the options, like :in, have to go at the end of arglist\n;; advantage of piping-in thru stdin is less need for quoting/escaping\nuser=> (println (:out (sh \"cat\" \"-\" :in \"Printing input from stdin with funny chars like ' \\\" $@ & \")))\nPrinting input from stdin with funny chars like ' \" $@ & \nnil", :created-at 1331269027000, :updated-at 1331270505000, :_id "542692d6c026201cdc3270e2"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; sh is implemented using Clojure futures. See examples for 'future'\n;; for discussion of an undesirable 1-minute wait that can occur before\n;; your standalone Clojure program exits if you do not use shutdown-agents.", :created-at 1336536805000, :updated-at 1336536828000, :_id "542692d6c026201cdc3270e7"} {:author {:login "octopusgrabbus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon"}, :editors [], :body "(sh \"pwd\" :dir \"/home/ics/icsdev\")\n{:exit 0, :out \"/home/ics/icsdev\\n\", :err \"\"}", :created-at 1398214606000, :updated-at 1398214606000, :_id "542692d6c026201cdc3270e9"} {:author {:login "octopusgrabbus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon"}, :editors [], :body "(require '[clojure.java.shell :as shell])\n(shell/sh \"sh\" \"-c\" \"cd /etc; pwd\")\n{:exit 0, :out \"/etc\\n\", :err \"\"}", :created-at 1398221530000, :updated-at 1398221530000, :_id "542692d6c026201cdc3270ea"} {:updated-at 1510403291191, :created-at 1510403291191, :author {:login "Atsman", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/3405704?v=4"}, :body ";; note that you have to split you script by whitespace \n;; that was confusing for me \n;; for example script: \n;; \"terraform plan -var param1=value1 -var param2=value2 -var-file=/etc/var.tfvars\"\n\n(shell/sh \"terraform\" \"plan\" \"-var\" \"param=value\" \"-var\" \"param2=value2\" \"-var-file=/etc/var.tfvars\")", :_id "5a06ecdbe4b0a08026c48cae"} {:updated-at 1539183276794, :created-at 1539183276794, :author {:login "claj", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/353113?v=4"}, :body ";; feed the sh with environment variables\n;; (note that $HELLO in our command line wouldn't work since we act as the shell here)\n\n(require '[clojure.java.shell :as shell])\n(shell/sh \"printenv\" \"HELLO\" :env {\"HELLO\" \"Hello, World!\"})\n{:exit 0, :out \"Hello, World!\\n\", :err \"\"}\n\n", :_id "5bbe12ace4b00ac801ed9ece"} {:updated-at 1539186762145, :created-at 1539186710931, :author {:login "claj", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/353113?v=4"}, :body ";; override environment variables\n;; BAD EXAMPLE since i guess lein uses a lot of env vars for coordination\n;; but anyway\n\n(require '[clojure.java.shell :as shell])\n\n(sh/sh \"lein\" \"compile\")\n{:exit 0,\n :out\n \"WARNING: You have $CLASSPATH set, probably by accident.\n It is strongly recommended to unset this before proceeding.\",\n :err \"\"}\n\n;; note that\n(sh/sh \"lein\" \"compile\" :env {})\n;; will make lein quite confused.\n\n;; we better modify the current env:\n\n(let [current-env (into {} (System/getenv))]\n (sh/sh \"lein\" \"compile\" :env (dissoc current-env \"CLASSPATH\"))\n{:exit 0, :out \"\", :err \"\"}\n\n\n;; (into {} ...) is needed because System/getenv returns a map of type\n;; java.util.Collections$UnmodifiableMap", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/353113?v=4", :account-source "github", :login "claj"}], :_id "5bbe2016e4b00ac801ed9ecf"} {:updated-at 1618300543742, :created-at 1618300543742, :author {:login "Saikyun", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2477927?v=4"}, :body ";; on windows, the above examples won't work. try with an exe instead :)\n(require '[clojure.java.shell :as shell])\n(shell/sh \"notepad.exe\")\n;; now notepad should be open!", :_id "60754e7fe4b0b1e3652d74c5"} {:editors [{:login "Crowbrammer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4"}], :body ";; On Windows, the Java shell needs to execute a program \n;; that executes the command: usually PowerShell, Bash, or cmd. \n\n;; So your `sh` function should invoke \"powershell\" OR \"bash\" and -c\" \n;; OR \"cmd and \"/c\" before your command. \n\n;; Instead of \n(clojure.java.shell/sh \"ls\")\n\n;; you would do this\n\n(clojure.java.shell/sh \"powershell\" \"ls\")\n\n;; or this\n\n(clojure.java.shell/sh \"bash\" \"-c\" \"ls\")\n\n;; or this\n\n(clojure.java.shell/sh \"cmd\" \"/c\" \"dir\") ;; No `ls` or `pwd` in cmd. \n\n;; (I first learned about the need for command flags like \"/c\" here: \n;; https://stackoverflow.com/a/4031412/2596132\n\n;; These Microsoft docs explain the \"/c\" flag: \n;; https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd\n\n;; I learned of bash's \"-c\" flag after finding `exec` in `bash -c help` as suggested\n;; from `bash --help. I didn't know that `-c` was the command flag at the time.)", :author {:avatar-url "https://avatars.githubusercontent.com/u/19522656?v=4", :account-source "github", :login "Crowbrammer"}, :created-at 1673135391810, :updated-at 1673136173848, :_id "63ba051fe4b08cf8563f4b5e"}], :notes [{:author {:login "ejschoen", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/10605666?v=3"}, :updated-at 1493923269271, :created-at 1493923269271, :body "It's worth noting that sh begins interpreting arguments starting with the first non-string (not just keywords!) as key-value pairs, as in the example above with pwd. This means that even if an argument's type has a trivial conversion to a string, such as an integer or boolean, it must be stringified. If not, it'll be passed as an argument to hash-map, and you might see an IllegalArgumentException if there are an odd number of arguments beginning with the first non-string.", :_id "590b75c5e4b01f4add58feab"} {:author {:login "geokon-gh", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/21017379?v=4"}, :updated-at 1550146015552, :created-at 1550146015552, :body "As noted in the [4th example](http://clojuredocs.org/clojure.java.shell/sh#example-542692d6c026201cdc3270e7), `sh` uses futures. This means that if your program uses `sh` and then finishes its execution it will unexpectedly hang and not terminate/exit. The `sh` future will still be alive in the background and will be holding up the program. \n\nThis is a bit confusing when you first try to use Clojure for scripting as it looks like your script doesn't exit naturally. Furthermore, when you run `sh` in the REPL the background futures aren't apparent to the user and everything works as-expected\n\nTo fix the situation you can either run `(System/exit 0)` to terminate your program explicitly. Or you can run `(shutdown-agents)` to kill the background future and then the program will exit naturally\n\nFor a discussion of this strange behavior see: https://clojureverse.org/t/why-doesnt-my-program-exit/3754/2", :_id "5c6559dfe4b0ca44402ef684"}], :arglists ["& args"], :doc "Passes the given strings to Runtime.exec() to launch a sub-process.\n\n Options are\n\n :in may be given followed by any legal input source for\n clojure.java.io/copy, e.g. InputStream, Reader, File, byte[],\n or String, to be fed to the sub-process's stdin.\n :in-enc option may be given followed by a String, used as a character\n encoding name (for example \"UTF-8\" or \"ISO-8859-1\") to\n convert the input string specified by the :in option to the\n sub-process's stdin. Defaults to UTF-8.\n If the :in option provides a byte array, then the bytes are passed\n unencoded, and this option is ignored.\n :out-enc option may be given followed by :bytes or a String. If a\n String is given, it will be used as a character encoding\n name (for example \"UTF-8\" or \"ISO-8859-1\") to convert\n the sub-process's stdout to a String which is returned.\n If :bytes is given, the sub-process's stdout will be stored\n in a byte array and returned. Defaults to UTF-8.\n :env override the process env with a map (or the underlying Java\n String[] if you are a masochist).\n :dir override the process dir with a String or java.io.File.\n\n You can bind :env or :dir for multiple operations using with-sh-env\n and with-sh-dir.\n\n sh returns a map of\n :exit => sub-process's exit code\n :out => sub-process's stdout (as byte[] or String)\n :err => sub-process's stderr (String via platform default encoding)", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.shell/sh"} {:ns "clojure.java.shell", :name "*sh-dir*", :file "clojure/java/shell.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 18, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.java.shell/*sh-dir*"} {:added "1.2", :ns "clojure.java.shell", :name "with-sh-dir", :file "clojure/java/shell.clj", :type "macro", :column 1, :see-alsos [{:created-at 1332915149000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.shell", :name "sh", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f48"}], :line 21, :examples [{:updated-at 1560006443938, :created-at 1560006443938, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body "(require '[clojure.java.shell :as shell :refer [sh]])\n\n(shell/with-sh-dir \"/usr/share\"\n (sh \"pwd\"))\n\n;; {:exit 0, :out \"/usr/share\\n\", :err \"\"}\n", :_id "5cfbcf2be4b0ca44402ef751"}], :macro true, :notes nil, :arglists ["dir & forms"], :doc "Sets the directory for use with sh, see sh for details.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.shell/with-sh-dir"} {:ns "clojure.java.shell", :name "*sh-env*", :file "clojure/java/shell.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 19, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.java.shell/*sh-env*"} {:added "1.2", :ns "clojure.java.shell", :name "with-sh-env", :file "clojure/java/shell.clj", :type "macro", :column 1, :see-alsos [{:created-at 1332915161000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.java.shell", :name "sh", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f58"}], :line 28, :examples [{:updated-at 1560006506866, :created-at 1560006506866, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body "(require '[clojure.java.shell :as shell :refer [sh]])\n\n(shell/with-sh-env {:debug \"true\"}\n (sh \"env\"))\n\n;; {:exit 0, :out \"debug=true\\n\", :err \"\"}\n", :_id "5cfbcf6ae4b0ca44402ef752"}], :macro true, :notes nil, :arglists ["env & forms"], :doc "Sets the environment for use with sh, see sh for details.", :library-url "https://github.com/clojure/clojure", :href "/clojure.java.shell/with-sh-env"} {:ns "clojure.main", :name "main", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 616, :examples [{:body "java -cp clojure-1.6.0.jar clojure.main hey.clj", :author {:login "ganeshskm", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2527539?v=3"}, :created-at 1418110038171, :updated-at 1418110038171, :_id "5486a456e4b04e93c519ff9f"}], :notes nil, :arglists ["& args"], :doc "Usage: java -cp clojure.jar clojure.main [init-opt*] [main-opt] [arg*]\n\n With no options or args, runs an interactive Read-Eval-Print Loop\n\n init options:\n -i, --init path Load a file or resource\n -e, --eval string Evaluate expressions in string; print non-nil values\n --report target Report uncaught exception to \"file\" (default), \"stderr\",\n or \"none\", overrides System property clojure.main.report\n\n main options:\n -m, --main ns-name Call the -main function from a namespace with args\n -r, --repl Run a repl\n path Run a script from a file or resource\n - Run a script from standard input\n -h, -?, --help Print this help message and exit\n\n operation:\n\n - Establishes thread-local bindings for commonly set!-able vars\n - Enters the user namespace\n - Binds *command-line-args* to a seq of strings containing command line\n args that appear after any main option\n - Runs all init options in order\n - Calls a -main function or runs a repl or script if requested\n\n The init options may be repeated and mixed freely, but must appear before\n any main option. The appearance of any eval option before running a repl\n suppresses the usual repl greeting message: \"Clojure ~(clojure-version)\".\n\n Paths may be absolute or relative in the filesystem or relative to\n classpath. Classpath-relative paths have prefix of @ or @/", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/main"} {:ns "clojure.main", :name "with-bindings", :file "clojure/main.clj", :type "macro", :column 1, :see-alsos [{:created-at 1374149313000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "binding", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a83"} {:created-at 1374149334000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-local-vars", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a84"} {:created-at 1374149343000, :author {:login "alilee", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2fb0196dc5a7cd3a5cc73f1b9941c209?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-redefs-fn", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a85"}], :line 77, :examples nil, :macro true, :notes nil, :arglists ["& body"], :doc "Executes body in the context of thread-local bindings for several vars\n that often need to be set!: *ns* *warn-on-reflection* *math-context*\n *print-meta* *print-length* *print-level* *compile-path*\n *command-line-args* *1 *2 *3 *e", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/with-bindings"} {:added "1.3", :ns "clojure.main", :name "stack-element-str", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 62, :examples nil, :notes nil, :arglists ["el"], :doc "Returns a (possibly unmunged) string representation of a StackTraceElement", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/stack-element-str"} {:ns "clojure.main", :name "repl-caught", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 348, :examples nil, :notes nil, :arglists ["e"], :doc "Default :caught hook for repl", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/repl-caught"} {:ns "clojure.main", :name "repl-exception", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 172, :examples nil, :notes nil, :arglists ["throwable"], :doc "Returns the root cause of throwables", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/repl-exception"} {:ns "clojure.main", :name "err->msg", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 343, :examples nil, :notes nil, :arglists ["e"], :doc "Helper to return an error message string from an exception.", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/err->msg"} {:ns "clojure.main", :name "repl-read", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 154, :examples nil, :notes nil, :arglists ["request-prompt request-exit"], :doc "Default :read hook for repl. Reads from *in* which must either be an\n instance of LineNumberingPushbackReader or duplicate its behavior of both\n supporting .unread and collapsing all of CR, LF, and CRLF into a single\n \\newline. repl-read:\n - skips whitespace, then\n - returns request-prompt on start of line, or\n - returns request-exit on end of stream, or\n - reads an object from the input stream, then\n - skips the next input character if it's end of line, then\n - returns the object.", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/repl-read"} {:ns "clojure.main", :name "load-script", :file "clojure/main.clj", :type "function", :column 1, :see-alsos [{:created-at 1422652999747, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=2"}, :to-var {:ns "clojure.core", :name "read-string", :library-url "https://github.com/clojure/clojure"}, :_id "54cbf647e4b0e2ac61831cee"} {:created-at 1422653011235, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=2"}, :to-var {:ns "clojure.edn", :name "read-string", :library-url "https://github.com/clojure/clojure"}, :_id "54cbf653e4b081e022073c3c"}], :line 468, :examples [{:body ";; In file /some/path/to-script.clj\n;; (ns test)\n;; \n;; (defn greet [name]\n;; (str \"Hello \" name))\n\n;; from repl\nuser=> (clojure.main/load-script \"/some/path/to-script.clj\")\n#'test/greet\nuser=> (greet \"Peter\")\n\"Hello Peter\"\n\n;; to load hello.clj from current directory\nuser=> (clojure.main/load-script \"hello.clj\")\n\n;; to load some-code.clj from class path\nuser=> (clojure.main/load-script \"@some-code.clj\")\n", :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=2"}, :created-at 1422652901571, :updated-at 1422652901571, :_id "54cbf5e5e4b0e2ac61831ced"}], :notes nil, :arglists ["path"], :doc "Loads Clojure source from a file or resource given its path. Paths\n beginning with @ or @/ are considered relative to classpath.", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/load-script"} {:ns "clojure.main", :name "skip-if-eol", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 108, :examples nil, :notes nil, :arglists ["s"], :doc "If the next character on stream s is a newline, skips it, otherwise\n leaves the stream untouched. Returns :line-start, :stream-end, or :body\n to indicate the relative location of the next character on s. The stream\n must either be an instance of LineNumberingPushbackReader or duplicate\n its behavior of both supporting .unread and collapsing all of CR, LF, and\n CRLF to a single \\newline.", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/skip-if-eol"} {:ns "clojure.main", :name "skip-whitespace", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 122, :examples [{:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; Use while reading characters from a LineNumberingPushbackReader\n;; to jump to the next available \":body\", skipping whites spaces \n;; line starts, comment lines, until \":stream-end\".\n\n(require '[clojure.main :as main])\n\n(defn string-reader [s] \n (-> (java.io.StringReader. s)\n (clojure.lang.LineNumberingPushbackReader.)))\n\n(def r \n (string-reader \n \" A\\n B\\n; comment\\n C\"))\n\n(char (.read r)) ;; \\space\n(main/skip-whitespace r) ;; :body\n(char (.read r)) ;; \\A\n(main/skip-whitespace r) ;; :line-start\n(main/skip-whitespace r) ;; :body\n(char (.read r)) ;; \\B\n(main/skip-whitespace r) ;; :line-start\n(main/skip-whitespace r) ;; :line-start\n(main/skip-whitespace r) ;; :body\n(char (.read r)) ;; \\C\n(main/skip-whitespace r) ;; :stream-end", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1559643650513, :updated-at 1559647605018, :_id "5cf64602e4b0ca44402ef749"}], :notes nil, :arglists ["s"], :doc "Skips whitespace characters on stream s. Returns :line-start, :stream-end,\n or :body to indicate the relative location of the next character on s.\n Interprets comma as whitespace and semicolon as comment to end of line.\n Does not interpret #! as comment to end of line because only one\n character of lookahead is available. The stream must either be an\n instance of LineNumberingPushbackReader or duplicate its behavior of both\n supporting .unread and collapsing all of CR, LF, and CRLF to a single\n \\newline.", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/skip-whitespace"} {:ns "clojure.main", :name "report-error", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 584, :examples nil, :notes nil, :arglists ["t & {:keys [target], :or {target \"file\"}, :as opts}"], :doc "Create and output an exception report for a Throwable to target.\n\n Options:\n :target - \"file\" (default), \"stderr\", \"none\"\n\n If file is specified but cannot be written, falls back to stderr.", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/report-error"} {:added "1.3", :ns "clojure.main", :name "root-cause", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 35, :examples nil, :notes nil, :arglists ["t"], :doc "Returns the initial cause of an exception or error by peeling off all of\n its wrappers", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/root-cause"} {:ns "clojure.main", :name "repl-requires", :file "clojure/main.clj", :type "var", :column 1, :see-alsos nil, :line 355, :examples nil, :notes nil, :arglists [], :doc "A sequence of lib specs that are applied to `require`\nby default when a new command-line REPL is started.", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/repl-requires"} {:added "1.3", :ns "clojure.main", :name "demunge", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 28, :examples [{:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [], :body "(use 'clojure.main)\n\n(demunge \"clojure.core$println\")\n=>\"clojure.core/println\"", :created-at 1325041264000, :updated-at 1325041264000, :_id "542692d6c026201cdc3270eb"}], :notes nil, :arglists ["fn-name"], :doc "Given a string representation of a fn class,\n as in a stack trace element, returns a readable version.", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/demunge"} {:ns "clojure.main", :name "with-read-known", :file "clojure/main.clj", :type "macro", :column 1, :see-alsos nil, :line 361, :examples nil, :macro true, :notes nil, :arglists ["& body"], :doc "Evaluates body with *read-eval* set to a \"known\" value,\n i.e. substituting true for :unknown if necessary.", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/with-read-known"} {:added "1.10", :ns "clojure.main", :name "ex-str", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 269, :examples nil, :notes nil, :arglists ["{:clojure.error/keys [phase source path line column symbol class cause spec], :as triage-data}"], :doc "Returns a string from exception data, as produced by ex-triage.\n The first line summarizes the exception phase and location.\n The subsequent lines describe the cause.", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/ex-str"} {:added "1.10", :ns "clojure.main", :name "renumbering-read", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 140, :examples nil, :notes nil, :arglists ["opts reader line-number"], :doc "Reads from reader, which must be a LineNumberingPushbackReader, while capturing\n the read string. If the read is successful, reset the line number and re-read.\n The line number on re-read is the passed line-number unless :line or\n :clojure.core/eval-file meta are explicitly set on the read value.", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/renumbering-read"} {:ns "clojure.main", :name "repl", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 368, :examples [{:updated-at 1559663740765, :created-at 1559663133898, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Create a REPL for a small toy language. A simple calculator \n;; evaluates the 4 arithmetic operators with infix notation.\n\n(require '[clojure.main :as main])\n\n(def repl-options\n [:prompt #(printf \"enter expression :> \")\n :read (fn [request-prompt request-exit]\n (or ({:line-start request-prompt :stream-end request-exit}\n (main/skip-whitespace *in*))\n (re-find #\"^(\\d+)([\\+\\-\\*\\/])(\\d+)$\" (read-line))))\n :eval (fn [[_ x op y]]\n (({\"+\" + \"-\" - \"*\" * \"/\" /} op)\n (Integer. x)\n (Integer. y)))])\n\n;; This enters a new REPL loop that shows a new prompt.\n;; Type ctrl+d to exit the nested REPL and go back to normal.\n(apply main/repl repl-options)\n\n;; An example interaction:\n;; enter expression :> 2*3\n;; 6\n\n\n", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5cf6921de4b0ca44402ef74d"}], :notes nil, :arglists ["& options"], :doc "Generic, reusable, read-eval-print loop. By default, reads from *in*,\n writes to *out*, and prints exception summaries to *err*. If you use the\n default :read hook, *in* must either be an instance of\n LineNumberingPushbackReader or duplicate its behavior of both supporting\n .unread and collapsing CR, LF, and CRLF into a single \\newline. Options\n are sequential keyword-value pairs. Available options and their defaults:\n\n - :init, function of no arguments, initialization hook called with\n bindings for set!-able vars in place.\n default: #()\n\n - :need-prompt, function of no arguments, called before each\n read-eval-print except the first, the user will be prompted if it\n returns true.\n default: (if (instance? LineNumberingPushbackReader *in*)\n #(.atLineStart *in*)\n #(identity true))\n\n - :prompt, function of no arguments, prompts for more input.\n default: repl-prompt\n\n - :flush, function of no arguments, flushes output\n default: flush\n\n - :read, function of two arguments, reads from *in*:\n - returns its first argument to request a fresh prompt\n - depending on need-prompt, this may cause the repl to prompt\n before reading again\n - returns its second argument to request an exit from the repl\n - else returns the next object read from the input stream\n default: repl-read\n\n - :eval, function of one argument, returns the evaluation of its\n argument\n default: eval\n\n - :print, function of one argument, prints its argument to the output\n default: prn\n\n - :caught, function of one argument, a throwable, called when\n read, eval, or print throws an exception or error\n default: repl-caught", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/repl"} {:ns "clojure.main", :name "repl-prompt", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 103, :examples nil, :notes nil, :arglists [""], :doc "Default :prompt hook for repl", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/repl-prompt"} {:added "1.10", :ns "clojure.main", :name "ex-triage", :file "clojure/main.clj", :type "function", :column 1, :see-alsos nil, :line 208, :examples nil, :notes nil, :arglists ["datafied-throwable"], :doc "Returns an analysis of the phase, error, cause, and location of an error that occurred\n based on Throwable data, as returned by Throwable->map. All attributes other than phase\n are optional:\n :clojure.error/phase - keyword phase indicator, one of:\n :read-source :compile-syntax-check :compilation :macro-syntax-check :macroexpansion\n :execution :read-eval-result :print-eval-result\n :clojure.error/source - file name (no path)\n :clojure.error/path - source path\n :clojure.error/line - integer line number\n :clojure.error/column - integer column number\n :clojure.error/symbol - symbol being expanded/compiled/invoked\n :clojure.error/class - cause exception class symbol\n :clojure.error/cause - cause exception message\n :clojure.error/spec - explain-data for spec error", :library-url "https://github.com/clojure/clojure", :href "/clojure.main/ex-triage"} {:added "1.2", :ns "clojure.pprint", :name "pprint", :file "clojure/pprint/pprint_base.clj", :type "function", :column 1, :see-alsos [{:created-at 1329988989000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.pprint", :name "pp", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e21"} {:created-at 1331448999000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.pprint", :name "print-table", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e22"} {:created-at 1486959495016, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "prn", :ns "clojure.core"}, :_id "58a13387e4b01f4add58fe4e"} {:created-at 1486959503388, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "prn-str", :ns "clojure.core"}, :_id "58a1338fe4b01f4add58fe4f"} {:created-at 1486959509922, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pr", :ns "clojure.core"}, :_id "58a13395e4b01f4add58fe50"} {:created-at 1486959527438, :author {:login "delonnewman", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10404?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pr-str", :ns "clojure.core"}, :_id "58a133a7e4b01f4add58fe51"} {:created-at 1518042875271, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pprint-tab", :ns "clojure.pprint"}, :_id "5a7b7efbe4b0316c0f44f8ae"}], :line 241, :examples [{:author {:login "nipra", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/142529?v=3"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "geofffilippi", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/caad97b26450a04c6925249cda76fd74?r=PG&default=identicon"} {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body "(def big-map (zipmap \n [:a :b :c :d :e] \n (repeat \n (zipmap [:a :b :c :d :e] \n (take 5 (range))))))\n;;=> #'user/big-map\n\nbig-map\n;;=> {:a {:a 0, :b 1, :c 2, :d 3, :e 4}, :b {:a 0, :b 1, :c 2, :d 3, :e 4}, :c {:a 0, :b 1, :c 2, :d 3, :e 4}, :d {:a 0, :b 1, :c 2, :d 3, :e 4}, :e {:a 0, :b 1, :c 2, :d 3, :e 4}}\n\n(clojure.pprint/pprint big-map)\n;; {:e {:e 4, :d 3, :c 2, :b 1, :a 0},\n;; :d {:e 4, :d 3, :c 2, :b 1, :a 0},\n;; :c {:e 4, :d 3, :c 2, :b 1, :a 0},\n;; :b {:e 4, :d 3, :c 2, :b 1, :a 0},\n;; :a {:e 4, :d 3, :c 2, :b 1, :a 0}}\n;; nil", :created-at 1279160964000, :updated-at 1536169383689, :_id "542692d0c026201cdc326ec5"} {:body ";; suppose you want to pretty print to a file.\n(clojure.pprint/pprint *map* (clojure.java.io/writer \"foo.txt\"))\n;; writes the contents of *map* to a file named 'foo.txt'", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1435609992368, :updated-at 1435609992368, :_id "5591ab88e4b05f167dcf2345"} {:updated-at 1449436011404, :created-at 1449436011404, :author {:login "mrzor", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/54230?v=3"}, :body ";; pprint into a string using with-out-str\n(with-out-str (clojure.pprint/pprint {:x 1 :y -1}))\n;; => \"{:x 1, :y -1}\\n\"\n\n;; pprint into a string using StringWriter\n(let [out (java.io.StringWriter.)]\n (clojure.pprint/pprint {:a 1 :b 2} out)\n (clojure.pprint/pprint {:c 3 :d 4} out)\n (.toString out))\n;; => \"{:a 1, :b 2}\\n{:c 3, :d 4}\\n\"\n", :_id "5664a36be4b09a2675a0ba71"} {:updated-at 1510915362495, :created-at 1510915362495, :author {:login "ibercode", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/31028993?v=4"}, :body ";;how to use it with :require and :use\n\n;; :require \n(ns example.pprinter\n (:require [clojure.pprint :as pp]))\n\n(def myname \"John Smith\")\n(pp/pprint myname)\n\n--------------\n\n;;:use\n(ns example.pprinter\n (:use clojure.pprint))\n\n(def myname \"John Smith\")\n(pprint myname)", :_id "5a0ebd22e4b0a08026c48cbb"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; get Clojure snippets to print nicely\n(require '[clojure.pprint :as p])\n\n(def lost-formatting \n \"(defn op [sel] (condp = sel :plus + :minus - :mult * \n :div / :rem rem :quot quot :mod mod))\")\n\n(p/with-pprint-dispatch\n p/code-dispatch\n (p/pprint \n (clojure.edn/read-string lost-formatting)))\n\n;; (defn op [sel]\n;; (condp = sel\n;; :plus +\n;; :minus -\n;; :mult *\n;; :div /\n;; :rem rem\n;; :quot quot\n;; :mod mod))", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1536495212985, :updated-at 1536495430265, :_id "5b950e6ce4b00ac801ed9e8a"} {:updated-at 1662581080334, :created-at 1662581080334, :author {:login "djblue", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1986211?v=4"}, :body ";; pprint with metadata, requires Clojure >= 1.10.2\n(require '[clojure.pprint :as p])\n(binding [*print-meta* true]\n (p/pprint ^{:hello :world} {}))", :_id "6318f958e4b0b1e3652d765f"}], :notes [{:body "When using Clojure from the REPL, you don't need to specify `clojure.pprint` to use `pprint` or `pp`. At the REPL `(clojure.pprint x)` is equivalent to `(pprint x)`.", :created-at 1536169564110, :updated-at 1536494583495, :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :_id "5b90165ce4b00ac801ed9e88"}], :arglists ["object" "object writer"], :doc "Pretty print object to the optional output writer. If the writer is not provided, \nprint the object to the currently bound value of *out*.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/pprint"} {:added "1.2", :ns "clojure.pprint", :name "simple-dispatch", :file "clojure/pprint/dispatch.clj", :type "function", :column 1, :see-alsos [{:created-at 1683111333271, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "set-pprint-dispatch", :ns "clojure.pprint"}, :_id "64523da5e4b08cf8563f4bb1"} {:created-at 1683111339705, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "with-pprint-dispatch", :ns "clojure.pprint"}, :_id "64523dabe4b08cf8563f4bb2"}], :line 151, :examples nil, :notes nil, :arglists ["object"], :doc "The pretty print dispatch function for simple data structure format.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/simple-dispatch"} {:added "1.2", :ns "clojure.pprint", :name "get-pretty-writer", :file "clojure/pprint/cl_format.clj", :type "function", :column 1, :see-alsos nil, :line 1203, :examples nil, :notes nil, :arglists ["writer"], :doc "Returns the java.io.Writer passed in wrapped in a pretty writer proxy, unless it's \nalready a pretty writer. Generally, it is unnecessary to call this function, since pprint,\nwrite, and cl-format all call it if they need to. However if you want the state to be \npreserved across calls, you will want to wrap them with this. \n\nFor example, when you want to generate column-aware output with multiple calls to cl-format, \ndo it like in this example:\n\n (defn print-table [aseq column-width]\n (binding [*out* (get-pretty-writer *out*)]\n (doseq [row aseq]\n (doseq [col row]\n (cl-format true \"~4D~7,vT\" col column-width))\n (prn))))\n\nNow when you run:\n\n user> (print-table (map #(vector % (* % %) (* % % %)) (range 1 11)) 8)\n\nIt prints a table of squares and cubes for the numbers from 1 to 10:\n\n 1 1 1 \n 2 4 8 \n 3 9 27 \n 4 16 64 \n 5 25 125 \n 6 36 216 \n 7 49 343 \n 8 64 512 \n 9 81 729 \n 10 100 1000", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/get-pretty-writer"} {:added "1.2", :ns "clojure.pprint", :name "*print-suppress-namespaces*", :file "clojure/pprint/pprint_base.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 72, :examples [{:author {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}, :editors [{:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}], :body "(require '[clojure.pprint :as pp])\n\n(defmacro plus [n1 n2]\n `(+ ~n1 ~n2))\n\n(macroexpand-1 '(plus 3 4))\n;=> (clojure.core/+ 3 4)\n\n\n(alter-var-root #'pp/*print-suppress-namespaces* (constantly true))\n\n(macroexpand-1 '(plus 3 4))\n;=> (clojure.core/+ 3 4)\n\n;; comes into effect only in pprint.\n(pp/pprint (macroexpand-1 '(plus 3 4)))\n;=> (+ 3 4)\n", :created-at 1397944252000, :updated-at 1397944707000, :_id "542692d6c026201cdc3270ec"}], :notes nil, :arglists [], :doc "Don't print namespaces with symbols. This is particularly useful when \npretty printing the results of macro expansions", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/*print-suppress-namespaces*"} {:added "1.2", :ns "clojure.pprint", :name "*print-pretty*", :file "clojure/pprint/pprint_base.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 30, :examples [{:updated-at 1533810134347, :created-at 1533810134347, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :body "(binding [clojure.pprint/*print-right-margin* 5]\n\n ;; Compare the two outputs below:\n\n (binding [clojure.pprint/*print-pretty* true]\n (clojure.pprint/write (range 3)))\n ; Prints:\n ; (0\n ; 1\n ; 2)\n\n (binding [clojure.pprint/*print-pretty* false]\n (clojure.pprint/write (range 3)))\n ; Prints:\n ; (0 1 2)\n)", :_id "5b6c15d6e4b00ac801ed9e48"}], :notes [{:author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :updated-at 1533810194451, :created-at 1533810194451, :body "`clojure.pprint/pprint` always sets `*print-pretty*` to `true` internally, so changing it has no effect if you only use `pprint` and not `write`.", :_id "5b6c1612e4b00ac801ed9e49"}], :arglists [], :doc "Bind to true if you want write to use pretty printing", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/*print-pretty*"} {:added "1.2", :ns "clojure.pprint", :name "*print-pprint-dispatch*", :file "clojure/pprint/pprint_base.clj", :type "var", :column 1, :see-alsos [{:created-at 1619968276432, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "with-pprint-dispatch", :ns "clojure.pprint"}, :_id "608ec114e4b0b1e3652d74ee"}], :dynamic true, :line 34, :examples [{:updated-at 1619968239057, :created-at 1619968239057, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :body "(require '[clojure.pprint :as pprint])\n\n(def condp-statement\n '(condp = x\n 1 \"one\" 2 \"two\" 3 \"three\"\n 4 \"four\" 5 \"five\" 6 \"six\" :else :none))\n\n(binding [pprint/*print-pprint-dispatch* pprint/code-dispatch]\n (pprint/pprint condp-statement))\n;; (condp = x\n;; 1 \"one\"\n;; 2 \"two\"\n;; 3 \"three\"\n;; 4 \"four\"\n;; 5 \"five\"\n;; 6 \"six\"\n;; :else :none)\n", :_id "608ec0efe4b0b1e3652d74ed"}], :notes nil, :arglists [], :doc "The pretty print dispatch function. Use with-pprint-dispatch or set-pprint-dispatch\nto modify.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/*print-pprint-dispatch*"} {:added "1.2", :ns "clojure.pprint", :name "pprint-newline", :file "clojure/pprint/pprint_base.clj", :type "function", :column 1, :see-alsos nil, :line 329, :examples nil, :notes nil, :arglists ["kind"], :doc "Print a conditional newline to a pretty printing stream. kind specifies if the \nnewline is :linear, :miser, :fill, or :mandatory. \n\nThis function is intended for use when writing custom dispatch functions.\n\nOutput is sent to *out* which must be a pretty printing writer.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/pprint-newline"} {:added "1.2", :ns "clojure.pprint", :name "code-dispatch", :file "clojure/pprint/dispatch.clj", :type "function", :column 1, :see-alsos [{:created-at 1683111298261, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "set-pprint-dispatch", :ns "clojure.pprint"}, :_id "64523d82e4b08cf8563f4baf"} {:created-at 1683111307405, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "with-pprint-dispatch", :ns "clojure.pprint"}, :_id "64523d8be4b08cf8563f4bb0"}], :line 453, :examples nil, :notes nil, :arglists ["object"], :doc "The pretty print dispatch function for pretty printing Clojure code.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/code-dispatch"} {:added "1.3", :ns "clojure.pprint", :name "print-length-loop", :file "clojure/pprint/pprint_base.clj", :type "macro", :column 1, :see-alsos nil, :line 391, :examples [{:updated-at 1682635931128, :created-at 1682635931128, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body "(set! *print-length* 5)\n\n(print-length-loop [a 0]\n (pprint a)\n (recur (inc a)))\n;; 0\n;; 1\n;; 2\n;; 3\n;; 4\n;; ...\n;; => nil", :_id "644afc9be4b08cf8563f4ba2"}], :macro true, :notes nil, :arglists ["bindings & body"], :doc "A version of loop that iterates at most *print-length* times. This is designed \nfor use in pretty-printer dispatch functions.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/print-length-loop"} {:added "1.2", :ns "clojure.pprint", :name "pprint-tab", :file "clojure/pprint/pprint_base.clj", :type "function", :column 1, :see-alsos nil, :line 356, :examples nil, :notes nil, :arglists ["kind colnum colinc"], :doc "Tab at this point in the pretty printing stream. kind specifies whether the tab\nis :line, :section, :line-relative, or :section-relative. \n\nColnum and colinc specify the target column and the increment to move the target\nforward if the output is already past the original target.\n\nThis function is intended for use when writing custom dispatch functions.\n\nOutput is sent to *out* which must be a pretty printing writer.\n\nTHIS FUNCTION IS NOT YET IMPLEMENTED.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/pprint-tab"} {:added "1.2", :ns "clojure.pprint", :name "pprint-logical-block", :file "clojure/pprint/pprint_base.clj", :type "macro", :column 1, :see-alsos nil, :line 302, :examples nil, :macro true, :notes nil, :arglists ["options* body"], :doc "Execute the body as a pretty printing logical block with output to *out* which \nmust be a pretty printing writer. When used from pprint or cl-format, this can be \nassumed. \n\nThis function is intended for use when writing custom dispatch functions.\n\nBefore the body, the caller can optionally specify options: :prefix, :per-line-prefix, \nand :suffix.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/pprint-logical-block"} {:added "1.3", :ns "clojure.pprint", :name "print-table", :file "clojure/pprint/print_table.clj", :type "function", :column 1, :see-alsos [{:created-at 1331448986000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.pprint", :name "pprint", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e86"} {:created-at 1331449122000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.inspector", :name "inspect-table", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e87"}], :line 11, :examples [{:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"} {:login "bkovitz", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/4142015?v=4"}], :body "(use 'clojure.pprint)\n;=> nil\n\n;; By default, columns are in the order returned by (keys (first rows))\n(print-table [{:a 1 :b 2 :c 3} {:b 5 :a 7 :c \"dog\"}])\n;; =============\n;; :a | :c | :b\n;; =============\n;; 1 | 3 | 2 \n;; 7 | dog | 5 \n;; =============\n;=> nil\n\n;; If there are keys not in the first row, and/or you want to specify only\n;; some, or in a particular order, give the desired keys as the first arg.\n(print-table [:b :a] [{:a 1 :b 2 :c 3} {:b 5 :a 7 :c \"dog\"}])\n;; =======\n;; :b | :a\n;; =======\n;; 2 | 1 \n;; 5 | 7 \n;; =======\n;=> nil\n", :created-at 1329889278000, :updated-at 1516548290588, :_id "542692d6c026201cdc3270f1"} {:updated-at 1507762324788, :created-at 1329889427000, :body "(use 'clojure.pprint 'clojure.reflect)\n;=> nil\n(def x (:members (reflect clojure.lang.BigInt)))\n;=> #'user/x\n(print-table [:name :type :flags] (sort-by :name x))\n;; ======================================================================\n;; :name | :type | :flags \n;; ======================================================================\n;; ONE | clojure.lang.BigInt | #{:static :public :final}\n;; ZERO | clojure.lang.BigInt | #{:static :public :final}\n;; add | | #{:public} \n;; bipart | java.math.BigInteger | #{:public :final} \n;; bitLength | | #{:public} \n;; byteValue | | #{:public} \n;; clojure.lang.BigInt | | #{:private} \n;; doubleValue | | #{:public} \n;; equals | | #{:public} \n;; floatValue | | #{:public} \n;; fromBigInteger | | #{:static :public} \n;; fromLong | | #{:static :public} \n;; hashCode | | #{:public} \n;; intValue | | #{:public} \n;; longValue | | #{:public} \n;; lpart | long | #{:public :final} \n;; lt | | #{:public} \n;; multiply | | #{:public} \n;; quotient | | #{:public} \n;; remainder | | #{:public} \n;; shortValue | | #{:public} \n;; toBigInteger | | #{:public} \n;; toString | | #{:public} \n;; valueOf | | #{:static :public} \n;; ======================================================================\n;=> nil\n", :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}, :_id "542692d6c026201cdc3270f3"} {:updated-at 1573569597228, :created-at 1573569597228, :author {:login "l3nz", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1101849?v=4"}, :body "; Redirect print-table to a string.\n\n(binding [*out* (java.io.StringWriter.)]\n (clojure.pprint/print-table [{:a 1 :b 2}])\n (.toString *out*))\n\n\n=> \"\\n| :a | :b |\\n|----+----|\\n| 1 | 2 |\\n\"\n\n", :_id "5dcac43de4b0ca44402ef7db"} {:updated-at 1579276290470, :created-at 1579276290470, :author {:login "malesch", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/114063?v=4"}, :body "; Another way to redirect print-table to a string\n\n(with-out-str (clojure.pprint/print-table [{:a 1 :b 2}]))\n\n=> \"\\n| :a | :b |\\n|----+----|\\n| 1 | 2 |\\n\"", :_id "5e21d802e4b0ca44402ef819"}], :notes nil, :arglists ["ks rows" "rows"], :doc "Prints a collection of maps in a textual table. Prints table headings\n ks, and then a line of output for each row, corresponding to the keys\n in ks. If ks are not specified, use the keys of the first item in rows.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/print-table"} {:added "1.2", :ns "clojure.pprint", :name "pp", :file "clojure/pprint/pprint_base.clj", :type "macro", :column 1, :see-alsos [{:created-at 1518042853743, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pprint", :ns "clojure.pprint"}, :_id "5a7b7ee5e4b0316c0f44f8ad"}], :line 254, :examples [{:updated-at 1285501102000, :created-at 1279160860000, :body "user=> (zipmap \n [:a :b :c :d :e] \n (repeat \n (zipmap \n [:a :b :c :d :e] \n (take 5 (range)))))\n{:e {:e 4, :d 3, :c 2, :b 1, :a 0}, :d {:e 4, :d 3, :c 2, :b 1, :a 0}, :c {:e 4, :d 3, :c 2, :b 1, :a 0}, :b {:e 4, :d 3, :c 2, :b 1, :a 0}, :a {:e 4, :d 3, :c 2, :b 1, :a 0}}\n\nuser=> (clojure.pprint/pp)\n{:e {:e 4, :d 3, :c 2, :b 1, :a 0},\n :d {:e 4, :d 3, :c 2, :b 1, :a 0},\n :c {:e 4, :d 3, :c 2, :b 1, :a 0},\n :b {:e 4, :d 3, :c 2, :b 1, :a 0},\n :a {:e 4, :d 3, :c 2, :b 1, :a 0}}\nnil\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :_id "542692d0c026201cdc326ec8"}], :macro true, :notes [{:author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :updated-at 1536169628718, :created-at 1536169628718, :body "When using Clojure from the REPL, you don't need to specify `clojure.pprint` to use `pp` or `pprint`. So at the REPL `(clojure.pp)` is equivalent to `(pp)`.", :_id "5b90169ce4b00ac801ed9e89"}], :arglists [""], :doc "A convenience macro that pretty prints the last thing output. This is\nexactly equivalent to (pprint *1).", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/pp"} {:added "1.2", :ns "clojure.pprint", :name "set-pprint-dispatch", :file "clojure/pprint/pprint_base.clj", :type "function", :column 1, :see-alsos [{:created-at 1683111037007, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "*print-pprint-dispatch*", :ns "clojure.pprint"}, :_id "64523c7de4b08cf8563f4bad"}], :line 260, :examples [{:updated-at 1683111221732, :created-at 1683111221732, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body "(require '[clojure.pprint :as pprint])\n\n(def condp-statement\n '(condp = x\n 1 \"one\" 2 \"two\" 3 \"three\"\n 4 \"four\" 5 \"five\" 6 \"six\" :else :none))\n\n(pprint/pprint condp-statement)\n;; (condp\n;; =\n;; x\n;; 1\n;; \"one\"\n;; 2\n;; \"two\"\n;; 3\n;; \"three\"\n;; 4\n;; \"four\"\n;; 5\n;; \"five\"\n;; 6\n;; \"six\"\n;; :else\n;; :none)\n\n(pprint/set-pprint-dispatch pprint/code-dispatch)\n\n(pprint/pprint condp-statement)\n;; (condp = x\n;; 1 \"one\"\n;; 2 \"two\"\n;; 3 \"three\"\n;; 4 \"four\"\n;; 5 \"five\"\n;; 6 \"six\"\n;; :else :none)", :_id "64523d35e4b08cf8563f4bae"}], :notes nil, :arglists ["function"], :doc "Set the pretty print dispatch function to a function matching (fn [obj] ...)\nwhere obj is the object to pretty print. That function will be called with *out* set\nto a pretty printing writer to which it should do its printing.\n\nFor example functions, see simple-dispatch and code-dispatch in \nclojure.pprint.dispatch.clj.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/set-pprint-dispatch"} {:added "1.2", :ns "clojure.pprint", :name "fresh-line", :file "clojure/pprint/cl_format.clj", :type "function", :column 1, :see-alsos nil, :line 1245, :examples nil, :notes nil, :arglists [""], :doc "Make a newline if *out* is not already at the beginning of the line. If *out* is\nnot a pretty writer (which keeps track of columns), this function always outputs a newline.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/fresh-line"} {:added "1.2", :ns "clojure.pprint", :name "formatter-out", :file "clojure/pprint/cl_format.clj", :type "macro", :column 1, :see-alsos [{:created-at 1683117747988, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "formatter", :ns "clojure.pprint"}, :_id "645256b3e4b08cf8563f4bb6"}], :line 1936, :examples [{:updated-at 1683117741775, :created-at 1683117741775, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body "(def my-formatter (pprint/formatter-out \"~:d\"))\n\n(my-formatter 123456)\n;; 123,456\n;; => nil", :_id "645256ade4b08cf8563f4bb5"}], :macro true, :notes nil, :arglists ["format-in"], :doc "Makes a function which can directly run format-in. The function is\nfn [& args] ... and returns nil. This version of the formatter macro is\ndesigned to be used with *out* set to an appropriate Writer. In particular,\nthis is meant to be used as part of a pretty printer dispatch method.\n\nformat-in can be either a control string or a previously compiled format.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/formatter-out"} {:added "1.2", :ns "clojure.pprint", :name "formatter", :file "clojure/pprint/cl_format.clj", :type "macro", :column 1, :see-alsos [{:created-at 1683117686117, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "formatter-out", :ns "clojure.pprint"}, :_id "64525676e4b08cf8563f4bb4"} {:created-at 1683389093912, :author {:login "josuesantos1", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/43919440?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pprint", :ns "clojure.pprint"}, :_id "64567aa5e4b08cf8563f4bba"}], :line 1916, :examples [{:updated-at 1683117677315, :created-at 1683117677315, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body "(def my-formatter (pprint/formatter \"~:d\"))\n\n(with-open [stream (java.io.StringWriter.)]\n (my-formatter stream 123456)\n (str stream))\n;; => \"123,456\"", :_id "6452566de4b08cf8563f4bb3"} {:updated-at 1683490074327, :created-at 1683128227191, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :body ";; Compiling the control string can have significant performance benefits…\n\n(time\n (with-open [stream (java.io.StringWriter.)]\n (doseq [x (range 1e5)]\n (pprint/cl-format stream \"Number is ~:d \" x))))\n;; Elapsed time: 5100.348801 msecs\n\n(def my-formatter (pprint/formatter \"Number is ~:d \"))\n\n(time\n (with-open [stream (java.io.StringWriter.)]\n (doseq [x (range 1e5)]\n (my-formatter stream x))))\n;; Elapsed time: 3620.067511 msecs\n\n;; But still not a patch on `format` for this example…\n\n(time\n (with-open [stream (java.io.StringWriter.)]\n (doseq [x (range 1e5)]\n (.write stream (format \"Number is %,d \" x)))))\n;; \"Elapsed time: 444.501672 msecs\"", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4", :account-source "github", :login "tomdl89"}], :_id "64527fa3e4b08cf8563f4bb8"}], :macro true, :notes nil, :arglists ["format-in"], :doc "Makes a function which can directly run format-in. The function is\nfn [stream & args] ... and returns nil unless the stream is nil (meaning \noutput to a string) in which case it returns the resulting string.\n\nformat-in can be either a control string or a previously compiled format.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/formatter"} {:added "1.2", :ns "clojure.pprint", :name "pprint-indent", :file "clojure/pprint/pprint_base.clj", :type "function", :column 1, :see-alsos nil, :line 341, :examples nil, :notes nil, :arglists ["relative-to n"], :doc "Create an indent at this point in the pretty printing stream. This defines how \nfollowing lines are indented. relative-to can be either :block or :current depending \nwhether the indent should be computed relative to the start of the logical block or\nthe current column position. n is an offset. \n\nThis function is intended for use when writing custom dispatch functions.\n\nOutput is sent to *out* which must be a pretty printing writer.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/pprint-indent"} {:added "1.2", :ns "clojure.pprint", :name "*print-radix*", :file "clojure/pprint/pprint_base.clj", :type "var", :column 1, :see-alsos [{:created-at 1664286342316, :author {:login "sreekanthb", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1254569?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "*print-base*", :ns "clojure.pprint"}, :_id "6332fe86e4b0b1e3652d7668"}], :dynamic true, :line 80, :examples [{:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}], :body "(require '[clojure.pprint :as pprint])\n\n(binding [pprint/*print-base* 16\n pprint/*print-radix* true]\n (pprint/pprint 3405691582))\n;; #xcafebabe\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1620057785572, :updated-at 1620333810711, :_id "60901eb9e4b0b1e3652d74f3"}], :notes nil, :arglists [], :doc "Print a radix specifier in front of integers and rationals. If *print-base* is 2, 8, \nor 16, then the radix specifier used is #b, #o, or #x, respectively. Otherwise the \nradix specifier is in the form #XXr where XX is the decimal value of *print-base* ", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/*print-radix*"} {:added "1.2", :ns "clojure.pprint", :name "cl-format", :file "clojure/pprint/cl_format.clj", :type "function", :column 1, :see-alsos [{:created-at 1330170813000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "printf", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f44"} {:created-at 1330170818000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "format", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f45"}], :line 27, :examples [{:updated-at 1627687397697, :created-at 1332481954000, :body ";; Formatting integers, with options, in one of many bases.\n\n;; Basic Example\nuser=> (cl-format nil \"~:d\" 1234567)\n\"1,234,567\"\n\n;; First arg true sends formatted output to *out*\nuser=> (cl-format true \"~5d\\n\" 3)\n 3\nnil\n\n;; First arg nil or false causes formatted output to be returned as string\nuser=> (cl-format nil \"~5d\" 3)\n\" 3\"\n\nuser=> (cl-format nil \"Pad with leading zeros ~5,'0d\" 3)\n\"Pad with leading zeros 00003\"\n\nuser=> (cl-format nil \"Pad with leading asterisks ~5,'*d\" 3)\n\"Pad with leading asterisks ****3\"\n\n;; If there is a way to specify left-justifying a number in a single\n;; format string, please add it here. It can be done by using one\n;; cl-format invocation to get a formatted number as a string, and\n;; then use the ~a specifier on the result.\nuser=> (cl-format nil \"~15a\" (cl-format nil \"~:d\" 1234567))\n\"1,234,567 \"\n\n;; To specify left-justifying a number in a single format string, you can use:\nuser=> (cl-format nil \"~15@<~:d~>\" 1234567)\n\"1,234,567 \"\n\nuser=> (cl-format nil \"Always print the sign ~5@d\" 3)\n\"Always print the sign +3\"\n\nuser=> (cl-format nil \"Use comma group-separator every 3 digits ~12:d\" 1234567)\n\"Use comma group-separator every 3 digits 1,234,567\"\n\nuser=> (cl-format nil \"decimal ~d binary ~b octal ~o hex ~x\" 63 63 63 63)\n\"decimal 63 binary 111111 octal 77 hex 3f\"\n\nuser=> (cl-format nil \"base 7 ~7r with width and zero pad ~7,15,'0r\" 63 63)\n\"base 7 120 with width and zero pad 000000000000120\"\n\n;; No need for you to do any conversions to use cl-format with BigInt,\n;; BigInteger, or BigDecimal.\nuser=> (cl-format nil \"cl-format handles BigInts ~15d\" 12345678901234567890)\n\"cl-format handles BigInts 12345678901234567890\"\n\nuser=> (cl-format nil \"Be aware of auto-conversion ~8,'0d ~8,'0d\" 2.4 -5/4)\n\"Be aware of auto-conversion 000002.4 0000-5/4\"\n\n;; This might look like a bug, but it is actually behavior specified by the\n;; Common Lisp HyperSpec mentioned in the docs above. If you don't want that\n;; behavior (format \"%08d\" -2) might suit your purposes better.\nuser=> (cl-format nil \"~8,'0d\" -2)\n\"000000-2\"", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "coldnew", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/39703?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/16775439?v=4", :account-source "github", :login "Okwori"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}, :_id "542692d6c026201cdc3270ee"} {:body "(let [examples [[]\n [\"Alice\"]\n [\"Alice\" \"Bob\"]\n [\"Alice\" \"Bob\" \"Charlie\"]]]\n (doseq [users examples]\n (cljs.pprint/cl-format true \"~1{~#[none~;~a~;~a and ~a~:;~@{~#[~;and ~]~a~^, ~}~]~:} ~:*~1{~#[are~;is~:;are~]~:} online\" users)))\n\n;; Prints the following:\n\nnone are online\nAlice is online\nAlice and Bob are online\nAlice, Bob, and Charlie are online\n\n;; The following guide for Common Lisp format is available here. The examples applies to Clojure as well:\n;; http://www.gigamonkeys.com/book/a-few-format-recipes.html", :author {:login "lokedhs", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1028755?v=3"}, :created-at 1432169914857, :updated-at 1432169914857, :_id "555d2dbae4b01ad59b65f4d7"} {:editors [{:login "mars0i", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3"}], :body ";; cl-format knows what nil should look like:\nuser=> (cl-format nil \"~s\" nil)\n\"nil\"\n;; format doesn't:\nuser=> (format \"%s\" nil)\n\"null\"\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/1836941?v=3", :account-source "github", :login "mars0i"}, :created-at 1437886988750, :updated-at 1437887125187, :_id "55b46a0ce4b0080a1b79cdac"} {:updated-at 1535748237199, :created-at 1535748237199, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body "(def word-wrap\n [\"This\" \"sentence\" \"is\" \"too\" \"long\" \"for\" \"a\" \"small\" \"screen\"\n \"and\" \"should\" \"appear\" \"in\" \"multiple\" \"lines\" \"no\" \"longer\"\n \"than\" \"20\" \"characters\" \"each\" \".\"])\n\n(println (cl-format nil \"~{~<~%~1,20:;~A~> ~}\" word-wrap))\n;; This sentence is too\n;; long for a small\n;; screen and should\n;; appear in multiple\n;; lines no longer than\n;; 20 characters each.", :_id "5b89a88de4b00ac801ed9e7b"} {:updated-at 1586704521298, :created-at 1586704521298, :author {:login "jimka2001", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/6414129?v=4"}, :body "user=> (cl-format true \"~R~%\" 63)\nsixty-three\nnil\nuser=> (cl-format false \"~R\" 635464)\n\"six hundred thirty-five thousand, four hundred sixty-four\"", :_id "5e933089e4b087629b5a18d2"} {:editors [{:login "jimka2001", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6414129?v=4"}], :body ";; ~ followed by newline and white space, ignores the newline and the white space\n;; it is used simply to align code.\n;; ~@ followed by newline and white space outputs the newline \n;; but ignores the white space\n;; ~& outputs a newline unless already at beginning of line\n\n;; The following (using clojure.test) formats 5 lines of output\n;; each starting at the left margin. \n;; The initial ~&~ starts a newline if necessary and outputs \"expected\"\n;; at the left margin (without the quotes of course)\n;; The first argument, false, of cl-format, simply indicates to print\n;; to a string and return the string.\n(deftest t-type-subtypep-randomized-2\n (testing \"type subtype of union\"\n (doseq [depth (range 5)\n reps (range 200)\n :let [t1 (gns/gen-type depth)\n t2 (gns/gen-type depth)]]\n (is (= true (bdd/type-subtype? t1 (gns/create-or [t1 t2])))\n (cl-format false\n \"~&~\n expecting t1 <: (or t1 t2)~@\n t1=~A~@\n t2=~A~@\n depth=~A~@\n reps=~A\"\n t1 t2\n depth reps)))))", :author {:avatar-url "https://avatars.githubusercontent.com/u/6414129?v=4", :account-source "github", :login "jimka2001"}, :created-at 1626965634556, :updated-at 1628090795457, :_id "60f98682e4b0b1e3652d751b"} {:editors [{:login "jimka2001", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6414129?v=4"}], :body ";; cl-format can be used to force lazy sequences to be unwound.\n\n;; returns a string such as \"hello clojure.lang.LazySeq@3874d01 world\\n\"\n(format \"hello %s world\\n\" (map list '(1 2 3 4 5)))\n\n;; returns the string \"hello ((1) (2) (3) (4) (5)) world\\n\"\n(cl-format false \"hello ~A world~%\" (map list '(1 2 3 4 5)))\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/6414129?v=4", :account-source "github", :login "jimka2001"}, :created-at 1627544071732, :updated-at 1627544168523, :_id "61025a07e4b0b1e3652d7521"}], :notes nil, :arglists ["writer format-in & args"], :doc "An implementation of a Common Lisp compatible format function. cl-format formats its\narguments to an output stream or string based on the format control string given. It \nsupports sophisticated formatting of structured data.\n\nWriter is an instance of java.io.Writer, true to output to *out* or nil to output \nto a string, format-in is the format control string and the remaining arguments \nare the data to be formatted.\n\nThe format control string is a string to be output with embedded 'format directives' \ndescribing how to format the various arguments passed in.\n\nIf writer is nil, cl-format returns the formatted result string. Otherwise, cl-format \nreturns nil.\n\nFor example:\n (let [results [46 38 22]]\n (cl-format true \"There ~[are~;is~:;are~]~:* ~d result~:p: ~{~d~^, ~}~%\" \n (count results) results))\n\nPrints to *out*:\n There are 3 results: 46, 38, 22\n\nDetailed documentation on format control strings is available in the \"Common Lisp the \nLanguage, 2nd edition\", Chapter 22 (available online at:\nhttp://www.cs.cmu.edu/afs/cs.cmu.edu/project/ai-repository/ai/html/cltl/clm/node200.html#SECTION002633000000000000000) \nand in the Common Lisp HyperSpec at \nhttp://www.lispworks.com/documentation/HyperSpec/Body/22_c.htm\n", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/cl-format"} {:added "1.2", :ns "clojure.pprint", :name "*print-miser-width*", :file "clojure/pprint/pprint_base.clj", :type "var", :column 1, :see-alsos [{:created-at 1620036444882, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "write", :ns "clojure.pprint"}, :_id "608fcb5ce4b0b1e3652d74f2"}], :dynamic true, :line 47, :examples [{:updated-at 1620036422897, :created-at 1620036422897, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :body "(require '[clojure.pprint :as pprint])\n\n;; Simple example to keep it readable, but this could\n;; be much more nested code coming from some large Clojure file\n(def nested-statement\n '(condp = x\n 1 \"one\" 2 \"two\" 3 \"three\"\n 4 \"four\" 5 \"five\" 6 \"six\"\n :else (condp = x\n 1 \"one\" 2 \"two\" 3 \"three\"\n 4 \"four\" 5 \"five\" 6 \"six\"\n :else :none)))\n\n;; Forcing a narrow right margin at 30 to illustrate the point.\n;; In reality the nesting would accumulate close to a larger margin\n;; with similar effects, leaving a lot of white space on the left.\n(binding [pprint/*print-pprint-dispatch* pprint/code-dispatch\n pprint/*print-right-margin* 30]\n (pprint/pprint nested-statement))\n\n;; (condp\n;; =\n;; x\n;; 1 \"one\"\n;; 2 \"two\"\n;; 3 \"three\"\n;; 4 \"four\"\n;; 5 \"five\"\n;; 6 \"six\"\n;; :else\n;; (condp\n;; =\n;; x\n;; 1 \"one\"\n;; 2 \"two\"\n;; 3 \"three\"\n;; 4 \"four\"\n;; 5 \"five\"\n;; 6 \"six\"\n;; :else :none))\n\n;; changing the miser width relax the pretty printer allowing to \n;; use the space better.\n(binding [pprint/*print-pprint-dispatch* pprint/code-dispatch\n pprint/*print-right-margin* 30\n pprint/*print-miser-width* 20]\n (pprint/pprint nested-statement))\n\n;; (condp = x\n;; 1 \"one\"\n;; 2 \"two\"\n;; 3 \"three\"\n;; 4 \"four\"\n;; 5 \"five\"\n;; 6 \"six\"\n;; :else (condp = x\n;; 1 \"one\"\n;; 2 \"two\"\n;; 3 \"three\"\n;; 4 \"four\"\n;; 5 \"five\"\n;; 6 \"six\"\n;; :else :none))", :_id "608fcb46e4b0b1e3652d74f1"}], :notes nil, :arglists [], :doc "The column at which to enter miser style. Depending on the dispatch table, \nmiser style add newlines in more places to try to keep lines short allowing for further \nlevels of nesting.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/*print-miser-width*"} {:added "1.2", :ns "clojure.pprint", :name "write", :file "clojure/pprint/pprint_base.clj", :type "function", :column 1, :see-alsos [{:created-at 1536497648303, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "pprint", :ns "clojure.pprint"}, :_id "5b9517f0e4b00ac801ed9e8f"}], :line 197, :examples [{:updated-at 1536497633749, :created-at 1536497633749, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Same as pprint but taking configuration directives.\n(require '[clojure.pprint :as p])\n\n;; Prints the number in binary with indication of the base as \"#b\".\n(p/write 20/3 :base 2 :radix true) \n;; #b10100/11\n\n;; Pretty looking truncation of lists longer than 3.\n(p/write (range 100) :length 3) \n;; (0 1 2 ...)\n\n;; Removes namespaces from symbols when printing.\n(p/write 'clojure.core/+ :suppress-namespaces true) \n;; +\n\n;; Avoids anything beyond 10 right margin.\n(p/write [:a :b :c :d] :right-margin 10)\n;; [:a\n;; :b\n;; :c\n;; :d]\n", :_id "5b9517e1e4b00ac801ed9e8e"}], :notes nil, :arglists ["object & kw-args"], :doc "Write an object subject to the current bindings of the printer control variables.\nUse the kw-args argument to override individual variables for this call (and any \nrecursive calls). Returns the string result if :stream is nil or nil otherwise.\n\nThe following keyword arguments can be passed with values:\n Keyword Meaning Default value\n :stream Writer for output or nil true (indicates *out*)\n :base Base to use for writing rationals Current value of *print-base*\n :circle* If true, mark circular structures Current value of *print-circle*\n :length Maximum elements to show in sublists Current value of *print-length*\n :level Maximum depth Current value of *print-level*\n :lines* Maximum lines of output Current value of *print-lines*\n :miser-width Width to enter miser mode Current value of *print-miser-width*\n :dispatch The pretty print dispatch function Current value of *print-pprint-dispatch*\n :pretty If true, do pretty printing Current value of *print-pretty*\n :radix If true, prepend a radix specifier Current value of *print-radix*\n :readably* If true, print readably Current value of *print-readably*\n :right-margin The column for the right margin Current value of *print-right-margin*\n :suppress-namespaces If true, no namespaces in symbols Current value of *print-suppress-namespaces*\n\n * = not yet supported\n", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/write"} {:added "1.2", :ns "clojure.pprint", :name "*print-right-margin*", :file "clojure/pprint/pprint_base.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 40, :examples [{:updated-at 1533810720443, :created-at 1533810720443, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :body ";; Compare the two outputs below. Note how pprint puts the map on two lines\n;; in the second snippet to avoid having a line longer than 5 characters.\n\n(binding [clojure.pprint/*print-right-margin* 15]\n (clojure.pprint/pprint {:foo \"bar\"}))\n; Prints:\n; {:foo \"bar\"}\n\n(binding [clojure.pprint/*print-right-margin* 5]\n (clojure.pprint/pprint {:foo \"bar\"}))\n; Prints:\n; {:foo\n; \"bar\"}", :_id "5b6c1820e4b00ac801ed9e4a"}], :notes nil, :arglists [], :doc "Pretty printing will try to avoid anything going beyond this column.\nSet it to nil to have pprint let the line be arbitrarily long. This will ignore all \nnon-mandatory newlines.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/*print-right-margin*"} {:added "1.2", :ns "clojure.pprint", :name "write-out", :file "clojure/pprint/pprint_base.clj", :type "function", :column 1, :see-alsos nil, :line 171, :examples nil, :notes nil, :arglists ["object"], :doc "Write an object to *out* subject to the current bindings of the printer control \nvariables. Use the kw-args argument to override individual variables for this call (and \nany recursive calls).\n\n*out* must be a PrettyWriter if pretty printing is enabled. This is the responsibility\nof the caller.\n\nThis method is primarily intended for use by pretty print dispatch functions that \nalready know that the pretty printer will have set up their environment appropriately.\nNormal library clients should use the standard \"write\" interface. ", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/write-out"} {:added "1.2", :ns "clojure.pprint", :name "with-pprint-dispatch", :file "clojure/pprint/pprint_base.clj", :type "macro", :column 1, :see-alsos [{:created-at 1683110543113, :author {:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "*print-pprint-dispatch*", :ns "clojure.pprint"}, :_id "64523a8fe4b08cf8563f4bac"}], :line 274, :examples [{:updated-at 1619968380698, :created-at 1619968380698, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :body "(require '[clojure.pprint :as pprint])\n\n(def condp-statement\n '(condp = x\n 1 \"one\" 2 \"two\" 3 \"three\"\n 4 \"four\" 5 \"five\" 6 \"six\" :else :none))\n\n(pprint/with-pprint-dispatch \n pprint/code-dispatch\n (pprint/pprint condp-statement))\n;; (condp = x\n;; 1 \"one\"\n;; 2 \"two\"\n;; 3 \"three\"\n;; 4 \"four\"\n;; 5 \"five\"\n;; 6 \"six\"\n;; :else :none)", :_id "608ec17ce4b0b1e3652d74ef"}], :macro true, :notes nil, :arglists ["function & body"], :doc "Execute body with the pretty print dispatch function bound to function.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/with-pprint-dispatch"} {:added "1.2", :ns "clojure.pprint", :name "*print-base*", :file "clojure/pprint/pprint_base.clj", :type "var", :column 1, :see-alsos [{:created-at 1664286279673, :author {:login "sreekanthb", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1254569?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "*print-radix*", :ns "clojure.pprint"}, :_id "6332fe47e4b0b1e3652d7667"}], :dynamic true, :line 87, :examples [{:updated-at 1533810848478, :created-at 1533810848478, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :body "(binding [clojure.pprint/*print-base* 10]\n (clojure.pprint/pprint 42))\n; Prints:\n; 42\n\n(binding [clojure.pprint/*print-base* 2]\n (clojure.pprint/pprint 42))\n; Prints:\n; 101010", :_id "5b6c18a0e4b00ac801ed9e4b"} {:updated-at 1664799578948, :created-at 1664286031216, :author {:login "sreekanthb", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1254569?v=4"}, :body ";; Prints list of hexadecimals with radix specifier: #x\nuser> (with-bindings {#'clojure.pprint/*print-base* 16\n #'clojure.pprint/*print-radix* true}\n (clojure.pprint/pprint (range 16)))\n;;=> (#x0 #x1 #x2 #x3 #x4 #x5 #x6 #x7 #x8 #x9 #xa #xb #xc #xd #xe #xf)\n\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/1254569?v=4", :account-source "github", :login "sreekanthb"}], :_id "6332fd4fe4b0b1e3652d7666"}], :notes nil, :arglists [], :doc "The base to use for printing integers and rationals.", :library-url "https://github.com/clojure/clojure", :href "/clojure.pprint/*print-base*"} {:ns "clojure.reflect", :name "->Field", :file "clojure/reflect/java.clj", :type "function", :column 1, :see-alsos nil, :line 154, :examples nil, :notes nil, :arglists ["name type declaring-class flags"], :doc "Positional factory function for class clojure.reflect.Field.", :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/->Field"} {:ns "clojure.reflect", :name "->Method", :file "clojure/reflect/java.clj", :type "function", :column 1, :see-alsos nil, :line 134, :examples nil, :notes nil, :arglists ["name return-type declaring-class parameter-types exception-types flags"], :doc "Positional factory function for class clojure.reflect.Method.", :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/->Method"} {:ns "clojure.reflect", :name "TypeReference", :file "clojure/reflect.clj", :type "var", :column 1, :see-alsos nil, :line 48, :examples nil, :notes nil, :arglists [], :doc "A TypeReference can be unambiguously converted to a type name on\n the host platform.\n\n All typerefs are normalized into symbols. If you need to\n normalize a typeref yourself, call typesym.", :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/TypeReference"} {:added "1.3", :ns "clojure.reflect", :name "reflect", :file "clojure/reflect.clj", :type "function", :column 1, :see-alsos [{:created-at 1332916378000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.pprint", :name "print-table", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e88"} {:created-at 1465943137399, :author {:login "bkovitz", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4142015?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "type-reflect", :ns "clojure.reflect"}, :_id "57608461e4b0bafd3e2a0487"}], :line 115, :examples [{:updated-at 1507758581210, :created-at 1329989405000, :body "(use 'clojure.reflect 'clojure.pprint)\n;;=> nil\n(def r (reflect *in*))\n;;=> #'user/r\n(count (:members r))\n;;=> 9\n(pprint (map class (:members r)))\n;; (clojure.reflect.Constructor\n;; clojure.reflect.Method\n;; clojure.reflect.Field\n;; clojure.reflect.Field\n;; clojure.reflect.Method\n;; clojure.reflect.Method\n;; clojure.reflect.Method\n;; clojure.reflect.Method\n;; clojure.reflect.Field)\n;;=> nil\n(pprint r)\n;; {:bases #{java.io.PushbackReader},\n;; :flags #{:public},\n;; :members\n;; #{{:name clojure.lang.LineNumberingPushbackReader,\n;; :declaring-class clojure.lang.LineNumberingPushbackReader,\n;; :parameter-types [java.io.Reader],\n;; :exception-types [],\n;; :flags #{:public}}\n;; {:name read,\n;; :return-type int,\n;; :declaring-class clojure.lang.LineNumberingPushbackReader,\n;; :parameter-types [],\n;; :exception-types [java.io.IOException],\n;; :flags #{:public}}\n;; {:name _atLineStart,\n;; :type boolean,\n;; :declaring-class clojure.lang.LineNumberingPushbackReader,\n;; :flags #{:private}}\n;; {:name newline,\n;; :type int,\n;; :declaring-class clojure.lang.LineNumberingPushbackReader,\n;; :flags #{:private :static :final}}\n;; {:name unread,\n;; :return-type void,\n;; :declaring-class clojure.lang.LineNumberingPushbackReader,\n;; :parameter-types [int],\n;; :exception-types [java.io.IOException],\n;; :flags #{:public}}\n;; {:name readLine,\n;; :return-type java.lang.String,\n;; :declaring-class clojure.lang.LineNumberingPushbackReader,\n;; :parameter-types [],\n;; :exception-types [java.io.IOException],\n;; :flags #{:public}}\n;; {:name atLineStart,\n;; :return-type boolean,\n;; :declaring-class clojure.lang.LineNumberingPushbackReader,\n;; :parameter-types [],\n;; :exception-types [],\n;; :flags #{:public}}\n;; {:name getLineNumber,\n;; :return-type int,\n;; :declaring-class clojure.lang.LineNumberingPushbackReader,\n;; :parameter-types [],\n;; :exception-types [],\n;; :flags #{:public}}\n;; {:name _prev,\n;; :type boolean,\n;; :declaring-class clojure.lang.LineNumberingPushbackReader,\n;; :flags #{:private}}}}\n;;=> nil\n", :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}, :_id "542692d6c026201cdc3270f4"} {:body "(require '[clojure.reflect :as cr])\n(require '[clojure.pprint :as pp])\n\n;; Here we have a simple function that prints the\n;; important bits of the class definition in a table.\n(->> String \n cr/reflect \n :members \n pp/print-table))\n;;=> [produces a large table the next example filters it down.\n\n;; In order to reduce the rows to just :public methods a filter can be used.\n(->> String \n cr/reflect \n :members \n (filter #(contains? (:flags %) :public)) \n pp/print-table)\n;;=> | :name | :return-type | :declaring-class | \n;; |------------------------+------------------+------------------+------->\n;; | replaceAll | java.lang.String | java.lang.String | \n;; | CASE_INSENSITIVE_ORDER | | java.lang.String | \n;; | codePointCount | int | java.lang.String |\n;; | getChars | void | java.lang.String | \n;; etc.\n\n;; Print methods that contain \"to\", as a way of code completion.\n;; Combine with above example ``#(contains? (:flags %) :public)`` to get \n;; matching callable methods (public & with \"to\")\n(->> String \n cr/reflect \n :members \n (filter #(.contains (str (:name %)) \"to\"))\n pp/print-table)\n\n;; => | :name | :return-type | :declaring-class | \n;; |-------------+------------------+------------------+---\n;; | toString | java.lang.String | java.lang.String | \n;; | toLowerCase | java.lang.String | java.lang.String | \n;; | toUpperCase | java.lang.String | java.lang.String | \n;; | toUpperCase | java.lang.String | java.lang.String | \n;; | toCharArray | char<> | java.lang.String | \n;; | toLowerCase | java.lang.String | java.lang.String | ", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :created-at 1424120412909, :updated-at 1507759169913, :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/4199136?v=3", :account-source "github", :login "alvarogarcia7"}], :_id "54e25a5ce4b0b716de7a6528"} {:editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :body "(require '[clojure.reflect :as cr])\n(import '(clojure.reflect.JavaReflector))\n\n;; Let us see what is available in the JavaReflector\n(->> clojure.reflect.JavaReflector \n cr/reflect\n :members\n (sort-by :name)\n (pp/print-table [:name :flags :parameter-types])\n;; | :name | :flags | :parameter-types |\n;; |-------------------------------+---------------------------+--------------------|\n;; | __cached_class__0 | #{:private :static} | |\n;; | classloader | #{:public :final} | |\n;; | clojure.reflect.JavaReflector | #{:public} | [java.lang.Object] |\n;; | const__0 | #{:public :static :final} | |\n;; | const__1 | #{:public :static :final} | |\n;; | const__10 | #{:public :static :final} | |\n;; | const__5 | #{:public :static :final} | |\n;; | const__7 | #{:public :static :final} | |\n;; | const__9 | #{:public :static :final} | |\n;; | do_reflect | #{:public} | [java.lang.Object] |\n;; | getBasis | #{:public :static} | [] |\n;;=> nil", :author {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}, :created-at 1507760580365, :updated-at 1507761553527, :_id "59de99c4e4b03026fe14ea68"}], :notes nil, :arglists ["obj & options"], :doc "Alpha - subject to change.\n Reflect on the type of obj (or obj itself if obj is a class).\n Return value and options are the same as for type-reflect. ", :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/reflect"} {:ns "clojure.reflect", :name "map->Field", :file "clojure/reflect/java.clj", :type "function", :column 1, :see-alsos [{:created-at 1507762821609, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "map->Constructor", :ns "clojure.reflect"}, :_id "59dea285e4b03026fe14ea6e"} {:created-at 1507762840684, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "map->Method", :ns "clojure.reflect"}, :_id "59dea298e4b03026fe14ea6f"}], :line 154, :examples [{:updated-at 1507762803236, :created-at 1507762803236, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body "(require '[clojure.reflect :as cr])\n\n;; I have no idea what this is for but here is what it does.\n(cr/map->Field {}) \n;=> #clojure.reflect.Field{:name nil, :type nil, :declaring-class nil, :flags nil}", :_id "59dea273e4b03026fe14ea6d"}], :notes nil, :arglists ["m__7888__auto__"], :doc "Factory function for class clojure.reflect.Field, taking a map of keywords to field values.", :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/map->Field"} {:ns "clojure.reflect", :name "map->Method", :file "clojure/reflect/java.clj", :type "function", :column 1, :see-alsos [{:created-at 1507762922151, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "map->Constructor", :ns "clojure.reflect"}, :_id "59dea2eae4b03026fe14ea71"} {:created-at 1507762942594, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "map->Field", :ns "clojure.reflect"}, :_id "59dea2fee4b03026fe14ea72"}], :line 134, :examples [{:updated-at 1507762895850, :created-at 1507762895850, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body "(require '[clojure.reflect :as cr])\n\n;; I have no idea what this is for but here is what it does.\n(cr/map->Method {}) \n;=> #clojure.reflect.Method{:name nil, :return-type nil, \n;; :declaring-class nil, :parameter-types nil,\n;; :exception-types nil, :flags nil}", :_id "59dea2cfe4b03026fe14ea70"}], :notes nil, :arglists ["m__7888__auto__"], :doc "Factory function for class clojure.reflect.Method, taking a map of keywords to field values.", :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/map->Method"} {:ns "clojure.reflect", :name "typename", :type "function", :see-alsos [{:created-at 1507759637967, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reflect", :ns "clojure.reflect"}, :_id "59de9615e4b03026fe14ea65"} {:created-at 1507759650019, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "do-reflect", :ns "clojure.reflect"}, :_id "59de9622e4b03026fe14ea66"} {:created-at 1507759666391, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "type-reflect", :ns "clojure.reflect"}, :_id "59de9632e4b03026fe14ea67"}], :examples [{:updated-at 1507759616018, :created-at 1507759616018, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body "(require '[clojure.reflect :as cr])\n\n;; It returns the class name as a string. \n(->> java.lang.Integer \n cr/typename)\n;;=> \"java.lang.Integer\"", :_id "59de9600e4b03026fe14ea64"}], :notes nil, :arglists ["o"], :doc "Returns Java name as returned by ASM getClassName, e.g. byte[], java.lang.String[]", :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/typename"} {:ns "clojure.reflect", :name "->JavaReflector", :file "clojure/reflect/java.clj", :type "function", :column 1, :see-alsos nil, :line 178, :examples [{:editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :body "(require '[clojure.reflect :as cr])\n(import '(clojure.reflect.JavaReflector))\n\n;; Let us see what is available in the JavaReflector\n(->> clojure.reflect.JavaReflector \n cr/reflect\n :members\n (sort-by :name)\n (pp/print-table [:name :flags :parameter-types]))\n; | :name | :flags | :parameter-types |\n; |-------------------------------+---------------------------+--------------------|\n; | __cached_class__0 | #{:private :static} | |\n; | classloader | #{:public :final} | |\n; | clojure.reflect.JavaReflector | #{:public} | [java.lang.Object] |\n; | const__0 | #{:public :static :final} | |\n; | const__1 | #{:public :static :final} | |\n; | const__10 | #{:public :static :final} | |\n; | const__5 | #{:public :static :final} | |\n; | const__7 | #{:public :static :final} | |\n; | const__9 | #{:public :static :final} | |\n; | do_reflect | #{:public} | [java.lang.Object] |\n; | getBasis | #{:public :static} | [] |\n;;=> nil\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}, :created-at 1507763250502, :updated-at 1507763276867, :_id "59dea432e4b03026fe14ea73"}], :notes nil, :arglists ["classloader"], :doc "Positional factory function for class clojure.reflect.JavaReflector.", :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/->JavaReflector"} {:ns "clojure.reflect", :name "->AsmReflector", :file "clojure/reflect/java.clj", :type "function", :column 1, :see-alsos nil, :line 208, :examples [{:updated-at 1507763433355, :created-at 1507763433355, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body "(require '[clojure.reflect :as cr])\n(import '(clojure.reflect.AsmReflector))\n\n;; Let us see what is available in the AsmReflector\n(->> clojure.reflect.AsmReflector \n cr/reflect\n :members\n (sort-by :name)\n (pp/print-table [:name :flags :parameter-types]))\n\n; | :name | :flags | :parameter-types |\n; |------------------------------+---------------------------+--------------------|\n; | __cached_class__0 | #{:private :static} | |\n; | class_resolver | #{:public :final} | |\n; | clojure.reflect.AsmReflector | #{:public} | [java.lang.Object] |\n; | const__0 | #{:public :static :final} | |\n; | const__3 | #{:public :static :final} | |\n; | const__4 | #{:public :static :final} | |\n; | const__5 | #{:public :static :final} | |\n; | do_reflect | #{:public} | [java.lang.Object] |\n; | getBasis | #{:public :static} | [] |\n;;=> nil\n", :_id "59dea4e9e4b03026fe14ea75"}], :notes nil, :arglists ["class-resolver"], :doc "Positional factory function for class clojure.reflect.AsmReflector.", :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/->AsmReflector"} {:ns "clojure.reflect", :name "resolve-class", :type "function", :see-alsos nil, :examples [{:author {:login "weakreference", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/86146f8bd5207b97701c0f16f0017334?r=PG&default=identicon"}, :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}], :body ";;Check if class c exists on the classpath\n(require '[clojure.reflect :refer [resolve-class]])\n\n(defn class-exists? [c] \n (resolve-class (.getContextClassLoader (Thread/currentThread)) c))\n\n(class-exists? 'org.joda.time.DateTime) \n;;=> nil", :created-at 1351132479000, :updated-at 1508166357885, :_id "542692d6c026201cdc3270f5"} {:editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :body ";; Obtaining a suitable class loader is an important consideration.\n;; to a large degree the class loader used by default is the\n;; context class loader which is controlled by \n*use-context-classloader*\n;=> true\n\n;; the following helper function shows the \n(require '[clojure.java.classpath :as cp])\n;=> nil\n\n;; the context class loader\n(def ccl (.getContextClassLoader (Thread/currentThread)))\n;=> #'boot.user/ccl\n(cp/classpath ccl)\n;=> (#object[java.io.File 0x709e8101 ...\n\n;; the system class loader\n(def scl (java.lang.ClassLoader/getSystemClassLoader)) \n;=> #'boot.user/scl\n(cp/classpath scl)\n;=> (#object[java.io.File 0x709e8101 ...\n\n;; the class loader used to load a particular class instance.\n(deftype Foo [bar])\n;=> boot.user.Foo\n(def icl (.getClassLoader (class (Foo. 4))))\n;=> #'boot.user/icl\n(cp/classpath icl)\n;=> (#object[java.io.File 0x709e8101 ...\n\n;; I recommend you use the DynamicClassLoader \n;; for cases when 'import' does not do it.\n;; https://github.com/clojure/clojure\n(def dcl (clojure.lang.DynamicClassLoader.))\n;=> #'boot.user/dcl\n(cp/classpath dcl)\n;=> (#object[java.io.File 0x709e8101 ...\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}, :created-at 1507306884656, :updated-at 1508168226939, :_id "59d7ad84e4b03026fe14ea54"}], :notes nil, :tag "InputStream", :arglists ["this name"], :doc "Given a class name, return that typeref's class bytes as an InputStream.", :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/resolve-class"} {:ns "clojure.reflect", :name "flag-descriptors", :file "clojure/reflect/java.clj", :type "var", :column 1, :see-alsos nil, :line 77, :examples [{:updated-at 1495736937803, :created-at 1495736937803, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body "(use 'clojure.reflect)\n\n(pprint clojure.reflect/flag-descriptors)\n;;=> [{:name :public, :flag 1, :contexts #{:method :field :class}}\n;; {:name :private, :flag 2, :contexts #{:method :field :class}}\n;; {:name :protected, :flag 4, :contexts #{:method :field :class}}\n;; {:name :static, :flag 8, :contexts #{:method :field}}\n;; {:name :final, :flag 16, :contexts #{:method :field :class}}\n;; {:name :synchronized, :flag 32, :contexts #{:method}}\n;; {:name :volatile, :flag 64, :contexts #{:field}}\n;; {:name :bridge, :flag 64, :contexts #{:method}}\n;; {:name :varargs, :flag 128, :contexts #{:method}}\n;; {:name :transient, :flag 128, :contexts #{:field}}\n;; {:name :native, :flag 256, :contexts #{:method}}\n;; {:name :interface, :flag 512, :contexts #{:class}}\n;; {:name :abstract, :flag 1024, :contexts #{:method :class}}\n;; {:name :strict, :flag 2048, :contexts #{:method}}\n;; {:name :synthetic, :flag 4096, :contexts #{:method :field :class}}\n;; {:name :annotation, :flag 8192, :contexts #{:class}}\n;; {:name :enum, :flag 16384, :contexts #{:field :inner :class}}]", :_id "59272269e4b093ada4d4d770"}], :notes [{:author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :updated-at 1495736792080, :created-at 1495736792080, :body "The value of the `:flag` field for each modifier is identical to the value of the constant representing the modifier in [`java.lang.reflect.Modifier`](https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Modifier.html#field.summary), which in turn is taken from [Table 4.1-A](https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.1-200-E.1), [Table 4.5-A](https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.5-200-A.1), [Table 4.6-A](https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.6-200-A.1) and [Table 4.7.6-A](https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7.6-300-D.1-D.1) of *The Java™ Virtual Machine Specification.*\n", :_id "592721d8e4b093ada4d4d76f"}], :arglists [], :doc "The Java access bitflags, along with their friendly names and\nthe kinds of objects to which they can apply.", :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/flag-descriptors"} {:ns "clojure.reflect", :name "do-reflect", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["reflector typeref"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/do-reflect"} {:ns "clojure.reflect", :name "ClassResolver", :file "clojure/reflect/java.clj", :type "var", :column 1, :see-alsos [{:created-at 1507763760914, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "resolve-class", :ns "clojure.reflect"}, :_id "59dea630e4b03026fe14ea77"}], :line 196, :examples [{:editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :body "(require '[clojure.reflect :as cr]) \n\n;; Let us see what is available in the JavaReflector\n(->> clojure.reflect.ClassResolver \n cr/reflect\n :members\n (sort-by :name)\n (pp/print-table [:name :flags :parameter-types])\n; | :name | :flags | :parameter-types |\n; |---------------+----------------------+--------------------|\n; | resolve_class | #{:public :abstract} | [java.lang.Object] |\n;;=> nil\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}, :created-at 1507763657006, :updated-at 1507763804408, :_id "59dea5c9e4b03026fe14ea76"}], :notes nil, :arglists [], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/ClassResolver"} {:ns "clojure.reflect", :name "Reflector", :file "clojure/reflect.clj", :type "var", :column 1, :see-alsos nil, :line 44, :examples nil, :notes [{:body ";; not to be confused with the Reflector class\n```\n (import '(clojure.lang DynamicClassLoader Reflector))\n``` \n;;=> clojure.lang.Reflector\n```\n(let [class-loader (DynamicClassLoader.) \n a-class (.loadClass class-loader \"java.lang.Long\")] \n (Reflector/invokeConstructor a-class (into-array String [\"2\"])))\n```\n;;=> 2", :created-at 1507758825536, :updated-at 1507758968544, :author {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}, :_id "59de92e9e4b03026fe14ea62"}], :arglists [], :doc "Protocol for reflection implementers.", :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/Reflector"} {:ns "clojure.reflect", :name "->Constructor", :file "clojure/reflect/java.clj", :type "function", :column 1, :see-alsos nil, :line 115, :examples nil, :notes nil, :arglists ["name declaring-class parameter-types exception-types flags"], :doc "Positional factory function for class clojure.reflect.Constructor.", :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/->Constructor"} {:ns "clojure.reflect", :name "map->Constructor", :file "clojure/reflect/java.clj", :type "function", :column 1, :see-alsos nil, :line 115, :examples [{:updated-at 1507762666011, :created-at 1507762666011, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body "(require '[clojure.reflect :as cr])\n\n;; I have no idea what this is for but here is what it does.\n(cr/map->Constructor {:name \"do_reflect\" \n :declaring-class \"clojure.reflect.JavaReflector\"\n :parameter-types [\"java.lang.Object\"]\n :exception-types []\n :flags #{:public}}) \n;=> #clojure.reflect.Constructor{:name \"do_reflect\", \n;; :declaring-class \"clojure.reflect.JavaReflector\",\n;; :parameter-types [\"java.lang.Object\"],\n;; :exception-types [],\n;; :flags #{:public}}", :_id "59dea1eae4b03026fe14ea6c"}], :notes nil, :arglists ["m__7888__auto__"], :doc "Factory function for class clojure.reflect.Constructor, taking a map of keywords to field values.", :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/map->Constructor"} {:added "1.3", :ns "clojure.reflect", :name "type-reflect", :file "clojure/reflect.clj", :type "function", :column 1, :see-alsos [{:created-at 1495744758522, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "reflect", :ns "clojure.reflect"}, :_id "592740f6e4b093ada4d4d773"}], :line 58, :examples [{:updated-at 1495738204071, :created-at 1495738204071, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body ";;;; Alphabetically list all public static fields in java.lang.Integer\n\n(use 'clojure.reflect)\n\n(->> java.lang.Integer \n clojure.reflect/type-reflect\n :members \n (filter #(instance? clojure.reflect.Field %)) \n (filter #(:public (:flags %)))\n (filter #(:static (:flags %)))\n (map #(vector (:name %) (:type %)))\n (sort)\n (pprint))\n\n;;=> ([BYTES int]\n;; [MAX_VALUE int]\n;; [MIN_VALUE int]\n;; [SIZE int]\n;; [TYPE java.lang.Class])", :_id "5927275ce4b093ada4d4d771"} {:updated-at 1495743210185, :created-at 1495743210185, :author {:login "svenschoenung", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10583730?v=3"}, :body ";;;; List class hierarchy for a particular class \n\n(defn class-hierarchy [clazz]\n (let [refl (fn [c] (assoc (clojure.reflect/type-reflect c) :name c))]\n (loop [type (refl clazz) hierarchy '()]\n (let [parent (->> type\n :bases\n (map refl)\n (remove #(:interface (:flags %)))\n first)]\n (if parent\n (recur parent (conj hierarchy (:name type)))\n (conj hierarchy java.lang.Object))))))\n\n(pprint (class-hierarchy javax.security.auth.login.CredentialNotFoundException))\n;;=> (java.lang.Object\n;; java.lang.Throwable\n;; java.lang.Exception\n;; java.security.GeneralSecurityException\n;; javax.security.auth.login.LoginException\n;; javax.security.auth.login.CredentialException\n;; javax.security.auth.login.CredentialNotFoundException)\n\n(pprint (class-hierarchy javax.swing.JPasswordField$AccessibleJPasswordField))\n;;=> (java.lang.Object\n;; javax.accessibility.AccessibleContext\n;; java.awt.Component$AccessibleAWTComponent\n;; java.awt.Container$AccessibleAWTContainer\n;; javax.swing.JComponent$AccessibleJComponent\n;; javax.swing.text.JTextComponent$AccessibleJTextComponent\n;; javax.swing.JTextField$AccessibleJTextField\n;; javax.swing.JPasswordField$AccessibleJPasswordField)\n", :_id "59273aeae4b093ada4d4d772"} {:updated-at 1508197724829, :created-at 1508197724829, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body "(require '(clojure [reflect :as cr] [pprint :as pp]))\n\n;; Let us see what is available in the DynamicClassLoader\n(->> clojure.lang.DynamicClassLoader \n cr/type-reflect\n :members\n (sort-by :name)\n (pp/print-table [:name :flags :parameter-types]))\n;| :name | :flags | :parameter-types |\n;|---------------------------------+-----------------------------+--------------------------------------------|\n;| EMPTY_URLS | #{:static :final} | |\n;| addURL | #{:public} | [java.net.URL] |\n;| classCache | #{:static} | |\n;| clojure.lang.DynamicClassLoader | #{:public} | [java.lang.ClassLoader] |\n;| clojure.lang.DynamicClassLoader | #{:public} | [] |\n;| constantVals | #{} | |\n;| defineClass | #{:public} | [java.lang.String byte<> java.lang.Object] |\n;| findClass | #{:protected} | [java.lang.String] |\n;| findInMemoryClass | #{:static} | [java.lang.String] |\n;| getConstants | #{:public} | [int] |\n;| loadClass | #{:synchronized :protected} | [java.lang.String boolean] |\n;| registerConstants | #{:public} | [int java.lang.Object<>] |\n;| rq | #{:static :final} | |", :_id "59e5455ce4b03026fe14ea91"}], :notes nil, :arglists ["typeref & options"], :doc "Alpha - subject to change.\n Reflect on a typeref, returning a map with :bases, :flags, and\n :members. In the discussion below, names are always Clojure symbols.\n\n :bases a set of names of the type's bases\n :flags a set of keywords naming the boolean attributes\n of the type.\n :members a set of the type's members. Each member is a map\n and can be a constructor, method, or field.\n\n Keys common to all members:\n :name name of the type \n :declaring-class name of the declarer\n :flags keyword naming boolean attributes of the member\n\n Keys specific to constructors:\n :parameter-types vector of parameter type names\n :exception-types vector of exception type names\n\n Key specific to methods:\n :parameter-types vector of parameter type names\n :exception-types vector of exception type names\n :return-type return type name\n\n Keys specific to fields:\n :type type name\n\n Options:\n\n :ancestors in addition to the keys described above, also\n include an :ancestors key with the entire set of\n ancestors, and add all ancestor members to\n :members.\n :reflector implementation to use. Defaults to JavaReflector,\n AsmReflector is also an option.", :library-url "https://github.com/clojure/clojure", :href "/clojure.reflect/type-reflect"} {:ns "clojure.repl", :name "source-fn", :file "clojure/repl.clj", :type "function", :column 1, :see-alsos [{:created-at 1353815572000, :author {:login "franks42", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b3ee701dd6c481e5d310467ddfe62c48?r=PG&default=identicon"}, :to-var {:ns "clojure.repl", :name "source", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e83"}], :line 148, :examples [{:updated-at 1481465114444, :created-at 1481465114444, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body "(source-fn 'max)\n\n;;=> \"(defn max\n \\\"Returns the greatest of the nums.\\\"\n {:added \\\"1.0\\\"\n :inline-arities >1?\n :inline (nary-inline 'max)}\n ([x] x)\n ([x y] (. clojure.lang.Numbers (max x y)))\n ([x y & more]\n (reduce1 max (max x y) more)))\"\n", :_id "584d5d1ae4b0782b632278dc"}], :notes nil, :arglists ["x"], :doc "Returns a string of the source code for the given symbol, if it can\n find it. This requires that the symbol resolve to a Var defined in\n a namespace for which the .clj is in the classpath. Returns nil if\n it can't find the source. For most REPL usage, 'source' is more\n convenient.\n\n Example: (source-fn 'filter)", :library-url "https://github.com/clojure/clojure", :href "/clojure.repl/source-fn"} {:added "1.0", :ns "clojure.repl", :name "doc", :file "clojure/repl.clj", :type "macro", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "source", :ns "clojure.repl"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342639092000, :_id "542692eaf6e94c6970521af5"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "dir", :ns "clojure.repl"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342639183000, :_id "542692eaf6e94c6970521af6"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "apropos", :ns "clojure.repl"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342639337000, :_id "542692eaf6e94c6970521af7"}], :line 132, :examples [{:updated-at 1342639164000, :created-at 1342639164000, :body "=> (doc map)\n;; prints in console:\n-------------------------\nclojure.core/map\n([f coll] [f c1 c2] [f c1 c2 c3] [f c1 c2 c3 & colls])\n Returns a lazy sequence consisting of the result of applying f to the\n set of first items of each coll, followed by applying f to the set\n of second items in each coll, until any one of the colls is\n exhausted. Any remaining items in other colls are ignored. Function\n f should accept number-of-colls arguments.", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :_id "542692d6c026201cdc3270f7"} {:author {:login "ryo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3f7913b563c72083c74030d928ba407e?r=PG&default=identicon"}, :editors [], :body "user> (doc clojure.core)\n-------------------------\nclojure.core\n Fundamental library of the Clojure language\n", :created-at 1398682749000, :updated-at 1398682749000, :_id "542692d6c026201cdc3270f8"}], :macro true, :notes [{:updated-at 1350125867000, :body "Note that the clojure.repl namespace which contains doc is not loaded by default in Emacs' SLIME mode, because SLIME provides its own doc function via C-c C-d d.", :created-at 1350125867000, :author {:login "pjlegato", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/4ce55cfd8b3ae2f63f5ecbc8fc1c05d4?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fed"}], :arglists ["name"], :doc "Prints documentation for a var or special form given its name,\n or for a spec if given a keyword", :library-url "https://github.com/clojure/clojure", :href "/clojure.repl/doc"} {:added "1.3", :ns "clojure.repl", :name "stack-element-str", :file "clojure/repl.clj", :type "function", :column 1, :see-alsos [{:created-at 1559582539068, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "demunge", :ns "clojure.repl"}, :_id "5cf5574be4b0ca44402ef746"}], :line 228, :examples [{:updated-at 1559582523950, :created-at 1559582310173, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body "(ns my-namespace)\n\n(require '[clojure.repl :refer [stack-element-str]])\n\n(defn my-funct! [] (throw (ex-info \"error\" {})))\n\n(def stack-trace \n (try (my-funct!) (catch Exception e (.getStackTrace e))))\n\n;; This stack trace element shows a Java compatible class name,\n;; but is not very readable.\n(str (nth stack-trace 2))\n;; \"my_namespace$my_funct_BANG_.invokeStatic(form-init417155.clj:1)\"\n\n;; Use stack-element-str to transform it back into idiomatic Clojure\n(stack-element-str (nth stack-trace 2))\n;; \"my-namespace/my-funct! (form-init417155.clj:1)\"\n", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5cf55666e4b0ca44402ef743"}], :notes nil, :arglists ["el"], :doc "Returns a (possibly unmunged) string representation of a StackTraceElement", :library-url "https://github.com/clojure/clojure", :href "/clojure.repl/stack-element-str"} {:added "1.0", :ns "clojure.repl", :name "find-doc", :file "clojure/repl.clj", :type "function", :column 1, :see-alsos nil, :line 116, :examples [{:author {:login "pimgeek", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fa1bf77254fb5c14b4fd5afd1c11fe53?r=PG&default=identicon"}, :editors [{:login "pimgeek", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fa1bf77254fb5c14b4fd5afd1c11fe53?r=PG&default=identicon"}], :body "user=> (find-doc \"data structure\")\n\n-------------------------\nclojure.core/eval\n([form])\n Evaluates the form data structure (not text!) and returns the result.\n-------------------------\nclojure.core/ifn?\n([x])\n Returns true if x implements IFn. Note that many data structures\n (e.g. sets and maps) implement IFn\n", :created-at 1365967175000, :updated-at 1365967933000, :_id "542692d6c026201cdc3270f9"}], :notes nil, :arglists ["re-string-or-pattern"], :doc "Prints documentation for any var whose documentation or name\n contains a match for re-string-or-pattern", :library-url "https://github.com/clojure/clojure", :href "/clojure.repl/find-doc"} {:ns "clojure.repl", :name "dir", :file "clojure/repl.clj", :type "macro", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "doc", :ns "clojure.repl"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342639192000, :_id "542692eaf6e94c6970521b24"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "source", :ns "clojure.repl"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342639197000, :_id "542692eaf6e94c6970521b25"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "apropos", :ns "clojure.repl"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342639317000, :_id "542692eaf6e94c6970521b26"}], :line 202, :examples [{:author {:login "teyc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd6e62afb4881ab0f617611b8b65d003?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (require 'clojure.string 'clojure.repl)\n\nuser=> (clojure.repl/dir clojure.string)\nblank?\ncapitalize\nescape\njoin\nlower-case\nreplace\nreplace-first\nreverse\nsplit\nsplit-lines\ntrim\ntrim-newline\ntriml\ntrimr\nupper-case", :created-at 1283977504000, :updated-at 1332953035000, :_id "542692d0c026201cdc326ecf"}], :macro true, :notes nil, :arglists ["nsname"], :doc "Prints a sorted directory of public vars in a namespace", :library-url "https://github.com/clojure/clojure", :href "/clojure.repl/dir"} {:added "1.3", :ns "clojure.repl", :name "pst", :file "clojure/repl.clj", :type "function", :column 1, :see-alsos [{:created-at 1334156025000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "*e", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f5f"}], :line 241, :examples [{:author {:login "pimgeek", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fa1bf77254fb5c14b4fd5afd1c11fe53?r=PG&default=identicon"}, :editors [], :body "user=> (pst)\nnil\n\nuser=> (/ 1 0)\nArithmeticException Divide by zero clojure.lang.Numbers.divide (Numbers.java:156)\n\nuser=> (pst)\nArithmeticException Divide by zero\n\tclojure.lang.Numbers.divide (Numbers.java:156)\n\tclojure.lang.Numbers.divide (Numbers.java:3691)\n\tuser/eval13 (NO_SOURCE_FILE:7)\n\tclojure.lang.Compiler.eval (Compiler.java:6619)\n\tclojure.lang.Compiler.eval (Compiler.java:6582)\n\tclojure.core/eval (core.clj:2852)\n\tclojure.main/repl/read-eval-print--6588/fn--6591 (main.clj:259)\n\tclojure.main/repl/read-eval-print--6588 (main.clj:259)\n\tclojure.main/repl/fn--6597 (main.clj:277)\n\tclojure.main/repl (main.clj:277)\n\tclojure.main/repl-opt (main.clj:343)\n\tclojure.main/main (main.clj:441)\nnil\n", :created-at 1365968672000, :updated-at 1365968672000, :_id "542692d6c026201cdc3270fb"}], :notes nil, :arglists ["" "e-or-depth" "e depth"], :doc "Prints a stack trace of the exception, to the depth requested. If none supplied, uses the root cause of the\n most recent repl exception (*e), and a depth of 12.", :library-url "https://github.com/clojure/clojure", :href "/clojure.repl/pst"} {:ns "clojure.repl", :name "dir-fn", :file "clojure/repl.clj", :type "function", :column 1, :see-alsos [{:created-at 1545998336322, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "dir", :ns "clojure.repl"}, :_id "5c261000e4b0ca44402ef600"}], :line 196, :examples [{:updated-at 1559571596051, :created-at 1283977379000, :body "(require 'clojure.repl 'clojure.string)\n\nuser=> (pprint (clojure.repl/dir-fn 'clojure.string))\n(blank?\n capitalize\n escape\n join\n lower-case\n replace\n replace-first\n reverse\n split\n split-lines\n trim\n trim-newline\n triml\n trimr\n upper-case)\nnil\n\n;; Or the same with \"dir\" at the REPL:\n\nuser=> (dir clojure.string)\n(blank?\n capitalize\n escape\n join\n lower-case\n[...]", :editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/bd6e62afb4881ab0f617611b8b65d003?r=PG&default=identicon", :account-source "clojuredocs", :login "teyc"}, :_id "542692d0c026201cdc326ed1"}], :notes nil, :arglists ["ns"], :doc "Returns a sorted seq of symbols naming public vars in\n a namespace or namespace alias. Looks for aliases in *ns*", :library-url "https://github.com/clojure/clojure", :href "/clojure.repl/dir-fn"} {:ns "clojure.repl", :name "source", :file "clojure/repl.clj", :type "macro", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "doc", :ns "clojure.repl"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342639074000, :_id "542692ebf6e94c6970521db6"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "dir", :ns "clojure.repl"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342639176000, :_id "542692ebf6e94c6970521db7"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "apropos", :ns "clojure.repl"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342639308000, :_id "542692ebf6e94c6970521db8"} {:created-at 1502136782003, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/8271291?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "source-fn", :ns "clojure.repl"}, :_id "5988c9cee4b0d19c2ce9d710"}], :line 173, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (source max)\n;; prints in console:\n(defn max\n \"Returns the greatest of the nums.\"\n {:added \"1.0\"}\n ([x] x)\n ([x y] (if (> x y) x y))\n ([x y & more]\n (reduce max (max x y) more)))\n", :created-at 1279775890000, :updated-at 1285497544000, :_id "542692d0c026201cdc326ecb"}], :macro true, :notes nil, :arglists ["n"], :doc "Prints the source code for the given symbol, if it can find it.\n This requires that the symbol resolve to a Var defined in a\n namespace for which the .clj is in the classpath.\n\n Example: (source filter)", :library-url "https://github.com/clojure/clojure", :href "/clojure.repl/source"} {:ns "clojure.repl", :name "set-break-handler!", :file "clojure/repl.clj", :type "function", :column 1, :see-alsos nil, :line 280, :examples nil, :notes nil, :arglists ["" "f"], :doc "Register INT signal handler. After calling this, Ctrl-C will cause\n the given function f to be called with a single argument, the signal.\n Uses thread-stopper if no function given.", :library-url "https://github.com/clojure/clojure", :href "/clojure.repl/set-break-handler!"} {:added "1.3", :ns "clojure.repl", :name "root-cause", :file "clojure/repl.clj", :type "function", :column 1, :see-alsos nil, :line 215, :examples [{:updated-at 1559582779428, :created-at 1559576151369, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body "(require '[clojure.repl :refer [root-cause]])\n\n(def chained-exceptions \n (ex-info \"Problem.\" {:status :surprise} \n (try (/ 1 0) \n (catch Exception e \n (ex-info \"What happened?\" {:status :unknown} e)))))\n\n;; Only shows the first 3 items from the stack trace \n;; of the root-cause exception in chained-exceptions.\n\n(pst (root-cause chained-exceptions) 3)\n\n;; ArithmeticException Divide by zero\n;; clojure.lang.Numbers.divide (Numbers.java:158)\n;; clojure.lang.Numbers.divide (Numbers.java:3808)\n;; user/fn--2169 (form-init4179141376169992155.clj:3)\n\n", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5cf53e57e4b0ca44402ef741"}], :notes nil, :arglists ["t"], :doc "Returns the initial cause of an exception or error by peeling off all of\n its wrappers", :library-url "https://github.com/clojure/clojure", :href "/clojure.repl/root-cause"} {:added "1.3", :ns "clojure.repl", :name "demunge", :file "clojure/repl.clj", :type "function", :column 1, :see-alsos [{:created-at 1559571453087, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "munge", :ns "clojure.core"}, :_id "5cf52bfde4b0ca44402ef73d"}], :line 208, :examples [{:author {:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"}, :editors [{:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=4"}], :body "user=> (require '[clojure.repl :as repl])\nnil\n\nuser=> (-> + class str)\n\"class clojure.core$_PLUS_\"\n\nuser=> (-> + class str repl/demunge)\n\"class clojure.core/+\"", :created-at 1335431555000, :updated-at 1647645337838, :_id "542692d6c026201cdc3270f6"}], :notes nil, :arglists ["fn-name"], :doc "Given a string representation of a fn class,\n as in a stack trace element, returns a readable version.", :library-url "https://github.com/clojure/clojure", :href "/clojure.repl/demunge"} {:ns "clojure.repl", :name "thread-stopper", :file "clojure/repl.clj", :type "function", :column 1, :see-alsos nil, :line 274, :examples nil, :notes nil, :arglists ["" "thread"], :doc "Returns a function that takes one arg and uses that as an exception message\n to stop the given thread. Defaults to the current thread", :library-url "https://github.com/clojure/clojure", :href "/clojure.repl/thread-stopper"} {:ns "clojure.repl", :name "apropos", :file "clojure/repl.clj", :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "source", :ns "clojure.repl"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342639345000, :_id "542692ebf6e94c6970521e1e"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "doc", :ns "clojure.repl"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342639350000, :_id "542692ebf6e94c6970521e1f"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "dir", :ns "clojure.repl"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1342639354000, :_id "542692ebf6e94c6970521e20"}], :line 182, :examples [{:author {:login "teyc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd6e62afb4881ab0f617611b8b65d003?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (apropos \"temp\")\n()\n\nuser=> (require 'clojure.template)\nnil\n\nuser=> (apropos \"temp\")\n(apply-template do-template)\n", :created-at 1283977701000, :updated-at 1285487332000, :_id "542692d0c026201cdc326ecd"} {:updated-at 1611953795226, :created-at 1611953795226, :author {:login "sanel", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/213914?v=4"}, :body ";; apropos can accept regex patterns. E.g. find only definitions\n;; ending with \"reduce\"\nuser=> (apropos #\".+?reduce\")\n(clojure.core/areduce clojure.core/ensure-reduced clojure.core/unreduced ...)\n\n;; get all public definitions from all currently-loaded namespaces\nuser=> (apropos #\"^+?\")\n(clojure.core/* clojure.core/*' clojure.core/*1 ...)", :_id "60147683e4b0b1e3652d7445"}], :notes nil, :arglists ["str-or-pattern"], :doc "Given a regular expression or stringable thing, return a seq of all\npublic definitions in all currently-loaded namespaces that match the\nstr-or-pattern.", :library-url "https://github.com/clojure/clojure", :href "/clojure.repl/apropos"} {:added "1.0", :ns "clojure.set", :name "union", :file "clojure/set.clj", :type "function", :column 1, :see-alsos [{:created-at 1318523783000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "intersection", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b57"} {:created-at 1318525824000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "difference", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b58"} {:created-at 1318525832000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "superset?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b59"}], :line 20, :examples [{:author {:login "Brian Marick", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (union)\n#{}\n\nuser=> (union #{1 2})\n#{1 2}\n\nuser=> (union #{1 2} #{2 3})\n#{1 2 3}\n\nuser=> (union #{1 2} #{2 3} #{3 4})\n#{1 2 3 4}\n", :created-at 1278994901000, :updated-at 1412048733230, :_id "542692d0c026201cdc326ed9"} {:editors [{:login "sleyzerzon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/528932?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/200617?v=3", :account-source "github", :login "bsima"}], :body "(reduce (fn [flattened [key val]]\n (conj flattened val))\n #{}\n {:e #{:m :f}, :c #{:f}, :b #{:c :f}, :d #{:m :f}, :a #{:c :f}})\n\n;;=> #{#{:m :f} #{:c :f} #{:f}}\n\n\n(reduce (fn [flattened [key val]]\n (clojure.set/union flattened val))\n #{}\n {:e #{:m :f}, :c #{:f}, :b #{:c :f}, :d #{:m :f}, :a #{:c :f}})\n\n;;=> #{:m :c :f}", :author {:avatar-url "https://avatars.githubusercontent.com/u/528932?v=3", :account-source "github", :login "sleyzerzon"}, :created-at 1471130818331, :updated-at 1485272654530, :_id "57afacc2e4b02d8da95c26f8"} {:updated-at 1471131322046, :created-at 1471131322046, :author {:login "sleyzerzon", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/528932?v=3"}, :body "(defn flatten-dpdnts [dpdnts-map]\n (apply set/union (vals dpdnts-map)))\n\n(flatten-dpdnts {:e #{:m :f}, :c #{:f}, :b #{:c :f}, :d #{:m :f}, :a #{:c :f}})\n;;=> #{:m :c :f}", :_id "57afaebae4b02d8da95c26fb"} {:updated-at 1532995894885, :created-at 1532655671091, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :body ";; Advice: Do not call union with non-set arguments. If you are\n;; concerned that you may be unintentionally doing so, and want an\n;; exception to be thrown if you do, consider using the library\n;; funjible (https://github.com/jafingerhut/funjible) which provides\n;; its own definition of union that is identical to Clojure's, except\n;; it checks the types of its arguments.\n\n;; union might or might not return what you expect if you give it\n;; values that are not sets. The implementation of union _does not\n;; check_ whether you are actually giving it values that are sets. It\n;; _assumes_ so.\n\n;; This looks like what someone might expect. It _happens_ to give\n;; back the same answer as if you coerced the second argument to a\n;; set.\nuser=> (union #{1 2 3} [4 5])\n#{1 4 3 2 5}\n\n;; Wait, this returned a vector, not a set!\nuser=> (union #{1 2} [3 4 5])\n[3 4 5 1 2]\n\n;; This also returned a vector, and some elements are duplicates of\n;; each other!\nuser=> (union #{1 2} [3 4 5] #{4 5})\n[3 4 5 1 2 4 5]\n\n;; Why not change the definition of union so it throws an exception if\n;; you give it a non-set argument? I would guess that the primary\n;; reason is that the extra run-time type checks would slow union down\n;; by an amount that the Clojure core team does not want everyone to\n;; have to pay on every such call.\n\n;; Related Clojure tickets: \n;; https://dev.clojure.org/jira/browse/CLJ-1953\n;; https://dev.clojure.org/jira/browse/CLJ-2287\n", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4", :account-source "github", :login "jafingerhut"}], :_id "5b5a7837e4b00ac801ed9e2e"} {:updated-at 1545071198416, :created-at 1545071198416, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :body ";; (set/union) treats nil as the empty set, as you'd probably expect.\n(clojure.set/union nil #{1 2} nil)\n;;=> #{1 2}\n\n;; This makes it handy to use as an accumulator in combination with (update-in):\n(update-in {} [:a :b :c] clojure.set/union #{333})\n;;=> {:a {:b {:c #{333}}}}\n", :_id "5c17ea5ee4b0ca44402ef5eb"} {:updated-at 1583387308326, :created-at 1583387308326, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; The \"powerset\" is the set of all the combinations of \"items\"\n(require '[clojure.set :refer [union]])\n\n(defn powerset [items]\n (reduce\n (fn [s x]\n (union s (map #(conj % x) s)))\n (hash-set #{})\n items))\n\n(powerset #{1 2 3})\n;; #{#{} #{3} #{2} #{1} #{1 3 2} #{1 3} #{1 2} #{3 2}}", :_id "5e6092ace4b087629b5a18b6"}], :notes nil, :arglists ["" "s1" "s1 s2" "s1 s2 & sets"], :doc "Return a set that is the union of the input sets", :library-url "https://github.com/clojure/clojure", :href "/clojure.set/union"} {:added "1.0", :ns "clojure.set", :name "map-invert", :file "clojure/set.clj", :type "function", :column 1, :see-alsos nil, :line 106, :examples [{:author {:login "Brian Marick", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Despite being in clojure.set, this has nothing to do with sets. \n\nuser=> (map-invert {:a 1, :b 2})\n{2 :b, 1 :a}\n\n;; If there are duplicate keys, one is chosen:\n\nuser=> (map-invert {:a 1, :b 1})\n{1 :b}\n\n;; I suspect it'd be unwise to depend on which key survives the clash.", :created-at 1278995220000, :updated-at 1285502749000, :_id "542692d0c026201cdc326ee9"} {:updated-at 1483716604767, :created-at 1483716604767, :author {:login "bruno-oliveira", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4722412?v=3"}, :body ";; The inverted map of an empty map is also an empty map.\nuser=> (map-invert {})\n{}\n\n;; Using complex values (which serve as keys in the inverted map) is possible.\nuser=> ((map-invert {:a {:c 5}}) {:c 5})\n:a", :_id "586fb7fce4b09108c8545a49"} {:updated-at 1532105186014, :created-at 1532105186014, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; simple text obfuscation and back, with map-invert\n\n(def scramble-key\n {\\a \\t \\b \\m \\c \\o \\d \\l\n \\e \\z \\f \\i \\g \\b \\h \\u\n \\i \\h \\j \\n \\k \\s \\l \\r\n \\m \\a \\n \\q \\o \\d \\p \\e\n \\q \\k \\r \\y \\s \\f \\t \\c\n \\u \\p \\v \\w \\w \\x \\x \\j\n \\y \\g \\z \\v \\space \\space})\n\n(defn scramble [text scramble-key]\n (apply str (map scramble-key text)))\n\n(defn unscramble [text scramble-key]\n (apply str (map (map-invert scramble-key) text)))\n\n(scramble \"try to read this if you can\" scramble-key)\n;; \"cyg cd yztl cuhf hi gdp otq\"\n\n(unscramble \"cyg cd yztl cuhf hi gdp otq\" scramble-key)\n;; \"try to read this if you can\"", :_id "5b5211e2e4b00ac801ed9e29"}], :notes [{:author {:login "optevo", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1281179?v=4"}, :updated-at 1573544646653, :created-at 1573544406399, :body "If you have the possibility of duplicate values, in your map, the invert-map function will only preserve one of them. An alternative which doesn't eliminate values is to ensure all values are sets then use the following function:\n
    (defn invert-map-of-sets [m]\n   (reduce (fn [a [k v]] (assoc a k (conj (get a k #{}) v))) {} (for [[k s] m v s] [v k]))))
    \nThis will work as follows:\n
    ;; From\n{1 #{:a :b :c} 2 #{:b :c :d}}
    \n\n
    ;; To\n{:c #{1 2}, :b #{1 2}, :a #{1}, :d #{2}}
    \n\n\n\n\n", :_id "5dca61d6e4b0ca44402ef7da"}], :arglists ["m"], :doc "Returns the map with the vals mapped to the keys.", :library-url "https://github.com/clojure/clojure", :href "/clojure.set/map-invert"} {:added "1.0", :ns "clojure.set", :name "join", :file "clojure/set.clj", :type "function", :column 1, :see-alsos [{:created-at 1533910568303, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "rename", :ns "clojure.set"}, :_id "5b6d9e28e4b00ac801ed9e50"}], :line 111, :examples [{:updated-at 1493911041846, :created-at 1278825825000, :body ";; This simple example shows each element of the first relation joined\n;; with each element of the second (because they have no columns in common):\n\nuser=> (def first-relation #{ {:a 1} {:a 2} })\nuser=> (def second-relation #{ {:b 1} {:b 2} })\nuser=> (join first-relation second-relation)\n#{{:b 1, :a 1} \n {:b 2, :a 1} \n {:b 1, :a 2} \n {:b 2, :a 2}}\n\n\n;; Here's a larger example, in which a relation mainly about animal ownership\n;; is joined with a relation about animal personality. The join is used to \n;; produce a relation joining information about an animal's personality to \n;; that animal.\n\nuser=> (def animals #{{:name \"betsy\" :owner \"brian\" :kind \"cow\"}\n {:name \"jake\" :owner \"brian\" :kind \"horse\"}\n {:name \"josie\" :owner \"dawn\" :kind \"cow\"}})\n\nuser=> (def personalities #{{:kind \"cow\" :personality \"stoic\"}\n {:kind \"horse\" :personality \"skittish\"}})\n#'user/personalities\nuser=> (join animals personalities)\n\n#{{:owner \"dawn\", :name \"josie\", :kind \"cow\", :personality \"stoic\"}\n {:owner \"brian\", :name \"betsy\", :kind \"cow\", :personality \"stoic\"}\n {:owner \"brian\", :name \"jake\", :kind \"horse\", :personality \"skittish\"}}\n\n\n;; (If cows had two personalities, instead of one, each cow would have \n;; two rows in the output.)\n\n;; Suppose `personalities` used `:species` instead of `:kind`:\n\nuser=> (def personalities #{{:species \"cow\" :personality \"stoic\"}\n {:species \"horse\" :personality \"skittish\"}})\n\n\n;; A simple join would produce results like this:\n\nuser=> (join animals personalities)\n#{{:kind \"horse\", :owner \"brian\", :name \"jake\", :species \"cow\", :personality \"stoic\"}\n {:kind \"cow\", :owner \"dawn\", :name \"josie\", :species \"cow\", :personality \"stoic\"}\n {:kind \"horse\", :owner \"brian\", :name \"jake\", :species \"horse\", :personality \"skittish\"}\n {:kind \"cow\", :owner \"brian\", :name \"betsy\", :species \"cow\", :personality \"stoic\"}\n {:kind \"cow\", :owner \"dawn\", :name \"josie\", :species \"horse\", :personality \"skittish\"}\n {:kind \"cow\", :owner \"brian\", :name \"betsy\", :species \"horse\", :personality \"skittish\"}}\n\n\n;; Notice that \"Jake\" is both a horse and a cow in the first line. That's \n;; likely not what you want. You can tell `join` to only produce output \n;; where the `:kind` value is the same as the `:species` value like this:\n\nuser=> (join animals personalities {:kind :species})\n#{{:kind \"cow\", :owner \"dawn\", :name \"josie\", :species \"cow\", :personality \"stoic\"}\n {:kind \"horse\", :owner \"brian\", :name \"jake\", :species \"horse\", :personality \"skittish\"}\n {:kind \"cow\", :owner \"brian\", :name \"betsy\", :species \"cow\", :personality \"stoic\"}}\n\n\n;; Notice that the `:kind` and `:species` keys both appear in each output map.\n", :editors [{:avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon", :account-source "clojuredocs", :login "Brian Marick"} {:avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon", :account-source "clojuredocs", :login "Brian Marick"} {:avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon", :account-source "clojuredocs", :login "Brian Marick"} {:avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon", :account-source "clojuredocs", :login "Brian Marick"} {:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://www.gravatar.com/avatar/90ffa70a579c3e0c398b7523ecdc6a87?r=PG&default=identicon", :account-source "clojuredocs", :login "morphling"} {:login "tomaskulich", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4833191?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon", :account-source "clojuredocs", :login "Brian Marick"}, :_id "542692d0c026201cdc326edf"} {:updated-at 1493911081751, :created-at 1493911081751, :author {:login "tomaskulich", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/4833191?v=3"}, :body "\n;; If you don't specify `km`, `join` has to 'guess' on which attributes to join.\n;; Sometimes, result may surprise you:\n\nuser=> (join [{:a 1 :b 2}] [{:c 3 :d 4} {:a 5 :b 6}]) \n;#{{:a 5, :b 6} {:a 1, :b 2, :c 3, :d 4}}", :_id "590b4629e4b01f4add58feaa"} {:updated-at 1631961178190, :created-at 1533911386656, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; join with rename of (otherwise clashing) keys. Note that in the following\n;; relations, we have \"user.type\" and \"account.type\"\n\n(def users\n #{{:user-id 1 :name \"john\" :age 22 :type \"personal\"}\n {:user-id 2 :name \"jake\" :age 28 :type \"company\"}\n {:user-id 3 :name \"amanda\" :age 63 :type \"personal\"}})\n\n(def accounts\n #{{:acc-id 1 :user-id 1 :amount 300.45 :type \"saving\"}\n {:acc-id 2 :user-id 2 :amount 1200.0 :type \"saving\"}\n {:acc-id 3 :user-id 1 :amount 850.1 :type \"debit\"}})\n\n(require '[clojure.set :as s])\n\n;; Clojure equivalent of the SQL:\n;; SELECT users.user-id, accounts.acc-id, \n;; users.type as type, accounts.type as atype\n;; FROM users\n;; INNER JOIN accounts ON users.user-id = accounts.user-id;\n\n(s/project\n (s/join users (s/rename accounts {:type :atype}))\n [:user-id :acc-id :type :atype])\n\n;; #{{:user-id 1, :acc-id 1, :type \"personal\", :atype \"saving\"}\n;; {:user-id 2, :acc-id 2, :type \"company\", :atype \"saving\"}\n;; {:user-id 1, :acc-id 3, :type \"personal\", :atype \"debit\"}}\n\n", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"} {:login "marckoch", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20969375?v=4"}], :_id "5b6da15ae4b00ac801ed9e51"}], :notes nil, :arglists ["xrel yrel" "xrel yrel km"], :doc "When passed 2 rels, returns the rel corresponding to the natural\n join. When passed an additional keymap, joins on the corresponding\n keys.", :library-url "https://github.com/clojure/clojure", :href "/clojure.set/join"} {:added "1.0", :ns "clojure.set", :name "select", :file "clojure/set.clj", :type "function", :column 1, :see-alsos [{:created-at 1321756919000, :author {:login "alimoeeny", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9e8dd06976ead4082d2181f3807117e1?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "filter", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d82"} {:created-at 1687507624559, :author {:login "daveliepmann", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/974443?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "project", :ns "clojure.set"}, :_id "649552a8e4b08cf8563f4bca"} {:created-at 1687507661784, :author {:login "daveliepmann", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/974443?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "join", :ns "clojure.set"}, :_id "649552cde4b08cf8563f4bcb"}], :line 65, :examples [{:author {:login "Brian Marick", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "kimh", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/924390?v=3"} {:avatar-url "https://avatars.githubusercontent.com/u/8908139?v=3", :account-source "github", :login "bsifou"}], :body "(clojure.set/select odd? #{1 2 3})\n;;=> #{1 3}\n", :created-at 1278822406000, :updated-at 1486787976866, :_id "542692d0c026201cdc326edb"}], :notes nil, :arglists ["pred xset"], :doc "Returns a set of the elements for which pred is true", :library-url "https://github.com/clojure/clojure", :href "/clojure.set/select"} {:added "1.0", :ns "clojure.set", :name "intersection", :file "clojure/set.clj", :type "function", :column 1, :see-alsos [{:created-at 1318523876000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "union", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aab"} {:created-at 1318525852000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "difference", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aac"} {:created-at 1318525861000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "superset?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aad"} {:created-at 1366429268000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "project", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521aae"}], :line 33, :examples [{:updated-at 1447239876245, :created-at 1278994500000, :body "user=> (clojure.set/intersection #{1})\n#{1}\nuser=> (clojure.set/intersection #{1 2} #{2 3})\n#{2}\nuser=> (clojure.set/intersection #{1 2} #{2 3} #{3 4})\n#{}\nuser=> (clojure.set/intersection #{1 :a} #{:a 3} #{:a})\n#{:a}\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:login "edipofederle", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/50778?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon", :account-source "clojuredocs", :login "Brian Marick"}, :_id "542692d0c026201cdc326ee7"} {:updated-at 1474102028022, :created-at 1474101854124, :author {:login "mhmdsalem1993", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10787314?v=3"}, :body "; gcd => Greatest common divisor\n(defn find-divisors [x]\n (let [divisors (atom [x])]\n (doseq [_x (range 1 x)] (if (== 0 (mod x _x))\n (swap! divisors conj _x)\n ))\n @divisors\n )\n )\n(defn gcd [x y] (let\n [x-div (set (find-divisors x))\n y-div (set (find-divisors y))]\n (last (into [] (clojure.set/intersection y-div x-div)))\n ))\n;; lcm least common multiply\n(defn lcm [x y] (/ (Math/abs (* x y)) (gcd x y)))\n\n\n=> #'user/find-divisors\n=> #'user/gcd\n=> #'user/lcm\n(lcm 4 6)\n=> 12", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/10787314?v=3", :account-source "github", :login "mhmdsalem1993"}], :_id "57dd025ee4b0709b524f04fc"} {:updated-at 1494919958612, :created-at 1494919958612, :author {:login "abhilater", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1904958?v=3"}, :body "(clojure.set/intersection #{:a :b :c} #{:d :c :b})\n;=> #{:b :c}\n\n(clojure.set/intersection #{:a :e :i :o :u}\n\t\t\t #{:a :u :r}\n\t\t\t #{:r :u :s})\n;=> #{:u}", :_id "591aab16e4b01920063ee05e"} {:updated-at 1532996003370, :created-at 1532676926792, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :body ";; Advice: Do not call intersection with non-set arguments. If you\n;; are concerned that you may be unintentionally doing so, and want an\n;; exception to be thrown if you do, consider using the library\n;; funjible (https://github.com/jafingerhut/funjible) which provides\n;; its own definition of intersection that is identical to Clojure's,\n;; except it checks the types of its arguments.\n\n;; intersection might or might not return what you expect if you give it\n;; values that are not sets. The implementation of intersection _does not\n;; check_ whether you are actually giving it values that are sets. It\n;; _assumes_ so.\n\n;; It is possible that intersection _might_ throw an exception if you\n;; give it a non-set as an argument:\nuser=> (intersection #{1 3 5} [2 4])\nClassCastException clojure.lang.PersistentVector cannot be cast to clojure.lang.IPersistentSet clojure.core/disj (core.clj:1517)\n\n;; But it can also simply return an answer that is not the\n;; intersection of the two collections:\nuser=> (intersection #{1 3 5} [2 4 6 8])\n#{1 3}\n\n;; In the previous case, it includes elements in the returned set that\n;; you would not expect. It can also leave out elements in the\n;; returned set that you would expect to find there.\nuser=> (intersection #{\"1\" \"3\" \"5\"} [\"1\" \"3\" \"5\" \"7\"])\n#{}\n\n;; Why not change the definition of intersection so it always throws\n;; an exception if you give it a non-set argument? I would guess that\n;; the primary reason is that the extra run-time type checks would\n;; slow intersection down by an amount that the Clojure core team does\n;; not want everyone to have to pay on every such call.\n\n;; Related Clojure tickets: \n;; https://dev.clojure.org/jira/browse/CLJ-1953\n;; https://dev.clojure.org/jira/browse/CLJ-2287\n", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4", :account-source "github", :login "jafingerhut"}], :_id "5b5acb3ee4b00ac801ed9e35"}], :notes nil, :arglists ["s1" "s1 s2" "s1 s2 & sets"], :doc "Return a set that is the intersection of the input sets", :library-url "https://github.com/clojure/clojure", :href "/clojure.set/intersection"} {:added "1.2", :ns "clojure.set", :name "superset?", :file "clojure/set.clj", :type "function", :column 1, :see-alsos [{:created-at 1338064940000, :author {:login "jasonrudolph.com", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c4e34ac0818591402a41b2e9cfb4747b?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "subset?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d31"} {:created-at 1338064955000, :author {:login "jasonrudolph.com", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c4e34ac0818591402a41b2e9cfb4747b?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "set", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d32"}], :line 150, :examples [{:author {:login "jasonrudolph.com", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c4e34ac0818591402a41b2e9cfb4747b?r=PG&default=identicon"}, :editors [], :body "(use '[clojure.set :only [superset?]])\n\nuser=> (superset? #{0} #{0})\ntrue\n\nuser=> (superset? #{0 1} #{0})\ntrue\n\nuser=> (superset? #{0} #{0 1}) \nfalse\n", :created-at 1338064647000, :updated-at 1338064647000, :_id "542692d6c026201cdc3270fc"} {:updated-at 1543865081521, :created-at 1532677432379, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :body ";; Advice: Do not call superset? with non-set arguments. If you are\n;; concerned that you may be unintentionally doing so, and want an\n;; exception to be thrown if you do, consider using the library\n;; funjible (https://github.com/jafingerhut/funjible) which provides\n;; its own definition of superset? that is identical to Clojure's,\n;; except it checks the types of its arguments.\n\n;; superset? might or might not return what you expect if you give it\n;; values that are not sets. The implementation of superset? _does not\n;; check_ whether you are actually giving it values that are sets. It\n;; _assumes_ so.\n\n;; If the first argument were a set with the same elements, you would\n;; expect the return value false here.\nuser=> (superset? [2 4 6 8] #{1 3})\ntrue\n\n;; Here, if the first argument were a set with the same elements as\n;; the vector, you would expect the return value true.\nuser=> (superset? [1 3 5] #{1 3 5})\nfalse\n\n;; And similarly here:\nuser=> (superset? [\"1\" \"3\" \"5\"] #{\"1\" \"3\"})\nfalse\n\n;; Switching to considering cases where the second argument is not a set, this\n;; appears to do what one would hope:\nuser=> (superset? #{1 2 3 4 5} [1 2 3 4])\ntrue\n\n;; ... but this does not (at least up until Clojure 1.10 this behavior is\n;; because of how superset? is implemented, first comparing the count of the\n;; two collections to make it possible to quickly return false when the second\n;; collection is larger):\nuser=> (subset? #{1 2 3 4 5} [1 2 3 4 1 2 3 4])\nfalse\n\n;; Why not change the definition of superset? so it always throws\n;; an exception if you give it a non-set argument? I would guess that\n;; the primary reason is that the extra run-time type checks would\n;; slow superset? down by an amount that the Clojure core team does\n;; not want everyone to have to pay on every such call.\n\n;; Related Clojure tickets: \n;; https://dev.clojure.org/jira/browse/CLJ-1953\n;; https://dev.clojure.org/jira/browse/CLJ-2287\n", :editors [{:avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4", :account-source "github", :login "jafingerhut"}], :_id "5b5acd38e4b00ac801ed9e39"}], :notes nil, :tag "java.lang.Boolean", :arglists ["set1 set2"], :doc "Is set1 a superset of set2?", :library-url "https://github.com/clojure/clojure", :href "/clojure.set/superset_q"} {:added "1.0", :ns "clojure.set", :name "index", :file "clojure/set.clj", :type "function", :column 1, :see-alsos [{:created-at 1290275867000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "hash-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b48"} {:created-at 1290275888000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "get", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b49"}], :line 95, :examples [{:author {:login "Brian Marick", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "taylor.sando", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c127297f5548f7275ded1428aa5518bb?r=PG&default=identicon"} {:login "taylor.sando", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c127297f5548f7275ded1428aa5518bb?r=PG&default=identicon"} {:login "taylor.sando", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c127297f5548f7275ded1428aa5518bb?r=PG&default=identicon"} {:avatar-url "https://avatars0.githubusercontent.com/u/7083783?v=4", :account-source "github", :login "cloojure"} {:login "conan", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3037019?v=4"}], :body "(use '[clojure.set :only (index)])\n\n;; Suppose you have a set of descriptions of the weights of animals:\n\nuser=> (def weights #{ {:name 'betsy :weight 1000}\n {:name 'jake :weight 756}\n {:name 'shyq :weight 1000} })\n\n\n; You want the names of all the animals that weigh 1000. One way to do \n; that uses `index`. First, you can group the set elements (the maps) so\n; that those with the same weights are in the same group.\nuser=> (def by-weight (index weights [:weight]))\n#'user/by-weight\n\n; index returns a map. The keys are maps themselves, where {:weight 756} \n; and {:weight 1000} are taken from the maps in the weights set. \n; The values in the map returned by index are sets that contain map \n; entries from the above weights set.\nuser=> by-weight\n{{:weight 756} #{{:name jake, :weight 756}}, \n {:weight 1000} #{{:name shyq, :weight 1000} \n {:name betsy, :weight 1000}}}\n\n; To better visualize the by-weight map that is returned by index, \n; you can query it using get, using {:weight 756} as the key. This \n; will return all the maps (animals) that contain a weight of 756. \n; In this case, there is only one result, which is a set containing \n; a single map. \nuser=> (get by-weight {:weight 756})\n#{{:name jake, :weight 756}}\n\n; To see that there are two animals with a weight of 1000, you can \n; query by-weight with the key {:weight 1000}. This returns a set \n; containing two maps.\nuser=> (get by-weight {:weight 1000})\n#{{:name shyq, :weight 1000} {:name betsy :weight 1000}}\n\n; You can verify by using count\nuser=> (count (get by-weight {:weight 1000}))\n2\n\n; To get the names of those two animals we can map a name-extracting function\n; over the set of two maps. Since a keyword in a map is also a function that\n; returns its corresponding value, we can just use `:name` as our function:\nuser=> (map :name (get by-weight {:weight 1000}))\n(shyq betsy)\n", :created-at 1278996864000, :updated-at 1612200146773, :_id "542692d0c026201cdc326ef1"} {:updated-at 1601047527682, :created-at 1523214100238, :author {:login "statcompute", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/4590938?v=4"}, :body ";; You can do a join using 'index'\n(require '[clojure.set :as s]\n '[clojure.core.reducers :as r])\n \n(def ds1 [{:id 1 :name \"name1\"}\n {:id 2 :name \"name2\"}\n {:id 3 :name \"name3\"}])\n \n(def ds2 [{:id 2 :address \"addr2\"}\n {:id 3 :address \"addr3\"}\n {:id 4 :address \"addr4\"}])\n\n(into () (r/map #(r/reduce merge %) (vals (s/index (s/union ds2 ds1) [:id]))))\n;; ({:id 1, :name \"name1\"}\n;; {:id 4, :address \"addr4\"}\n;; {:id 3, :name \"name3\", :address \"addr3\"}\n;; {:id 2, :address \"addr2\", :name \"name2\"})\n", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4", :account-source "github", :login "dijonkitchen"} {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}], :_id "5aca6714e4b045c27b7fac3a"}], :notes nil, :arglists ["xrel ks"], :doc "Returns a map of the distinct values of ks in the xrel mapped to a\n set of the maps in xrel with the corresponding values of ks.", :library-url "https://github.com/clojure/clojure", :href "/clojure.set/index"} {:added "1.2", :ns "clojure.set", :name "subset?", :file "clojure/set.clj", :type "function", :column 1, :see-alsos [{:created-at 1293674668000, :author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "set?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a98"} {:created-at 1293674671000, :author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "set", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a99"} {:created-at 1338064920000, :author {:login "jasonrudolph.com", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c4e34ac0818591402a41b2e9cfb4747b?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "superset?", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521a9a"} {:created-at 1512076531871, :author {:login "chbrown", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/360279?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "every?", :ns "clojure.core"}, :_id "5a2074f3e4b0a08026c48cc9"}], :line 142, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [], :body "user> (clojure.set/subset? #{2 3} #{1 2 3 4})\ntrue\n\nuser> (clojure.set/subset? #{2 4} #{1 2 3 4})\ntrue\n\nuser> (clojure.set/subset? #{2 5} #{1 2 3 4})\nfalse", :created-at 1293674661000, :updated-at 1293674661000, :_id "542692d0c026201cdc326ee6"} {:editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}], :body ";; Advice: Do not call subset? with non-set arguments. If you are\n;; concerned that you may be unintentionally doing so, and want an\n;; exception to be thrown if you do, consider using the library\n;; funjible (https://github.com/jafingerhut/funjible) which provides\n;; its own definition of subset? that is identical to Clojure's,\n;; except it checks the types of its arguments.\n\n;; subset? might or might not return what you expect if you give it\n;; values that are not sets. The implementation of subset? _does not\n;; check_ whether you are actually giving it values that are sets. It\n;; _assumes_ so.\n\n;; If the second argument were a set with the same elements, you would\n;; expect the return value false here.\nuser=> (subset? #{1 3} [2 4 6 8])\ntrue\n\n;; Here, if the second argument were a set with the same elements as\n;; the vector, you would expect the return value true.\nuser=> (subset? #{1 3 5} [1 3 5])\nfalse\n\n;; And similarly here:\nuser=> (subset? #{\"1\" \"3\"} [\"1\" \"3\" \"5\"])\nfalse\n\n;; Switching to considering cases where the first argument is not a set, this\n;; appears to do what one would hope:\nuser=> (subset? [1 2 3 4] #{1 2 3 4 5})\ntrue\n\n;; ... but this does not (at least up until Clojure 1.10 this behavior is\n;; because of how subset? is implemented, first comparing the count of the\n;; two collections to make it possible to quickly return false when the first\n;; collection is larger):\nuser=> (subset? [1 2 3 4 1 2 3 4] #{1 2 3 4 5})\nfalse\n\n;; Why not change the definition of subset? so it always throws\n;; an exception if you give it a non-set argument? I would guess that\n;; the primary reason is that the extra run-time type checks would\n;; slow subset? down by an amount that the Clojure core team does\n;; not want everyone to have to pay on every such call.\n\n;; Related Clojure tickets: \n;; https://dev.clojure.org/jira/browse/CLJ-1953\n;; https://dev.clojure.org/jira/browse/CLJ-2287\n", :author {:avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4", :account-source "github", :login "jafingerhut"}, :created-at 1532677195231, :updated-at 1543865004707, :_id "5b5acc4be4b00ac801ed9e37"}], :notes [{:body "Do note that this will only work as expected for sets. subset? uses contains? in it's implementation. The functionality in contains? for vectors can be slightly unintuitive at first, and causes functions like this to perform in completely unexpected ways when using vectors instead of sets. For example,\n\n```\nuser> (clojure.set/subset? [0 1] [2 3])\ntrue\nuser> (clojure.set/subset? [2 3] [2 3])\nfalse\n```\n\nIt is slightly more intuitive with maps, as it checks whether every item in the first collection is a key in the map passed in as the 2nd parameter, but still is probably a bit confusing to someone reading your code.\n\n```\nuser> (clojure.set/subset? '(7 8) {8 1 7 3})\ntrue\nuser> (clojure.set/subset? '(9 10) {8 1 7 3})\nfalse\n```\n\nLong story short, if you're using functions from the clojure.set namespace, make sure you're passing in sets. ", :created-at 1422419407728, :updated-at 1422422014024, :author {:login "arkdrag", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1578334?v=3"}, :_id "54c865cfe4b0e2ac61831ce5"}], :tag "java.lang.Boolean", :arglists ["set1 set2"], :doc "Is set1 a subset of set2?", :library-url "https://github.com/clojure/clojure", :href "/clojure.set/subset_q"} {:added "1.0", :ns "clojure.set", :name "rename", :file "clojure/set.clj", :type "function", :column 1, :see-alsos [{:created-at 1313707898000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "rename-keys", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e1a"}], :line 89, :examples [{:author {:login "Brian Marick", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Here's a relation with two keys (think \"column names\" in SQL), :a and :b\n\nuser=> (def relation #{ {:a 1, :b 1} {:a 2, :b 2} })\n\n\n;; I decide that :a is a stupid name and that :new-a would be better. \n;; Here's how I make a new relation with the renamed key:\n\nuser=> (rename relation {:a :new-a})\n#{{:new-a 1, :b 1} {:new-a 2, :b 2}}\n\n", :created-at 1278824834000, :updated-at 1285503801000, :_id "542692d0c026201cdc326eef"}], :notes nil, :arglists ["xrel kmap"], :doc "Returns a rel of the maps in xrel with the keys in kmap renamed to the vals in kmap", :library-url "https://github.com/clojure/clojure", :href "/clojure.set/rename"} {:added "1.0", :ns "clojure.set", :name "rename-keys", :file "clojure/set.clj", :type "function", :column 1, :see-alsos [{:created-at 1313707906000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "rename", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d90"}], :line 78, :examples [{:author {:login "Brian Marick", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "Stathis Sideris", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/299a3fab7a1a2d6644455dedae9fce0a?r=PG&default=identicon"}], :body "user=> (rename-keys {:a 1, :b 2} {:a :new-a, :b :new-b})\n{:new-a 1, :new-b 2}\n\n\n;; The behavior when the second map contains a key not in the first is interesting.\n;; I suspect you shouldn't depend on it. (Clojure 1.1 - no longer happens in 1.2.1)\n\nuser=> (rename-keys {:a 1} {:b :new-b})\n{ :a 1, :new-b nil}\n", :created-at 1278824415000, :updated-at 1350332324000, :_id "542692d0c026201cdc326ed2"} {:author {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"}, :editors [{:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"} {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"} {:login "steveminer", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d28543d134185d12d4006a74738d233e?r=PG&default=identicon"} {:avatar-url "https://avatars1.githubusercontent.com/u/28267638?v=4", :account-source "github", :login "mrkam2"} {:login "dijonkitchen", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/11434205?v=4"}], :body ";; You need to be careful about key collisions. You probably shouldn't \n;; depend on the exact behavior.\nuser=> (rename-keys {:a 1 :b 2} {:a :b})\n{:b 1}\n", :created-at 1305262334000, :updated-at 1576884199874, :_id "542692d0c026201cdc326ed5"} {:updated-at 1548872180983, :created-at 1548872180983, :author {:login "mrkam2", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/28267638?v=4"}, :body ";; Key collisions no longer reproducible in Clojure 1.10.0\nuser=> (rename-keys {:a 1 :b 2} {:a :b :b :a})\n{:b 1, :a 2}", :_id "5c51e9f4e4b0ca44402ef65d"} {:editors [{:login "Jeel-Shah", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/4922694?v=4"}], :body ";; Note that rename-keys in the clojure.set namespace. In order to use it, you\n;; must require the namespace\n\nuser=> (require '[clojure.set :as set])\nuser=> (set/rename-keys {:a 1 :b 2} {:a :new-a})\n=> {:new-a 1 :b 2}\n\n;; Alternatively, you can use rename-keys by simply doing clojure.set/rename-keys", :author {:avatar-url "https://avatars2.githubusercontent.com/u/4922694?v=4", :account-source "github", :login "Jeel-Shah"}, :created-at 1580344960284, :updated-at 1580589650671, :_id "5e322680e4b0ca44402ef828"} {:editors [{:login "shegeley", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8594472?v=4"}], :body "doesn't works on nested (as one might expect)\nuser=> \n(rename-keys\n {:user {:name \"john\"}}\n {:user {:name :nickname}}) => {{:name :nickname} {:name \"john\"}}", :author {:avatar-url "https://avatars.githubusercontent.com/u/8594472?v=4", :account-source "github", :login "shegeley"}, :created-at 1621365421644, :updated-at 1621365442781, :_id "60a412ade4b0b1e3652d7501"}], :notes nil, :arglists ["map kmap"], :doc "Returns the map with the keys in kmap renamed to the vals in kmap", :library-url "https://github.com/clojure/clojure", :href "/clojure.set/rename-keys"} {:added "1.0", :ns "clojure.set", :name "project", :file "clojure/set.clj", :type "function", :column 1, :see-alsos nil, :line 72, :examples [{:author {:login "Brian Marick", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; `project` strips out unwanted key/value pairs from a set of maps. \n;; Suppose you have these descriptions of cows:\n\nuser=> (def cows #{ {:name \"betsy\" :id 33} {:name \"panda\" :id 34} })\n#'user/cows\n\n;; You care only about the names. So you can get them like this:\n\nuser=> (project cows [:name])\n#{{:name \"panda\"} {:name \"betsy\"}}\n", :created-at 1278995532000, :updated-at 1285502725000, :_id "542692d0c026201cdc326edd"} {:updated-at 1476954849358, :created-at 1476954849358, :author {:login "dalzony", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/562341?v=3"}, :body ";; also worked from vector of maps.\n\nuser=> (def sample [{:name \"Minsun\" :device \"iphone6\"}\n {:name \"hogle\" :device \"iphone7 matte black\"}])\n;;=> #'user/sample\n\nuser=> (clojure.set/project sample [:name])\n;;=> #{{:name \"hogle\"} {:name \"Minsun\"}}\n", :_id "58088ae1e4b001179b66bdd5"}], :notes [{:updated-at 1320358713000, :body "is there a function that is like project, but returns a set of hash-maps with with all the keys but the ones project was given?", :created-at 1320358713000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fd1"} {:updated-at 1349530376000, :body "This doesn't exist in clojure.set, but I think it would be what you wanted.\r\n\r\n
    \r\n(defn project-not [xrel ks]\r\n  ;; convert the given key sequence into a hash-set\r\n  ;; This represents keys that you don't want included\r\n  (let [ks-set (into #{} ks)]\r\n    ;; Do a projection on the keys that are not in ks\r\n    (clojure.set/project xrel\r\n                         ;; Assumes xrel is a set of maps\r\n                         ;; Grab the first map and extract the keys\r\n                         ;; Then remove any keys that are in ks-set\r\n                         ;; This will leave the remaining keys for\r\n                         ;; projection\r\n                         (remove #(ks-set %) (keys (first xrel))))))\r\n\r\nuser> (project-not cows [:id])\r\n#{{:name \"panda\" {:name \"betsy\"}}\r\n
    ", :created-at 1349530376000, :author {:login "taylor.sando", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c127297f5548f7275ded1428aa5518bb?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fe9"} {:updated-at 1366672505000, :body "it strikes me as being very odd that the key set is a vector as opposed to vargs\r\n", :created-at 1366672505000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :_id "542692edf6e94c6970522001"} {:body "An alternate version of `project-not` that doesn't assume the first map in xrel has all the possible keys:\n\n
    \n(defn project-not\n  \"Returns a rel of the elements of xrel with keys in ks dissoced\"\n  [xrel ks]\n  (with-meta (set (map #(apply dissoc % ks) xrel)) (meta xrel)))\n
    ", :created-at 1444156923198, :updated-at 1444156940978, :author {:avatar-url "https://avatars.githubusercontent.com/u/938655?v=3", :account-source "github", :login "yanatan16"}, :_id "561415fbe4b084e61c76ecbc"}], :arglists ["xrel ks"], :doc "Returns a rel of the elements of xrel with only the keys in ks", :library-url "https://github.com/clojure/clojure", :href "/clojure.set/project"} {:added "1.0", :ns "clojure.set", :name "difference", :file "clojure/set.clj", :type "function", :column 1, :see-alsos [{:created-at 1318525779000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "union", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ce2"} {:created-at 1318525788000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "intersection", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ce3"} {:created-at 1318525910000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "superset?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ce4"} {:created-at 1366429247000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.set", :name "project", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ce5"} {:created-at 1533849200342, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "disj", :ns "clojure.core"}, :_id "5b6cae70e4b00ac801ed9e4c"}], :line 49, :examples [{:author {:login "Brian Marick", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a523012f661f603806ab1c22d855216f?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (difference #{1 2 3})\n#{1 2 3}\nuser=> (difference #{1 2} #{2 3})\n#{1}\nuser=> (difference #{1 2 3} #{1} #{1 4} #{3})\n#{2}", :created-at 1278822538000, :updated-at 1332952529000, :_id "542692d0c026201cdc326eeb"} {:author {:login "devijvers", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/81018e4231ac1ce8b7a9e6d377092656?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (difference (set (keys {:1 1 :2 2 :3 3})) (set (keys {:1 1 :2 2})))\n#{:3}\nuser=> (difference (set (keys {:1 1 :2 2})) (set (keys {:1 1 :2 2 :3 3})))\n#{}", :created-at 1279384603000, :updated-at 1332952542000, :_id "542692d0c026201cdc326eed"} {:updated-at 1457518056250, :created-at 1457518056250, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8271291?v=3"}, :body "user=> (difference #{:a :b :c :d} (difference #{:a :b :c :d} #{:c :e :a :f :d}))\n#{:a :c :d}", :_id "56dff5e8e4b0119038be0211"} {:editors [{:login "tdg5", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/2316989?v=4"} {:avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4", :account-source "github", :login "jafingerhut"}], :body ";; Advice: Do not call difference with non-set arguments. If you are\n;; concerned that you may be unintentionally doing so, and want an\n;; exception to be thrown if you do, consider using the library\n;; funjible (https://github.com/jafingerhut/funjible) which provides\n;; its own definition of difference that is identical to Clojure's,\n;; except it checks the types of its arguments.\n\n;; difference might or might not return what you expect if you give it\n;; values that are not sets. The implementation of difference _does not\n;; check_ whether you are actually giving it values that are sets. It\n;; _assumes_ so.\n\n;; This looks like what someone might expect. It _happens_ to give\n;; back the same answer as if you coerced the second argument to a\n;; set.\nuser=> (difference #{1 3 5} [1 2 3 4 5 6])\n#{}\n\n;; This is not the difference between the two collections (if they\n;; were both sets) at all!\nuser=> (difference #{1 3 5} [2 4 6 8 10 12])\n#{}\n\n;; Give it only sets, and it returns the correct answer.\nuser=> (set/difference #{1 3 5} #{2 4 6 8 10 12})\n#{1 3 5}\n\n;; Also not the correct set difference, because the second arg is a\n;; vector, not a set.\nuser=> (difference #{-1 10 20 30} [-1 10 20 30 40])\n#{20 -1 30 10}\n\n;; This is correct.\nuser=> (difference #{-1 10 20 30} #{-1 10 20 30 40})\n#{}\n\n;; Why not change the definition of difference so it throws an exception if\n;; you give it a non-set argument? I would guess that the primary\n;; reason is that the extra run-time type checks would slow difference down\n;; by an amount that the Clojure core team does not want everyone to\n;; have to pay on every such call.\n\n;; Related Clojure tickets: \n;; https://dev.clojure.org/jira/browse/CLJ-1953\n;; https://dev.clojure.org/jira/browse/CLJ-2287\n", :author {:avatar-url "https://avatars2.githubusercontent.com/u/2316989?v=4", :account-source "github", :login "tdg5"}, :created-at 1505239113099, :updated-at 1532995953611, :_id "59b82049e4b09f63b945ac71"} {:editors [{:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4"}], :body ";; difference subtracts the trailing sets\n(def s1 #{1 2})\n(def s2 #{2 3})\n(set/difference s1 s2)\n;;=> #{1}\n\n;; to get the exclusive union #{1 3} (or \"XOR\"):\n(set/difference\n (set/union s1 s2)\n (set/intersection s1 s2))\n;;=> #{1 3}\n\n;; You can extend this to maps:\n(defn- map-xor [m1 m2]\n (map (juxt (fn [[k1 _] _] k1)\n (fn [[_ v1] [_ v2]]\n (set/difference\n (set/union (set v1) (set v2))\n (set/intersection (set v1) (set v2)))))\n m1\n m2))\n(map-xor \n {:a [1 2] :b [2 3]}\n {:a [2 3] :b [3]})\n;;=> ([:a #{1 3}] \n [:b #{2}])", :author {:avatar-url "https://avatars.githubusercontent.com/u/24317401?v=4", :account-source "github", :login "loeschzwerg"}, :created-at 1655477240416, :updated-at 1655477266625, :_id "62ac93f8e4b0b1e3652d7606"}], :notes nil, :arglists ["s1" "s1 s2" "s1 s2 & sets"], :doc "Return a set that is the first set without elements of the remaining sets", :library-url "https://github.com/clojure/clojure", :href "/clojure.set/difference"} {:ns "clojure.spec.alpha", :name "form", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 173, :examples nil, :notes nil, :arglists ["spec"], :doc "returns the spec as data", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/form"} {:ns "clojure.spec.alpha", :name "&", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos nil, :line 653, :examples [{:editors [{:login "holyjak", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/624958?v=4"}], :body "(require '[clojure.spec.alpha :as s])\n\n(s/conform\n (s/cat :tag keyword? :children (s/& (s/+ integer?) #(-> % count (>= 2))))\n [:a 3])\n;=> :clojure.spec.alpha/invalid\n(s/conform\n (s/cat :tag keyword? :children (s/& (s/+ integer?) #(-> % count (>= 2))))\n [:a 3 4 5])\n;=> {:tag :a, :children [3 4 5]}\n", :author {:avatar-url "https://avatars1.githubusercontent.com/u/624958?v=4", :account-source "github", :login "holyjak"}, :created-at 1561635215512, :updated-at 1561635233952, :_id "5d14a98fe4b0ca44402ef771"}], :macro true, :notes nil, :arglists ["re & preds"], :doc "takes a regex op re, and predicates. Returns a regex-op that consumes\n input as per re but subjects the resulting value to the\n conjunction of the predicates, and any conforming they might perform.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/&"} {:ns "clojure.spec.alpha", :name "nilable-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1829, :examples nil, :notes nil, :arglists ["form pred gfn"], :doc "Do not call this directly, use 'nilable'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/nilable-impl"} {:ns "clojure.spec.alpha", :name "*recursion-limit*", :file "clojure/spec/alpha.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 19, :examples [{:editors [{:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}], :body ";; Limit the recursion to 1\n(binding [s/*recursion-limit* 1]\n (gen/generate (s/gen my-spec)))", :author {:avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4", :account-source "github", :login "bfontaine"}, :created-at 1542797640693, :updated-at 1542797667795, :_id "5bf53948e4b00ac801ed9f02"}], :notes nil, :arglists [], :doc "A soft limit on how many times a branching spec (or/alt/*/opt-keys/multi-spec)\n can be recursed through during generation. After this a\n non-recursive branch will be chosen.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/*recursion-limit*"} {:ns "clojure.spec.alpha", :name "*coll-error-limit*", :file "clojure/spec/alpha.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 33, :examples nil, :notes nil, :arglists [], :doc "The number of errors reported by explain in a collection spec'ed with 'every'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/*coll-error-limit*"} {:ns "clojure.spec.alpha", :name "fspec", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos nil, :line 669, :examples nil, :macro true, :notes nil, :arglists ["& {:keys [args ret fn gen], :or {ret (quote clojure.core/any?)}}"], :doc "takes :args :ret and (optional) :fn kwargs whose values are preds\n and returns a spec whose conform/explain take a fn and validates it\n using generative testing. The conformed value is always the fn itself.\n\n See 'fdef' for a single operation that creates an fspec and\n registers it, as well as a full description of :args, :ret and :fn\n\n fspecs can generate functions that validate the arguments and\n fabricate a return value compliant with the :ret spec, ignoring\n the :fn spec if present.\n\n Optionally takes :gen generator-fn, which must be a fn of no args\n that returns a test.check generator.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/fspec"} {:ns "clojure.spec.alpha", :name "explain-printer", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 227, :examples nil, :notes nil, :arglists ["ed"], :doc "Default printer for explain-data. nil indicates a successful validation.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/explain-printer"} {:ns "clojure.spec.alpha", :name "Specize", :file "clojure/spec/alpha.clj", :type "var", :column 1, :see-alsos nil, :line 121, :examples nil, :notes nil, :arglists [], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/Specize"} {:ns "clojure.spec.alpha", :name "every", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos nil, :line 515, :examples nil, :macro true, :notes nil, :arglists ["pred & {:keys [into kind count max-count min-count distinct gen-max gen], :as opts}"], :doc "takes a pred and validates collection elements against that pred.\n\n Note that 'every' does not do exhaustive checking, rather it samples\n *coll-check-limit* elements. Nor (as a result) does it do any\n conforming of elements. 'explain' will report at most *coll-error-limit*\n problems. Thus 'every' should be suitable for potentially large\n collections.\n\n Takes several kwargs options that further constrain the collection:\n\n :kind - a pred that the collection type must satisfy, e.g. vector?\n (default nil) Note that if :kind is specified and :into is\n not, this pred must generate in order for every to generate.\n :count - specifies coll has exactly this count (default nil)\n :min-count, :max-count - coll has count (<= min-count count max-count) (defaults nil)\n :distinct - all the elements are distinct (default nil)\n\n And additional args that control gen\n\n :gen-max - the maximum coll size to generate (default 20)\n :into - one of [], (), {}, #{} - the default collection to generate into\n (default: empty coll as generated by :kind pred if supplied, else [])\n \n Optionally takes :gen generator-fn, which must be a fn of no args that\n returns a test.check generator\n\n See also - coll-of, every-kv\n", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/every"} {:ns "clojure.spec.alpha", :name "keys*", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos [{:created-at 1549644522869, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "keys", :ns "clojure.spec.alpha"}, :_id "5c5db2eae4b0ca44402ef66a"}], :line 1789, :examples nil, :macro true, :notes nil, :arglists ["& kspecs"], :doc "takes the same arguments as spec/keys and returns a regex op that matches sequences of key/values,\n converts them into a map, and conforms that map with a corresponding\n spec/keys call:\n\n user=> (s/conform (s/keys :req-un [::a ::c]) {:a 1 :c 2})\n {:a 1, :c 2}\n user=> (s/conform (s/keys* :req-un [::a ::c]) [:a 1 :c 2])\n {:a 1, :c 2}\n\n the resulting regex op can be composed into a larger regex:\n\n user=> (s/conform (s/cat :i1 integer? :m (s/keys* :req-un [::a ::c]) :i2 integer?) [42 :a 1 :c 2 :d 4 99])\n {:i1 42, :m {:a 1, :c 2, :d 4}, :i2 99}", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/keys*"} {:ns "clojure.spec.alpha", :name "alt-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1442, :examples nil, :notes nil, :arglists ["ks ps forms"], :doc "Do not call this directly, use 'alt'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/alt-impl"} {:ns "clojure.spec.alpha", :name "def-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 322, :examples nil, :notes nil, :arglists ["k form spec"], :doc "Do not call this directly, use 'def'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/def-impl"} {:ns "clojure.spec.alpha", :name "*explain-out*", :file "clojure/spec/alpha.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 252, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/*explain-out*"} {:ns "clojure.spec.alpha", :name "regex-spec-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1692, :examples nil, :notes nil, :arglists ["re gfn"], :doc "Do not call this directly, use 'spec' with a regex op argument", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/regex-spec-impl"} {:ns "clojure.spec.alpha", :name "merge-spec-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1190, :examples nil, :notes nil, :arglists ["forms preds gfn"], :doc "Do not call this directly, use 'merge'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/merge-spec-impl"} {:ns "clojure.spec.alpha", :name "explain-data*", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 211, :examples nil, :notes nil, :arglists ["spec path via in x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/explain-data*"} {:ns "clojure.spec.alpha", :name "check-asserts", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1950, :examples nil, :notes [{:author {:login "allmonty", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4502764?v=4"}, :updated-at 1678998355863, :created-at 1678998355863, :body "You can also **enable check-asserts globally** using deps.edn you can add it to a profile. It is a jvm option. In your **deps.edn** you can add this:\n\n```\n:aliases {:dev {:jvm-opts [\"-Dclojure.spec.check-asserts=true\"]}}\n```", :_id "64137b53e4b08cf8563f4b7e"}], :arglists ["flag"], :doc "Enable or disable spec asserts that have been compiled\nwith '*compile-asserts*' true. See 'assert'.\n\nInitially set to boolean value of clojure.spec.check-asserts\nsystem property. Defaults to false.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/check-asserts"} {:ns "clojure.spec.alpha", :name "assert*", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1959, :examples nil, :notes nil, :arglists ["spec x"], :doc "Do not call this directly, use 'assert'.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/assert*"} {:ns "clojure.spec.alpha", :name "inst-in-range?", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1884, :examples nil, :notes nil, :arglists ["start end inst"], :doc "Return true if inst at or after start and before end", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/inst-in-range_q"} {:ns "clojure.spec.alpha", :name "nilable", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos nil, :line 1855, :examples [{:editors [{:login "escherize", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/343288?v=4"}], :body "(def ::my-spec (nilable int?))\n\n(valid? ::my-spec 2)\n;;=> true\n\n(valid ::my-spec 3.3)\n;;=> false\n\n(valid? ::my-spec nil)\n;;=> true", :author {:avatar-url "https://avatars2.githubusercontent.com/u/343288?v=4", :account-source "github", :login "escherize"}, :created-at 1521476741313, :updated-at 1521476829553, :_id "5aafe485e4b0316c0f44f92f"}], :macro true, :notes nil, :arglists ["pred"], :doc "returns a spec that accepts nil and values satisfying pred", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/nilable"} {:ns "clojure.spec.alpha", :name "and-spec-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1146, :examples nil, :notes nil, :arglists ["forms preds gfn"], :doc "Do not call this directly, use 'and'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/and-spec-impl"} {:ns "clojure.spec.alpha", :name "describe*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["spec"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/describe*"} {:ns "clojure.spec.alpha", :name "map-spec-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 817, :examples nil, :notes nil, :arglists ["{:keys [req-un opt-un keys-pred pred-exprs opt-keys req-specs req req-keys opt-specs pred-forms opt gfn], :as argm}"], :doc "Do not call this directly, use 'spec' with a map argument", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/map-spec-impl"} {:ns "clojure.spec.alpha", :name "coll-of", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos [{:created-at 1535112883796, :author {:login "maiwald", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/355026?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "map-of", :ns "clojure.spec.alpha"}, :_id "5b7ff6b3e4b00ac801ed9e71"} {:created-at 1535112895156, :author {:login "maiwald", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/355026?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "every", :ns "clojure.spec.alpha"}, :_id "5b7ff6bfe4b00ac801ed9e72"}], :line 574, :examples [{:updated-at 1535329349336, :created-at 1535329349336, :author {:login "veix", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/31626014?v=4"}, :body "(def suit? #{:heart :diamond :club :spade})\n(def rank?\n (into #{:ace :king :queen :jack} (range 2 11)))\n\n(def deck (for [s suit? r rank?] [s r])) \n\n(s/def ::card (s/tuple suit? rank?)) \n(s/def ::deck (s/coll-of ::card :distinct true :into [] :count 52)))\n", :_id "5b834445e4b00ac801ed9e7a"}], :macro true, :notes nil, :arglists ["pred & opts"], :doc "Returns a spec for a collection of items satisfying pred. Unlike\n 'every', coll-of will exhaustively conform every value.\n\n Same options as 'every'. conform will produce a collection\n corresponding to :into if supplied, else will match the input collection,\n avoiding rebuilding when possible.\n\n See also - every, map-of", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/coll-of"} {:ns "clojure.spec.alpha", :name "cat", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos nil, :line 637, :examples [{:updated-at 1553623784678, :created-at 1553623784678, :author {:login "yanisurbis", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/9294910?v=4"}, :body "(require '[clojure.spec.alpha :as s])\n\n(let [spec (s/cat :e even? :o odd?)]\n [(s/conform spec [22 11])\n (s/conform spec [22])\n (s/conform spec [22 11 22])\n (s/conform spec 22)\n (s/conform spec \"22\")])\n;; => [{:e 22, :o 11}\n;; :clojure.spec.alpha/invalid\n;; :clojure.spec.alpha/invalid\n;; :clojure.spec.alpha/invalid\n;; :clojure.spec.alpha/invalid]", :_id "5c9a6ae8e4b0ca44402ef6cc"}], :macro true, :notes nil, :arglists ["& key-pred-forms"], :doc "Takes key+pred pairs, e.g.\n\n (s/cat :e even? :o odd?)\n\n Returns a regex op that matches (all) values in sequence, returning a map\n containing the keys of each pred and the corresponding value.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/cat"} {:ns "clojure.spec.alpha", :name "*", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos [{:created-at 1549644413188, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "+", :ns "clojure.spec.alpha"}, :_id "5c5db27de4b0ca44402ef667"} {:created-at 1549644433319, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "?", :ns "clojure.spec.alpha"}, :_id "5c5db291e4b0ca44402ef668"}], :line 602, :examples nil, :macro true, :notes nil, :arglists ["pred-form"], :doc "Returns a regex op that matches zero or more values matching\n pred. Produces a vector of matches iff there is at least one match", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/*"} {:ns "clojure.spec.alpha", :name "explain", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos [{:created-at 1628867588311, :author {:login "ferdinand-beyer", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/23474334?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "explain-data", :ns "clojure.spec.alpha"}, :_id "61168c04e4b0b1e3652d752f"}], :line 260, :examples [{:editors [{:login "yanisurbis", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/9294910?v=4"}], :body "(require '[clojure.spec.alpha :as s])\n\n(s/def ::oop-languages #{\"java\" \"python\" \"ruby\" \"c++\" \"smalltalk\" \"simula\"})\n\n(s/explain ::oop-languages \"clojure\")\n;; val: \"clojure\" fails spec: :user/oop-languages predicate:\n;; #{\"simula\" \"java\" \"c++\" \"smalltalk\" \"ruby\" \"python\"}\n;; => nil\n\n(s/explain ::oop-languages \"python\")]\n;; Success!\n;; => nil\n\n;; read more at https://clojure.org/guides/spec#_explain", :author {:avatar-url "https://avatars0.githubusercontent.com/u/9294910?v=4", :account-source "github", :login "yanisurbis"}, :created-at 1553627032812, :updated-at 1553627141914, :_id "5c9a7798e4b0ca44402ef6cd"}], :notes nil, :arglists ["spec x"], :doc "Given a spec and a value that fails to conform, prints an explanation to *out*.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/explain"} {:ns "clojure.spec.alpha", :name "with-gen*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["spec gfn"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/with-gen*"} {:ns "clojure.spec.alpha", :name "or-spec-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos [{:created-at 1549644601886, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "or", :ns "clojure.spec.alpha"}, :_id "5c5db339e4b0ca44402ef66b"}], :line 1056, :examples nil, :notes nil, :arglists ["keys forms preds gfn"], :doc "Do not call this directly, use 'or'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/or-spec-impl"} {:ns "clojure.spec.alpha", :name "*fspec-iterations*", :file "clojure/spec/alpha.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 25, :examples nil, :notes nil, :arglists [], :doc "The number of times an anonymous fn specified by fspec will be (generatively) tested during conform", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/*fspec-iterations*"} {:ns "clojure.spec.alpha", :name "Spec", :file "clojure/spec/alpha.clj", :type "var", :column 1, :see-alsos nil, :line 37, :examples nil, :notes nil, :arglists [], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/Spec"} {:ns "clojure.spec.alpha", :name "unform", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos [{:created-at 1524219315965, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "conform", :ns "clojure.spec.alpha"}, :_id "5ad9bdb3e4b045c27b7fac47"} {:created-at 1588732338488, :author {:login "jdf-id-au", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/9016301?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "conformer", :ns "clojure.spec.alpha"}, :_id "5eb221b2e4b087629b5a1902"}], :line 166, :examples [{:updated-at 1560617844690, :created-at 1560617844690, :author {:login "enocom", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1175430?v=4"}, :body "(require '[clojure.spec.alpha :as s])\n\n;; define spec as a sequential concatenation of two more specs:\n;; pos? and one of possible units (:meters :miles)\n;; :amount and :unit are the names we are giving to each position\n(s/def ::distance (s/cat :amount (s/and number? pos?)\n :unit #{:meters :miles}))\n\n(s/conform ::distance [3 :meters])\n;; => {:amount 3, :unit :meters}\n\n(s/unform ::distance {:amount 3, :unit :meters})\n;; => (3 :meters)\n\n(s/unform ::distance {:amount 3, :unit :foo})\n;; => (3 :foo)\n\n(s/unform ::distance {:amount 3, :foo :miles})\n;; => (3)\n\n(s/unform ::distance {:bar 3, :foo :miles})\n;; => ()\n", :_id "5d052374e4b0ca44402ef759"}], :notes nil, :arglists ["spec x"], :doc "Given a spec and a value created by or compliant with a call to\n 'conform' with the same spec, returns a value with all conform\n destructuring undone.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/unform"} {:ns "clojure.spec.alpha", :name "valid?", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 765, :examples [{:updated-at 1549644718642, :created-at 1549644718642, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :body "(s/def ::ok boolean?)\n\n(s/valid? ::ok true) ; true\n(s/valid? ::ok false) ; true\n(s/valid? ::ok 42) ; false\n(s/valid? ::ok \"true\") ; false", :_id "5c5db3aee4b0ca44402ef66f"}], :notes nil, :arglists ["spec x" "spec x form"], :doc "Helper function that returns true when x is valid for spec.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/valid_q"} {:ns "clojure.spec.alpha", :name "gen", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos [{:created-at 1579285770113, :author {:login "yuhan0", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/22216124?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "with-gen", :ns "clojure.spec.alpha"}, :_id "5e21fd0ae4b0ca44402ef81a"}], :line 285, :examples [{:updated-at 1593619687739, :created-at 1593619687739, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :body ";; get a generator for the spec 'int?' and generate a sample from it\n(gen/sample (s/gen int?))\n; => (-1 0 0 -1 7 2 1 0 59 -6)", :_id "5efcb4e7e4b0b1e3652d731d"} {:updated-at 1602570052630, :created-at 1602570052630, :author {:login "deadghost", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1156996?v=4"}, :body ";; Generator override example\n(s/def :foo/bar\n (s/keys :req [:biz/baz]))\n\n(s/def :biz/baz int?)\n\n(comment\n (gen/sample\n (s/gen :foo/bar {:biz/baz #(s/gen #{1 10 100})}) 5)\n ;; Example Result\n (#:biz{:baz 100}\n #:biz{:baz 100}\n #:biz{:baz 1}\n #:biz{:baz 10}\n #:biz{:baz 10}))\n\n;; Note that \"Spec does not trust custom generators and any values they produce\n;; will also be checked by their associated spec to guarantee they pass\n;; conformance.\"\n;; See: https://clojure.org/guides/spec#_custom_generators\n", :_id "5f854744e4b0b1e3652d73d8"}], :notes nil, :arglists ["spec" "spec overrides"], :doc "Given a spec, returns the generator for it, or throws if none can\n be constructed. Optionally an overrides map can be provided which\n should map spec names or paths (vectors of keywords) to no-arg\n generator-creating fns. These will be used instead of the generators at those\n names/paths. Note that parent generator (in the spec or overrides\n map) will supersede those of any subtrees. A generator for a regex\n op must always return a sequential collection (i.e. a generator for\n s/? should return either an empty sequence/vector or a\n sequence/vector with one item in it)", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/gen"} {:ns "clojure.spec.alpha", :name "every-kv", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos [{:created-at 1549873931835, :author {:login "pieterbreed", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/448604?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "map-of", :ns "clojure.spec.alpha"}, :_id "5c61330be4b0ca44402ef676"} {:created-at 1549873947107, :author {:login "pieterbreed", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/448604?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "every", :ns "clojure.spec.alpha"}, :_id "5c61331be4b0ca44402ef677"}], :line 563, :examples nil, :macro true, :notes nil, :arglists ["kpred vpred & opts"], :doc "like 'every' but takes separate key and val preds and works on associative collections.\n\n Same options as 'every', :into defaults to {}\n\n See also - map-of", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/every-kv"} {:ns "clojure.spec.alpha", :name "int-in", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos [{:created-at 1549644745851, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "int-in-range?", :ns "clojure.spec.alpha"}, :_id "5c5db3c9e4b0ca44402ef671"} {:created-at 1549644762559, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "double-in", :ns "clojure.spec.alpha"}, :_id "5c5db3dae4b0ca44402ef672"}], :line 1909, :examples nil, :macro true, :notes nil, :arglists ["start end"], :doc "Returns a spec that validates fixed precision integers in the\n range from start (inclusive) to end (exclusive).", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/int-in"} {:ns "clojure.spec.alpha", :name "alt", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos [{:created-at 1534374735387, :author {:login "ryoakg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/23413?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "or", :ns "clojure.spec.alpha"}, :_id "5b74b34fe4b00ac801ed9e5d"}], :line 620, :examples [{:updated-at 1534374875088, :created-at 1534374875088, :author {:login "ryoakg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/23413?v=4"}, :body "(require '[clojure.spec.alpha :as s])\n\n(let [spec (s/alt :n number? :b boolean?)]\n [(s/conform spec [1])\n (s/conform spec [true])\n (s/conform spec [\"str\"])])\n;; => [[:n 1] [:b true] :clojure.spec.alpha/invalid]", :_id "5b74b3dbe4b00ac801ed9e5f"} {:editors [{:login "rgkirch", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6143833?v=4"}], :body "(require '[clojure.spec.alpha :as s])\n\n(s/def ::type-hinted-destructure\n (s/* (s/alt :hinted (s/cat :symbol symbol?\n :separator #(= :- %)\n :schema any?)\n :not-hinted (s/cat :symbol symbol?))))\n\n(s/conform ::type-hinted-destructure\n '[first :- string? ; `first :- string?` not `[first :- string?]`\n last])\n;; [[:hinted {:symbol first, :separator :-, :schema string?}] [:not-hinted {:symbol last}]]\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/6143833?v=4", :account-source "github", :login "rgkirch"}, :created-at 1651545031079, :updated-at 1651545677032, :_id "627093c7e4b0b1e3652d75e0"}], :macro true, :notes nil, :arglists ["& key-pred-forms"], :doc "Takes key+pred pairs, e.g.\n\n (s/alt :even even? :small #(< % 42))\n\n Returns a regex op that returns a map entry containing the key of the\n first matching pred and the corresponding value. Thus the\n 'key' and 'val' functions can be used to refer generically to the\n components of the tagged return", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/alt"} {:ns "clojure.spec.alpha", :name "nonconforming", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1808, :examples nil, :notes nil, :arglists ["spec"], :doc "takes a spec and returns a spec that has the same properties except\n 'conform' returns the original (not the conformed) value. Note, will specize regex ops.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/nonconforming"} {:ns "clojure.spec.alpha", :name "unform*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["spec y"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/unform*"} {:ns "clojure.spec.alpha", :name "abbrev", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 179, :examples nil, :notes nil, :arglists ["form"], :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/abbrev"} {:ns "clojure.spec.alpha", :name "regex?", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 78, :examples nil, :notes nil, :arglists ["x"], :doc "returns x if x is a (clojure.spec) regex op, else logical false", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/regex_q"} {:ns "clojure.spec.alpha", :name "int-in-range?", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos [{:created-at 1549644736832, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "int-in", :ns "clojure.spec.alpha"}, :_id "5c5db3c0e4b0ca44402ef670"}], :line 1903, :examples nil, :notes nil, :arglists ["start end val"], :doc "Return true if start <= val, val < end and val is a fixed\n precision integer.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/int-in-range_q"} {:ns "clojure.spec.alpha", :name "or", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos [{:created-at 1534374718106, :author {:login "ryoakg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/23413?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "alt", :ns "clojure.spec.alpha"}, :_id "5b74b33ee4b00ac801ed9e5c"} {:created-at 1542797828176, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "*recursion-limit*", :ns "clojure.spec.alpha"}, :_id "5bf53a04e4b00ac801ed9f04"} {:created-at 1549644313245, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "and", :ns "clojure.spec.alpha"}, :_id "5c5db219e4b0ca44402ef666"}], :line 471, :examples [{:updated-at 1534374833278, :created-at 1534374833278, :author {:login "ryoakg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/23413?v=4"}, :body "(require '[clojure.spec.alpha :as s])\n\n(let [spec (s/or :n number? :b boolean?)]\n [(s/conform spec 1)\n (s/conform spec true)\n (s/conform spec \"str\")])\n;; => [[:n 1] [:b true] :clojure.spec.alpha/invalid]", :_id "5b74b3b1e4b00ac801ed9e5e"} {:editors [{:login "rgkirch", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6143833?v=4"}], :body "(require '[clojure.spec.alpha :as s])\n\n(s/def ::type-hinted-destructure\n (s/coll-of (s/or :hinted (s/cat :symbol symbol?\n :separator #(= :- %)\n :schema any?)\n :not-hinted (s/cat :symbol symbol?))\n :kind vector?))\n\n(s/conform ::type-hinted-destructure\n '[[first :- string?] ; `[first :- string?]` not `first :- string?`\n [last]])\n;; [[:hinted {:symbol first, :separator :-, :schema string?}] [:not-hinted {:symbol last}]]", :author {:avatar-url "https://avatars.githubusercontent.com/u/6143833?v=4", :account-source "github", :login "rgkirch"}, :created-at 1651545098589, :updated-at 1651963713471, :_id "6270940ae4b0b1e3652d75e1"}], :macro true, :notes nil, :arglists ["& key-pred-forms"], :doc "Takes key+pred pairs, e.g.\n\n (s/or :even even? :small #(< % 42))\n\n Returns a destructuring spec that returns a map entry containing the\n key of the first matching pred and the corresponding value. Thus the\n 'key' and 'val' functions can be used to refer generically to the\n components of the tagged return.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/or"} {:ns "clojure.spec.alpha", :name "spec?", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 72, :examples nil, :notes nil, :arglists ["x"], :doc "returns x if x is a spec object, else logical false", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/spec_q"} {:ns "clojure.spec.alpha", :name "registry", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 351, :examples nil, :notes nil, :arglists [""], :doc "returns the registry map, prefer 'get-spec' to lookup a spec by name", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/registry"} {:ns "clojure.spec.alpha", :name "rep+impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos [{:created-at 1549644629139, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "+", :ns "clojure.spec.alpha"}, :_id "5c5db355e4b0ca44402ef66d"}], :line 1408, :examples nil, :notes nil, :arglists ["form p"], :doc "Do not call this directly, use '+'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/rep+impl"} {:ns "clojure.spec.alpha", :name "exercise-fn", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1870, :examples nil, :notes nil, :arglists ["sym" "sym n" "sym-or-f n fspec"], :doc "exercises the fn named by sym (a symbol) by applying it to\n n (default 10) generated samples of its args spec. When fspec is\n supplied its arg spec is used, and sym-or-f can be a fn. Returns a\n sequence of tuples of [args ret]. ", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/exercise-fn"} {:ns "clojure.spec.alpha", :name "exercise", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1861, :examples [{:updated-at 1548441490507, :created-at 1548441490507, :author {:login "Activeghost", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10783037?v=4"}, :body "(...ns declaration...\n(:require [clojure.spec.alpha :as s]\n [clojure.spec.gen.alpha :as gen]))\n\n;; function spec\n;;\n(s/fdef map-to-tags\n :args (s/cat :record ::tag-record)\n :ret ::tag-model\n :fn (fn [{:keys [args ret]}]\n (s/valid? ::tag-model ret)))\n\n\n;; the actual fn\n;; extract a tag model from RDF query results\n;;\n(defn map-to-tags\n [record]\n {:pre [(s/valid? ::tag-record record)]\n :post [(s/valid? ::tag-model %)]}\n (log/infof \"[map-to-tags] mapping record: %s\" (pr-str record))\n (let [{:keys [type class name relevance]} record]\n (let [new-record {:tag-type (type :value)\n :tag-class (class :value)\n :tag-name (name :value)\n :tag-relevance (relevance :value)}]\n (log/debugf \"[map-to-tags] extracted record: %s\" new-record)\n new-record)))\n\nIn REPL:\n\n=> (s/exercise 'calais-response-processor.rdf-core/map-to-tags)\n([#object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"] #object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"]] [#object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"] #object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"]] [#object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"] #object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"]] [#object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"] #object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"]] [#object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"] #object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"]] [#object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"] #object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"]] [#object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"] #object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"]] [#object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"] #object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454\n0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"]] [#object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"] #object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"]] [#object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"] #object[clojure.spec.alpha$fspec_impl$reify__2451$fn__2454 0x22251fa \"clojure.spec.alpha$fspec_impl$reify__2451$fn__2454@22251fa\"]])", :_id "5c4b5792e4b0ca44402ef62a"}], :notes nil, :arglists ["spec" "spec n" "spec n overrides"], :doc "generates a number (default 10) of values compatible with spec and maps conform over them,\n returning a sequence of [val conformed-val] tuples. Optionally takes\n a generator overrides map as per gen", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/exercise"} {:ns "clojure.spec.alpha", :name "multi-spec", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos nil, :line 380, :examples [{:updated-at 1534398043992, :created-at 1534398043992, :author {:login "jdf-id-au", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/9016301?v=4"}, :body "Use retag function to allow generative testing of multi-spec whose\nmultimethod has a :default dispatch method.\n\n(require '[clojure.spec.alpha :as s]\n '[clojure.spec.gen.alpha :as gen])\n\n(s/def ::tag #{:a :b :c :d})\n(s/def ::example-key keyword?)\n(s/def ::different-key keyword?)\n\n(defmulti tagmm :tag)\n(defmethod tagmm :a [_] (s/keys :req-un [::tag ::example-key]))\n(defmethod tagmm :default [_] (s/keys :req-un [::tag ::different-key]))\n\n(s/def ::example (s/multi-spec tagmm :tag))\n(gen/sample (s/gen ::example))\n;=> only get examples with :tag :a\n\n(s/def ::example (s/multi-spec tagmm (fn retag [gen-v dispatch-tag] gen-v)))\n(gen/sample (s/gen ::example))\n;=> get examples with all :tag options", :_id "5b750e5be4b00ac801ed9e60"} {:updated-at 1584169164619, :created-at 1584169164619, :author {:login "Activeghost", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10783037?v=4"}, :body "(def create-playlist (s/cat :command ::commands :type ::types :data (s/coll-of ::playlist)))\n(def create-song (s/cat :command ::commands :type ::types :data (s/coll-of ::song)))\n(def create-user (s/cat :command ::commands :type ::types :data (s/coll-of ::user)))\n\n(defmulti create-spec? second)\n(defmethod create-spec? :playlist [_] create-playlist)\n(defmethod create-spec? :song [_] create-song)\n(defmethod create-spec? :user [_] create-user)\n\n(def update-playlist (s/cat :command ::commands :type ::types :data (s/coll-of ::playlist-update)))\n(def update-song (s/cat :command ::commands :type ::types :data (s/coll-of ::song-update)))\n(def update-user (s/cat :command ::commands :type ::types :data (s/coll-of ::user-update)))\n\n(defmulti update-spec? second)\n(defmethod update-spec? :playlist [_] update-playlist)\n(defmethod update-spec? :song [_] update-song)\n(defmethod update-spec? :user [_] update-user)\n\n;; [:create :user [{:name \"bobby\"} {:name \"sally\"}{:name \"fred\"}]]\n(s/def ::create-action\n (s/with-gen #(s/multi-spec create-spec? %)\n #(gen/fmap vec (s/gen create-action-pattern))))\n\n;; [:update :user [\"1\"] [{:name \"bobby minerva\"}]]\n(s/def ::update-action\n (s/with-gen #(s/multi-spec update-spec? %)\n #(gen/fmap vec (s/gen update-action-pattern))))\n\n;; examples\n=> (s/explain ::create-action [:create :user [{:name \"bobby\"} {:name \"sally\"}{:name \"fred\"}]])\nSuccess!\nnil\n\n=> (s/explain ::update-action [:update :user [\"1\"] [{:name \"bobby minerva\"}]])\nSuccess!\nnil", :_id "5e6c80cce4b087629b5a18bb"}], :macro true, :notes nil, :arglists ["mm retag"], :doc "Takes the name of a spec/predicate-returning multimethod and a\n tag-restoring keyword or fn (retag). Returns a spec that when\n conforming or explaining data will pass it to the multimethod to get\n an appropriate spec. You can e.g. use multi-spec to dynamically and\n extensibly associate specs with 'tagged' data (i.e. data where one\n of the fields indicates the shape of the rest of the structure).\n\n (defmulti mspec :tag)\n\n The methods should ignore their argument and return a predicate/spec:\n (defmethod mspec :int [_] (s/keys :req-un [::tag ::i]))\n\n retag is used during generation to retag generated values with\n matching tags. retag can either be a keyword, at which key the\n dispatch-tag will be assoc'ed, or a fn of generated value and\n dispatch-tag that should return an appropriately retagged value.\n\n Note that because the tags themselves comprise an open set,\n the tag key spec cannot enumerate the values, but can e.g.\n test for keyword?.\n\n Note also that the dispatch values of the multimethod will be\n included in the path, i.e. in reporting and gen overrides, even\n though those values are not evident in the spec.\n", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/multi-spec"} {:ns "clojure.spec.alpha", :name "explain-data", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos [{:created-at 1591253326213, :author {:login "fredsh2k", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/38362977?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "explain", :ns "clojure.spec.alpha"}, :_id "5ed8994ee4b087629b5a1924"} {:created-at 1591253335898, :author {:login "fredsh2k", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/38362977?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "explain-str", :ns "clojure.spec.alpha"}, :_id "5ed89957e4b087629b5a1925"}], :line 218, :examples [{:editors [{:login "fredsh2k", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/38362977?v=4"} {:avatar-url "https://avatars.githubusercontent.com/u/4986865?v=4", :account-source "github", :login "nvseenu"}], :body "(require '[clojure.spec.alpha :as spec])\n\n(spec/def ::name string?)\n;;=> :ns/name\n\n(spec/explain-data ::name \"n0\")\n;;=> nil\n\n(spec/explain-data ::name 0)\n;;=>\n;;#:clojure.spec.alpha{:problems [{:path [],\n;; :pred clojure.core/string?,\n;; :val 0,\n;; :via [:ns/name],\n;; :in []}],\n;; :spec :ns.ns/name,\n;; :value 0\n\n\n;; To extract :problems alone \n(:clojure.spec.alpha/problems (spec/explain-data ::name 0)) \n;; => [{:path [],:pred clojure.core/string?,:val 0,:via [:ns/name],:in []}]", :author {:avatar-url "https://avatars2.githubusercontent.com/u/38362977?v=4", :account-source "github", :login "fredsh2k"}, :created-at 1591253258331, :updated-at 1665035425045, :_id "5ed8990ae4b087629b5a1923"}], :notes nil, :arglists ["spec x"], :doc "Given a spec and a value x which ought to conform, returns nil if x\n conforms, else a map with at least the key ::problems whose value is\n a collection of problem-maps, where problem-map has at least :path :pred and :val\n keys describing the predicate and the value that failed at that\n path.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/explain-data"} {:ns "clojure.spec.alpha", :name "tuple-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 991, :examples nil, :notes nil, :arglists ["forms preds" "forms preds gfn"], :doc "Do not call this directly, use 'tuple'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/tuple-impl"} {:ns "clojure.spec.alpha", :name "multi-spec-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos [{:created-at 1549644612774, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "multi-spec", :ns "clojure.spec.alpha"}, :_id "5c5db344e4b0ca44402ef66c"}], :line 941, :examples nil, :notes nil, :arglists ["form mmvar retag" "form mmvar retag gfn"], :doc "Do not call this directly, use 'multi-spec'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/multi-spec-impl"} {:ns "clojure.spec.alpha", :name "tuple", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos nil, :line 689, :examples nil, :macro true, :notes nil, :arglists ["& preds"], :doc "takes one or more preds and returns a spec for a tuple, a vector\n where each element conforms to the corresponding pred. Each element\n will be referred to in paths using its ordinal.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/tuple"} {:ns "clojure.spec.alpha", :name "conform", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos [{:created-at 1524130477189, :author {:login "anler", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/83847?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unform", :ns "clojure.spec.alpha"}, :_id "5ad862ade4b045c27b7fac40"} {:created-at 1524130485944, :author {:login "anler", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/83847?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "explain", :ns "clojure.spec.alpha"}, :_id "5ad862b5e4b045c27b7fac41"} {:created-at 1524130495988, :author {:login "anler", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/83847?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "gen", :ns "clojure.spec.alpha"}, :_id "5ad862bfe4b045c27b7fac42"}], :line 160, :examples [{:updated-at 1560617617276, :created-at 1524130497300, :author {:login "anler", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/83847?v=4"}, :body "(require '[clojure.spec.alpha :as s])\n\n;; define spec as a sequential concatenation of two more specs:\n;; number? and pos? and one of possible units (:meters :miles)\n;; :amount and :unit are the names we are giving to each position\n(s/def ::distance (s/cat :amount (s/and number? pos?)\n :unit #{:meters :miles}))\n\n(s/conform ::distance [3 :meters])\n;; => {:amount 3, :unit :meters}\n\n(s/conform ::distance [3 :steps])\n;; => :clojure.spec.alpha/invalid", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/1175430?v=4", :account-source "github", :login "enocom"}], :_id "5ad862c1e4b045c27b7fac43"}], :notes nil, :arglists ["spec x"], :doc "Given a spec and a value, returns :clojure.spec.alpha/invalid \n\tif value does not match spec, else the (possibly destructured) value.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/conform"} {:ns "clojure.spec.alpha", :name "gen*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["spec overrides path rmap"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/gen*"} {:ns "clojure.spec.alpha", :name "fspec-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1740, :examples nil, :notes nil, :arglists ["argspec aform retspec rform fnspec fform gfn"], :doc "Do not call this directly, use 'fspec'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/fspec-impl"} {:ns "clojure.spec.alpha", :name "assert", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos [{:created-at 1538056781941, :author {:login "witek", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/209520?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "assert", :ns "clojure.core"}, :_id "5bace24de4b00ac801ed9eab"}], :line 1970, :examples [{:updated-at 1548971359388, :created-at 1548971359388, :author {:login "fhur", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/6452323?v=4"}, :body "; Notice that if you try to execute assert it will always return the given value:\n\n(require ['clojure.spec.alpha :as 's])\n\n(s/assert even? 1)\n=> 1\n\n; This is because asserts are turned off by default:\n(s/check-asserts?)\n=> false\n\n; To enable asserts, run this\n(s/check-asserts true)\n=> true\n\n; Now your asserts will properly fail\n(s/assert even? 3)\n; ExceptionInfo Spec assertion failed...\n\n```", :_id "5c536d5fe4b0ca44402ef661"}], :macro true, :notes nil, :arglists ["spec x"], :doc "spec-checking assert expression. Returns x if x is valid? according\nto spec, else throws an ex-info with explain-data plus ::failure of\n:assertion-failed.\n\nCan be disabled at either compile time or runtime:\n\nIf *compile-asserts* is false at compile time, compiles to x. Defaults\nto value of 'clojure.spec.compile-asserts' system property, or true if\nnot set.\n\nIf (check-asserts?) is false at runtime, always returns x. Defaults to\nvalue of 'clojure.spec.check-asserts' system property, or false if not\nset. You can toggle check-asserts? with (check-asserts bool).", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/assert"} {:ns "clojure.spec.alpha", :name "?", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos [{:created-at 1549644449353, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "+", :ns "clojure.spec.alpha"}, :_id "5c5db2a1e4b0ca44402ef669"}], :line 614, :examples [{:updated-at 1542798236106, :created-at 1542798236106, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :body ";; Think of this as a regex like \"ab?\"\n(s/def ::ab (s/cat :a #{:a}\n :b (s/? #{:b})))\n\n(s/valid? ::ab [:a :b])\n; => true\n\n(s/valid? ::ab [:a])\n; => true\n\n(s/valid? ::ab [:a :c])\n; => false", :_id "5bf53b9ce4b00ac801ed9f05"}], :macro true, :notes nil, :arglists ["pred-form"], :doc "Returns a regex op that matches zero or one value matching\n pred. Produces a single value (not a collection) if matched.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/_q"} {:ns "clojure.spec.alpha", :name "*coll-check-limit*", :file "clojure/spec/alpha.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 29, :examples nil, :notes nil, :arglists [], :doc "The number of elements validated in a collection spec'ed with 'every'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/*coll-check-limit*"} {:ns "clojure.spec.alpha", :name "merge", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos nil, :line 498, :examples [{:editors [{:login "manawardhana", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/1821789?v=4"}], :body "\n(s/def ::fname string?)\n(s/def ::lname string?)\n(s/def ::street string?)\n(s/def ::city string?)\n\n(s/def ::person (s/keys :req [::fname ::lname]))\n(s/def ::address (s/keys :req [::street ::city]))\n\n;; Merging...\n(s/def ::contact (s/merge ::person ::address))\n\n(s/valid? ::contact {::fname \"Rich\" ::lname \"Hickey\"\n ::street \"Some Street\" ::city \"New York\"})\n;;=> true", :author {:avatar-url "https://avatars1.githubusercontent.com/u/1821789?v=4", :account-source "github", :login "manawardhana"}, :created-at 1527764482905, :updated-at 1527765280946, :_id "5b0fd602e4b045c27b7fac87"}], :macro true, :notes nil, :arglists ["& pred-forms"], :doc "Takes map-validating specs (e.g. 'keys' specs) and\n returns a spec that returns a conformed map satisfying all of the\n specs. Unlike 'and', merge can generate maps satisfying the\n union of the predicates.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/merge"} {:ns "clojure.spec.alpha", :name "get-spec", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 356, :examples nil, :notes nil, :arglists ["k"], :doc "Returns spec registered for keyword/symbol/var k, or nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/get-spec"} {:ns "clojure.spec.alpha", :name "conformer", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos [{:created-at 1588732306293, :author {:login "jdf-id-au", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/9016301?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "unform", :ns "clojure.spec.alpha"}, :_id "5eb22192e4b087629b5a1901"}], :line 661, :examples [{:editors [{:login "glts", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4"}], :body ";; One use of clojure.spec.alpha/conformer is to convert inputs to a data\n;; structure more suitable for further conforming. In this sketch we use a regex\n;; spec to describe a string representing a binary number.\n\n(require '[clojure.spec.alpha :as s]\n '[clojure.spec.gen.alpha :as gen])\n\n(s/def ::str->chars (s/conformer seq #(apply str %)))\n\n(s/def ::binary-digits (s/cat :initial #{\\1}, :more (s/* #{\\0 \\1})))\n\n;; Look, no \"re-matches\"!\n(s/def ::binary-string\n (s/with-gen (s/and string? ::str->chars ::binary-digits)\n (fn []\n (gen/fmap #(s/unform ::str->chars %) (s/gen ::binary-digits)))))\n\n(s/conform ::binary-string \"1011\")\n;;=> {:initial \\1, :more [\\0 \\1 \\1]}\n\n(gen/sample (s/gen ::binary-string))\n;;=> (\"1\" \"1\" \"11\" \"1\" \"1001\" \"11\" \"1100\" \"110011\" \"111111\" \"10\")\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/1483271?v=4", :account-source "github", :login "glts"}, :created-at 1526667363901, :updated-at 1568125324402, :_id "5aff1863e4b045c27b7fac6f"} {:updated-at 1592829288019, :created-at 1592829288019, :author {:login "ertugrulcetin", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/8271291?v=4"}, :body "(s/conform map? {:a 1})\n;;=> {:a 1}\n\n(s/conform (s/conformer map?) {:a 1})\n;;=> true\n\n-------------------------------\n\n(s/conform second [:a :b :c])\n;;=> [:a :b :c]\n\n(s/conform (s/conformer second) [:a :b :c])\n;;=> :b", :_id "5ef0a568e4b0b1e3652d730b"}], :macro true, :notes nil, :arglists ["f" "f unf"], :doc "takes a predicate function with the semantics of conform i.e. it should return either a\n (possibly converted) value or :clojure.spec.alpha/invalid, and returns a\n spec that uses it as a predicate/conformer. Optionally takes a\n second fn that does unform of result of first", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/conformer"} {:ns "clojure.spec.alpha", :name "every-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1240, :examples nil, :notes nil, :arglists ["form pred opts" "form pred {conform-into :into, describe-form :clojure.spec.alpha/describe, :keys [kind :clojure.spec.alpha/kind-form count max-count min-count distinct gen-max :clojure.spec.alpha/kfn :clojure.spec.alpha/cpred conform-keys :clojure.spec.alpha/conform-all], :or {gen-max 20}, :as opts} gfn"], :doc "Do not call this directly, use 'every', 'every-kv', 'coll-of' or 'map-of'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/every-impl"} {:ns "clojure.spec.alpha", :name "spec", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos nil, :line 361, :examples [{:updated-at 1548443679521, :created-at 1548443679521, :author {:login "Activeghost", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10783037?v=4"}, :body "(ns ... some namespace declaration \n (:require [clojure.spec.alpha :as s]\n [clojure.spec.gen.alpha :as gen]))\n\n;; for more info see https://clojure.org/guides/spec#_getting_started\n\n;; different types of specs\n\n;; data spec defining a custom generator\n(s/def ::significant-string (s/with-gen \n (s/and string? #(not= % nil?) #(not= % \"\"))\n (fn [] (gen/such-that #(not= % \"\")\n (gen/string-alphanumeric)))))\n\n=> (gen/sample (s/gen '::significant-string))\n;(\"u\" \"p\" \"XG\" \"63\" \"3\" \"HI\" \"e0Ksv\" \"wr9sj3J\" \"600343\" \"D1n9Vz8v\")\n\n;; data spec referring to another spec as a definition\n(s/def ::value ::significant-string)\n\n;; a spec using (s/and ...) with another spec and regex matching\n(s/def ::file-location (s/and ::significant-string #(re-matches constants/filename-regex %)))\n\n;; a map spec asserting required keys (the keys are also specs you would have to define)\n(s/def ::tag-record (s/keys :req-un [::type ::class ::name ::relevance]))\n\n=> (gen/sample (s/gen '::tag-record))\n;({:type {:value \"g\"}, :class {:value \"7X\"}, :name {:value \"3\"}, :relevance {:value \"h\"}} ... many more})\n\n;; defining a spec that is a collection of tag models\n;; see https://clojure.org/guides/spec#_collections \n(s/def ::tag-models (s/coll-of ::tag-model))\n\n=> (gen/sample (s/gen '::tag-models))\n;({[{:tag-type \"G\", :tag-class \"FVrYDZcS\", :tag-name \"7t5u\", :tag-relevance \"1EZ7I32\"} {:tag-type \"Ax0\", :tag-class \"6hfP\", :tag-name \"9Z7v7\", :tag-relevance \"eG\"} {:tag-type \"Tb\", :tag-class \"9EVg46p\", :tag-name \"n1E5Nsl84\", :tag-relevance \"34Q4F\"}] [{:tag-type \"2\", :tag-class \"gy\", :tag-name \"xY9Pmhd43\", :tag-relevance \"QqA1k1G5\"} {:tag-type \"81j\", :tag-class \"52\", :tag-name \"3BrXji\", :tag-relevance \"o6A3t\"} {:tag-type \"Pm2t\", :tag-class \"sW9FH\", :tag-name \"wI2kt\", :tag-relevance \"B\"} {:tag-type \"6p17s\", :tag-class \"4\", :tag-name \"wuV63bjo4\", :tag-relevance \"l77Suzj\"}] ... removed ... })\n\n;; a function spec\n;; see https://clojure.org/guides/spec#_specing_functions \n(s/fdef string->stream\n :args (s/cat :s ::significant-string)\n :ret ::byte-stream\n :fn (fn [{:keys [args ret]}]\n (instance? java.io.ByteArrayInputStream ret)))\n\n;; for this function\n (defn string->stream\n \"Given a string, return a java.io.ByteArrayInputStream\"\n ([s] {:pre [(s/valid? ::significant-string s)]\n :post [(s/valid? ::byte-stream %)]}\n (string->stream s \"UTF-8\"))\n ([s encoding]\n (-> s\n (.getBytes encoding)\n (java.io.ByteArrayInputStream.))))\n", :_id "5c4b601fe4b0ca44402ef62b"}], :macro true, :notes nil, :arglists ["form & {:keys [gen]}"], :doc "Takes a single predicate form, e.g. can be the name of a predicate,\n like even?, or a fn literal like #(< % 42). Note that it is not\n generally necessary to wrap predicates in spec when using the rest\n of the spec macros, only to attach a unique generator\n\n Can also be passed the result of one of the regex ops -\n cat, alt, *, +, ?, in which case it will return a regex-conforming\n spec, useful when nesting an independent regex.\n ---\n\n Optionally takes :gen generator-fn, which must be a fn of no args that\n returns a test.check generator.\n\n Returns a spec.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/spec"} {:ns "clojure.spec.alpha", :name "keys", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos nil, :line 409, :examples [{:editors [{:login "penguin2774", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/22309?v=4"}], :body "(s/def ::id integer?)\n(s/def ::name string?)\n\n(s/def ::user (s/keys :req-un [::id ::name]))\n\n(s/valid? ::user {}) ; false\n(s/valid? ::user {:id 0}) ; false\n(s/valid? ::user {:name \"bob\"}) ; false\n(s/valid? ::user {:id 1 :name \"bob\"}) ; true", :author {:avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4", :account-source "github", :login "bfontaine"}, :created-at 1549644274548, :updated-at 1595098386693, :_id "5c5db1f2e4b0ca44402ef664"} {:updated-at 1582243144778, :created-at 1582243144778, :author {:login "robertfw", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/814818?v=4"}, :body ";; Demonstrating validation of *all* namespace-qualified keys\n\n(s/def ::id integer?)\n(s/def ::name string?)\n\n(s/def ::user (s/keys))\n\n(s/valid? ::user {}) ; true\n(s/valid? ::user {::id \"bob\"}) ; false\n(s/valid? ::user {::name 1}) ; false\n(s/valid? ::user {::id 1 ::name \"bob\"}) ; true", :_id "5e4f1d48e4b087629b5a189d"}], :macro true, :notes nil, :arglists ["& {:keys [req req-un opt opt-un gen]}"], :doc "Creates and returns a map validating spec. :req and :opt are both\n vectors of namespaced-qualified keywords. The validator will ensure\n the :req keys are present. The :opt keys serve as documentation and\n may be used by the generator.\n\n The :req key vector supports 'and' and 'or' for key groups:\n\n (s/keys :req [::x ::y (or ::secret (and ::user ::pwd))] :opt [::z])\n\n There are also -un versions of :req and :opt. These allow\n you to connect unqualified keys to specs. In each case, fully\n qualfied keywords are passed, which name the specs, but unqualified\n keys (with the same name component) are expected and checked at\n conform-time, and generated during gen:\n\n (s/keys :req-un [:my.ns/x :my.ns/y])\n\n The above says keys :x and :y are required, and will be validated\n and generated by specs (if they exist) named :my.ns/x :my.ns/y \n respectively.\n\n In addition, the values of *all* namespace-qualified keys will be validated\n (and possibly destructured) by any registered specs. Note: there is\n no support for inline value specification, by design.\n\n Optionally takes :gen generator-fn, which must be a fn of no args that\n returns a test.check generator.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/keys"} {:ns "clojure.spec.alpha", :name "spec-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 908, :examples nil, :notes nil, :arglists ["form pred gfn cpred?" "form pred gfn cpred? unc"], :doc "Do not call this directly, use 'spec'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/spec-impl"} {:ns "clojure.spec.alpha", :name "+", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos nil, :line 608, :examples nil, :macro true, :notes nil, :arglists ["pred-form"], :doc "Returns a regex op that matches one or more values matching\n pred. Produces a vector of matches", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/+"} {:ns "clojure.spec.alpha", :name "invalid?", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 155, :examples nil, :notes nil, :arglists ["ret"], :doc "tests the validity of a conform return value", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/invalid_q"} {:ns "clojure.spec.alpha", :name "amp-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1413, :examples nil, :notes nil, :arglists ["re re-form preds pred-forms"], :doc "Do not call this directly, use '&'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/amp-impl"} {:ns "clojure.spec.alpha", :name "map-of", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos [{:created-at 1549873907812, :author {:login "pieterbreed", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/448604?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "every-kv", :ns "clojure.spec.alpha"}, :_id "5c6132f3e4b0ca44402ef675"} {:created-at 1549874043452, :author {:login "pieterbreed", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/448604?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "every", :ns "clojure.spec.alpha"}, :_id "5c61337be4b0ca44402ef679"} {:created-at 1549874097531, :author {:login "pieterbreed", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/448604?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "coll-of", :ns "clojure.spec.alpha"}, :_id "5c6133b1e4b0ca44402ef67a"}], :line 587, :examples [{:updated-at 1555060942358, :created-at 1555060942358, :author {:login "codxse", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/5813694?v=4"}, :body "(require '[clojure.spec.alpha :as spec])\n\n(spec/def ::animals (spec/map-of #{:duck :cat :chicken} (spec/and int? #(> % 1))))\n\n(spec/valid? ::animals {:duck 2})\n\n;;=> true\n\n(spec/valid? ::animals {:duck 1})\n\n;;=> false", :_id "5cb058cee4b0ca44402ef707"} {:updated-at 1557337699513, :created-at 1557337699513, :author {:login "funkrider", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/12958644?v=4"}, :body ";; Validating that the value of a map is related to the key \n;; can not normally be done with map-of as the predicates \n;; are applied independently.\n\n(require '[clojure.spec.alpha :as s])\n(require '[clojure.spec.gen.alpha :as gen])\n\n(s/def ::id pos-int?)\n(s/def ::name string?)\n\n(s/def ::tag (s/keys :req-un [::id ::name]))\n(s/def ::tags (s/map-of ::id ::tag))\n\n(gen/sample (s/gen ::tags))\n;; => ({1 {:id 2, :name \"\"}, 2 {:id 3, :name \"\"}}...)\n\n;; The key has no relation to the value.\n\n;; Lets try again and add in another spec that validates the key and value\n(s/def ::tags (s/and \n (s/map-of ::id ::tag) \n (s/every (fn [[k v]] (= (:id v) k)))))\n\n(s/valid? ::tags {101 {:id 101 :name \"foo\"}})\n;; => true\n(s/valid? ::tags {33 {:id 101 :name \"foo\"}})\n;; => false\n\n(s/explain ::tags {33 {:id 101 :name \"foo\"}})\n;; => [33 {:id 101, :name \"foo\"}] - failed: (fn [[k v]] (= (:id v) k)) in: [0] ;; ;; => spec: :user/tags\n\n;; Spec seems good - lets try generators\n\n(gen/sample (s/gen ::tags))\n;; => #error {:message \"Couldn't satisfy such-that predicate after 100 tries.\", :data {}}...\n\n;; Dang, must create a generator ourselves.\n\n(s/def ::tags (s/with-gen\n (s/and\n (s/map-of ::id ::tag)\n (s/every (fn [[k v]](= (:id v) k))))\n #(gen/fmap (fn [c]\n ;; Create a map from the collection\n (apply hash-map (->> c\n (map (juxt :id identity))\n (flatten))))\n ;; Generates a collection of the generated vals\n (s/gen (s/coll-of ::tag))))) \n\n(gen/sample (s/gen ::tags))\n;; =>({2 {:id 2, :name \"wx3p3BPir\"},\n;; => 3 {:id 3, :name \"jq8\"},\n;; => 4 {:id 4, :name \"q3I\"},\n;; => 38 {:id 38, :name \"dhPlIf4\"},\n;; => 7 {:id 7, :name \"t\"},\n;; => 67 {:id 167, :name \"KS9uDEYS\"},\n;; => 11 {:id 11, :name \"\"}, \n;; => 147 {:id 147, :name \"hmSAKGpZ\"}}...)", :_id "5cd31663e4b0ca44402ef71c"}], :macro true, :notes nil, :arglists ["kpred vpred & opts"], :doc "Returns a spec for a map whose keys satisfy kpred and vals satisfy\n vpred. Unlike 'every-kv', map-of will exhaustively conform every\n value.\n\n Same options as 'every', :kind defaults to map?, with the addition of:\n\n :conform-keys - conform keys as well as values (default false)\n\n See also - every-kv", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/map-of"} {:ns "clojure.spec.alpha", :name "cat-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1392, :examples nil, :notes nil, :arglists ["ks ps forms"], :doc "Do not call this directly, use 'cat'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/cat-impl"} {:ns "clojure.spec.alpha", :name "explain-str", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos [{:created-at 1591273515390, :author {:login "fredsh2k", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/38362977?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "explain", :ns "clojure.spec.alpha"}, :_id "5ed8e82be4b087629b5a1928"} {:created-at 1591273531958, :author {:login "fredsh2k", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/38362977?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "explain-data", :ns "clojure.spec.alpha"}, :_id "5ed8e83be4b087629b5a1929"}], :line 265, :examples [{:updated-at 1591273493420, :created-at 1591273493420, :author {:login "fredsh2k", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/38362977?v=4"}, :body "(require '[clojure.spec.alpha :as spec])\n\n(spec/def ::name string?)\n;;=> :ns/name\n\n(spec/explain-str ::name \"0\")\n;;=> \"Success!\\n\"\n\n(spec/explain-str ::name 0)\n;; => \"0 - failed: string? spec: :ns/name\\n\"", :_id "5ed8e815e4b087629b5a1927"}], :notes nil, :arglists ["spec x"], :doc "Given a spec and a value that fails to conform, returns an explanation as a string.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/explain-str"} {:ns "clojure.spec.alpha", :name "*compile-asserts*", :file "clojure/spec/alpha.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 1934, :examples nil, :notes nil, :arglists [], :doc "If true, compiler will enable spec asserts, which are then\nsubject to runtime control via check-asserts? If false, compiler\nwill eliminate all spec assert overhead. See 'assert'.\n\nInitially set to boolean value of clojure.spec.compile-asserts\nsystem property. Defaults to true.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/*compile-asserts*"} {:ns "clojure.spec.alpha", :name "with-gen", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos [{:created-at 1524133491325, :author {:login "anler", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/83847?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "gen", :ns "clojure.spec.alpha"}, :_id "5ad86e73e4b045c27b7fac44"}], :line 203, :examples [{:updated-at 1524133985001, :created-at 1524133985001, :author {:login "anler", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/83847?v=4"}, :body "(require '[clojure.spec.alpha :as s]\n '[clojure.spec.gen.alpha :as g])\n\n;; generator for int? includes positive and negative integers\n(-> int?\n s/gen\n g/generate)\n;; => -31\n;; => -177\n;; => 7\n\n;; there's a pos-int? generator that generates only positive integers, but\n;; for the sake of this example let's pretend it doesn't exist\n(-> pos-int?\n s/gen\n g/generate)\n;; => 848961\n;; => 11767\n;; => 3479479\n\n;; let's attach a new generator to int? so it generates only positive integers\n(require '[clojure.test.check.generators :as test.g])\n\n(defn abs [^long v] (Math/abs v))\n\n;; let's generate only positive int? values\n(-> int?\n (s/with-gen #(test.g/fmap abs (s/gen int?)))\n s/gen\n g/generate)\n;; => 299578\n;; => 438034\n;; => 315023\n;; => 31\n\n", :_id "5ad87061e4b045c27b7fac45"} {:editors [{:login "holyjak", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/624958?v=4"} {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}], :body "(require '[clojure.spec.alpha :as s]\n '[clojure.spec.gen.alpha :as g])\n\n;; How to add a generator to a named spec\n;; Remember that spec expects a fn returning a generator,\n;; not the generator directly!\n(def gen-rand-digit (g/elements (range 10)))\n(s/def ::small-num (s/with-gen\n (s/int-in 0 10)\n (constantly gen-rand-digit)))", :author {:avatar-url "https://avatars1.githubusercontent.com/u/624958?v=4", :account-source "github", :login "holyjak"}, :created-at 1557576794355, :updated-at 1593619477647, :_id "5cd6bc5ae4b0ca44402ef71f"}], :notes nil, :arglists ["spec gen-fn"], :doc "Takes a spec and a no-arg, generator-returning fn and returns a version of that spec that uses that generator", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/with-gen"} {:ns "clojure.spec.alpha", :name "conform*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["spec x"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/conform*"} {:ns "clojure.spec.alpha", :name "check-asserts?", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1945, :examples nil, :notes nil, :arglists [""], :doc "Returns the value set by check-asserts.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/check-asserts_q"} {:ns "clojure.spec.alpha", :name "rep-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 1404, :examples nil, :notes nil, :arglists ["form p"], :doc "Do not call this directly, use '*'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/rep-impl"} {:ns "clojure.spec.alpha", :name "double-in", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos [{:created-at 1549644769131, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "int-in", :ns "clojure.spec.alpha"}, :_id "5c5db3e1e4b0ca44402ef673"}], :line 1916, :examples nil, :macro true, :notes nil, :arglists ["& {:keys [infinite? NaN? min max], :or {infinite? true, NaN? true}, :as m}"], :doc "Specs a 64-bit floating point number. Options:\n\n :infinite? - whether +/- infinity allowed (default true)\n :NaN? - whether NaN allowed (default true)\n :min - minimum value (inclusive, default none)\n :max - maximum value (inclusive, default none)", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/double-in"} {:ns "clojure.spec.alpha", :name "inst-in", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos nil, :line 1891, :examples nil, :macro true, :notes nil, :arglists ["start end"], :doc "Returns a spec that validates insts in the range from start\n(inclusive) to end (exclusive).", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/inst-in"} {:ns "clojure.spec.alpha", :name "describe", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 198, :examples nil, :notes nil, :arglists ["spec"], :doc "returns an abbreviated description of the spec as data", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/describe"} {:ns "clojure.spec.alpha", :name "explain-out", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos nil, :line 254, :examples nil, :notes nil, :arglists ["ed"], :doc "Prints explanation data (per 'explain-data') to *out* using the printer in *explain-out*,\n by default explain-printer.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/explain-out"} {:ns "clojure.spec.alpha", :name "and", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos [{:created-at 1549644301185, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "or", :ns "clojure.spec.alpha"}, :_id "5c5db20de4b0ca44402ef665"}], :line 488, :examples [{:updated-at 1586209849180, :created-at 1586209849180, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :body "(require '[clojure.spec.alpha :as s])\n\n(s/conform (s/and int? pos?) 3) ;=> 3", :_id "5e8ba439e4b087629b5a18cd"}], :macro true, :notes nil, :arglists ["& pred-forms"], :doc "Takes predicate/spec-forms, e.g.\n\n (s/and even? #(< % 42))\n\n Returns a spec that returns the conformed value. Successive\n conformed values propagate through rest of predicates.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/and"} {:ns "clojure.spec.alpha", :name "specize*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["_" "_ form"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/specize*"} {:ns "clojure.spec.alpha", :name "def", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos nil, :line 342, :examples [{:updated-at 1659267005892, :created-at 1659267005892, :author {:login "m1nhtu99-hoan9", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19143075?v=4"}, :body "```clojure\n(ns my-app.entry \n (:require [clojure.spec.alpha :as s]\n [clojure.repl :refer [doc]]))\n\n;; the :: macro will automatically prepend current namespace into \n;; the qualified :entry-state spec keyword\n(s/def ::entry-state #{:entered :exited})\n\n;; check it out:\n(doc :my-app.entry/entry-state)\n;; -------------------------\n;; :my-app.entry/entry-state\n;; Spec\n;; #{:entered :exited}\n```", :_id "62e667bde4b0b1e3652d7635"}], :macro true, :notes nil, :arglists ["k spec-form"], :doc "Given a namespace-qualified keyword or resolvable symbol k, and a\n spec, spec-name, predicate or regex-op makes an entry in the\n registry mapping k to the spec. Use nil to remove an entry in\n the registry for k.", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/def"} {:ns "clojure.spec.alpha", :name "maybe-impl", :file "clojure/spec/alpha.clj", :type "function", :column 1, :see-alsos [{:created-at 1549644646995, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "?", :ns "clojure.spec.alpha"}, :_id "5c5db366e4b0ca44402ef66e"}], :line 1446, :examples nil, :notes nil, :arglists ["p form"], :doc "Do not call this directly, use '?'", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/maybe-impl"} {:ns "clojure.spec.alpha", :name "explain*", :type "function", :see-alsos nil, :examples nil, :notes nil, :arglists ["spec path via in x"], :doc nil, :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/explain*"} {:ns "clojure.spec.alpha", :name "fdef", :file "clojure/spec/alpha.clj", :type "macro", :column 1, :see-alsos nil, :line 709, :examples [{:updated-at 1531338068729, :created-at 1531337930997, :author {:login "pianostringquartet", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/18562836?v=4"}, :body ";; Example from Clojure.org spec guide:\n;; https://clojure.org/guides/spec\n\n(require '[clojure.spec.alpha :as s])\n\n(s/fdef ranged-rand\n :args (s/and (s/cat :start int? :end int?)\n #(< (:start %) (:end %)))\n :ret int?\n :fn (s/and #(>= (:ret %) (-> % :args :start))\n #(< (:ret %) (-> % :args :end))))", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/18562836?v=4", :account-source "github", :login "pianostringquartet"}], :_id "5b465ccae4b00ac801ed9e25"} {:updated-at 1548440412226, :created-at 1548440412226, :author {:login "Activeghost", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/10783037?v=4"}, :body "(...ns declaration...\n(:require [clojure.spec.alpha :as s]\n [clojure.spec.gen.alpha :as gen]))\n\n;; lets say I created a set of specs to build up the fn.\n;;\n(s/def ::significant-string (s/with-gen \n (s/and string? #(not (nil? %)))\n (fn [] (gen/such-that #(not= % \"\")\n (gen/string-alphanumeric)))))\n\n(s/def ::byte-stream \n (s/with-gen #(instance? java.io.ByteArrayInputStream %)\n (gen/fmap #(string->stream %) (gen/string-alphanumeric))))\n\n;; :args spec is invoked with an argument list\n;; using cat to reach into the argument list and test conformity to the\n;; ::significant-string spec.\n;; :ret is invoked with the return value (testing conformity to a ::byte-stream)\n;; :fn spec is invoked with a map of the input and return values. (not using args here)\n(s/fdef string->stream\n :args (s/cat :s ::significant-string)\n :ret ::byte-stream\n :fn (fn [{:keys [args ret]}]\n (instance? java.io.ByteArrayInputStream ret)))\n\n;;\n;; the actual fn\n;;\n(defn string->stream\n \"Given a string, return a java.io.ByteArrayInputStream\"\n ([s] {:pre [(s/valid? ::significant-string s)]\n :post [(s/valid? ::byte-stream %)]}\n (string->stream s \"UTF-8\"))\n ([s encoding]\n (-> s\n (.getBytes encoding)\n (java.io.ByteArrayInputStream.))))\n\n;; note, the post condition in this example is redundant with the :fn spec.\n;; and given we aren't using the args value in the :fn spec I would drop that one \n;; in practical use.\n\n", :_id "5c4b535ce4b0ca44402ef629"}], :macro true, :notes nil, :arglists ["fn-sym & specs"], :doc "Takes a symbol naming a function, and one or more of the following:\n\n :args A regex spec for the function arguments as they were a list to be\n passed to apply - in this way, a single spec can handle functions with\n multiple arities\n :ret A spec for the function's return value\n :fn A spec of the relationship between args and ret - the\n value passed is {:args conformed-args :ret conformed-ret} and is\n expected to contain predicates that relate those values\n\n Qualifies fn-sym with resolve, or using *ns* if no resolution found.\n Registers an fspec in the global registry, where it can be retrieved\n by calling get-spec with the var or fully-qualified symbol.\n\n Once registered, function specs are included in doc, checked by\n instrument, tested by the runner clojure.spec.test.alpha/check, and (if\n a macro) used to explain errors during macroexpansion.\n\n Note that :fn specs require the presence of :args and :ret specs to\n conform values, and so :fn specs will be ignored if :args or :ret\n are missing.\n\n Returns the qualified fn-sym.\n\n For example, to register function specs for the symbol function:\n\n (s/fdef clojure.core/symbol\n :args (s/alt :separate (s/cat :ns string? :n string?)\n :str string?\n :sym symbol?)\n :ret symbol?)", :library-url "https://github.com/clojure/clojure", :href "/clojure.spec.alpha/fdef"} {:added "1.1", :ns "clojure.stacktrace", :name "print-stack-trace", :file "clojure/stacktrace.clj", :type "function", :column 1, :see-alsos [{:created-at 1518042239168, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "catch", :ns "clojure.core"}, :_id "5a7b7c7fe4b0316c0f44f8a5"} {:created-at 1518042247997, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ex-info", :ns "clojure.core"}, :_id "5a7b7c87e4b0316c0f44f8a6"}], :line 48, :examples [{:updated-at 1508791426015, :created-at 1374649676000, :body "(clojure.stacktrace/print-stack-trace (Exception. \"foo\"))\n; java.lang.Exception: foo\n; at user$eval112.invoke (NO_SOURCE_FILE:1)\n; clojure.lang.Compiler.eval (Compiler.java:6619)\n; clojure.lang.Compiler.eval (Compiler.java:6582)\n; clojure.core$eval.invoke (core.clj:2852)\n; clojure.main$repl$read_eval_print__6588$fn__6591.invoke (main.clj:259)\n; clojure.main$repl$read_eval_print__6588.invoke (main.clj:259)\n; clojure.main$repl$fn__6597.invoke (main.clj:277)\n; clojure.main$repl.doInvoke (main.clj:277)\n; clojure.lang.RestFn.invoke (RestFn.java:1096)\n; clojure.tools.nrepl.middleware.interruptible_eval$evaluate$fn__3615.invoke (interruptible_eval.clj:56)\n; clojure.lang.AFn.applyToHelper (AFn.java:159)\n; clojure.lang.AFn.applyTo (AFn.java:151)\n; clojure.core$apply.invoke (core.clj:617)\n; clojure.core$with_bindings_STAR_.doInvoke (core.clj:1788)\n; clojure.lang.RestFn.invoke (RestFn.java:425)\n; clojure.tools.nrepl.middleware.interruptible_eval$evaluate.invoke (interruptible_eval.clj:41)\n; clojure.tools.nrepl.middleware.interruptible_eval$interruptible_eval$fn__3656$fn__3659.invoke (interruptible_eval.clj:171)\n; clojure.core$comp$fn__4154.invoke (core.clj:2330)\n; clojure.tools.nrepl.middleware.interruptible_eval$run_next$fn__3649.invoke (interruptible_eval.clj:138)\n; clojure.lang.AFn.run (AFn.java:24)\n; java.util.concurrent.ThreadPoolExecutor.runWorker (:-1)\n; java.util.concurrent.ThreadPoolExecutor$Worker.run (:-1)\n; java.lang.Thread.run (:-1)\n;=> nil\n\n(clojure.stacktrace/print-stack-trace (Exception. \"foo\") 4)\n; java.lang.Exception: foo\n; at user$eval124.invoke (NO_SOURCE_FILE:1)\n; clojure.lang.Compiler.eval (Compiler.java:6619)\n; clojure.lang.Compiler.eval (Compiler.java:6582)\n; clojure.core$eval.invoke (core.clj:2852)\n;=> nil", :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/627acfa99fdd2a4e0c5aab58825b6ffd?r=PG&default=identicon", :account-source "clojuredocs", :login "sjm"}, :_id "542692d7c026201cdc3270fd"} {:updated-at 1508791292657, :created-at 1508791292657, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body ";; if you need to capture the stack trace in a string.\n(with-out-str (clojure.stacktrace/print-stack-trace (Exception. \"foo\") 4))\n;; \"\\n clojure.core/eval core.clj: 3211\\n ... \\n boot.user$eval1726.invoke : 1\\nboot.user$eval1726.invokeStatic : 1\\njava.lang.Exception: foo\\n\"", :_id "59ee53fce4b03026fe14ea94"}], :notes nil, :arglists ["tr" "tr n"], :doc "Prints a Clojure-oriented stack trace of tr, a Throwable.\n Prints a maximum of n stack frames (default: unlimited).\n Does not print chained exceptions (causes).", :library-url "https://github.com/clojure/clojure", :href "/clojure.stacktrace/print-stack-trace"} {:added "1.1", :ns "clojure.stacktrace", :name "print-trace-element", :file "clojure/stacktrace.clj", :type "function", :column 1, :see-alsos nil, :line 26, :examples [{:updated-at 1508791733815, :created-at 1508791733815, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body "(clojure.stacktrace/print-trace-element (Exception. \"foo\"))\n; \n;=> nil", :_id "59ee55b5e4b03026fe14ea98"}], :notes nil, :arglists ["e"], :doc "Prints a Clojure-oriented view of one element in a stack trace.", :library-url "https://github.com/clojure/clojure", :href "/clojure.stacktrace/print-trace-element"} {:added "1.1", :ns "clojure.stacktrace", :name "print-cause-trace", :file "clojure/stacktrace.clj", :type "function", :column 1, :see-alsos [{:created-at 1433792931008, :author {:login "JarredLHumphrey", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/2120888?v=3"}, :to-var {:ns "clojure.stacktrace", :name "print-stack-trace", :library-url "https://github.com/clojure/clojure"}, :_id "5575f1a3e4b03e2132e7d18a"}], :line 70, :examples [{:editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :body "(clojure.stacktrace/print-cause-trace (Exception. \"foo\") 4)\n; clojure.core/eval core.clj: 3211\n; ... \n; boot.user$eval1731.invoke : 1\n; boot.user$eval1731.invokeStatic : 1\n; java.lang.Exception: foo\n;=> nil\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}, :created-at 1508791543258, :updated-at 1508791574495, :_id "59ee54f7e4b03026fe14ea96"}], :notes nil, :arglists ["tr" "tr n"], :doc "Like print-stack-trace but prints chained exceptions (causes).", :library-url "https://github.com/clojure/clojure", :href "/clojure.stacktrace/print-cause-trace"} {:added "1.1", :ns "clojure.stacktrace", :name "e", :file "clojure/stacktrace.clj", :type "function", :column 1, :see-alsos nil, :line 80, :examples [{:editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :body "(/ 1 0)\n\n;;ArithmeticException Divide by zero clojure.lang.Numbers.divide (Numbers.java:156)\n\n(clojure.stacktrace/e)\n\n;;java.lang.ArithmeticException: Divide by zero\n;; at clojure.lang.Numbers.divide (Numbers.java:156)\n;; clojure.lang.Numbers.divide (Numbers.java:3731)\n;; user$eval11696.invoke (form-init813878306514169279.clj:1)\n;; clojure.lang.Compiler.eval (Compiler.java:6703)\n;; clojure.lang.Compiler.eval (Compiler.java:6666)\n;; clojure.core$eval.invoke (core.clj:2927)\n;; clojure.main$repl$read_eval_print__6625$fn__6628.invoke (main.clj:239)\n;; clojure.main$repl$read_eval_print__6625.invoke (main.clj:239)\n\n;; => nil", :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :created-at 1443937645032, :updated-at 1508791980228, :_id "5610bd6de4b0686557fcbd52"}], :notes nil, :arglists [""], :doc "REPL utility. Prints a brief stack trace for the root cause of the\n most recent exception.", :library-url "https://github.com/clojure/clojure", :href "/clojure.stacktrace/e"} {:added "1.1", :ns "clojure.stacktrace", :name "root-cause", :file "clojure/stacktrace.clj", :type "function", :column 1, :see-alsos nil, :line 18, :examples [{:updated-at 1508792641035, :created-at 1508792641035, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :body ";; make an exception\n(def anex (try (/ 1 0) (catch Exception ex ex)))\n\n;; get the root cause\n(clojure.stacktrace/root-cause anex)\n;;=> #error {\n;; :cause \"Divide by zero\"\n;; :via\n;; [{:type java.lang.ArithmeticException\n;; :message \"Divide by zero\"\n;; :at [clojure.lang.Numbers divide \"Numbers.java\" 163]}]\n;; :trace\n;; [[clojure.lang.Numbers divide \"Numbers.java\" 163]\n;; [clojure.lang.Numbers divide \"Numbers.java\" 3833]\n;; ...\n;; [java.lang.Thread run \"Thread.java\" 748]]}\n", :_id "59ee5941e4b03026fe14ea9e"}], :notes nil, :arglists ["tr"], :doc "Returns the last 'cause' Throwable in a chain of Throwables.", :library-url "https://github.com/clojure/clojure", :href "/clojure.stacktrace/root-cause"} {:added "1.1", :ns "clojure.stacktrace", :name "print-throwable", :file "clojure/stacktrace.clj", :type "function", :column 1, :see-alsos [{:created-at 1508792399533, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "print-stack-trace", :ns "clojure.stacktrace"}, :_id "59ee584fe4b03026fe14ea9c"} {:created-at 1508792411207, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "print-cause-trace", :ns "clojure.stacktrace"}, :_id "59ee585be4b03026fe14ea9d"}], :line 38, :examples [{:editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :body ";; let's make an exception\n(def anex (try (/ 1 0) (catch Exception ex ex)))\n\n;; now print the exception\n(clojure.stacktrace/print-throwable anex)\n;; java.lang.ArithmeticException: Divide by zero\n;=> nil\n\n;; and catch it in a string\n(def msg (with-out-str (clojure.stacktrace/print-throwable anex)))\n;=> #'boot.user/msg\n\nmsg\n;=> \"java.lang.ArithmeticException: Divide by zero\"\n\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}, :created-at 1508792234572, :updated-at 1508792362516, :_id "59ee57aae4b03026fe14ea9a"}], :notes nil, :arglists ["tr"], :doc "Prints the class and message of a Throwable. Prints the ex-data map\n if present.", :library-url "https://github.com/clojure/clojure", :href "/clojure.stacktrace/print-throwable"} {:added "1.8", :ns "clojure.string", :name "ends-with?", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1543591000911, :author {:login "iGEL", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/36442?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "starts-with?", :ns "clojure.string"}, :_id "5c015458e4b0ca44402ef5d4"} {:created-at 1676935186431, :author {:login "oakmac", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/98485?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "includes?", :ns "clojure.string"}, :_id "63f40012e4b08cf8563f4b70"}], :line 366, :examples [{:updated-at 1476954122056, :created-at 1476954122056, :author {:login "dalzony", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/562341?v=3"}, :body "(use 'clojure.string)\n\n(ends-with? \"Minsun\" \"sun\")\n;;=> true\n(ends-with? \"Minsun\" \"suns\")\n;;=> false\n(ends-with? \"Minsun\" \"un\")\n;;=> true", :_id "5808880ae4b001179b66bdd4"}], :notes nil, :arglists ["s substr"], :doc "True if s ends with substr.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/ends-with_q"} {:added "1.2", :ns "clojure.string", :name "capitalize", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1330171018000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.string", :name "upper-case", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b62"} {:created-at 1330171022000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.string", :name "lower-case", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b63"}], :line 196, :examples [{:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "teyc", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd6e62afb4881ab0f617611b8b65d003?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (require 'clojure.string)\nnil\n\nuser=> (clojure.string/capitalize \"MiXeD cAsE\")\n\"Mixed case\"\n\nuser=> (clojure.string/capitalize \"mIxEd CaSe\")\n\"Mixed case\"\n", :created-at 1282324695000, :updated-at 1285487692000, :_id "542692d1c026201cdc326f12"} {:editors [{:avatar-url "https://avatars.githubusercontent.com/u/40753?v=2", :account-source "github", :login "sir-pinecone"} {:avatar-url "https://avatars.githubusercontent.com/u/99447?v=3", :account-source "github", :login "olivergeorge"}], :updated-at 1452219646078, :created-at 1415122766154, :author {:avatar-url "https://avatars.githubusercontent.com/u/40753?v=2", :account-source "github", :login "sir-pinecone"}, :body "(defn capitalize-words \n \"Capitalize every word in a string\"\n [s]\n (->> (string/split (str s) #\"\\b\") \n (map string/capitalize)\n string/join))\n\n(capitalize-words \"a bunch of words/text\")\n;;=> \"A Bunch Of Words/Text\"", :_id "54590f4ee4b0dc573b892fb8"} {:updated-at 1518738391882, :created-at 1518738391882, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/109629?v=4"}, :body ";; Warning: If you deal with Unicode characters often, note that some do not\n;; fit into a single 16-bit Java char. Yes, such Unicode characters exist.\n;; The JVM encodes them in strings in memory using UTF-16, as 2 consecutive\n;; 16-bit values, each with their own separate index in the string's array\n;; of chars.\n\n;; https://en.wikipedia.org/wiki/UTF-16\n\n;; clojure.string/capitalize should not be used for such strings, as it\n;; operates by feeding the first 16-bit Java char for capitalization, and the rest\n;; of the Java chars for converting to lower case.\n\n;; I wouldn't bother filing (another) bug on Clojure for this, since it is\n;; unlikely to change in this regard. If you are dealing with many languages\n;; in the Unicode character set on a regular basis, then you likely\n;; want to use a library like ICU4J, which is much more sophisticated in its\n;; capabilities than anything built into Clojure.\n\n;; ICU4J (also ICU4C): http://site.icu-project.org", :_id "5a861bd7e4b0316c0f44f8c4"}], :notes nil, :tag "java.lang.String", :arglists ["s"], :doc "Converts first character of the string to upper-case, all other\n characters to lower-case.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/capitalize"} {:added "1.2", :ns "clojure.string", :name "reverse", :file "clojure/string.clj", :type "function", :column 1, :see-alsos nil, :line 48, :examples [{:updated-at 1557853754276, :created-at 1291916345000, :body ";; This demonstrates clojure.core/reverse, and not clojure.string/reverse, to be clear.\n\nuser> (reverse \"foo\")\n(\\o \\o \\f)\n\nuser> (apply str (reverse \"foo\"))\n\"oof\"", :editors [{:avatar-url "https://www.gravatar.com/avatar/73dfb1eb77844f0dbae599ff9b81e78f?r=PG&default=identicon", :account-source "clojuredocs", :login "mudge"} {:avatar-url "https://avatars3.githubusercontent.com/u/13070019?v=4", :account-source "github", :login "krizk"} {:login "bpringe", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/12722744?v=4"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692d1c026201cdc326f10"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; clojure.string/reverse correctly treats UTF-16 surrogate pairs\n;; as a unit, and does not reverse the 2 Java chars of the pair. Good!\nuser=> (def s \"smily \\ud83d\\ude03.\")\n#'user/s\nuser=> (def x (str/reverse s))\n#'user/x\nuser=> (map #(format \"%04X\" (int %)) s)\n(\"0073\" \"006D\" \"0069\" \"006C\" \"0079\" \"0020\" \"D83D\" \"DE03\" \"002E\")\nuser=> (map #(format \"%04X\" (int %)) x)\n(\"002E\" \"D83D\" \"DE03\" \"0020\" \"0079\" \"006C\" \"0069\" \"006D\" \"0073\")\n", :created-at 1329876696000, :updated-at 1329876696000, :_id "542692d7c026201cdc32710b"}], :notes nil, :tag "java.lang.String", :arglists ["s"], :doc "Returns s with its characters reversed.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/reverse"} {:added "1.2", :ns "clojure.string", :name "join", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1314291144000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "split-at", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d3a"} {:created-at 1314291148000, :author {:login "Havvy", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e799a79441c7543be48562403411cd13?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "split-with", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d3b"} {:created-at 1334733670000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "interpose", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e48"} {:created-at 1627950208675, :author {:login "Okwori", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/16775439?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "apply", :ns "clojure.core"}, :_id "61088c80e4b0b1e3652d752b"}], :line 180, :examples [{:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "morty", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3272?v=3"}], :body "user=> (clojure.string/join \", \" [1 2 3])\n\"1, 2, 3\"", :created-at 1282320829000, :updated-at 1416262356224, :_id "542692d0c026201cdc326f00"} {:author {:login "Santosh", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/851ccd369a1501c72f5e08af19ff9dc1?r=PG&default=identicon"}, :editors [{:login "Santosh", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/851ccd369a1501c72f5e08af19ff9dc1?r=PG&default=identicon"} {:login "Santosh", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/851ccd369a1501c72f5e08af19ff9dc1?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Splits a string on space character and joins \n;; the resulting collection with a line feed character\n\n(use '[clojure.string :only (join split)])\n\nuser=> (println\n (join \"\\n\"\n (split \"The Quick Brown Fox\" #\"\\s\")))\nThe\nQuick\nBrown\nFox\nnil", :created-at 1286103547000, :updated-at 1286115114000, :_id "542692d0c026201cdc326f01"} {:updated-at 1442089276535, :created-at 1442089276535, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :body ";; Note that empty strings and nils will appear as blank items\n;; in the result:\n\n(require '[clojure.string :as string])\n\n(string/join \", \" [\"spam\" nil \"eggs\" \"\" \"spam\"])\n;;=> \"spam, , eggs, , spam\"\n\n;; If you'd like to avoid this, you might do something like this:\n\n(string/join \", \" (remove string/blank? [\"spam\" nil \"eggs\" \"\" \"spam\"]))\n;;=> \"spam, eggs, spam\"", :_id "55f4893ce4b06a9ffaad4fbc"} {:editors [{:login "timjimsmith", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/23392266?v=4"}], :body "(require '[clojure.string :as string])\n\n;; No separator means no separation\n(string/join [1 2 3])\n;; => \"123\"", :author {:avatar-url "https://avatars3.githubusercontent.com/u/23392266?v=4", :account-source "github", :login "timjimsmith"}, :created-at 1551217121626, :updated-at 1551217186482, :_id "5c75b1e1e4b0ca44402ef6a8"}], :notes nil, :tag "java.lang.String", :arglists ["coll" "separator coll"], :doc "Returns a string of all elements in coll, as returned by (seq coll),\n separated by an optional separator.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/join"} {:added "1.2", :ns "clojure.string", :name "replace-first", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1323919307000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.string", :name "replace", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c57"} {:created-at 1324450151000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "re-pattern", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c58"} {:created-at 1379040099000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.core", :name "subs", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c59"} {:created-at 1534291088264, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "re-quote-replacement", :ns "clojure.string"}, :_id "5b736c90e4b00ac801ed9e57"}], :line 138, :examples [{:updated-at 1497950006591, :created-at 1323919917000, :body "user=> (use '[clojure.string :only (replace-first)])\n\n;; Only replace the first match.\nuser=> (replace-first \"A good day to you, sir. Good day.\" #\"day\" \"night\")\n\"A good night to you, sir. Good day.\"\n\n;; If there are no matches, return the original string.\nuser=> (replace-first \"A good day to you, sir.\" #\"madam\" \"master\")\n\"A good day to you, sir.\"\n\n;; (?i) at the beginning of a pattern makes the entire thing match\n;; case-insensitively, at least for US ASCII characters. (?u) does\n;; the corresponding thing for Unicode.\nuser=> (replace-first \"Day need not be SHOUTED.\" #\"(?i)day\" \"night\")\n\"night need not be SHOUTED.\"\n\n;; See here for many details on regex patterns:\n;; http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html\n;; Also the book \"Mastering Regular Expressions\" by Jeffrey Friedl.\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}, :_id "542692d7c026201cdc327104"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body "user=> (use '[clojure.string :only (replace-first)])\n\n;; Pattern matches from beginning of string (signified by ^) up to the\n;; last occurrence of /, because by default * is greedy, i.e. it\n;; matches as much as possible.\nuser=> (replace-first \"/path/to/file/name\" #\"^.*/\" \"\")\n\"name\"\n\n;; Use *? to match as little as possible.\nuser=> (replace-first \"/path/to/file/name\" #\"^.*?/\" \"\")\n\"path/to/file/name\"\n", :created-at 1323919934000, :updated-at 1323919934000, :_id "542692d7c026201cdc327107"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body ";; Note: When replace-first or replace have a regex pattern as their\n;; match argument, dollar sign ($) and backslash (\\) characters in\n;; the replacement string are treated specially.\n\n;; Example: pattern matches string \"fodder\", with (o+) matching \"o\"\n;; and (\\S+) matching \"dder\". Replacement string says to replace the\n;; entire match \"fodder\" with $2, the string matched by the second\n;; parenthesized group, \"dder\", followed by $1, \"o\".\nuser=> (str/replace-first \"fabulous fodder foo food\" #\"f(o+)(\\S+)\" \"$2$1\")\n\"fabulous ddero foo food\"\n\n;; To avoid this special treatment of $ and \\, you must escape them with\n;; \\. Because it is in a Clojure string, to get one \\ we must escape\n;; *that* with its own \\.\nuser=> (str/replace-first \"fabulous fodder foo food\" #\"f(o+)(\\S+)\" \"\\\\$2\\\\$1\")\n\"fabulous $2$1 foo food\"\n\n;; To ensure the replacement is treated literally, call\n;; java.util.regex.Matcher/quoteReplacement on it. A shorter name\n;; like re-qr can be handy.\nuser=> (import '(java.util.regex Matcher))\njava.util.regex.Matcher\n\nuser=> (defn re-qr [replacement]\n (Matcher/quoteReplacement replacement))\n#'user/re-qr\n\nuser=> (str/replace-first \"fabulous fodder foo food\" #\"f(o+)(\\S+)\" (re-qr \"$2$1\"))\n\"fabulous $2$1 foo food\"\n", :created-at 1324449916000, :updated-at 1325401081000, :_id "542692d7c026201cdc327108"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; Note: See clojure.core/subs for discussion of behavior of substrings\n;; holding onto references of the original strings, which can\n;; significantly affect your memory usage in some cases.", :created-at 1379040092000, :updated-at 1379040092000, :_id "542692d7c026201cdc32710a"}], :notes nil, :tag "java.lang.String", :arglists ["s match replacement"], :doc "Replaces the first instance of match with replacement in s.\n\n match/replacement can be:\n\n char / char\n string / string\n pattern / (string or function of match).\n\n See also replace.\n\n The replacement is literal (i.e. none of its characters are treated\n specially) for all cases above except pattern / string.\n\n For pattern / string, $1, $2, etc. in the replacement string are\n substituted with the string that matched the corresponding\n parenthesized group in the pattern. If you wish your replacement\n string r to be used literally, use (re-quote-replacement r) as the\n replacement argument. See also documentation for\n java.util.regex.Matcher's appendReplacement method.\n\n Example:\n (clojure.string/replace-first \"swap first two words\"\n #\"(\\w+)(\\s+)(\\w+)\" \"$3$2$1\")\n -> \"first swap two words\"", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/replace-first"} {:added "1.8", :ns "clojure.string", :name "starts-with?", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1676935139053, :author {:login "oakmac", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/98485?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "ends-with?", :ns "clojure.string"}, :_id "63f3ffe3e4b08cf8563f4b6e"} {:created-at 1676935157532, :author {:login "oakmac", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/98485?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "includes?", :ns "clojure.string"}, :_id "63f3fff5e4b08cf8563f4b6f"}], :line 360, :examples [{:editors [{:login "elias94", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8095533?v=4"}], :body "(ns tst.xyz.core\n (:use clojure.test )\n (:require [clojure.string :as string] ))\n\n(deftest t-starts-with?\n (is (string/starts-with? \"abcde\" \"a\"))\n (is (string/starts-with? \"abcde\" \"ab\"))\n (is (string/starts-with? \"abcde\" \"abc\"))\n\n (is (not (string/starts-with? \"abcde\" \"b\")))\n (is (not (string/starts-with? \"abcde\" \"bc\")))\n\n (is (not (string/starts-with? \"a\" \"ab\")))\n (is (not (string/starts-with? \"ab\" \"abc\"))))", :author {:avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3", :account-source "github", :login "cloojure"}, :created-at 1472592967082, :updated-at 1635628021204, :_id "57c5fc47e4b0709b524f04dd"}], :notes [{:author {:login "oivulf", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3288506?v=4"}, :updated-at 1638567826166, :created-at 1638567826166, :body "why not support toffset as java does?", :_id "61aa8f92e4b0b1e3652d757e"}], :arglists ["s substr"], :doc "True if s starts with substr.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/starts-with_q"} {:added "1.2", :ns "clojure.string", :name "escape", :file "clojure/string.clj", :type "function", :column 1, :see-alsos nil, :line 300, :examples [{:updated-at 1451890503592, :created-at 1298559035000, :body ";; There should be no space between the \\ and the &, but I don't know how\n;; to create that in an example yet.\nuser=> (clojure.string/escape \"I want 1 < 2 as HTML, & other good things.\"\n {\\< \"<\", \\> \">\", \\& \"&\"})\n\"I want 1 < 2 as HTML, & other good things.\"", :editors [{:avatar-url "https://www.gravatar.com/avatar/e1237fa7ee270ace2ebb53c8cab91a6b?r=PG&default=identicon", :account-source "clojuredocs", :login "dyba"} {:login "pho-coder", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6576686?v=3"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}, :_id "542692d1c026201cdc326f15"} {:editors [{:login "educoutinho", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/3706894?v=4"}], :body "(ns test1.core\n (:require [clojure.string :as str]))\n\n(def text1 \"Hello Clojure World!\")\n\n;; Escape each character '!'\n(str/escape text1 {\\! \"!!!\"})\n;; => \"Hello Clojure World!!!\"\n\n;; Escape each space character\n(str/escape text1 {\\ \"-\"})\n;; => \"Hello-Clojure-World!\"\n\n;; Escape each characters '!' or space\n(str/escape text1 {\\! \"!!!\" \\ \"-\"})\n;; => \"Hello-Clojure-World!!!\"", :author {:avatar-url "https://avatars3.githubusercontent.com/u/3706894?v=4", :account-source "github", :login "educoutinho"}, :created-at 1516793634961, :updated-at 1516793653706, :_id "5a686f22e4b09621d9f53a77"} {:updated-at 1531760345824, :created-at 1531760345824, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :body ";; Note it correctly handles the case where a replacement string contains\n;; a char that’s in the replacement map:\n\n(clojure.string/escape \"123\" {\\1 \"2\" \\2 \"3\" \\3 \"4\"})\n;; => \"234\"\n\n(clojure.string/escape \"ab\" {\\a \"b\" \\b \"a\"})\n;; => \"ba\"", :_id "5b4cced9e4b00ac801ed9e28"} {:updated-at 1598459216961, :created-at 1598459216961, :author {:login "GSvensk", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/17110145?v=4"}, :body ";; Escape can be called with a function as the second argument.\n\n(defn convert [val]\n (case val\n \\a \\B\n \\b \\A\n \\C))\n\n(clojure.string/escape \"ab\" convert)\n;; => \"BA\"\n\n(clojure.string/escape \"ak\" convert)\n;; => BC", :_id "5f468d50e4b0b1e3652d73ae"}], :notes nil, :tag "java.lang.String", :arglists ["s cmap"], :doc "Return a new string, using cmap to escape each character ch\n from s as follows:\n \n If (cmap ch) is nil, append ch to the new string.\n If (cmap ch) is non-nil, append (str (cmap ch)) instead.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/escape"} {:added "1.8", :ns "clojure.string", :name "last-index-of", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1472459225244, :author {:login "hatappo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1096084?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "index-of", :ns "clojure.string"}, :_id "57c3f1d9e4b0709b524f04db"}], :line 339, :examples [{:editors [{:login "dalzony", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/562341?v=3"}], :body ";; 1. Just find index of char\n\nuser=> (last-index-of \"aaaaaa\" \"a\")\n5\nuser=> (last-index-of \"abcde\" \"c\")\n2\n\n;; 2. Optionally searching example\n\nuser=> (last-index-of \"abcde\" \"e\" 0)\n;;=> nil\nuser=> (last-index-of \"abcde\" \"e\" 1)\n;;=> nil\nuser=> (last-index-of \"abcde\" \"e\" 2)\n;;=> nil\nuser=> (last-index-of \"abcde\" \"e\" 3)\n;;=> nil\nuser=> (last-index-of \"abcde\" \"e\" 4)\n;;=> 4\nuser=> (last-index-of \"abcde\" \"e\" 5)\n;;=> 4\n", :author {:avatar-url "https://avatars.githubusercontent.com/u/562341?v=3", :account-source "github", :login "dalzony"}, :created-at 1476955531813, :updated-at 1476955666691, :_id "58088d8be4b001179b66bdd6"}], :notes nil, :arglists ["s value" "s value from-index"], :doc "Return last index of value (string or char) in s, optionally\n searching backward from from-index. Return nil if value not found.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/last-index-of"} {:added "1.5", :ns "clojure.string", :name "re-quote-replacement", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1534291404302, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "replace", :ns "clojure.string"}, :_id "5b736dcce4b00ac801ed9e59"}], :line 54, :examples [{:body ";; Special characters are escaped\n\n(use '[clojure.string :only (re-quote-replacement)])\n\nuser=> (re-quote-replacement \"string \\\\ $\")\n\"string \\\\\\\\ \\\\$\"", :author {:login "mzenzie", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1862891?v=3"}, :created-at 1433165381448, :updated-at 1433165381448, :_id "556c5e45e4b03e2132e7d182"} {:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; Use with s/replace to prevent unwanted reference\n;; to matching groups (i.e. $1, $2 etc.)\n\n(require '[clojure.string :as s])\n(def s \"May 2018, June 2019\")\n(s/replace s #\"May|June\" \"10$\") ;; IllegalArgumentException\n(s/replace s #\"May|June\" (s/re-quote-replacement \"10$ in\"))\n;; \"10$ in 2018, 10$ in 2019\"", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1534291388494, :updated-at 1656679988330, :_id "5b736dbce4b00ac801ed9e58"}], :notes nil, :tag "java.lang.String", :arglists ["replacement"], :doc "Given a replacement string that you wish to be a literal\n replacement for a pattern match in replace or replace-first, do the\n necessary escaping of special characters in the replacement.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/re-quote-replacement"} {:added "1.8", :ns "clojure.string", :name "includes?", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1552344296239, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "re-matches", :ns "clojure.core"}, :_id "5c86e4e8e4b0ca44402ef6b2"} {:created-at 1552344313247, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "index-of", :ns "clojure.string"}, :_id "5c86e4f9e4b0ca44402ef6b3"}], :line 372, :examples [{:editors [{:login "fasiha", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/37649?v=3"} {:login "tanrax", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/4553672?v=4"}], :body ";; String-oriented alternative to regular-expression functions in core\n(clojure.string/includes? \"clojure\" \"cl\")\n;;=> true\n\n;; Does *not* work with regular expressions!\n(clojure.string/includes? \"clojure\" #\"cl\")\n;;=> java.util.regex.Pattern cannot be cast to java.lang.CharSequence\n;; (java.lang.ClassCastException)", :author {:avatar-url "https://avatars.githubusercontent.com/u/37649?v=3", :account-source "github", :login "fasiha"}, :created-at 1481745619651, :updated-at 1583219409606, :_id "5851a4d3e4b004d3a355e2b7"} {:updated-at 1670311423805, :created-at 1670311423805, :author {:login "Yacobh", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/9374390?v=4"}, :body "\n;; Be careful when you uses with maps \n(includes? (str (:name {})) \"Bob Alice\")\n;;=> false\n\n(includes? (:name {}) \"Bob Alice\")\n;;=> Execution error (NullPointerException) at user/eval63454 (REPL:1).\n;;Cannot invoke \"Object.toString()\" because \"s\" is null", :_id "638eedffe4b0b1e3652d7694"}], :notes nil, :arglists ["s substr"], :doc "True if s includes substr.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/includes_q"} {:added "1.2", :ns "clojure.string", :name "replace", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1318625174000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "subs", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e64"} {:created-at 1318625263000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "split", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e65"} {:created-at 1323919331000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.string", :name "replace-first", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e66"} {:created-at 1534289083122, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "re-quote-replacement", :ns "clojure.string"}, :_id "5b7364bbe4b00ac801ed9e54"}], :line 75, :examples [{:updated-at 1507930108317, :created-at 1284347892000, :body "(clojure.string/replace \"The color is red\" #\"red\" \"blue\")\n;=> \"The color is blue\"", :editors [{:avatar-url "https://www.gravatar.com/avatar/e2051c4ebaaa8c22fa9c0bb2f32f64fd?r=PG&default=identicon", :account-source "clojuredocs", :login "rustem.suniev"} {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/e2051c4ebaaa8c22fa9c0bb2f32f64fd?r=PG&default=identicon", :account-source "clojuredocs", :login "rustem.suniev"}, :_id "542692d1c026201cdc326f0b"} {:author {:login "JD Huntington", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a3d6887041bc564a5d60cdc811ae4ef9?r=PG&default=identicon"}, :editors [{:login "Domon", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3fe8ae238c14d716a9fc16734a70765b?r=PG&default=identicon"} {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"} {:login "Panthevm", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/43318093?v=4"}], :body "(clojure.string/replace \"The color is red.\" #\"[aeiou]\" #(str %1 %1))\n;=> \"Thee cooloor iis reed.\"\n", :created-at 1295092425000, :updated-at 1604318073825, :_id "542692d1c026201cdc326f0e"} {:updated-at 1534289397632, :created-at 1324450115000, :body ";; Note: When replace-first or replace have a regex pattern as their\n;; match argument, dollar sign ($) and backslash (\\) characters in\n;; the replacement string are treated specially.\n\n;; Example: first substring that the pattern matches is \"fodder\", with\n;; (o+) matching \"o\" and (\\S+) matching \"dder\". Replacement string\n;; says to replace the entire match \"fodder\" with $2, the string\n;; matched by the second parenthesized group, \"dder\", followed by $1,\n;; \"o\".\n(str/replace \"fabulous fodder foo food\" #\"f(o+)(\\S+)\" \"$2$1\")\n;=> \"fabulous ddero oo doo\"\n\n;; To avoid this special treatment of $ and \\, you must escape them with\n;; \\. Because it is in a Clojure string, to get one \\ we must escape\n;; *that* with its own \\.\n(str/replace \"fabulous fodder foo food\" #\"f(o+)(\\S+)\" \"\\\\$2\\\\$1\")\n;=> \"fabulous $2$1 $2$1 $2$1\"\n\n;; To ensure the replacement is treated literally, call\n;; java.util.regex.Matcher/quoteReplacement on it. A shorter name\n;; like re-qr can be handy.\n(import '(java.util.regex Matcher))\n;=> java.util.regex.Matcher\n\n(defn re-qr [replacement]\n (Matcher/quoteReplacement replacement))\n;=> #'user/re-qr\n\n(str/replace \"fabulous fodder foo food\" #\"f(o+)(\\S+)\" (re-qr \"$2$1\"))\n;=> \"fabulous $2$1 $2$1 $2$1\"\n\n;; Since 1.5, re-qr can be replaced by clojure.string/re-quote-replacement\n(str/replace \"fabulous fodder foo food\" #\"f(o+)(\\S+)\" (str/re-quote-replacement \"$2$1\"))\n;=> \"fabulous $2$1 $2$1 $2$1\"", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"} {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"} {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/109629?v=3", :account-source "github", :login "jafingerhut"}, :_id "542692d7c026201cdc3270fe"} {:updated-at 1507930204780, :created-at 1344740223000, :body ";; replaces all a's with 1 and all b's with 2\n(clojure.string/replace \"a b a\" #\"a|b\" {\"a\" \"1\" \"b\" \"2\"})\n;=> \"1 2 1\"", :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon", :account-source "clojuredocs", :login "dansalmo"}, :_id "542692d7c026201cdc327100"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; Note: See clojure.core/subs for discussion of behavior of substrings\n;; holding onto references of the original strings, which can\n;; significantly affect your memory usage in some cases.", :created-at 1379040065000, :updated-at 1379040065000, :_id "542692d7c026201cdc327101"} {:author {:login "Corin", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/58ca01bfad092685652c8ea2b7bb3008?r=PG&default=identicon"}, :editors [{:login "Corin", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/58ca01bfad092685652c8ea2b7bb3008?r=PG&default=identicon"} {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; To title case\n(clojure.string/replace \"hello world\" #\"\\b.\" #(.toUpperCase %1))\n\"Hello World\"\n\n;; Note that a vector is passed to your replacement function\n;; when pattern contains capturing groups (see re-groups)\n(clojure.string/replace \"hello world\" #\"\\b(.)\" #(.toUpperCase (%1 1)))\n\"Hello World\"\n", :created-at 1397250241000, :updated-at 1412843380347, :_id "542692d7c026201cdc327102"} {:updated-at 1464723944272, :created-at 1464723944272, :author {:login "alexbispo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/6197542?v=3"}, :body ";; Note that the s \"Vegeta\" is returned as is, because there is no matching.\n(clojure.string/replace \"Vegeta\" #\"Goku\" \"Gohan\")\n\"Vegeta\"", :_id "574de9e8e4b0bafd3e2a046c"} {:updated-at 1636733826696, :created-at 1636733826696, :author {:login "wdhowe", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4631165?v=4"}, :body ";; Removing characters, while ignoring case.\n(clojure.string/replace \"Hello hello!\" #\"(?i)[h!]\" \"\")\n\n;=> \"ello ello\"", :_id "618e9382e4b0b1e3652d7572"}], :notes [{:updated-at 1351132541000, :body "How can i replace \".\" with #\"\\s\"", :created-at 1351132541000, :author {:login "TejasBhatt", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2953c9d9a1566f643e6910c4aa392525?r=PG&default=identicon"}, :_id "542692edf6e94c6970521ff2"}], :tag "java.lang.String", :arglists ["s match replacement"], :doc "Replaces all instance of match with replacement in s.\n\n match/replacement can be:\n\n string / string\n char / char\n pattern / (string or function of match).\n\n See also replace-first.\n\n The replacement is literal (i.e. none of its characters are treated\n specially) for all cases above except pattern / string.\n\n For pattern / string, $1, $2, etc. in the replacement string are\n substituted with the string that matched the corresponding\n parenthesized group in the pattern. If you wish your replacement\n string r to be used literally, use (re-quote-replacement r) as the\n replacement argument. See also documentation for\n java.util.regex.Matcher's appendReplacement method.\n\n Example:\n (clojure.string/replace \"Almost Pig Latin\" #\"\\b(\\w)(\\w+)\\b\" \"$2$1ay\")\n -> \"lmostAay igPay atinLay\"", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/replace"} {:added "1.2", :ns "clojure.string", :name "split-lines", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1329986651000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.string", :name "split", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bce"}], :line 228, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (clojure.string/split-lines \"test \\n string\")\n[\"test \" \" string\"]", :created-at 1281617355000, :updated-at 1332953156000, :_id "542692d0c026201cdc326f08"} {:updated-at 1470989747427, :created-at 1470989747427, :author {:login "mdemare", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4588?v=3"}, :body "; ignores trailing newlines\nuser=> (clojure.string/split-lines \"test\\n\\n\")\n[\"test\"]", :_id "57ad85b3e4b0bafd3e2a04e6"} {:editors [{:login "PEZ", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/30010?v=4"}], :body ";; About ignoring trailing newlines: split-lines is implemented something like:\nuser=> (clojure.string/split s #\"\\r?\\n\")\n\n;; To always get all the lines, you need to use split instead,\n;; and supply a negative third argument:\nuser=> (clojure.string/split \"\\ntest\\n\\n\" #\"\\r?\\n\" -1)\n;;=> [\"\" \"test\" \"\" \"\"]", :author {:avatar-url "https://avatars2.githubusercontent.com/u/30010?v=4", :account-source "github", :login "PEZ"}, :created-at 1530254196315, :updated-at 1530254213480, :_id "5b35d374e4b00ac801ed9e21"}], :notes nil, :arglists ["s"], :doc "Splits s on \\n or \\r\\n.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/split-lines"} {:added "1.2", :ns "clojure.string", :name "lower-case", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1330171039000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.string", :name "upper-case", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f4d"} {:created-at 1330171043000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.string", :name "capitalize", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f4e"}], :line 213, :examples [{:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (clojure.string/lower-case \"MiXeD cAsE\")\n\"mixed case\"", :created-at 1282324622000, :updated-at 1332951955000, :_id "542692d0c026201cdc326ef9"}], :notes nil, :tag "java.lang.String", :arglists ["s"], :doc "Converts string to all lower-case.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/lower-case"} {:added "1.2", :ns "clojure.string", :name "trim-newline", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1285923216000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "trim", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521de8"} {:created-at 1285923222000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "triml", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521de9"} {:created-at 1285923228000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "trimr", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dea"}], :line 274, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [], :body "
    \r\nuser=> (clojure.string/trim-newline \"test\\n\\r\")\r\n\"test\"\r\n
    ", :created-at 1280737509000, :updated-at 1280737509000, :_id "542692d1c026201cdc326f18"}], :notes nil, :tag "java.lang.String", :arglists ["s"], :doc "Removes all trailing newline \\n or return \\r characters from\n string. Similar to Perl's chomp.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/trim-newline"} {:added "1.2", :ns "clojure.string", :name "upper-case", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1330171029000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.string", :name "lower-case", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521af0"} {:created-at 1330171033000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.string", :name "capitalize", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521af1"}], :line 207, :examples [{:author {:login "pkolloch", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (clojure.string/upper-case \"MiXeD cAsE\")\n\"MIXED CASE\"", :created-at 1282324576000, :updated-at 1332951710000, :_id "542692d0c026201cdc326f05"} {:author {:login "nickzam", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/89377?v=2"}, :editors [], :body ";; Non-character symbols will be returned back\nuser=> (clojure.string/upper-case \",.!@#$%^&*()\")\n\",.!@#$%^&*()\"", :created-at 1386881910000, :updated-at 1386881910000, :_id "542692d7c026201cdc327113"} {:updated-at 1520347173061, :created-at 1520347173061, :author {:login "lov3machine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/13834519?v=4"}, :body ";; upper-case can't handle nil \nuser=> (clojure.string/upper-case nil) ;;=> NullPointerException ", :_id "5a9ea825e4b0316c0f44f90c"}], :notes nil, :tag "java.lang.String", :arglists ["s"], :doc "Converts string to all upper-case.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/upper-case"} {:added "1.2", :ns "clojure.string", :name "split", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1318625222000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "subs", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f59"} {:created-at 1318625227000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "replace", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f5a"} {:created-at 1318625367000, :author {:login "mmwaikar", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/29d36f4c9f39c9f8ff61c07033b13118?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "re-seq", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f5b"} {:created-at 1329986664000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.string", :name "split-lines", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521f5c"} {:created-at 1519238766963, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "trim", :ns "clojure.string"}, :_id "5a8dbe6ee4b0316c0f44f8da"} {:created-at 1612477021984, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "join", :ns "clojure.string"}, :_id "601c725de4b0b1e3652d7447"}], :line 219, :examples [{:author {:avatar-url "https://avatars.githubusercontent.com/u/142529?v=3", :account-source "github", :login "nipra"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"} {:avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3", :account-source "github", :login "cloojure"} {:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"}], :body "user=> (require '[clojure.string :as str])\n\nuser=> (str/split \"Clojure is awesome!\" #\" \")\n[\"Clojure\" \"is\" \"awesome!\"]\n\nuser=> (str/split \"q1w2e3r4t5y6u7i8o9p0\" #\"\\d+\")\n[\"q\" \"w\" \"e\" \"r\" \"t\" \"y\" \"u\" \"i\" \"o\" \"p\"]\n\n;; Note that the 'limit' arg is the maximum number of strings to\n;; return (not the number of splits)\nuser=> (str/split \"q1w2e3r4t5y6u7i8o9p0\" #\"\\d+\" 5)\n[\"q\" \"w\" \"e\" \"r\" \"t5y6u7i8o9p0\"]\n\n;; to get back all the characters of a string, as a vector of strings:\nuser=> (str/split \" q1w2 \" #\"\")\n[\" \" \"q\" \"1\" \"w\" \"2\" \" \"]\n;; Note: sequence, in contrast, would return characters.\n\n;; Using lookarounds (lookahead, lookbehind) one can keep the matching characters:\nuser=> (str/split \" something and ACamelName \" #\"(?=[A-Z])\")\n[\" something and \" \"A\" \"Camel\" \"Name \"]\n\n;; If the pattern is not found, we get back the original string untouched:\nuser=> (str/split \"a\" #\"b\")\n[\"a\"]\n\nuser=> (str/split \" \" #\"b\")\n[\" \"]\n\nuser=> (str/split \"\" #\"b\")\n[\"\"]\n\n;; If everything matches, an empty vector is returned!\nuser=> (str/split \"a\" #\"a\")\n[]\n\nuser=> (str/split \"aaa\" #\"a\")\n[]\n\n;; but:\nuser=> (str/split \"\" #\"\")\n[\"\"]", :created-at 1279388024000, :updated-at 1519255116562, :_id "542692d0c026201cdc326efb"} {:author {:login "Santosh", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/851ccd369a1501c72f5e08af19ff9dc1?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; Splits a string on space character and joins \n;; the resulting collection with a line feed character\n\n(use '[clojure.string :only (join split)])\n\nuser=> (println\n (join \"\\n\"\n (split \"The Quick Brown Fox\" #\"\\s\")))\nThe\nQuick\nBrown\nFox\nnil", :created-at 1286103685000, :updated-at 1286115074000, :_id "542692d0c026201cdc326efe"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"} {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "(use '[clojure.string :only (split triml)])\n\n;; Splitting on whitespace is a common desire.\nuser=> (split \"Some words to split\" #\"\\s+\")\n[\"Some\" \"words\" \"to\" \"split\"]\n\n;; By using the pattern #\"\\s+\", we split on all occurrences of one or\n;; more consecutive whitespace characters.\nuser=> (split \"Some words with\\tother whitespace \\n\" #\"\\s+\")\n[\"Some\" \"words\" \"with\" \"other\" \"whitespace\"]\n\n;; If you are used to Perl's special behavior of split(' ', $str),\n;; where it ignores leading whitespace in the string to be split, this\n;; does not quite do it.\nuser=> (split \" Leading whitespace causes empty first string\" #\"\\s+\")\n[\"\" \"Leading\" \"whitespace\" \"causes\" \"empty\" \"first\" \"string\"]\n\n;; This will do it.\nuser=> (defn perl-split-on-space [s]\n (split (triml s) #\"\\s+\"))\n#'user/perl-split-on-space\nuser=> (perl-split-on-space \" This is often what you want \")\n[\"This\" \"is\" \"often\" \"what\" \"you\" \"want\"]\n\n;; There might be cases where you want this instead.\nuser=> (split \"Some words with\\tother whitespace \\n\" #\"\\s\")\n[\"Some\" \"\" \"\" \"\" \"words\" \"\" \"\" \"with\" \"other\" \"whitespace\"]\n", :created-at 1323918291000, :updated-at 1324028976000, :_id "542692d7c026201cdc32710c"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body "(use '[clojure.string :only (split)])\n\n;; Split on every occurrence of : character\nuser=> (split \"root:*:0:0:admin:/var/root:/bin/sh\" #\":\")\n[\"root\" \"*\" \"0\" \"0\" \"admin\" \"/var/root\" \"/bin/sh\"]\n\n;; Empty strings are returned when two colons appear consecutively in\n;; the string to be split.\nuser=> (split \"root::0:0::/var/root:/bin/sh\" #\":\")\n[\"root\" \"\" \"0\" \"0\" \"\" \"/var/root\" \"/bin/sh\"]\n\n;; Without specifying a limit, any empty strings at the end are\n;; omitted.\nuser=> (split \"root::0:0:admin:/var/root:\" #\":\")\n[\"root\" \"\" \"0\" \"0\" \"admin\" \"/var/root\"]\nuser=> (split \"root::0:0:admin::\" #\":\")\n[\"root\" \"\" \"0\" \"0\" \"admin\"]\n\n;; If you want all of the fields, even trailing empty ones, use a\n;; negative limit.\nuser=> (split \"root::0:0:admin:/var/root:\" #\":\" -1)\n[\"root\" \"\" \"0\" \"0\" \"admin\" \"/var/root\" \"\"]\nuser=> (split \"root::0:0:admin::\" #\":\" -1)\n[\"root\" \"\" \"0\" \"0\" \"admin\" \"\" \"\"]\n\n;; Use a positive limit of n to limit the maximum number of strings in\n;; the return value to n. If it returns exactly n strings, the last\n;; contains everything left over after splitting off the n-1 earlier\n;; strings.\nuser=> (split \"root::0:0:admin:/var/root:\" #\":\" 2)\n[\"root\" \":0:0:admin:/var/root:\"]\nuser=> (split \"root::0:0:admin:/var/root:\" #\":\" 3)\n[\"root\" \"\" \"0:0:admin:/var/root:\"]\nuser=> (split \"root::0:0:admin:/var/root:\" #\":\" 4)\n[\"root\" \"\" \"0\" \"0:admin:/var/root:\"]\nuser=> (split \"root::0:0:admin:/var/root:\" #\":\" 15)\n[\"root\" \"\" \"0\" \"0\" \"admin\" \"/var/root\" \"\"]\n", :created-at 1323918517000, :updated-at 1323918517000, :_id "542692d7c026201cdc327110"} {:author {:login "octopusgrabbus", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/fd31b8bcea99fa7b0711fbc424587774?r=PG&default=identicon"}, :editors [], :body "(:require [clojure.string :as cstr])\n\n(def legal-ref \"1321-61\")\n\n(cstr/split legal-ref #\"-\")\n[\"1321\" \"61\"]", :created-at 1358660615000, :updated-at 1358660615000, :_id "542692d7c026201cdc327111"} {:author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :editors [], :body ";; Note: See clojure.core/subs for discussion of behavior of substrings\n;; holding onto references of the original strings, which can\n;; significantly affect your memory usage in some cases.", :created-at 1379040081000, :updated-at 1379040081000, :_id "542692d7c026201cdc327112"} {:updated-at 1519238946118, :created-at 1519238946118, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :body ";; Note: see clojure.string/trim for an example where\n;; (split ... #\"\\s\") might not do what you expect!", :_id "5a8dbf22e4b0316c0f44f8db"} {:updated-at 1601051069239, :created-at 1601051069239, :author {:login "themustafabasit", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/24441401?v=4"}, :body "(let [response {:headers {\"authorization\" \"Token /VwzFIKzVgFOZUeykendtzbKRS/uUvBtfF+LjYB0XRI=\"\n \"host\" \"localhost:7000\"}}]\n (-> response\n :headers\n (get \"authorization\")\n (clojure.string/split #\"\\s\")\n second))\n;; => /VwzFIKzVgFOZUeykendtzbKRS/uUvBtfF+LjYB0XRI=", :_id "5f6e19bde4b0b1e3652d73c1"}], :notes [{:updated-at 1280043062000, :body "user=> (clojure.string/split \"foo bar\")\r\njava.lang.ClassNotFoundException: clojure.string\r\n\r\nDo I need to require / use anything?", :created-at 1280043062000, :author {:login "Jacolyte", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1703a0c3ed358b787f4b1bf3b2799472?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f89"} {:updated-at 1284342879000, :body "You need to add a namespace:\r\nuser => (use 'clojure.string)", :created-at 1284342879000, :author {:login "rustem.suniev", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e2051c4ebaaa8c22fa9c0bb2f32f64fd?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521f95"} {:updated-at 1306110858000, :body "I 've a doubt...in ruby if I've this:\r\n\r\nbignumber=\"2938434\"\r\n\r\nI can do this\r\n\r\nbignumber.split(\"\") \r\n\r\nand get\r\n(\"2\", \"9\", \"3\", \"8\" .....)\r\n\r\nHow can I do this with clojure?...thanks", :created-at 1306110858000, :author {:login "cocoOS", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/8be1592fe29f2a7ac4e9e6ad683baaa1?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fbc"} {:updated-at 1315397601000, :body "Hi, cocoOS. You may want to do it like this:\r\n\r\n
    user=> (use '[clojure.string :only (split)])\r\nnil\r\nuser=> (def bignumber \"2938434\")\r\n#'user/bignumber\r\nuser=> (split bignumber #\"\")\r\n[\"\" \"2\" \"9\" \"3\" \"8\" \"4\" \"3\" \"4\"]\r\n
    \r\n\r\nYou will have to filter out the empty string.\r\n\r\n
    \r\n\r\nBut there are other ways, like:\r\n
    user=> (map str (vec bignumber))\r\n(\"2\" \"9\" \"3\" \"8\" \"4\" \"3\" \"4\")\r\n
    ", :created-at 1315395310000, :author {:login "Domon", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3fe8ae238c14d716a9fc16734a70765b?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fc9"} {:updated-at 1338786357000, :body "
    \r\nuser=> (seq \"2938434\")\r\n(\\2 \\9 \\3 \\8 \\4 \\3 \\4)\r\n
    \r\n\r\nmight also be what you want.", :created-at 1338786357000, :author {:login "Iceland_jack", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/c889e0a95a3bb07f90ab28ad442f1127?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fe2"} {:updated-at 1365500709000, :body "Thanks for the help Domon and Iceland_jack, one more question:\r\n\r\nSay I have used sequence in the way:\r\n\r\nuser=> (seq \"2938434\")\r\n(\\2 \\9 \\3 \\8 \\4 \\3 \\4)\r\n\r\nIf I only wanted to access the 4th item in the sequence (which is 8), how would I do so? Aside from using (next (next (next ...))) ? Just trying to index it giving that I want position 4", :created-at 1365500563000, :author {:login "Instinct212", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/2f71c013847ef7da0e6cf8ea7a2dec62?r=PG&default=identicon"}, :_id "542692edf6e94c6970522000"} {:body "When limit=1 the original string is returned\n\n
    \n(clojure.string/split \"abcd\" #\"a\" 1)\n=> [\"abcd\"]\n\n(clojure.string/split \"abcd\" #\"a\" 2)\n=> [\"\" \"bcd\"]\n
    ", :created-at 1419810351540, :updated-at 1419810380767, :author {:login "olivergeorge", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/99447?v=3"}, :_id "54a0962fe4b09260f767ca81"} {:body "@Instinct212\n
    \n(nth (seq \"2938434\") 3)\n=> \\8\n
    ", :created-at 1448240477083, :updated-at 1448240508295, :author {:avatar-url "https://avatars.githubusercontent.com/u/1740215?v=3", :account-source "github", :login "Yuhta"}, :_id "5652655de4b0538444398274"} {:author {:login "rux", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/11169?v=3"}, :updated-at 1489061703747, :created-at 1489061357001, :body "There is a change in behaviour between Java 7 and Java 8 that can affect the returned values. \"When there is a positive-width match at the beginning of this string then an empty leading substring is included at the beginning of the resulting array. A zero-width match at the beginning however never produces such empty leading substring.\" was added to the docs for split().\n\nBoth run with Clojure 1.8, the code below splits a string based on capital letters, but...\n\nin Java 7\n\n
    (clojure.string/split \"PrimaryEmailAddr\" #\"(?=[A-Z])\")\n=> [\"\" \"Primary\" \"Email\" \"Addr\"]
    \n\n⁠⁠⁠in Java 8\n\n
    (clojure.string/split \"PrimaryEmailAddr\" #\"(?=[A-Z])\")\n=> [\"Primary\" \"Email\" \"Addr\"]
    ", :_id "58c145ede4b01f4add58fe71"}], :arglists ["s re" "s re limit"], :doc "Splits string on a regular expression. Optional argument limit is\n the maximum number of splits. Not lazy. Returns vector of the splits.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/split"} {:added "1.2", :ns "clojure.string", :name "trimr", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1289214850000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "trim", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ad1"} {:created-at 1289214855000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "triml", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521ad2"}], :line 263, :examples [{:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [], :body "(use 'clojure.string)\n(trimr \" my string \")\n=> \" my string\"", :created-at 1289214835000, :updated-at 1289214835000, :_id "542692d0c026201cdc326f07"} {:editors [{:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}], :body ";; Note: see an example at trim for the differences between\n;; \"whitespace\" for trim/trimr/triml and \n;; \"whitespace\" for regex (\\s)", :author {:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"}, :created-at 1519239707456, :updated-at 1519240323449, :_id "5a8dc21be4b0316c0f44f8de"}], :notes nil, :tag "java.lang.String", :arglists ["s"], :doc "Removes whitespace from the right side of string.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/trimr"} {:added "1.8", :ns "clojure.string", :name "index-of", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1472459205219, :author {:login "hatappo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1096084?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "last-index-of", :ns "clojure.string"}, :_id "57c3f1c5e4b0709b524f04da"}], :line 318, :examples [{:updated-at 1472460796969, :created-at 1472458615566, :author {:login "hatappo", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1096084?v=3"}, :body "(use '[clojure.string :only [index-of]])\n\n(index-of \"ababc\" \"\")\n;;=> 0\n\n(index-of \"ababc\" \"a\")\n;;=> 0\n\n(index-of \"ababc\" \"ab\")\n;;=> 0\n\n(index-of \"ababc\" \"ab\" 1)\n;;=> 2\n\n(index-of \"ababc\" \"abc\")\n;;=> 2\n\n(index-of \"ababc\" \"abcd\")\n;;=> nil\n\n(index-of \"ababc\" \\c)\n;;=> 4\n\n\n;; same as .indexOf method\n\n(.indexOf \"ababc\" \"ab\")\n;;=> 0\n\n(.indexOf \"ababc\" \"ab\" 1)\n;;=> 2\n\n\n;; different from .indexOf method\n\n(.indexOf \"ababc\" \"abcd\")\n;;=> -1\n\n(.indexOf \"ababc\" \\c)\n;;=> IllegalArgumentException No matching method found: indexOf for class java.lang.String clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:80)\n\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/1096084?v=3", :account-source "github", :login "hatappo"}], :_id "57c3ef77e4b0709b524f04d7"} {:updated-at 1535012531564, :created-at 1535012531564, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Also works with other java.lang.CharSequence impls:\n\n(import 'java.lang.StringBuffer)\n(require '[clojure.string :as s])\n\n(s/index-of (StringBuffer. \"Bonjure Clojure\") \\j)\n;; 3", :_id "5b7e6eb3e4b00ac801ed9e6d"}], :notes nil, :arglists ["s value" "s value from-index"], :doc "Return index of value (string or char) in s, optionally searching\n forward from from-index. Return nil if value not found.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/index-of"} {:added "1.2", :ns "clojure.string", :name "trim", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1285923170000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "triml", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521de0"} {:created-at 1285923176000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "trimr", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521de1"} {:created-at 1285923182000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "trim-newline", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521de2"}], :line 234, :examples [{:author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :editors [{:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"} {:login "biggert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4029296?v=3"}], :body ";; Trim basically does what you'd expect. What the doc string\n;; does not tell you however is that:\n;; - null will cause an error\n;; - non-string parameters will cause an error\n\n(use 'clojure.string)\nuser=> (trim \" a \")\n\"a\"\nuser=> (trim nil) \njava.lang.NullPointerException (NO_SOURCE_FILE:0)\nuser=> (trim 1.1)\njava.lang.Double cannot be cast to java.lang.CharSequence\nuser=> (trim [1 2 3])\nclojure.lang.PersistentVector cannot be cast to java.lang.CharSequence\n", :created-at 1285923161000, :updated-at 1428428016646, :_id "542692d0c026201cdc326ef7"} {:editors [{:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}], :body ";; trim might not do what you expect\n;; if your string starts/ends with 'separator' ascii control codes.\n\n;; This is because these characters are treated as\n;; whitespace in trim (and trimr and triml), but\n;; non-whitespace in the regex #\"\\s\" (and \\S).\n\n;; In other words either you believe they are whitespaces or not whitespaces,\n;; you can be surprised when using trim/trimr/triml or when using #\"\\s\" or #\"\\S\":\n;; \"whitespace\" for trim is NOT the same as\n;; \"whitespace\" for \\s.\n\n(use 'clojure.string)\n\n(trim \"a \\u001F\")\n=> \"a\"\n\nbut\n\n(split \"a \\u001F\" #\"\\s+\")\n=> [\"a\" \"\\u001F\"]\n;; instead of [\"a\"], that could be expected based on trim's behaviour\n\n;; The exact list of these special \"characters\":\n;; Dec Hex (UTF-8) Unicode (UTF-16BE) Clojure Name Abbreviation\n;; 28 1C U+001C '\\u001C' File separator FS\n;; 29 1D U+001D '\\u001D' Group separator GS\n;; 30 1E U+001E '\\u001E' Record separator RS\n;; 31 1F U+001F '\\u001F' Unit separator US\n\n;; Background: Clojure's trim uses Java Character's isWhitespace,\n;; that has its own definition of whitespace,\n;; that differs from the definition of whitespace in the \\s\n;; \"whitespace character class\" of Java regex.\n\n;; References:\n;; Clojure trim's source: \n;; https://clojure.github.io/clojure/clojure.string-api.html#clojure.string/trim\n;; Java Character's isWhitespace: \n;; https://docs.oracle.com/javase/8/docs/api/java/lang/Character.html#isWhitespace-char-\n;; Java's \\s whitespace character class: \n;; https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html\n", :author {:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"}, :created-at 1519238263932, :updated-at 1519240206703, :_id "5a8dbc77e4b0316c0f44f8d9"} {:editors [{:login "saitouena", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/40712240?v=4"}], :body ";; No-Break Space \\u00a0 will not be trimmed.\n;; str/replace can be used for No-Break Space\n(str/replace s \"\\u00a0\" \"\")\n\n;; for inspection of codepoint for i-th char of string\n(int (nth (seq s) i))", :author {:avatar-url "https://avatars3.githubusercontent.com/u/40712240?v=4", :account-source "github", :login "saitouena"}, :created-at 1573620092287, :updated-at 1573620157344, :_id "5dcb897ce4b0ca44402ef7dc"}], :notes nil, :tag "java.lang.String", :arglists ["s"], :doc "Removes whitespace from both ends of string.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/trim"} {:added "1.2", :ns "clojure.string", :name "triml", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1285923245000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "trim", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d6c"} {:created-at 1285923254000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "trim-newline", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d6d"} {:created-at 1285923266000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :to-var {:ns "clojure.string", :name "trimr", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d6e"}], :line 251, :examples [{:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [], :body "(use 'clojure.string)\n(triml \" my string \")\n=> \"my string \"\n", :created-at 1289214918000, :updated-at 1289214918000, :_id "542692d0c026201cdc326f0a"} {:updated-at 1519240299402, :created-at 1519239323396, :author {:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}, :body ";; Note: see an example at trim for the differences between\n;; \"whitespace\" for trim/trimr/triml and \n;; \"whitespace\" for regex (\\s)", :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"}], :_id "5a8dc09be4b0316c0f44f8dc"}], :notes nil, :tag "java.lang.String", :arglists ["s"], :doc "Removes whitespace from the left side of string.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/triml"} {:added "1.2", :ns "clojure.string", :name "blank?", :file "clojure/string.clj", :type "function", :column 1, :see-alsos [{:created-at 1462633178615, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "trim", :ns "clojure.string"}, :_id "572e02dae4b0b27c121b214e"} {:created-at 1462633189164, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "triml", :ns "clojure.string"}, :_id "572e02e5e4b0b27c121b214f"} {:created-at 1462633194787, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "trimr", :ns "clojure.string"}, :_id "572e02eae4b0b27c121b2150"}], :line 287, :examples [{:updated-at 1496318959321, :created-at 1293672606000, :body "user> (clojure.string/blank? nil)\ntrue\n\nuser> (clojure.string/blank? \"\")\ntrue\n\nuser> (clojure.string/blank? \" \")\ntrue\n\nuser> (clojure.string/blank? \" a \")\nfalse\n\nuser> (clojure.string/blank? false)\ntrue\n\nuser> (clojure.string/blank? \"\\n\")\ntrue", :editors [{:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"} {:login "Azd325", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/426541?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon", :account-source "clojuredocs", :login "dakrone"}, :_id "542692d1c026201cdc326f17"} {:editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :body ";; A way to remove blanks from a string.\n(def astr \"This contains blanks \\n \\t \\r and other whitespace\")\n(->> astr \n (#(clojure.string/split % #\"\\s\")) \n (remove clojure.string/blank?) \n (clojure.string/join \" \"))\n\n;;=> \"This contains blanks and other whitespace\"\n\n;; Of course the task can be better performed other ways.\n;; The goal here is just to show how blank? works.\n(clojure.string/replace (clojure.string/trim astr) #\"\\s{2,}\" \" \")", :author {:avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4", :account-source "github", :login "phreed"}, :created-at 1526574308467, :updated-at 1526574971727, :_id "5afdace4e4b045c27b7fac69"} {:updated-at 1535021760000, :created-at 1535019305646, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; The list of the 25 whitespace chars in UTF-16. Using the \\uNNNN hex code\n;; when another representation is not available or not printable.\n;; \\u0020 is the common white space, AKA \" \" or '\\space' as a single char.\n\n(require '[clojure.string :as s])\n\n(s/blank? \"\\t \\n \\u000b \\f \\r \\u001c \\u001d \\u001e \\u001f\") ;; true\n(s/blank? \"\\u0020 \\u1680 \\u2000 \\u2001 \\u2002 \\u2003\") ;; true\n(s/blank? \"\\u2004 \\u2005 \\u2006 \\u2008 \\u2009\") ;; true\n(s/blank? \"\\u200a \\u2028 \\u2029 \\u205f \\u3000\") ;; true", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5b7e8929e4b00ac801ed9e6e"}], :notes nil, :arglists ["s"], :doc "True if s is nil, empty, or contains only whitespace.", :library-url "https://github.com/clojure/clojure", :href "/clojure.string/blank_q"} {:ns "clojure.template", :name "do-template", :file "clojure/template.clj", :type "macro", :column 1, :see-alsos nil, :line 45, :examples [{:updated-at 1339250655000, :created-at 1280117904000, :body ";; Because it is expanded at compile time, you can also use special \n;; forms as in full blown macros:\n\nuser=> (use 'clojure.template)\nuser=> (do-template [a b] (def a b) d 1 e 2 f 3)\n#'user/f\nuser=> d\n1\nuser=> e\n2\nuser=> f\n3\n\n;; and if you are curious why\nuser=> (use 'clojure.walk)\nuser=> (macroexpand-all '(do-template [a b] (def a b) d 1 e 2 f 3))\n(do (def d 1) (def e 2) (def f 3))\n\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}], :author {:avatar-url "https://www.gravatar.com/avatar/10b2fd3c0a4cc46dc241a48468dc551?r=PG&default=identicon", :account-source "clojuredocs", :login "pkolloch"}, :_id "542692d1c026201cdc326f19"}], :macro true, :notes nil, :arglists ["argv expr & values"], :doc "Repeatedly copies expr (in a do block) for each group of arguments\n in values. values are automatically partitioned by the number of\n arguments in argv, an argument vector as in defn.\n\n Example: (macroexpand '(do-template [x y] (+ y x) 2 4 3 5))\n ;=> (do (+ 4 2) (+ 5 3))", :library-url "https://github.com/clojure/clojure", :href "/clojure.template/do-template"} {:ns "clojure.template", :name "apply-template", :file "clojure/template.clj", :type "function", :column 1, :see-alsos [{:created-at 1347013502000, :author {:login "siteshen", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/a50fd1fe168786443e5fe62560ed03e8?r=PG&default=identicon"}, :to-var {:ns "clojure.template", :name "do-template", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dc1"}], :line 30, :examples [{:author {:login "sunil.nandihalli", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3b7fcae9384271fb8ca8cd0c612bebf3?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body "user=> (apply-template '[a b c d e] '[d a b e c e b a d] '(1 2 3 4 5))\n[4 1 2 5 3 5 2 1 4] \n\nuser=> (apply-template '[a b c d e] '[d a b e c e b a d] '(1 [2 3] [4 5]))\n[d 1 [2 3] e [4 5] e [2 3] 1 d]", :created-at 1287072285000, :updated-at 1287673447000, :_id "542692d1c026201cdc326f1c"}], :notes nil, :arglists ["argv expr values"], :doc "For use in macros. argv is an argument list, as in defn. expr is\n a quoted expression using the symbols in argv. values is a sequence\n of values to be used for the arguments.\n\n apply-template will recursively replace argument symbols in expr\n with their corresponding values, returning a modified expr.\n\n Example: (apply-template '[x] '(+ x x) '[2])\n ;=> (+ 2 2)", :library-url "https://github.com/clojure/clojure", :href "/clojure.template/apply-template"} {:added "1.1", :ns "clojure.test", :name "are", :file "clojure/test.clj", :type "macro", :column 1, :see-alsos [{:created-at 1281856914000, :author {:login "looselytyped", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9bfc2e772db334c8b8516c86b9da7a0c?r=PG&default=identicon"}, :to-var {:ns "clojure.test", :name "is", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c6f"} {:created-at 1330170936000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.test", :name "deftest", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c70"} {:created-at 1541172463126, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "do-template", :ns "clojure.template"}, :_id "5bdc6cefe4b00ac801ed9eeb"}], :line 572, :examples [{:author {:login "looselytyped", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/9bfc2e772db334c8b8516c86b9da7a0c?r=PG&default=identicon"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}], :body ";; An alternate to the example in the documentation is \n\nuser=> (are [result arg-map] (= result (+ (:x arg-map) (:y arg-map)))\n 5 {:x 2 :y 3},\n 10 {:x 6 :y 4})\n\n\n", :created-at 1281856669000, :updated-at 1285494663000, :_id "542692d1c026201cdc326f27"}], :macro true, :notes nil, :arglists ["argv expr & args"], :doc "Checks multiple assertions with a template expression.\n See clojure.template/do-template for an explanation of\n templates.\n\n Example: (are [x y] (= x y) \n 2 (+ 1 1)\n 4 (* 2 2))\n Expands to: \n (do (is (= 2 (+ 1 1)))\n (is (= 4 (* 2 2))))\n\n Note: This breaks some reporting features, such as line numbers.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/are"} {:added "1.1", :ns "clojure.test", :name "test-all-vars", :file "clojure/test.clj", :type "function", :column 1, :see-alsos nil, :line 737, :examples nil, :notes nil, :arglists ["ns"], :doc "Calls test-vars on every var interned in the namespace, with fixtures.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/test-all-vars"} {:added "1.1", :ns "clojure.test", :name "test-var", :file "clojure/test.clj", :type "function", :column 1, :see-alsos nil, :dynamic true, :line 708, :examples nil, :notes nil, :arglists ["v"], :doc "If v has a function in its :test metadata, calls that function,\n with *testing-vars* bound to (conj *testing-vars* v).", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/test-var"} {:added "1.2", :ns "clojure.test", :name "do-report", :file "clojure/test.clj", :type "function", :column 1, :see-alsos nil, :line 351, :examples nil, :notes nil, :arglists ["m"], :doc "Add file and line information to a test result and call report.\n If you are writing a custom assert-expr method, call this function\n to pass test results to report.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/do-report"} {:added "1.1", :ns "clojure.test", :name "run-all-tests", :file "clojure/test.clj", :type "function", :column 1, :see-alsos [{:created-at 1417800372343, :author {:login "fordsfords", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7671908?v=3"}, :to-var {:ns "clojure.test", :name "run-tests", :library-url "https://github.com/clojure/clojure"}, :_id "5481eab4e4b0dc573b892fec"} {:created-at 1418219288042, :author {:login "fordsfords", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7671908?v=3"}, :to-var {:ns "clojure.core", :name "re-matches", :library-url "https://github.com/clojure/clojure"}, :_id "54884f18e4b04e93c519ffa2"}], :line 780, :examples [{:body ";; assuming current namespace is user\n(use 'clojure.test)\n(deftest eg-tests (is (= 1 1)))\n(run-all-tests)\n;;=> ... visits very many namespaces looking for tests to run\n;;=> {:type :summary, :fail 0, :error 0, :pass 1, :test 1}\n\n(run-all-tests #\"us.*\") ; only matches \"user\"\n;;=> Testing user\n;;=> Ran 1 tests containing 1 assertions.\n;;=> 0 failures, 0 errors.\n;;=> {:type :summary, :fail 0, :error 0, :pass 1, :test 1}\n", :author {:login "fordsfords", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7671908?v=3"}, :created-at 1417800504449, :updated-at 1417800504449, :_id "5481eb38e4b0dc573b892fed"}], :notes [{:author {:login "PEZ", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/30010?v=4"}, :updated-at 1605766888964, :created-at 1605766888964, :body "In ClojureScript this is a macro. The optional regular expression must be a literal.\n\n```clojure\n(let [rp (re-pattern \"foo\")] (cljs.test/run-all-tests rp))\n;;=> clojure.lang.ExceptionInfo: clojure.lang.Symbol cannot be cast to java.util.regex.Pattern\n```", :_id "5fb60ee8e4b0b1e3652d740e"}], :arglists ["" "re"], :doc "Runs all tests in all namespaces; prints results.\n Optional argument is a regular expression; only namespaces with\n names matching the regular expression (with re-matches) will be\n tested.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/run-all-tests"} {:added "1.1", :ns "clojure.test", :name "assert-any", :file "clojure/test.clj", :type "function", :column 1, :see-alsos nil, :line 455, :examples nil, :notes nil, :arglists ["msg form"], :doc "Returns generic assertion code for any test, including macros, Java\n method calls, or isolated symbols.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/assert-any"} {:added "1.1", :ns "clojure.test", :name "testing-contexts-str", :file "clojure/test.clj", :type "function", :column 1, :see-alsos nil, :line 307, :examples nil, :notes nil, :arglists [""], :doc "Returns a string representation of the current test context. Joins\n strings in *testing-contexts* with spaces.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/testing-contexts-str"} {:added "1.1", :ns "clojure.test", :name "file-position", :file "clojure/test.clj", :type "function", :column 1, :see-alsos nil, :line 282, :examples [{:updated-at 1534514881886, :created-at 1534514881886, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/1334295?v=4"}, :body "(clojure.test/file-position 0)\n; => [\"test.clj\" 282]\n\n(take 5 (map clojure.test/file-position (range)))\n; => ([\"test.clj\" 282]\n; [\"test.clj\" 282]\n; [\"core.clj\" 2747]\n; [\"LazySeq.java\" 40]\n; [\"LazySeq.java\" 49])\n", :_id "5b76d6c1e4b00ac801ed9e64"}], :deprecated "1.2", :notes nil, :arglists ["n"], :doc "Returns a vector [filename line-number] for the nth call up the\n stack.\n\n Deprecated in 1.2: The information needed for test reporting is\n now on :file and :line keys in the result map.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/file-position"} {:added "1.1", :ns "clojure.test", :name "testing", :file "clojure/test.clj", :type "macro", :column 1, :see-alsos [{:created-at 1289286950000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.test", :name "is", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c2c"} {:created-at 1330170963000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.test", :name "deftest", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c2d"}], :line 597, :examples [{:updated-at 1567775824694, :created-at 1289286946000, :body "(:use 'clojure.test)\n\n; nest within `deftest` in source file\n(testing \"Arithmetic\"\n (testing \"with positive integers\"\n (is (= 4 (+ 2 2)))\n (is (= 7 (+ 3 4))))\n (testing \"with negative integers\"\n (is (= -4 (+ -2 -2)))\n (is (= -1 (+ 3 -4)))))\n=> true\n\n\n---------------------------------------------------------------------------\n\n; nest within `deftest` in source file\n(testing \"Arithmetic\"\n (testing \"with positive integers\"\n (is (= 4 (+ 2 2)))\n (is (= 7 (+ 3 4))))\n (testing \"with negative integers\"\n (is (= -5 (+ -2 -2))) ;error here\n (is (= -1 (+ 3 -4)))))\n\n=> FAIL in clojure.lang.PersistentList$EmptyList@1 (NO_SOURCE_FILE:641)\nArithmetic with negative integers ;bread crumb trail\nexpected: (= -5 (+ -2 -2))\n actual: (not (= -5 -4))\ntrue", :editors [{:avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon", :account-source "clojuredocs", :login "boxie"} {:avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon", :account-source "clojuredocs", :login "boxie"} {:login "cloojure", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/7083783?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon", :account-source "clojuredocs", :login "boxie"}, :_id "542692d1c026201cdc326f23"} {:updated-at 1477945021201, :created-at 1477945021201, :author {:login "freckletonj", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8399149?v=3"}, :body ";; this is also valid:\n\n(deftest alternate-use\n (testing \"test a vector of `is`\"\n [(is true)\n (is true)\n (is true)]))\n\n;; which is useful in the following example:\n(defn with-resource [f]\n (setup)\n (f \"expected\")\n (breakdown))\n\n(deftest alternate-use\n (testing \"test a vector of `is`\"\n (with-resource\n (fn [resource]\n [(is (= \"expected\" resource))]))))", :_id "5817a6bde4b024b73ca35a20"}], :macro true, :notes nil, :arglists ["string & body"], :doc "Adds a new string to the list of testing contexts. May be nested,\n but must occur inside a test function (deftest).", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/testing"} {:added "1.1", :ns "clojure.test", :name "join-fixtures", :file "clojure/test.clj", :type "function", :column 1, :see-alsos [{:created-at 1339790151000, :author {:login "mnicky", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/be261a601929eaf8eda9e1420b4781f9?r=PG&default=identicon"}, :to-var {:ns "clojure.test", :name "use-fixtures", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c69"} {:created-at 1339790157000, :author {:login "mnicky", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/be261a601929eaf8eda9e1420b4781f9?r=PG&default=identicon"}, :to-var {:ns "clojure.test", :name "compose-fixtures", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c6a"}], :line 696, :examples nil, :notes nil, :arglists ["fixtures"], :doc "Composes a collection of fixtures, in order. Always returns a valid\n fixture function, even if the collection is empty.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/join-fixtures"} {:added "1.1", :ns "clojure.test", :name "set-test", :file "clojure/test.clj", :type "macro", :column 1, :see-alsos nil, :line 648, :examples nil, :macro true, :notes nil, :arglists ["name & body"], :doc "Experimental.\n Sets :test metadata of the named var to a fn with the given body.\n The var must already exist. Does not modify the value of the var.\n\n When *load-tests* is false, set-test is ignored.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/set-test"} {:added "1.1", :ns "clojure.test", :name "get-possibly-unbound-var", :file "clojure/test.clj", :type "function", :column 1, :see-alsos nil, :line 416, :examples nil, :notes nil, :arglists ["v"], :doc "Like var-get but returns nil if the var is unbound.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/get-possibly-unbound-var"} {:ns "clojure.test", :name "assert-expr", :file "clojure/test.clj", :type "var", :column 1, :see-alsos [{:created-at 1561677525480, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "report", :ns "clojure.test"}, :_id "5d154ed5e4b0ca44402ef776"}], :line 476, :examples [{:updated-at 1561677432836, :created-at 1561676459536, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; \"assert-expr\" is a multimethod that can be used \n;; to register additional predicates for assert expression.\n;; The following adds a \"roughly\" predicate to check\n;; for numeric equivalence with some tolerance of decimal digits.\n\n(require '[clojure.test :refer [is deftest] :as t])\n\n(defmethod t/assert-expr 'roughly [msg form]\n `(let [op1# ~(nth form 1)\n op2# ~(nth form 2)\n tolerance# (if (= 4 ~(count form)) ~(last form) 2)\n decimals# (/ 1. (Math/pow 10 tolerance#))\n result# (< (Math/abs (- op1# op2#)) decimals#)]\n (t/do-report \n {:type (if result# :pass :fail)\n :message ~msg\n :expected (format \"%s should be roughly %s with %s tolerance\" \n op1# op2# decimals#)\n :actual result#})\n result#))\n\n(deftest PI-test\n (is (roughly 3.14 Math/PI 2))\n (is (roughly 3.14 Math/PI 3)))\n\n(t/test-var #'PI-test)\n\nFAIL in (PI-test)\nexpected: \"3.14 should be roughly 3.141592653589793 with 0.001 tolerance\"\n actual: false", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5d154aabe4b0ca44402ef773"}], :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.test/assert-expr"} {:added "1.1", :ns "clojure.test", :name "report", :file "clojure/test.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 324, :examples nil, :notes nil, :arglists [], :doc "Generic reporting function, may be overridden to plug in\n different report formats (e.g., TAP, JUnit). Assertions such as\n 'is' call 'report' to indicate results. The argument given to\n 'report' will be a map with a :type key. See the documentation at\n the top of test_is.clj for more information on the types of\n arguments for 'report'.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/report"} {:added "1.1", :ns "clojure.test", :name "compose-fixtures", :file "clojure/test.clj", :type "function", :column 1, :see-alsos [{:created-at 1515206621681, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/94482?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "join-fixtures", :ns "clojure.test"}, :_id "5a5037dde4b0a08026c48cea"}], :line 689, :examples nil, :notes nil, :arglists ["f1 f2"], :doc "Composes two fixture functions, creating a new fixture function\n that combines their behavior.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/compose-fixtures"} {:added "1.1", :ns "clojure.test", :name "with-test", :file "clojure/test.clj", :type "macro", :column 1, :see-alsos [{:created-at 1289287480000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "test", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bb6"} {:created-at 1289287493000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "meta", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bb7"} {:created-at 1355984959000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.test", :name "deftest", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bb8"}], :line 609, :examples [{:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [], :body ";with test is the same as using {:test #((is...)(is...))} in the meta data of the function.\n\n(:use 'clojure.test)\n\n(with-test\n (defn my-function [x y]\n (+ x y))\n (is (= 4 (my-function 2 2)))\n (is (= 7 (my-function 3 4))))\n\n(test #'my-function) ;(test (var my-function))\n=> :ok", :created-at 1289287473000, :updated-at 1289287473000, :_id "542692d1c026201cdc326f29"}], :macro true, :notes nil, :arglists ["definition & body"], :doc "Takes any definition form (that returns a Var) as the first argument.\n Remaining body goes in the :test metadata function for that Var.\n\n When *load-tests* is false, only evaluates the definition, ignoring\n the tests.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/with-test"} {:added "1.1", :ns "clojure.test", :name "*stack-trace-depth*", :file "clojure/test.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 252, :examples nil, :notes nil, :arglists [], :doc "The maximum depth of stack traces to print when an Exception\n is thrown during a test. Defaults to nil, which means print the \n complete stack trace.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/*stack-trace-depth*"} {:added "1.1", :ns "clojure.test", :name "is", :file "clojure/test.clj", :type "macro", :column 1, :see-alsos [{:created-at 1330170895000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.test", :name "are", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bef"} {:created-at 1330170928000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.test", :name "deftest", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521bf0"} {:created-at 1595376872402, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "testing", :ns "clojure.test"}, :_id "5f1784e8e4b0b1e3652d7324"}], :line 554, :examples [{:author {:login "JonNeale", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/52f685bf4240b827b1486b6551cfcd56?r=PG&default=identicon"}, :editors [{:login "JonNeale", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/52f685bf4240b827b1486b6551cfcd56?r=PG&default=identicon"}], :body "(use '[clojure.test :only [is]])\n\nuser=> (is (true? true))\ntrue\n\n;; false assertions print a message and evaluate to false\n\nuser=> (is (true? false))\nFAIL in clojure.lang.PersistentList$EmptyList@1 (NO_SOURCE_FILE:1)\nexpected: (true? false)\n actual: (not (true? false))\nfalse\n\n", :created-at 1350425559000, :updated-at 1350488982000, :_id "542692d7c026201cdc327114"} {:author {:login "Alan Thompson", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5b677647e3c6fb2bc89fa2f481461b11?r=PG&default=identicon"}, :editors [], :body "; Testing for thrown exceptions\n\n; Verifies that the specified exception is thrown\nuser=> (is (thrown? ArithmeticException (/ 1 0)))\n#\n\n; Verified that the exception is thrown, and that the error message matches the specified regular expression.\nuser=> (is (thrown-with-msg? ArithmeticException #\"Divide by zero\"\n #_=> (/ 1 0)))\n#\nuser=> \n\n", :created-at 1398819305000, :updated-at 1398819305000, :_id "542692d7c026201cdc327116"}], :macro true, :notes nil, :arglists ["form" "form msg"], :doc "Generic assertion macro. 'form' is any predicate test.\n 'msg' is an optional message to attach to the assertion.\n \n Example: (is (= 4 (+ 2 2)) \"Two plus two should be 4\")\n\n Special forms:\n\n (is (thrown? c body)) checks that an instance of c is thrown from\n body, fails if not; then returns the thing thrown.\n\n (is (thrown-with-msg? c re body)) checks that an instance of c is\n thrown AND that the message on the exception matches (with\n re-find) the regular expression re.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/is"} {:ns "clojure.test", :name "*report-counters*", :file "clojure/test.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 262, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.test/*report-counters*"} {:added "1.1", :ns "clojure.test", :name "*load-tests*", :file "clojure/test.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 245, :examples [{:updated-at 1619041908533, :created-at 1619041908533, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/20086?v=4"}, :body ";; Assuming \"mynamespace\" is available from the classpath and\n;; contains a mix of production and test code, the following prevents\n;; macros like \"deftest\" from producing test functions,\n;; removing them from any compiled AOT artifact:\n\n(require '[clojure.test :as t])\n(binding [t/*load-tests* false]\n (compile 'mynamespace))\n", :_id "60809e74e4b0b1e3652d74cd"}], :notes [{:body "In modern times, `*load-tests*` is almost never required, as build tools such as Leiningen or `clojure.tools.deps` enforce a conventional separation of tests from production code, preventing their presence in production artifacts.", :created-at 1619041938259, :updated-at 1619041967134, :author {:avatar-url "https://avatars.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :_id "60809e92e4b0b1e3652d74ce"}], :arglists [], :doc "True by default. If set to false, no test functions will\n be created by deftest, set-test, or with-test. Use this to omit\n tests when compiling or loading production code.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/*load-tests*"} {:added "1.1", :ns "clojure.test", :name "deftest", :file "clojure/test.clj", :type "macro", :column 1, :see-alsos [{:created-at 1289287593000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.test", :name "run-all-tests", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e90"} {:created-at 1289288265000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.test", :name "run-tests", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e91"} {:created-at 1330170918000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.test", :name "is", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e92"} {:created-at 1330170920000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.test", :name "are", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e93"} {:created-at 1330170973000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :to-var {:ns "clojure.test", :name "testing", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e94"} {:created-at 1366152324000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.test", :name "test-var", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e95"}], :line 622, :examples [{:author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :editors [{:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"} {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}], :body ";successful test example\n(ns testing)\n(use 'clojure.test)\n\n\n(deftest addition\n (is (= 4 (+ 2 2)))\n (is (= 7 (+ 3 4))))\n=> #'testing/addition\n\n(deftest subtraction\n (is (= 1 (- 4 3)))\n (is (= 3 (- 7 4))))\n=> #'testing/subtraction\n\n;composing tests\n(deftest arithmetic\n (addition)\n (subtraction))\n=> #'testing/arithmetic\n\n(run-tests 'testing)\n\n=> Testing testing\n\nRan 6 tests containing 10 assertions.\n0 failures, 0 errors.\n{:type :summary, :test 6, :pass 10, :fail 0, :error 0}", :created-at 1280985983000, :updated-at 1289288085000, :_id "542692d1c026201cdc326f1e"} {:author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :editors [{:login "mikebridge", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/517ea04cf362ddc08f107f6ef98a12d9?r=PG&default=identicon"}], :body ";failure test example\n\n;there is nesting, so when a leaf test fails so does its parents, in this example 2 tests fail, though there was only one real error.\n\n(ns testing)\n(use 'clojure.test)\n\n\n(deftest addition\n (is (= 4 (+ 2 2)))\n (is (= 7 (+ 3 4))))\n=> #'testing/addition\n\n(deftest subtraction\n (is (= 1 (- 4 3)))\n (is (= 6 (- 7 4)))) ;error\n=> #'testing/subtraction\n\n;composing tests\n(deftest arithmetic\n (addition)\n (subtraction))\n=> #'testing/arithmetic\n\n(run-tests 'testing)\n\n=> Testing testing\n\nFAIL in (arithmetic subtraction) (NO_SOURCE_FILE:669)\nexpected: (= 6 (- 7 4))\n actual: (not (= 6 3))\n\nFAIL in (subtraction) (NO_SOURCE_FILE:669)\nexpected: (= 6 (- 7 4))\n actual: (not (= 6 3))\n\nRan 6 tests containing 10 assertions.\n2 failures, 0 errors.\n{:type :summary, :test 6, :pass 8, :fail 2, :error 0}", :created-at 1289288235000, :updated-at 1332332244000, :_id "542692d1c026201cdc326f21"}], :macro true, :notes nil, :arglists ["name & body"], :doc "Defines a test function with no arguments. Test functions may call\n other tests, so tests may be composed. If you compose tests, you\n should also define a function named test-ns-hook; run-tests will\n call test-ns-hook instead of testing all vars.\n\n Note: Actually, the test body goes in the :test metadata on the var,\n and the real function (the value of the var) calls test-var on\n itself.\n\n When *load-tests* is false, deftest is ignored.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/deftest"} {:added "1.1", :ns "clojure.test", :name "assert-predicate", :file "clojure/test.clj", :type "function", :column 1, :see-alsos nil, :line 436, :examples nil, :notes nil, :arglists ["msg form"], :doc "Returns generic assertion code for any functional predicate. The\n 'expected' argument to 'report' will contains the original form, the\n 'actual' argument will contain the form with all its sub-forms\n evaluated. If the predicate returns false, the 'actual' form will\n be wrapped in (not...).", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/assert-predicate"} {:added "1.1", :ns "clojure.test", :name "with-test-out", :file "clojure/test.clj", :type "macro", :column 1, :see-alsos nil, :line 273, :examples nil, :macro true, :notes nil, :arglists ["& body"], :doc "Runs body with *out* bound to the value of *test-out*.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/with-test-out"} {:added "1.1", :ns "clojure.test", :name "function?", :file "clojure/test.clj", :type "function", :column 1, :see-alsos [{:created-at 1494538047673, :author {:login "timgilbert", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/94482?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "fn?", :ns "clojure.core"}, :_id "5914d73fe4b01f4add58feb6"}], :line 424, :examples [{:author {:login "dakrone", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bcacd00a7f05c4772329cf9f446c7987?r=PG&default=identicon"}, :editors [], :body "user> (defn foo [] (println \"foo\"))\n#'user/foo\n\nuser> (def bar \"bar\")\n#'user/bar\n\nuser> (clojure.test/function? foo)\ntrue\n\nuser> (clojure.test/function? bar)\nfalse", :created-at 1293673262000, :updated-at 1293673262000, :_id "542692d1c026201cdc326f26"}], :notes nil, :arglists ["x"], :doc "Returns true if argument is a function or a symbol that resolves to\n a function (not a macro).", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/function_q"} {:added "1.1", :ns "clojure.test", :name "deftest-", :file "clojure/test.clj", :type "macro", :column 1, :see-alsos [{:created-at 1289287570000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.test", :name "deftest", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b08"}], :line 639, :examples [{:updated-at 1589047680452, :created-at 1589047680452, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Create normal test functions which are not public in the current\n;; namespace, but evaluates normally when running tests.\n\n(in-ns 'user)\n(require '[clojure.test :refer :all])\n\n(deftest- this-is-not-public\n (is (= 2 (+ 1 1))))\n\n(ns-publics *ns*)\n;; {}\n\n(run-tests)\n;; Testing user\n;; Ran 1 tests containing 1 assertions.\n;; 0 failures, 0 errors.\n;; {:test 1, :pass 1, :fail 0, :error 0, :type :summary}", :_id "5eb6f180e4b087629b5a1909"}], :macro true, :notes nil, :arglists ["name & body"], :doc "Like deftest but creates a private var.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/deftest-"} {:added "1.6", :ns "clojure.test", :name "test-vars", :file "clojure/test.clj", :type "function", :column 1, :see-alsos nil, :line 723, :examples [{:editors [{:login "fdhenard", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/884972?v=4"}], :body "(clojure.test/test-vars [#'the-ns/the-test])\n\n;; credit to this SO answer by Alex Miller: https://stackoverflow.com/a/24974841/59439", :author {:avatar-url "https://avatars2.githubusercontent.com/u/884972?v=4", :account-source "github", :login "fdhenard"}, :created-at 1527161820493, :updated-at 1527161857196, :_id "5b06a3dce4b045c27b7fac77"}], :notes nil, :arglists ["vars"], :doc "Groups vars by their namespace and runs test-vars on them with\n appropriate fixtures applied.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/test-vars"} {:added "1.1", :ns "clojure.test", :name "try-expr", :file "clojure/test.clj", :type "macro", :column 1, :see-alsos [{:created-at 1289460897000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.test", :name "is", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cf6"}], :line 538, :examples [{:editors [{:avatar-url "https://avatars.githubusercontent.com/u/200617?v=3", :account-source "github", :login "bsima"}], :updated-at 1437772493560, :created-at 1415383686022, :author {:avatar-url "https://avatars.githubusercontent.com/u/200617?v=3", :account-source "github", :login "bsima"}, :body "(try-expr \"Can I call this function?\" (= 1 1))\n;; => \"No! I said you don't call this.\" - Rich Hickey", :_id "545d0a86e4b03d20a10242a0"}], :macro true, :notes nil, :arglists ["msg form"], :doc "Used by the 'is' macro to catch unexpected exceptions.\n You don't call this.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/try-expr"} {:added "1.1", :ns "clojure.test", :name "successful?", :file "clojure/test.clj", :type "function", :column 1, :see-alsos nil, :line 789, :examples nil, :notes nil, :arglists ["summary"], :doc "Returns true if the given test summary indicates all tests\n were successful, false otherwise.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/successful_q"} {:added "1.1", :ns "clojure.test", :name "use-fixtures", :file "clojure/test.clj", :type "var", :column 1, :see-alsos [{:created-at 1339790120000, :author {:login "mnicky", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/be261a601929eaf8eda9e1420b4781f9?r=PG&default=identicon"}, :to-var {:ns "clojure.test", :name "join-fixtures", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ceb"} {:created-at 1339790135000, :author {:login "mnicky", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/be261a601929eaf8eda9e1420b4781f9?r=PG&default=identicon"}, :to-var {:ns "clojure.test", :name "compose-fixtures", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cec"}], :line 670, :examples [{:author {:login "benkay", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/21acd4a2c781a436afdb28fead34b76a?r=PG&default=identicon"}, :editors [{:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"} {:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"}], :body "; See https://clojure.github.io/clojure/clojure.test-api.html for details\n\n; my-test-fixture will be passed a fn that will call all your tests \n; (e.g. test-using-db). Here you perform any required setup \n; (e.g. create-db), then call the passed function f, then perform \n; any required teardown (e.g. destroy-db).\n(defn my-test-fixture [f]\n (create-db)\n (f)\n (destroy-db))\n\n; Here we register my-test-fixture to be called once, wrapping ALL tests \n; in the namespace\n(use-fixtures :once my-test-fixture)\n \n; This is a regular test function, which is to be wrapped using my-test-fixture\n(deftest test-using-db\n (is ... \n))", :created-at 1375349400000, :updated-at 1405042589000, :_id "542692d7c026201cdc327117"} {:author {:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"}, :editors [{:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"} {:login "cloojure", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1ad3de25d00d953de6e8c82f554cdbf5?r=PG&default=identicon"}], :body "; This fixture is intended to perform setup/teardown for each individual test in the namespace. Note that it assumes the :once fixture will handle creating/destroying the DB, while we only create/drop tables within the DB.\n(defn another-fixture [f]\n (create-db-table)\n (f)\n (drop-db-table))\n\n; Here we register another-fixture to wrap each test in the namespace\n(use-fixtures :each another-fixture)", :created-at 1405042717000, :updated-at 1405043050000, :_id "542692d7c026201cdc32711a"} {:updated-at 1456028182727, :created-at 1456028130697, :author {:login "charlespwd", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4990691?v=3"}, :body ";; `use-fixtures` supports multiples arguments. \n;; They wrap the tests in order (left-to-right).\n\n;; We define some fixtures that are to be run in order\n(defn with-db [f] \n (start-db)\n (f)\n (stop-db))\n\n(defn with-data [f] \n (fill-db)\n (f)\n (empty-db))\n\n;; Here we register them\n(use-fixtures :once with-db with-data)", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/4990691?v=3", :account-source "github", :login "charlespwd"}], :_id "56c939e2e4b0b41f39d96cd0"}], :notes nil, :arglists [], :doc "Wrap test runs in a fixture function to perform setup and\n teardown. Using a fixture-type of :each wraps every test\n individually, while :once wraps the whole run in a single function.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/use-fixtures"} {:added "1.1", :ns "clojure.test", :name "inc-report-counter", :file "clojure/test.clj", :type "function", :column 1, :see-alsos nil, :line 314, :examples nil, :notes nil, :arglists ["name"], :doc "Increments the named counter in *report-counters*, a ref to a map.\n Does nothing if *report-counters* is nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/inc-report-counter"} {:added "1.1", :ns "clojure.test", :name "testing-vars-str", :file "clojure/test.clj", :type "function", :column 1, :see-alsos nil, :line 294, :examples nil, :notes nil, :arglists ["m"], :doc "Returns a string representation of the current test. Renders names\n in *testing-vars* as a list, then the source file and line of\n current assertion.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/testing-vars-str"} {:ns "clojure.test", :name "*testing-contexts*", :file "clojure/test.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 269, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.test/*testing-contexts*"} {:added "1.1", :ns "clojure.test", :name "test-ns", :file "clojure/test.clj", :type "function", :column 1, :see-alsos nil, :line 743, :examples [{:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; Executes all tests in a namespace. \n;; One possible use of test-ns-hook is to temporary run a single test\n;; without having to comment all others out\n\n(ns lot-of-tests)\n(require '[clojure.test :refer [is deftest]])\n\n(deftest fail-a (is (= 1 (+ 2 2))))\n(deftest fail-b (is (= 1 (+ 2 2))))\n(deftest fail-c (is (= 1 (+ 2 2))))\n\n(defn test-ns-hook [] (fail-a))\n\n(ns user)\n(require '[clojure.test :refer [test-ns]])\n\n(t/test-ns 'lot-of-tests)\n;; Testing lot-of-tests\n\n;; FAIL in (fail-a) (NO_SOURCE_FILE:1)\n;; expected: (= 1 (+ 2 2))\n;; actual: (not (= 1 4))\n;; {:test 1, :pass 0, :fail 1, :error 0}", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1561721878563, :updated-at 1561721929000, :_id "5d15fc16e4b0ca44402ef779"}], :notes nil, :arglists ["ns"], :doc "If the namespace defines a function named test-ns-hook, calls that.\n Otherwise, calls test-all-vars on the namespace. 'ns' is a\n namespace object or a symbol.\n\n Internally binds *report-counters* to a ref initialized to\n *initial-report-counters*. Returns the final, dereferenced state of\n *report-counters*.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/test-ns"} {:added "1.1", :ns "clojure.test", :name "run-tests", :file "clojure/test.clj", :type "function", :column 1, :see-alsos [{:created-at 1417800283222, :author {:login "fordsfords", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7671908?v=3"}, :to-var {:ns "clojure.test", :name "run-all-tests", :library-url "https://github.com/clojure/clojure"}, :_id "5481ea5be4b03d20a10242c4"}], :line 768, :examples [{:body ";; assuming current namespace is user\n(use 'clojure.test)\n(deftest eg-tests (is (= 1 1)))\n(run-tests)\n;;=> Testing user\n;;=> Ran 1 tests containing 1 assertions.\n;;=> 0 failures, 0 errors.\n;;=> {:type :summary, :fail 0, :error 0, :pass 1, :test 1}\n\n(run-tests 'user) ; if supplying a namespace to test, must quote\n;;=> Testing user\n;;=> Ran 1 tests containing 1 assertions.\n;;=> 0 failures, 0 errors.\n;;=> {:type :summary, :fail 0, :error 0, :pass 1, :test 1}", :author {:login "fordsfords", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7671908?v=3"}, :created-at 1417800300379, :updated-at 1417800300379, :_id "5481ea6ce4b0dc573b892feb"}], :notes nil, :arglists ["" "& namespaces"], :doc "Runs all tests in the given namespaces; prints results.\n Defaults to current namespace if none given. Returns a map\n summarizing test results.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test/run-tests"} {:ns "clojure.test", :name "*testing-vars*", :file "clojure/test.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 267, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.test/*testing-vars*"} {:ns "clojure.test", :name "*test-out*", :file "clojure/test.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 271, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.test/*test-out*"} {:ns "clojure.test", :name "*initial-report-counters*", :file "clojure/test.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 264, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.test/*initial-report-counters*"} {:ns "clojure.test.junit", :name "junit-report", :file "clojure/test/junit.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 142, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/junit-report"} {:ns "clojure.test.junit", :name "start-case", :file "clojure/test/junit.clj", :type "function", :column 1, :see-alsos nil, :line 89, :examples nil, :notes nil, :arglists ["name classname"], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/start-case"} {:ns "clojure.test.junit", :name "suite-attrs", :file "clojure/test/junit.clj", :type "function", :column 1, :see-alsos nil, :line 97, :examples nil, :notes nil, :arglists ["package classname"], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/suite-attrs"} {:ns "clojure.test.junit", :name "start-suite", :file "clojure/test/junit.clj", :type "function", :column 1, :see-alsos nil, :line 104, :examples nil, :notes nil, :arglists ["name"], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/start-suite"} {:ns "clojure.test.junit", :name "indent", :file "clojure/test/junit.clj", :type "function", :column 1, :see-alsos nil, :line 51, :examples nil, :notes nil, :arglists [""], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/indent"} {:ns "clojure.test.junit", :name "finish-suite", :file "clojure/test/junit.clj", :type "function", :column 1, :see-alsos nil, :line 109, :examples nil, :notes nil, :arglists [""], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/finish-suite"} {:ns "clojure.test.junit", :name "finish-element", :file "clojure/test/junit.clj", :type "function", :column 1, :see-alsos nil, :line 70, :examples nil, :notes nil, :arglists ["tag pretty"], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/finish-element"} {:ns "clojure.test.junit", :name "failure-el", :file "clojure/test/junit.clj", :type "function", :column 1, :see-alsos nil, :line 128, :examples nil, :notes nil, :arglists ["message expected actual"], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/failure-el"} {:ns "clojure.test.junit", :name "message-el", :file "clojure/test/junit.clj", :type "function", :column 1, :see-alsos nil, :line 113, :examples nil, :notes nil, :arglists ["tag message expected-str actual-str"], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/message-el"} {:ns "clojure.test.junit", :name "*depth*", :file "clojure/test/junit.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 49, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/*depth*"} {:ns "clojure.test.junit", :name "*var-context*", :file "clojure/test/junit.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 48, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/*var-context*"} {:added "1.1", :ns "clojure.test.junit", :name "with-junit-output", :file "clojure/test/junit.clj", :type "macro", :column 1, :see-alsos nil, :line 182, :examples nil, :macro true, :notes nil, :arglists ["& body"], :doc "Execute body with modified test-is reporting functions that write\n JUnit-compatible XML output.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/with-junit-output"} {:ns "clojure.test.junit", :name "start-element", :file "clojure/test/junit.clj", :type "function", :column 1, :see-alsos nil, :line 55, :examples nil, :notes nil, :arglists ["tag pretty & [attrs]"], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/start-element"} {:ns "clojure.test.junit", :name "package-class", :file "clojure/test/junit.clj", :type "function", :column 1, :see-alsos nil, :line 82, :examples nil, :notes nil, :arglists ["name"], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/package-class"} {:ns "clojure.test.junit", :name "element-content", :file "clojure/test/junit.clj", :type "function", :column 1, :see-alsos nil, :line 66, :examples nil, :notes nil, :arglists ["content"], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/element-content"} {:ns "clojure.test.junit", :name "finish-case", :file "clojure/test/junit.clj", :type "function", :column 1, :see-alsos nil, :line 93, :examples nil, :notes nil, :arglists [""], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/finish-case"} {:ns "clojure.test.junit", :name "error-el", :file "clojure/test/junit.clj", :type "function", :column 1, :see-alsos nil, :line 132, :examples nil, :notes nil, :arglists ["message expected actual"], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/error-el"} {:ns "clojure.test.junit", :name "test-name", :file "clojure/test/junit.clj", :type "function", :column 1, :see-alsos nil, :line 77, :examples nil, :notes nil, :arglists ["vars"], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.junit/test-name"} {:added "1.1", :ns "clojure.test.tap", :name "print-tap-fail", :file "clojure/test/tap.clj", :type "function", :column 1, :see-alsos [{:created-at 1617958686413, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "print-tap-pass", :ns "clojure.test.tap"}, :_id "6070171ee4b0b1e3652d74bb"}], :line 65, :examples nil, :notes nil, :arglists ["msg"], :doc "Prints a TAP 'not ok' line. msg is a string, with no line breaks", :library-url "https://github.com/clojure/clojure", :href "/clojure.test.tap/print-tap-fail"} {:added "1.1", :ns "clojure.test.tap", :name "print-tap-pass", :file "clojure/test/tap.clj", :type "function", :column 1, :see-alsos [{:created-at 1617958703255, :author {:login "bfontaine", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1334295?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "print-tap-fail", :ns "clojure.test.tap"}, :_id "6070172fe4b0b1e3652d74bc"}], :line 59, :examples nil, :notes nil, :arglists ["msg"], :doc "Prints a TAP 'ok' line. msg is a string, with no line breaks", :library-url "https://github.com/clojure/clojure", :href "/clojure.test.tap/print-tap-pass"} {:ns "clojure.test.tap", :name "print-diagnostics", :file "clojure/test/tap.clj", :type "function", :column 1, :see-alsos nil, :line 78, :examples nil, :notes nil, :arglists ["data"], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.tap/print-diagnostics"} {:added "1.1", :ns "clojure.test.tap", :name "print-tap-plan", :file "clojure/test/tap.clj", :type "function", :column 1, :see-alsos nil, :line 45, :examples nil, :notes nil, :arglists ["n"], :doc "Prints a TAP plan line like '1..n'. n is the number of tests", :library-url "https://github.com/clojure/clojure", :href "/clojure.test.tap/print-tap-plan"} {:added "1.1", :ns "clojure.test.tap", :name "with-tap-output", :file "clojure/test/tap.clj", :type "macro", :column 1, :see-alsos nil, :line 117, :examples nil, :macro true, :notes nil, :arglists ["& body"], :doc "Execute body with modified test reporting functions that produce\n TAP output", :library-url "https://github.com/clojure/clojure", :href "/clojure.test.tap/with-tap-output"} {:ns "clojure.test.tap", :name "tap-report", :file "clojure/test/tap.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 72, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.test.tap/tap-report"} {:added "1.1", :ns "clojure.test.tap", :name "print-tap-diagnostic", :file "clojure/test/tap.clj", :type "function", :column 1, :see-alsos nil, :line 51, :examples nil, :notes nil, :arglists ["data"], :doc "Prints a TAP diagnostic line. data is a (possibly multi-line)\n string.", :library-url "https://github.com/clojure/clojure", :href "/clojure.test.tap/print-tap-diagnostic"} {:added "1.1", :ns "clojure.walk", :name "postwalk", :file "clojure/walk.clj", :type "function", :column 1, :see-alsos [{:created-at 1321428795000, :author {:login "srid", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd3a68d670372cd09876c26270a4299a?r=PG&default=identicon"}, :to-var {:ns "clojure.walk", :name "prewalk", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521db9"} {:created-at 1348453793000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.walk", :name "postwalk-demo", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dba"} {:created-at 1348453807000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.walk", :name "postwalk-replace", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dbb"}], :line 53, :examples [{:author {:login "sunil.nandihalli", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3b7fcae9384271fb8ca8cd0c612bebf3?r=PG&default=identicon"}, :editors [{:avatar-url "https://avatars0.githubusercontent.com/u/382011?v=4", :account-source "github", :login "bolasblack"}], :body "(require '[clojure.walk :refer [postwalk]])\n(let [counter (atom -1)\n line-counter (atom 0)\n print-touch (fn [x]\n (print (swap! line-counter inc) \":\" (pr-str x) \"→ \"))\n change (fn [x]\n (let [new-x (swap! counter inc)]\n (prn new-x)\n [new-x x]))]\n (postwalk (fn [x]\n (print-touch x)\n (change x))\n {:a 1 :b 2}))\n\n;; printed output:\n\n1 : :a → 0\n2 : 1 → 1\n3 : [[0 :a] [1 1]] → 2\n4 : :b → 3\n5 : 2 → 4\n6 : [[3 :b] [4 2]] → 5\n7 : {2 [[0 :a] [1 1]], 5 [[3 :b] [4 2]]} → 6\n\n;; returned value:\n\n[6 {2 [[0 :a] [1 1]], 5 [[3 :b] [4 2]]}]", :created-at 1287073344000, :updated-at 1521646144691, :_id "542692d1c026201cdc326f2b"} {:updated-at 1672398839535, :created-at 1359706452000, :body ";;example of removing namespaces from all keys in a nested data structure\n(def thing {:page/tags [{:tag/category \"lslsls\"}]})\n(postwalk #(if (keyword? %) (keyword (name %)) %) thing)\n{:tags [{:category \"lslsls\"}]}", :editors [{:avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon", :account-source "clojuredocs", :login "boxie"} {:login "daveliepmann", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/974443?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon", :account-source "clojuredocs", :login "boxie"}, :_id "542692d7c026201cdc327122"} {:updated-at 1491425591876, :created-at 1491425591876, :author {:login "wmatson", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/3883798?v=3"}, :body "(use 'clojure.walk)\n\n;;example of evaluating an expression tree, starting at the leaves\n(def expression-tree\n {:function +\n :children\n [1 {:function *\n :children [2 6]}]})\n\n(defn evaluate [node]\n (if-let [f (:function node)]\n (apply f (:children node))\n node))\n\n(postwalk evaluate expression-tree)\n\n=> 13", :_id "58e55937e4b01f4add58fe83"} {:editors [{:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}], :body ";; an example to show the differences between postwalk and prewalk\n;; (see the counterpart at prewalk)\n\n(let [counter (atom 0)\n print-touch (fn [x]\n (print (swap! counter inc) \":\" (pr-str x) \"→ \"))\n change-type (fn [x]\n (let [new-x (if (vector? x)\n (apply list x)\n (str x))]\n (prn new-x)\n new-x))]\n (clojure.walk/postwalk (fn [x]\n (print-touch x)\n (change-type x))\n [:a [:ba :bb] :c]))\n\n;; printed output:\n\n1 : :a → \":a\"\n2 : :ba → \":ba\"\n3 : :bb → \":bb\"\n4 : [\":ba\" \":bb\"] → (\":ba\" \":bb\")\n5 : :c → \":c\"\n6 : [\":a\" (\":ba\" \":bb\") \":c\"] → (\":a\" (\":ba\" \":bb\") \":c\")\n\n;; returned value:\n\n=> (\":a\" (\":ba\" \":bb\") \":c\")", :author {:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"}, :created-at 1519076695677, :updated-at 1519084470249, :_id "5a8b4557e4b0316c0f44f8d0"}], :notes [{:author {:login "pesterhazy", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/106328?v=4"}, :updated-at 1519696583504, :created-at 1519696583504, :body "As of 1.9.0, postwalk passes the k/v pairs of a map to `f` not, as one might expect, as type `clojure.lang.MapEntry` but as `clojure.lang.PersistentVector` ([JIRA](https://dev.clojure.org/jira/browse/CLJ-2031)). As a result, `f` cannot distinguish k/v pairs from other two-element vectors.", :_id "5a94bac7e4b0316c0f44f8ff"} {:author {:login "finalfantasia", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/2316604?v=4"}, :updated-at 1541807954318, :created-at 1541807954318, :body "Alex Miller's article [\"Tree visitors in Clojure\"](https://www.ibm.com/developerworks/library/j-treevisit/index.html) might be helpful in understanding general tree traversal and the usage of `clojure.walk/postwalk`.\n", :_id "5be61f52e4b00ac801ed9ef1"} {:author {:login "leo-ppp", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/72382759?v=4"}, :updated-at 1615827306990, :created-at 1615827306990, :body "> As of 1.9.0, postwalk passes the k/v pairs of a map to f not, as one might expect, as type clojure.lang.MapEntry but as clojure.lang.PersistentVector (JIRA). As a result, f cannot distinguish k/v pairs from other two-element vectors.\n\nThis was [fixed in 1.10.0](https://github.com/clojure/clojure/blob/master/changes.md#42-api), and one can use `(map-entry? v)` to distinguish a k/v pair from a vector when `walk`ing. ", :_id "604f916ae4b0b1e3652d7497"} {:author {:login "jeff303", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/3521562?v=4"}, :updated-at 1632884419953, :created-at 1632884419953, :body "Updated link to \"Tree visitors in Clojure\", mentioned above (PDF):\n\nhttps://insideclojure.org/images/j-treevisit-pdf.pdf", :_id "6153d6c3e4b0b1e3652d754a"}], :arglists ["f form"], :doc "Performs a depth-first, post-order traversal of form. Calls f on\n each sub-form, uses f's return value in place of the original.\n Recognizes all Clojure data structures. Consumes seqs as with doall.", :library-url "https://github.com/clojure/clojure", :href "/clojure.walk/postwalk"} {:added "1.1", :ns "clojure.walk", :name "keywordize-keys", :file "clojure/walk.clj", :type "function", :column 1, :see-alsos [{:created-at 1429291271248, :author {:login "Chort409", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1062637?v=3"}, :to-var {:ns "clojure.core", :name "keyword", :library-url "https://github.com/clojure/clojure"}, :_id "55314107e4b01bb732af0a84"} {:created-at 1440158846927, :author {:login "BernhardBln", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4759839?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "stringify-keys", :ns "clojure.walk"}, :_id "55d7147ee4b0831e02cddf17"}], :line 94, :examples [{:updated-at 1457839421545, :created-at 1287070176000, :body "(require 'clojure.walk)\n(clojure.walk/keywordize-keys {\"a\" 1 \"b\" 2})\n;;=> {:a 1 :b 2}", :editors [{:login "fasiha", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/37649?v=3"}], :author {:avatar-url "https://www.gravatar.com/avatar/3b7fcae9384271fb8ca8cd0c612bebf3?r=PG&default=identicon", :account-source "clojuredocs", :login "sunil.nandihalli"}, :_id "542692d1c026201cdc326f2a"} {:updated-at 1476953810286, :created-at 1476953810286, :author {:login "eunmin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1837478?v=3"}, :body "(use 'clojure.walk)\n\n(keywordize-keys {\"a\" 1, \"b\" {\"c\" {\"d\" 2}}})\n;;=> {:a 1, :b {:c {:d 2}}}", :_id "580886d2e4b001179b66bdd2"} {:updated-at 1610750233661, :created-at 1610750233661, :author {:login "Luke1298", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/7078861?v=4"}, :body ";; The input object also doesn't have to be a dictionary\n(require 'clojure.walk)\n(clojure.walk/keywordize-keys [{\"hello\" \"goodbye\"}])\n;;=>[{:hello \"goodbye\"}]", :_id "60021919e4b0b1e3652d7432"}], :notes nil, :arglists ["m"], :doc "Recursively transforms all map keys from strings to keywords.", :library-url "https://github.com/clojure/clojure", :href "/clojure.walk/keywordize-keys"} {:added "1.1", :ns "clojure.walk", :name "walk", :file "clojure/walk.clj", :type "function", :column 1, :see-alsos [{:created-at 1337310249000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.walk", :name "postwalk", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d11"} {:created-at 1337310268000, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.walk", :name "prewalk", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d12"}], :line 35, :examples [{:updated-at 1519744662463, :created-at 1330654697000, :body "(use 'clojure.walk)\n\n(walk #(* 2 %) #(apply + %) [1 2 3 4 5])\n;=> 30\n\n(walk second #(apply max %) [ [1 2] [3 4] [5 6] ])\n;=> 6\n\n(walk first #(apply max %) [ [1 2] [3 4] [5 6] ])\n;=> 5\n\n(walk first reverse [ [1 2] [3 4] [5 6] ])\n;=> (5 3 1)", :editors [{:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :author {:avatar-url "https://www.gravatar.com/avatar/ef581bba2f97adb539c67a35465b3e1b?r=PG&default=identicon", :account-source "clojuredocs", :login "jjcomer"}, :_id "542692d7c026201cdc327133"} {:updated-at 1519744710013, :created-at 1335333358000, :body "(require '[clojure.walk :as w])\n\n(w/walk (fn [[k v]] [k (* 10 v)]) identity {:a 1 :b 2 :c 3})\n;=> {:a 10, :c 30, :b 20}\n\n(w/postwalk #(if (number? %) (* 2 %) %) [[1 2 3] [4 7 2] [2 5 2]])\n;=> [[2 4 6] [8 14 4] [4 10 4]]\n\n(let [s [1 '(2 3 [1])]] \n (w/postwalk #(if (seq? %) (vec %) %) s))\n;=> [1 [2 3 [1]]]\n\n(w/walk (comp vec reverse) identity {0 :start 1 :inprogress 2 :end})\n;=> {:start 0, :inprogress 1, :end 2}", :editors [{:login "devn", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/10421?v=3"} {:login "phreed", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/211644?v=4"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692d7c026201cdc327134"} {:updated-at 1633012838790, :created-at 1633012838790, :author {:login "burinc", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/19825136?v=4"}, :body ";; Recursively sort nested map\n(require '[clojure.walk :as w])\n\n(def m {:b 2, :c 3, :a 1, :d {:x 10, :c 3, :a 11, :b 22}})\n\n(w/postwalk (fn [x] (if (map? x) (into (sorted-map) x) x)) m)\n;;=> {:a 1, :b 2, :c 3, :d {:a 11, :b 22, :c 3, :x 10}}\n", :_id "6155cc66e4b0b1e3652d754c"}], :notes nil, :arglists ["inner outer form"], :doc "Traverses form, an arbitrary data structure. inner and outer are\n functions. Applies inner to each element of form, building up a\n data structure of the same type, then applies outer to the result.\n Recognizes all Clojure data structures. Consumes seqs as with doall.", :library-url "https://github.com/clojure/clojure", :href "/clojure.walk/walk"} {:added "1.1", :ns "clojure.walk", :name "prewalk-replace", :file "clojure/walk.clj", :type "function", :column 1, :see-alsos [{:created-at 1281619206000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.walk", :name "postwalk-replace", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521df9"} {:created-at 1281619213000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "replace", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dfa"} {:created-at 1348453766000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.walk", :name "prewalk", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521dfb"}], :line 110, :examples [{:author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :editors [{:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}], :body "user=> (clojure.walk/prewalk-replace '{a b} '(c (d a)))\n(c (d b))", :created-at 1281563651000, :updated-at 1332953005000, :_id "542692d1c026201cdc326f2c"} {:author {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}, :editors [], :body "(use 'clojure.walk)\n\n(prewalk-replace {:a 1 :b 2} [:a :b])\n;=> [1 2]\n\n(prewalk-replace {:a 1 :b 2} [:a :b :c])\n;=> [1 2 :c]\n\n(prewalk-replace {:a 1 :b 2} [:a :b [:a :b] :c])\n;=> [1 2 [1 2] :c]", :created-at 1397943558000, :updated-at 1397943558000, :_id "542692d7c026201cdc32712f"}], :notes nil, :arglists ["smap form"], :doc "Recursively transforms form by replacing keys in smap with their\n values. Like clojure/replace but works on any data structure. Does\n replacement at the root of the tree first.", :library-url "https://github.com/clojure/clojure", :href "/clojure.walk/prewalk-replace"} {:added "1.1", :ns "clojure.walk", :name "stringify-keys", :file "clojure/walk.clj", :type "function", :column 1, :see-alsos [{:created-at 1440158810607, :author {:login "BernhardBln", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4759839?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "keywordize-keys", :ns "clojure.walk"}, :_id "55d7145ae4b072d7f27980e9"}], :line 102, :examples [{:author {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}, :editors [{:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"} {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}], :body "(use 'clojure.walk)\n\n(stringify-keys {:a 1 :b 2})\n;=> {\"a\" 1, \"b\" 2}", :created-at 1397941537000, :updated-at 1397943447000, :_id "542692d7c026201cdc327130"} {:updated-at 1476953480559, :created-at 1476953480559, :author {:login "eunmin", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/1837478?v=3"}, :body "(use 'clojure.walk)\n\n(stringify-keys {:a 1 :b {:c {:d 2}}})\n;=> {\"a\" 1, \"b\" {\"c\" {\"d\" 2}}}", :_id "58088588e4b001179b66bdd1"} {:updated-at 1624571487187, :created-at 1624571487187, :author {:login "kevo1ution", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8290559?v=4"}, :body "(use 'clojure.walk)\n\n(stringify-keys {:hello/world 1})\n;=> {\"world\" 1}", :_id "60d4fe5fe4b0b1e3652d750f"}], :notes [{:body "Recursively transforms all map keys and values from strings to keywords.\n\n
    \n(use 'clojure.walk)\n(defn stringify-keys-and-vals\n  \"Recursively transforms all map keys and values from keywords to strings.\"\n  [m]\n  (let [kf (fn [[k v]] (if (keyword? k) [(name k) v] [k v]))\n        vf (fn [[k v]] (if (keyword? v) [k (name v)] [k v]))]\n    ;; only apply to maps\n    (postwalk (fn [x] (if (map? x) (into {} (map #(-> % kf vf) x)) x)) m))) \n
    \n\nExample:\n\n
    \n(stringify-keys-and-vals {:a :hello :b :world})\n;=> {\"a\" \"hello\", \"b\" \"world\"}\n(stringify-keys-and-vals {:a {:hello :world} :b [{:love :clojure} {:hate :other}]})\n;=> {\"a\" {\"hello\" \"world\"}, \"b\" [{\"love\" \"clojure\"} {\"hate\" \"other\"}]}\n
    \n\n", :created-at 1615188831849, :updated-at 1615189007982, :author {:avatar-url "https://avatars.githubusercontent.com/u/278430?v=4", :account-source "github", :login "gongpengjun"}, :_id "6045d35fe4b0b1e3652d7473"}], :arglists ["m"], :doc "Recursively transforms all map keys from keywords to strings.", :library-url "https://github.com/clojure/clojure", :href "/clojure.walk/stringify-keys"} {:added "1.1", :ns "clojure.walk", :name "prewalk", :file "clojure/walk.clj", :type "function", :column 1, :see-alsos [{:created-at 1321428775000, :author {:login "srid", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd3a68d670372cd09876c26270a4299a?r=PG&default=identicon"}, :to-var {:ns "clojure.walk", :name "postwalk", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c84"} {:created-at 1348453563000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.walk", :name "prewalk-demo", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c85"} {:created-at 1348453577000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.walk", :name "prewalk-replace", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c86"}], :line 61, :examples [{:author {:login "srid", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bd3a68d670372cd09876c26270a4299a?r=PG&default=identicon"}, :editors [], :body ";; From http://stackoverflow.com/questions/8089074/idiomatically-iterating-over-a-2-or-higher-dimensional-sequence-in-clojure/8091544#8091544\n\n(def matrix [[1 2 3]\n [4 5 6]\n [7 8 9]])\n(use 'clojure.walk :only [prewalk])\n\n(prewalk #(if (number? %) (inc %) %) matrix)\n=> [[2 3 4] [5 6 7] [8 9 10]]", :created-at 1321428749000, :updated-at 1321428749000, :_id "542692d7c026201cdc32712a"} {:editors [{:login "cljlc", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4"}], :body ";; an example to show the differences between postwalk and prewalk\n;; (see the counterpart at postwalk)\n\n(let [counter (atom 0)\n print-touch (fn [x]\n (print (swap! counter inc) \":\" (pr-str x) \"→ \"))\n change-type (fn [x]\n (let [new-x (if (vector? x)\n (apply list x)\n (str x))]\n (prn new-x)\n new-x))]\n (clojure.walk/prewalk (fn [x]\n (print-touch x)\n (change-type x))\n [:a [:ba :bb] :c]))\n\n;; printed output:\n\n1 : [:a [:ba :bb] :c] → (:a [:ba :bb] :c)\n2 : :a → \":a\"\n3 : [:ba :bb] → (:ba :bb)\n4 : :ba → \":ba\"\n5 : :bb → \":bb\"\n6 : :c → \":c\"\n\n;; returned value:\n\n=> (\":a\" (\":ba\" \":bb\") \":c\")", :author {:avatar-url "https://avatars0.githubusercontent.com/u/36645452?v=4", :account-source "github", :login "cljlc"}, :created-at 1519076844559, :updated-at 1519084512666, :_id "5a8b45ece4b0316c0f44f8d1"} {:editors [{:login "dan-f", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/2146312?v=4"}], :body "(postwalk\n (fn [x]\n (let [new (if (number? x) (* x 2) x)]\n (printf \"%s -> %s\\n\" x new)\n new))\n '(1 (2 3))) ;; => (2 (4 6))\n\n;; console output\n;; 1 -> 2\n;; 2 -> 4\n;; 3 -> 6\n;; (4 6) -> (4 6)\n;; (2 (4 6)) -> (2 (4 6))\n", :author {:avatar-url "https://avatars3.githubusercontent.com/u/2146312?v=4", :account-source "github", :login "dan-f"}, :created-at 1544197160620, :updated-at 1544197323000, :_id "5c0a9428e4b0ca44402ef5e6"}], :notes nil, :arglists ["f form"], :doc "Like postwalk, but does pre-order traversal.", :library-url "https://github.com/clojure/clojure", :href "/clojure.walk/prewalk"} {:added "1.1", :ns "clojure.walk", :name "postwalk-demo", :file "clojure/walk.clj", :type "function", :column 1, :see-alsos [{:created-at 1447033235869, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "postwalk", :ns "clojure.walk"}, :_id "563ff993e4b04b157a6648ed"} {:created-at 1447033255822, :author {:login "cloojure", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7083783?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "postwalk-replace", :ns "clojure.walk"}, :_id "563ff9a7e4b0290a56055d23"}], :line 80, :examples [{:author {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}, :editors [{:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"} {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}], :body "(use 'clojure.walk)\n\nuser> (postwalk-demo [[1 2] [3 4 [5 6]] [7 8]])\nWalked: 1\nWalked: 2\nWalked: [1 2]\nWalked: 3\nWalked: 4\nWalked: 5\nWalked: 6\nWalked: [5 6]\nWalked: [3 4 [5 6]]\nWalked: 7\nWalked: 8\nWalked: [7 8]\nWalked: [[1 2] [3 4 [5 6]] [7 8]]\n[[1 2] [3 4 [5 6]] [7 8]]\n\nuser> (postwalk-demo {:a 1 :b 2})\nWalked: :a\nWalked: 1\nWalked: [:a 1]\nWalked: :b\nWalked: 2\nWalked: [:b 2]\nWalked: {:a 1, :b 2}\n{:a 1, :b 2}", :created-at 1397942586000, :updated-at 1397943097000, :_id "542692d7c026201cdc327124"}], :notes nil, :arglists ["form"], :doc "Demonstrates the behavior of postwalk by printing each form as it is\n walked. Returns form.", :library-url "https://github.com/clojure/clojure", :href "/clojure.walk/postwalk-demo"} {:added "1.1", :ns "clojure.walk", :name "prewalk-demo", :file "clojure/walk.clj", :type "function", :column 1, :see-alsos [{:created-at 1348453549000, :author {:login "dansalmo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/e33ee460f5f61bc5ba9b598934766215?r=PG&default=identicon"}, :to-var {:ns "clojure.walk", :name "prewalk", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d48"}], :line 87, :examples [{:author {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}, :editors [{:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"} {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"} {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}], :body "(use 'clojure.walk)\n\nuser> (prewalk-demo [[1 2] [3 4 [5 6]] [7 8]])\nWalked: [[1 2] [3 4 [5 6]] [7 8]]\nWalked: [1 2]\nWalked: 1\nWalked: 2\nWalked: [3 4 [5 6]]\nWalked: 3\nWalked: 4\nWalked: [5 6]\nWalked: 5\nWalked: 6\nWalked: [7 8]\nWalked: 7\nWalked: 8\n[[1 2] [3 4 [5 6]] [7 8]]\n\nuser> (prewalk-demo {:a 1 :b 2})\nWalked: {:a 1, :b 2}\nWalked: [:a 1]\nWalked: :a\nWalked: 1\nWalked: [:b 2]\nWalked: :b\nWalked: 2\n{:a 1, :b 2}", :created-at 1397942432000, :updated-at 1397943044000, :_id "542692d7c026201cdc32712b"}], :notes nil, :arglists ["form"], :doc "Demonstrates the behavior of prewalk by printing each form as it is\n walked. Returns form.", :library-url "https://github.com/clojure/clojure", :href "/clojure.walk/prewalk-demo"} {:added "1.1", :ns "clojure.walk", :name "macroexpand-all", :file "clojure/walk.clj", :type "function", :column 1, :see-alsos [{:to-var {:library-url "https://github.com/clojure/clojure", :name "macroexpand-1", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1339248731000, :_id "542692ebf6e94c6970521de6"} {:to-var {:library-url "https://github.com/clojure/clojure", :name "macroexpand", :ns "clojure.core"}, :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :created-at 1339248761000, :_id "542692ebf6e94c6970521de7"}], :line 126, :examples [{:updated-at 1339248698000, :created-at 1339248698000, :body "user=> (use 'clojure.walk)\nuser=> (macroexpand-all '(-> c (+ 3) (* 2)))\n(* (+ c 3) 2)", :editors [], :author {:avatar-url "https://avatars.githubusercontent.com/u/528360?v=3", :account-source "github", :login "BertrandDechoux"}, :_id "542692d7c026201cdc32711d"} {:author {:login "Sgeo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bf4e0e4e4f0b1f703b1372a8dd7b0735?r=PG&default=identicon"}, :editors [], :body "user=> (use 'clojure.walk)\n\n; tryclj.com and lazybot on #clojure get the following wrong\nuser=> (let [-> inc] (-> 5)) \n6\n\n; Below macroexpansion is supposed to result in equivalent code to the above\nuser=> (macroexpand-all '(let [-> inc] (-> 5)))\n(let* [-> inc] 5)\nuser=> (let* [-> inc] 5)\n5\n\n; However, as is clear above, it does not", :created-at 1355181392000, :updated-at 1355181392000, :_id "542692d7c026201cdc32711e"} {:author {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}, :editors [{:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"} {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}], :body ";; differences between macroexpand-1, macroexpand and macroexpand-all \n\n(require '[clojure.pprint :as pp]\n '[clojure.walk :as walk])\n\n(alter-var-root #'pp/*print-suppress-namespaces* (constantly true))\n\n\n(defmacro plus [n1 n2]\n `(+ ~n1 ~n2))\n\n(pp/pprint (macroexpand-1 '(plus 3 4))) ;=> (+ 3 4)\n(pp/pprint (macroexpand '(plus 3 4))) ;=> (+ 3 4)\n\n\n(defmacro pl [p1 p2]\n `(plus ~p1 ~p2))\n\n(pp/pprint (macroexpand-1 '(pl 3 4))) ;=> (plus 3 4)\n(pp/pprint (macroexpand '(pl 3 4))) ;=> (+ 3 4)\n\n\n(defmacro minus [m1 m2]\n `(- ~m1 ~m2))\n\n(defmacro calc [c1 c2]\n `(pl ~c1 (minus ~c1 ~c2)))\n\n(pp/pprint (macroexpand-1 '(calc 20 30)))\n;=> (pl 20 (minus 20 30))\n\n(pp/pprint (macroexpand '(calc 20 30)))\n;=> (+ 20 (minus 20 30))\n\n(pp/pprint (walk/macroexpand-all '(calc 20 30)))\n;=> (+ 20 (- 20 30))", :created-at 1397943977000, :updated-at 1397944114000, :_id "542692d7c026201cdc32711f"} {:updated-at 1689437697116, :created-at 1689437656976, :author {:login "owenRiddy", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/8080718?v=4"}, :body "; macroexpand-all can give different results to what is generated in a real\n; evaluation. Here is a code sample that should normally evaluates to `dummy`, \n; but `macroexpand-all` generates code that evaluates to `nil`.\n\n(defmacro d []\n (let [probably-dummy# (-> &env keys first)]\n `(quote ~probably-dummy#)))\n\n(letfn [(dummy [] true)]\n (d))\n; => dummy\n\n(clojure.walk/macroexpand-all\n '(letfn [(dummy [] true)]\n (d)))\n; => (letfn* [dummy (fn* dummy ([] true))] (quote nil))\n\n(eval \n (clojure.walk/macroexpand-all\n '(letfn [(dummy [] true)]\n (d))))\n; => nil", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/8080718?v=4", :account-source "github", :login "owenRiddy"}], :_id "64b2c5d8e4b08cf8563f4bd2"}], :notes [{:updated-at 1351086771000, :body "DO NOT USE THIS FUNCTION, it doesn't handle special forms at all, and, as such, does not in fact expand into the ultimate macroexpansion of the form.\r\n\r\nFor example,\r\n
    (require '[clojure.walk :as walk])\r\n(println (walk/macroexpand-all '(quote (let [a 1] a))))\r\n
    \r\nWill print\r\n
    (quote (let* [a 1] a))\r\n
    \r\nWhen the correct answer is\r\n
    (quote (let [a 1] a))\r\n
    \r\nShowing an utter unawareness of proper handling of special forms\r\n\r\nDO NOT USE THIS FUNCTION", :created-at 1351086666000, :author {:login "Sgeo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bf4e0e4e4f0b1f703b1372a8dd7b0735?r=PG&default=identicon"}, :_id "542692edf6e94c6970521ff0"} {:updated-at 1354211038000, :body "@Sgeo - `let` is just a macro for `let*`:\r\n\r\n (clojure.repl/source let) =>\r\n\r\n (defmacro let\r\n \"binding => binding-form init-expr\r\n\r\n Evaluates the exprs in a lexical context in which the symbols in\r\n the binding-forms are bound to their respective init-exprs or parts\r\n therein.\"\r\n {:added \"1.0\", :special-form true, :forms '[(let [bindings*] exprs*)]}\r\n [bindings & body]\r\n (assert-args let\r\n (vector? bindings) \"a vector for its binding\"\r\n (even? (count bindings)) \"an even number of forms in binding vector\")\r\n `(let* ~(destructure bindings) ~@body))", :created-at 1354211038000, :author {:login "Cubic", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/b6678a430a805dd78366d6e135b49f2d?r=PG&default=identicon"}, :_id "542692edf6e94c6970521ff6"} {:updated-at 1354485217000, :body "(quote (let [a 1] a)) is '(let [a 1] a) which evaluates to a list containing the symbol let, a vector [a 1], and a symbol a. In this context, the (let [a 1] a) is not code, but mere data, and as such, should not be macroexpanded at all, anymore than a string like \"(-> a b c)\" should be macroexpanded into \"(c (b a))\" (and yes, I know that's not the exact macroexpansion).", :created-at 1354484499000, :author {:login "Sgeo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bf4e0e4e4f0b1f703b1372a8dd7b0735?r=PG&default=identicon"}, :_id "542692edf6e94c6970521ff7"}], :arglists ["form"], :doc "Recursively performs all possible macroexpansions in form.", :library-url "https://github.com/clojure/clojure", :href "/clojure.walk/macroexpand-all"} {:added "1.1", :ns "clojure.walk", :name "postwalk-replace", :file "clojure/walk.clj", :type "function", :column 1, :see-alsos [{:created-at 1281619231000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.walk", :name "prewalk-replace", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c82"} {:created-at 1281619236000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :to-var {:ns "clojure.core", :name "replace", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c83"} {:created-at 1585850917002, :author {:login "MicahElliott", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/159047?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "postwalk", :ns "clojure.walk"}, :_id "5e862a25e4b087629b5a18ca"}], :line 118, :examples [{:author {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}, :editors [{:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"} {:login "philos99", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/1de5617efb013ca7c9cf8e5646818ffa?r=PG&default=identicon"}], :body "(use 'clojure.walk)\n\n(postwalk-replace {:a 1 :b 2} [:a :b])\n;=> [1 2]\n\n(postwalk-replace {:a 1 :b 2} [:a :b :c])\n;=> [1 2 :c]\n\n(postwalk-replace {:a 1 :b 2} [:a :b [:a :b] :c])\n;=> [1 2 [1 2] :c]", :created-at 1397943421000, :updated-at 1397943663000, :_id "542692d7c026201cdc327127"} {:updated-at 1463496047122, :created-at 1463496047122, :author {:login "x", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/693546?v=3"}, :body "(postwalk-replace {nil :NIL} {:a 1, :b nil, :c 3, nil 4})\n;=> {:NIL 4, :a 1, :b :NIL, :c 3}", :_id "573b2d6fe4b05c05173143fb"}], :notes nil, :arglists ["smap form"], :doc "Recursively transforms form by replacing keys in smap with their\n values. Like clojure/replace but works on any data structure. Does\n replacement at the leaves of the tree first.", :library-url "https://github.com/clojure/clojure", :href "/clojure.walk/postwalk-replace"} {:ns "clojure.xml", :name "tag", :file "clojure/xml.clj", :type "var", :column 1, :see-alsos nil, :line 22, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.xml/tag"} {:ns "clojure.xml", :name "*sb*", :file "clojure/xml.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 18, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.xml/*sb*"} {:ns "clojure.xml", :name "*state*", :file "clojure/xml.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 17, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.xml/*state*"} {:ns "clojure.xml", :name "*stack*", :file "clojure/xml.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 15, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.xml/*stack*"} {:ns "clojure.xml", :name "element", :file "clojure/xml.clj", :type "var", :column 1, :see-alsos [{:created-at 1324592891000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.xml", :name "emit-element", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ec8"} {:created-at 1324592934000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "struct", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ec9"} {:created-at 1324592937000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "struct-map", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521eca"} {:created-at 1324592944000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.xml", :name "parse", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ecb"} {:created-at 1324593203000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-out-str", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ecc"}], :line 20, :examples [{:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [{:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"} {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}], :body "(use 'clojure.zip)\n\n;;using our old friend struct for performance in maps \n(struct element :httplink {:href \"http://clojure.org\"} nil)\n=>\n{:tag :httplink, \n :attrs {:href \"http://clojure.org\"}, \n :content nil}\n\n;;these elements can be output to ordinary xml strings with emit-element\n(emit-element (struct element :httplink {:href \"http://clojure.org\"} nil))\n=>\n\n;;this is printed - can be catched with macro with-out-str\n\n;;make hierarchies:\n(struct element :parent {:name \"Barbara\"} \n [(struct element :children {:name \"Gina\"} nil) \n (struct element :children {:name \"John\"} nil)])\n=>\n{:tag :parent, :attrs {:name \"Barbara\"}, :content \n [{:tag :children, :attrs {:name \"Gina\"}, :content nil} \n {:tag :children, :attrs {:name \"John\"}, :content nil}]}\n\n;;which can be emit-elemented as well\n\n(emit-element {:tag :parent, :attrs {:name \"Barbara\"}, :content [{:tag :children, :attrs {:name \"Gina\"}, :content nil} {:tag :children, :attrs {:name \"John\"}, :content nil}]})\n=>\n\n \n \n", :created-at 1324592984000, :updated-at 1324593242000, :_id "542692d7c026201cdc327136"}], :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.xml/element"} {:ns "clojure.xml", :name "*current*", :file "clojure/xml.clj", :type "var", :column 1, :see-alsos nil, :dynamic true, :line 16, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.xml/*current*"} {:ns "clojure.xml", :name "content", :file "clojure/xml.clj", :type "var", :column 1, :see-alsos nil, :line 24, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.xml/content"} {:ns "clojure.xml", :name "content-handler", :file "clojure/xml.clj", :type "var", :column 1, :see-alsos nil, :line 26, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.xml/content-handler"} {:added "1.0", :ns "clojure.xml", :name "parse", :file "clojure/xml.clj", :type "function", :column 1, :see-alsos [{:created-at 1324593911000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.xml", :name "emit-element", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cf3"} {:created-at 1324593914000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-out-str", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cf4"} {:created-at 1324593922000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.xml", :name "element", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cf5"}], :line 78, :examples [{:updated-at 1430664126603, :created-at 1324593962000, :body "(require '[clojure.xml :as xml]\n '[clojure.zip :as zip])\n\n;;convenience function, first seen at nakkaya.com later in clj.zip src\n(defn zip-str [s]\n (zip/xml-zip \n (xml/parse (java.io.ByteArrayInputStream. (.getBytes s)))))\n\n;;parse from xml-strings to internal xml representation\nuser=> (zip-str \"
    \")\n[{:tag :a, :attrs {:href \"nakkaya.com\"}, :content nil} nil]\n\n;;root can be rendered with xml/emit-element\nuser=> (xml/emit-element (zip/root [{:tag :a, :attrs {:href \"nakkaya.com\"}, :content nil} nil]))\n\n\n;;printed (to assure it's not lazy and for performance), can be caught to string variable with with-out-str", :editors [{:avatar-url "https://www.gravatar.com/avatar/9a562ca6891212ffed05e29cc69c9124?r=PG&default=identicon", :account-source "clojuredocs", :login "balamkej"} {:avatar-url "https://www.gravatar.com/avatar/6f4c4cb023ca9033b53a6a517ed89153?r=PG&default=identicon", :account-source "clojuredocs", :login "Lowgain"} {:avatar-url "https://avatars.githubusercontent.com/u/92894?v=3", :account-source "github", :login "rafmagana"} {:avatar-url "https://avatars.githubusercontent.com/u/353113?v=3", :account-source "github", :login "claj"}], :author {:avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon", :account-source "clojuredocs", :login "Claj"}, :_id "542692d7c026201cdc32713c"} {:editors [{:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}], :body ";; Use the \"startparse\" parameter to disable \n;; validation and network requests for external DTDs\n\n(require '[clojure.xml :as xml]\n '[clojure.java.io :as io])\n(import '[javax.xml.parsers SAXParserFactory])\n\n(def conforming\n \"\n \n \n
    Hello
    \n \")\n\n(defn non-validating [s ch]\n (..\n (doto\n (SAXParserFactory/newInstance)\n (.setFeature \n \"http://apache.org/xml/features/nonvalidating/load-external-dtd\" false))\n (newSAXParser)\n (parse s ch)))\n\n(def xml\n (-> conforming .getBytes io/input-stream (xml/parse non-validating)))\n\n;; {:tag :html,\n;; :attrs {:xmlns \"http://www.w3.org/1999/xhtml\"},\n;; :content [{:tag :article, :attrs nil, :content [\"Hello\"]}]}\n", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1559323024229, :updated-at 1559334683073, :_id "5cf16190e4b0ca44402ef73b"}], :notes nil, :arglists ["s" "s startparse"], :doc "Parses and loads the source s, which can be a File, InputStream or\n String naming a URI. Returns a tree of the xml/element struct-map,\n which has the keys :tag, :attrs, and :content. and accessor fns tag,\n attrs, and content. Other parsers can be supplied by passing\n startparse, a fn taking a source and a ContentHandler and returning\n a parser", :library-url "https://github.com/clojure/clojure", :href "/clojure.xml/parse"} {:ns "clojure.xml", :name "startparse-sax", :file "clojure/xml.clj", :type "function", :column 1, :see-alsos nil, :line 75, :examples nil, :notes nil, :arglists ["s ch"], :library-url "https://github.com/clojure/clojure", :href "/clojure.xml/startparse-sax"} {:ns "clojure.xml", :name "emit", :file "clojure/xml.clj", :type "function", :column 1, :see-alsos [{:created-at 1323923286000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-out-str", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e6f"}], :line 111, :examples [{:body "(use 'clojure.xml)\n;;attrs stores the attributes of a tag and content contains the children\n(emit {:tag :parent :attrs {:value \"Hello\"} :content[\n\t{:tag :child1 :attrs {:value \"World\"}}\n\t{:tag :child2 :attrs {:value \"Clojure\"}}\n\t]})\n\n;; prints this to *out*:\n\n\n\n\n", :author {:login "finiterecursion", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/4407459?v=3"}, :created-at 1425400719581, :updated-at 1438720830296, :editors [{:avatar-url "https://avatars.githubusercontent.com/u/353113?v=3", :account-source "github", :login "claj"}], :_id "54f5e38fe4b0b716de7a652f"}], :notes [{:updated-at 1325286942000, :body "this one have a problem when trying to export xml with string containing & etc (should be escaped). Contribs prxml has this functionality.", :created-at 1325286942000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fd5"} {:updated-at 1328074886000, :body "A 1.3 compatible version of prxml can be found here:\r\n\r\nhttps://github.com/weissjeffm/clojure.prxml", :created-at 1328074886000, :author {:login "gstamp", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/cd4185cdca53ccdc11cd24ebc0cfb46d?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fd8"}], :arglists ["x"], :library-url "https://github.com/clojure/clojure", :href "/clojure.xml/emit"} {:ns "clojure.xml", :name "attrs", :file "clojure/xml.clj", :type "var", :column 1, :see-alsos nil, :line 23, :examples nil, :notes nil, :arglists [], :library-url "https://github.com/clojure/clojure", :href "/clojure.xml/attrs"} {:ns "clojure.xml", :name "emit-element", :file "clojure/xml.clj", :type "function", :column 1, :see-alsos [{:created-at 1323923092000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.core", :name "with-out-str", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ed5"} {:created-at 1324592254000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.xml", :name "element", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ed6"}], :line 95, :examples [{:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [{:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"} {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"} {:login "dyba", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/296219?v=3"}], :body "(use 'clojure.xml)\n\n;;If just a string it's text inside or something. just print it\n(emit-element \"hello\")\nhello\n\n;;we want a map with a tag\n(emit-element {:tag :hello})\n\n\n;;strings works as well (since we're using the \"name\" function)\n(emit-element {:tag \"hello\"})\n\n\n;;:attrs is for all the attributes\n(emit-element {:tag :hello :attrs {:place \"world\"}})\n\n\n;;:content is for all the children in the element\n(emit-element {:tag :parent :attrs {:id \"22\" :name \"fritz\"} :content [\n {:tag :child :attrs {:id \"56\"}} \n {:tag :child :attrs {:id \"57\"}]}))\n\n\n\n\n\n;; also, look out for not supplying :content with another xml-ish map\n;; or at minimum a vector containing the string you want to put as the content:\n(emit-element {:tag :hello :content \"world\"})\n\njava.lang.NullPointerException (NO_SOURCE_FILE:0)\n\n(emit-element {:tag :hello :content [\"world\"])\nworld\n", :created-at 1323922631000, :updated-at 1420944718054, :_id "542692d7c026201cdc327139"}], :notes [{:updated-at 1323923133000, :body "you can catch the printed code with the macro
    with-out-str
    if you want to catch it in variables.", :created-at 1323923133000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fd2"}], :arglists ["e"], :library-url "https://github.com/clojure/clojure", :href "/clojure.xml/emit-element"} {:added "1.0", :ns "clojure.zip", :name "rightmost", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1497531575982, :author {:login "tkocmathla", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/183459?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "leftmost", :ns "clojure.zip"}, :_id "594284b7e4b06e730307db33"}], :line 157, :examples nil, :notes nil, :arglists ["loc"], :doc "Returns the loc of the rightmost sibling of the node at this loc, or self", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/rightmost"} {:added "1.0", :ns "clojure.zip", :name "insert-child", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1329432152000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "zipper", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521edf"} {:created-at 1357860181000, :author {:login "juan.facorro", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d6f59d93cc17c698f16e550034a2d1ad?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "append-child", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521ee0"}], :line 216, :examples [{:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [], :body "(use 'clojure.zip) ;;warnings OK\n\n(def zp (zipper vector? seq (fn [_ c] c) [[1 2 3] [4 [5 6] 7] [8 9]]) )\n\n(root (insert-child (-> zp down right) 42))\n=>([1 2 3] (42 4 [5 6] 7) [8 9])\n\n\n(def zp2 (zipper vector? seq (fn [_ c] c) [74 75])\n\n(root (insert-right (-> zp down right) zp2))\n=>([1 2 3] [4 [5 6] 7] [[74 75] nil] [8 9])\n\n(root (insert-left (-> zp down right) zp2))\n=>([1 2 3] [[74 75] nil] [4 [5 6] 7] [8 9])\n\n\n\n", :created-at 1329432685000, :updated-at 1329432685000, :_id "542692d7c026201cdc327140"}], :notes nil, :arglists ["loc item"], :doc "Inserts the item as the leftmost child of the node at this loc,\n without moving", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/insert-child"} {:added "1.0", :ns "clojure.zip", :name "left", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos nil, :line 166, :examples nil, :notes nil, :arglists ["loc"], :doc "Returns the loc of the left sibling of the node at this loc, or nil", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/left"} {:added "1.0", :ns "clojure.zip", :name "path", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos nil, :line 90, :examples [{:updated-at 1559115788133, :created-at 1534083516071, :author {:login "abhi18av", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/12799326?v=4"}, :body "\n(def nested-vecs\n [:foo [:bar :baz [:bork]]])\n\n;; now let's make a zipper\n(def z (zip/vector-zip nested-vecs))\n\n;; \"path\" only returns the \"down nodes\" necessary to reach the destination.\n;; Any other horizontal movement is not collected:\n\n(-> z\n zip/down ;; down1 [:foo [:bar :baz [:bork]]]\n zip/right\n zip/down ;; down2 [:bar :baz [:bork]]\n zip/rightmost\n zip/down ;; down3 [:bork]\n zip/path)\n\n;; [[:foo [:bar :baz [:bork]]] \n;; [:bar :baz [:bork]] \n;; [:bork]]\n\n\n\n", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5b7041bce4b00ac801ed9e53"}], :notes nil, :arglists ["loc"], :doc "Returns a seq of nodes leading to this loc", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/path"} {:added "1.0", :ns "clojure.zip", :name "leftmost", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1497531567628, :author {:login "tkocmathla", :account-source "github", :avatar-url "https://avatars0.githubusercontent.com/u/183459?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "rightmost", :ns "clojure.zip"}, :_id "594284afe4b06e730307db32"}], :line 174, :examples nil, :notes nil, :arglists ["loc"], :doc "Returns the loc of the leftmost sibling of the node at this loc, or self", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/leftmost"} {:added "1.0", :ns "clojure.zip", :name "append-child", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1558985943586, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "insert-child", :ns "clojure.zip"}, :_id "5cec3cd7e4b0ca44402ef72e"}], :line 223, :examples [{:editors [{:login "tomdl89", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/33435574?v=4"}], :body ";; \"append-child\" adds a new child as the rightmost element. \n;; \"insert-child\" does the same, but leftmost. The node needs to be a branch.\n\n(require '[clojure.zip :as zip])\n\n(def vzip\n (zip/vector-zip\n [[1 2]\n [3 4 [5 10 [11 12]]]\n [13 14]])) \n\n(-> vzip zip/down zip/rightmost (zip/append-child 'INS) zip/up zip/node)\n;; [[1 2] [3 4 [5 10 [11 12]]] [13 14 INS]]\n\n(-> vzip zip/down zip/rightmost (zip/insert-child 'INS) zip/up zip/node)\n;; [[1 2] [3 4 [5 10 [11 12]]] [INS 13 14]]\n\n(-> vzip zip/down zip/rightmost zip/down (zip/append-child 'INS))\n;; Exception called children on a leaf node\n", :author {:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}, :created-at 1558985910358, :updated-at 1683123974927, :_id "5cec3cb6e4b0ca44402ef72d"} {:updated-at 1574335186052, :created-at 1574335186052, :author {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/24317401?v=4"}, :body "(use 'clojure.zip)\n;; def a tree struct\n;; .\n;; / \\\n;; . 0\n;; / \\\n;; 1 2\n(def tree\n (vector-zip\n [[1 2] 0]))\n\n(-> tree\n down\n (append-child 3))\n;; .\n;; / \\\n;; x 0\n;; /|\\\n;; 1 2 3\n;;\n;; 3 inserted, location x unchanged", :_id "5dd672d2e4b0ca44402ef7e3"}], :notes nil, :arglists ["loc item"], :doc "Inserts the item as the rightmost child of the node at this loc,\n without moving", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/append-child"} {:added "1.0", :ns "clojure.zip", :name "branch?", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos nil, :line 69, :examples [{:updated-at 1574334564922, :created-at 1574334564922, :author {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/24317401?v=4"}, :body "(use 'clojure.zip)\n;; def a tree struct\n;; .\n;; / \\\n;; . 0\n;; / \\\n;; 1 2\n(def tree\n (vector-zip\n [[1 2] 0]))\n\n;; #0 #1 #2\n;; x . .\n;; / \\ / \\ / \\\n;; . 0 x 0 . x\n;; / \\ / \\ / \\\n;; 1 2 1 2 1 2\n\n;; #0\n(-> tree\n branch?) ;; => true\n;; #1\n(-> tree\n down\n branch?) ;; => true\n;; #2\n(-> tree\n down\n next\n branch?) ;; => false\n\n;; false for leaves", :_id "5dd67064e4b0ca44402ef7e2"}], :notes nil, :arglists ["loc"], :doc "Returns true if the node at loc is a branch", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/branch_q"} {:added "1.0", :ns "clojure.zip", :name "children", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1455292742761, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "zipper", :ns "clojure.zip"}, :_id "56be0146e4b0b0491b9ed178"}], :line 75, :examples [{:updated-at 1574339327098, :created-at 1574335336603, :author {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/24317401?v=4"}, :body "(use 'clojure.zip)\n;; def a tree struct\n;; .\n;; / \\\n;; . 0\n;; / \\\n;; 1 2\n(def tree\n (vector-zip\n [[1 2] 0]))\n\n;; #0 #1 #2\n;; x . .\n;; / \\ / \\ / \\\n;; . 0 x 0 . 0\n;; / \\ / \\ / \\\n;; 1 2 1 2 x 2\n\n;; #0\n(-> tree\n children) ;; => ([1 2] 0)\n;; #1\n(-> tree\n down\n children) ;; => (1 2)\n;; #2\n(-> tree\n down\n down\n children) ;; => Exception called children on a leaf node", :editors [{:avatar-url "https://avatars3.githubusercontent.com/u/24317401?v=4", :account-source "github", :login "loeschzwerg"}], :_id "5dd67368e4b0ca44402ef7e4"}], :notes nil, :arglists ["loc"], :doc "Returns a seq of the children of node at loc, which must be a branch", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/children"} {:added "1.0", :ns "clojure.zip", :name "remove", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos nil, :line 264, :examples [{:updated-at 1558973394746, :created-at 1558973394746, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body "(require '[clojure.zip :as zip])\n\n(def vzip\n (zip/vector-zip\n [[1 2]\n [3 4 [5 10 [11 12]]]\n [13 14]])) ;; target for removal\n\n(-> vzip zip/down zip/rightmost zip/remove zip/root)\n;; [[1 2] [3 4 [5 10 [11 12]]]]", :_id "5cec0bd2e4b0ca44402ef72c"} {:editors [{:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/24317401?v=4"}], :body "(use 'clojure.zip)\n;; def a tree struct\n;; .\n;; / \\\n;; . 0\n;; / \\\n;; 1 2\n(def tree\n (vector-zip\n [[1 2] 0]))\n\n;; #1 #2\n;; x x\n;; / \\ /|\\\n;; 1 0 1 - 0\n;; / \\\n;; 1 2\n\n;; #1\n(-> tree\n down\n (replace 1)\n up\n node) ;; => [1 0]\n;; #2\n(-> tree\n down\n (insert-left 1)\n remove ;; cut desired node\n up\n node) ;; => [1 0]", :author {:avatar-url "https://avatars3.githubusercontent.com/u/24317401?v=4", :account-source "github", :login "loeschzwerg"}, :created-at 1574337342956, :updated-at 1574337519515, :_id "5dd67b3ee4b0ca44402ef7e7"}], :notes nil, :arglists ["loc"], :doc "Removes the node at loc, returning the loc that would have preceded\n it in a depth-first walk.", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/remove"} {:added "1.0", :ns "clojure.zip", :name "down", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1455292674651, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "zipper", :ns "clojure.zip"}, :_id "56be0102e4b060004fc217c0"}], :line 109, :examples [{:updated-at 1574335586383, :created-at 1574335586383, :author {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/24317401?v=4"}, :body "(use 'clojure.zip)\n;; def a tree struct\n;; .\n;; / \\\n;; . 0\n;; / \\\n;; 1 2\n(def tree\n (vector-zip\n [[1 2] 0]))\n\n;; #0 #1 #2\n;; x . .\n;; / \\ / \\ / \\\n;; . 0 x 0 . 0\n;; / \\ / \\ / \\\n;; 1 2 1 2 x 2\n\n;; #0\n(-> tree\n node) ;; => [[1 2] 0]\n;; #1\n(-> tree\n down\n node) ;; => [1 2]\n;; #2\n(-> tree\n down\n down\n node) ;; => 1\n\n;; notice the leftmost child / first element", :_id "5dd67462e4b0ca44402ef7e5"}], :notes nil, :arglists ["loc"], :doc "Returns the loc of the leftmost child of the node at this loc, or\n nil if no children", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/down"} {:added "1.0", :ns "clojure.zip", :name "replace", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1357860115000, :author {:login "juan.facorro", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d6f59d93cc17c698f16e550034a2d1ad?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "edit", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521c4b"}], :line 203, :examples [{:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [], :body "(use 'clojure.zip)\n\n(def vz (vector-zip [1 2 [73 88] 4]))\n\n(root (replace (-> vz down right right) 3))\n=>[1 2 3 4]", :created-at 1329434106000, :updated-at 1329434106000, :_id "542692d7c026201cdc327142"}], :notes [{:author {:login "nsadeh", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/15837587?v=4"}, :updated-at 1688429049053, :created-at 1688429049053, :body "This throws an error if you replace the end node btw", :_id "64a361f9e4b08cf8563f4bd1"}], :arglists ["loc node"], :doc "Replaces the node at this loc, without moving", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/replace"} {:added "1.0", :ns "clojure.zip", :name "zipper", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1329431493000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "down", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d93"} {:created-at 1329431497000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "up", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d94"} {:created-at 1329431508000, :author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "right", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d95"} {:created-at 1364881252000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "left", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d96"} {:created-at 1364881303000, :author {:login "boxie", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bfc366066e3c1beee98f3a6666728169?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "children", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d97"} {:created-at 1417358040306, :author {:login "abrooks", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/69976?v=2"}, :to-var {:ns "clojure.zip", :name "node", :library-url "https://github.com/clojure/clojure"}, :_id "547b2ad8e4b0dc573b892fe5"} {:created-at 1455304623314, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "replace", :ns "clojure.zip"}, :_id "56be2fafe4b060004fc217c3"}], :line 18, :examples [{:updated-at 1406155327000, :created-at 1287950611000, :body ";; Some clojure.zip functions will overwrite clojure.core's definitions\n(use 'clojure.zip)\n\n;; You may wish to require :as in order to avoid the above\n(require '[clojure.zip :as z])\n\n;; For the purposes of keeping the examples that follow clean,\n;; assume we have taken the former route: (use 'clojure.zip)\n\n(use 'clojure.pprint)\n(def p pprint)\n\nuser> (def z [[1 2 3] [4 [5 6] 7] [8 9]])\n#'user/z\n\nuser> (def zp (zipper vector? seq (fn [_ c] c) z))\n#'user/zp\n\nuser> zp\n[[[1 2 3] [4 [5 6] 7] [8 9]] nil]\n\nuser=> (p (-> zp down))\n[[1 2 3]\n {:l [],\n :pnodes [[[1 2 3] [4 [5 6] 7] [8 9]]],\n :ppath nil,\n :r ([4 [5 6] 7] [8 9])}]\n \nuser> (first (-> zp down))\n[1 2 3]\n\nuser=> (p (-> zp down right))\n[[4 [5 6] 7]\n {:l [[1 2 3]],\n :pnodes [[[1 2 3] [4 [5 6] 7] [8 9]]],\n :ppath nil,\n :r ([8 9])}]\n\nuser> (first (-> zp down right))\n[4 [5 6] 7]\n\nuser=> (p (-> zp down right down right))\n[[5 6]\n {:l [4],\n :pnodes [[[1 2 3] [4 [5 6] 7] [8 9]] [4 [5 6] 7]],\n :ppath\n {:l [[1 2 3]],\n :pnodes [[[1 2 3] [4 [5 6] 7] [8 9]]],\n :ppath nil,\n :r ([8 9])},\n :r (7)}]\n\nuser=> (p (-> zp down right down right down))\n[5\n {:l [],\n :pnodes [[[1 2 3] [4 [5 6] 7] [8 9]] [4 [5 6] 7] [5 6]],\n :ppath\n {:l [4],\n :pnodes [[[1 2 3] [4 [5 6] 7] [8 9]] [4 [5 6] 7]],\n :ppath\n {:l [[1 2 3]],\n :pnodes [[[1 2 3] [4 [5 6] 7] [8 9]]],\n :ppath nil,\n :r ([8 9])},\n :r (7)},\n :r (6)}]\n\nuser=> (p (-> zp down right down right (replace \"hello\")))\n[\"hello\"\n {:changed? true,\n :l [4],\n :pnodes [[[1 2 3] [4 [5 6] 7] [8 9]] [4 [5 6] 7]],\n :ppath\n {:l [[1 2 3]],\n :pnodes [[[1 2 3] [4 [5 6] 7] [8 9]]],\n :ppath nil,\n :r ([8 9])},\n :r (7)}]\n\nuser=> (p (-> zp down right down right (replace \"hello\") up))\n[(4 \"hello\" 7)\n {:changed? true,\n :l [[1 2 3]],\n :pnodes [[[1 2 3] [4 [5 6] 7] [8 9]]],\n :ppath nil,\n :r ([8 9])}]\n\nuser=> (p (-> zp down right down right (replace \"hello\") up root))\n([1 2 3] (4 \"hello\" 7) [8 9])", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/7194?v=2", :account-source "github", :login "zk"} {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"} {:avatar-url "https://www.gravatar.com/avatar/e21945030cedebfd5b4a4f04ad3843e8?r=PG&default=identicon", :account-source "clojuredocs", :login "elben"}], :author {:avatar-url "https://www.gravatar.com/avatar/4bc423f6653d93f9185a5cdc9f5cd84f?r=PG&default=identicon", :account-source "clojuredocs", :login "bhenry"}, :_id "542692d1c026201cdc326f2e"} {:body "(require '[clojure.zip :as zip])\n\n;; Adds zip support for maps.\n;; (Source: http://stackoverflow.com/a/15020649/42188)\n(defn map-zipper [m]\n (zip/zipper \n (fn [x] (or (map? x) (map? (nth x 1))))\n (fn [x] (seq (if (map? x) x (nth x 1))))\n (fn [x children] \n (if (map? x) \n (into {} children) \n (assoc x 1 (into {} children))))\n m))\n\n(def m {:a 3 :b {:x true :y false} :c 4})\n\n;; Note that hash-maps are not ordered:\n(-> (map-zipper m) zip/down zip/right zip/node)\n;;=> [:b {:y false, :x true}]\n\n;; Treat nodes as [key value] pairs:\n(-> (map-zipper m) \n zip/down\n (zip/edit (fn [[k v]] [k (inc v)]))\n zip/root)\n;;=> {:c 5, :b {:y false, :x true}, :a 3}", :author {:login "muhuk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/40178?v=3"}, :created-at 1423511905733, :updated-at 1423511905733, :_id "54d91161e4b081e022073c72"} {:updated-at 1481022698534, :created-at 1480941951575, :author {:login "PetrGlad", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/124476?v=3"}, :body ";; A version of zipper that allows mixing maps and vectors \n;; Note that it traverses map entries too\n(require '[clojure.zip :as z])\n(defn map-vec-zipper [m]\n (z/zipper\n (fn [x] (or (map? x) (sequential? x)))\n seq\n (fn [p xs]\n (if (isa? (type p) clojure.lang.MapEntry)\n (into [] xs)\n (into (empty p) xs)))\n m))\n(-> (map-vec-zipper [{1 [21 22] 3 [4]}])\n z/down\n (z/edit assoc :e 99)\n z/down\n ;; Note that the map does not guarantee particular entries ordering.\n z/down ;; Getting into map entry. \n z/next\n (z/edit conj 77)\n z/root)\n;;=> [{1 [21 22 77], 3 [4], :e 99}]", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/124476?v=3", :account-source "github", :login "PetrGlad"}], :_id "5845617fe4b0782b632278d3"} {:updated-at 1481023902325, :created-at 1481023619209, :author {:login "PetrGlad", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/124476?v=3"}, :body ";; Get sequence of all visited nodes\n(require '[clojure.zip :as z])\n(->> (z/vector-zip [[1 2] 3 [[4 5]]])\n (iterate z/next)\n (take-while #(not (z/end? %))) ;; Zipper's \"end of iteration\" condition. \n (map z/node))\n;;=> ([[1 2] 3 [[4 5]]] \n;; [1 2] \n;; 1 2\n;; 3 \n;; [[4 5]] \n;; [4 5]\n;; 4 5)", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/124476?v=3", :account-source "github", :login "PetrGlad"}], :_id "5846a083e4b0782b632278d9"}], :notes [{:updated-at 1287977279000, :body "For more info on zippers:\r\n\r\n* [Brian Marick](http://clojuredocs.org/profile/Brian%20Marick): [“Editingâ€� trees in Clojure with clojure.zip](http://www.exampler.com/blog/2010/09/01/editing-trees-in-clojure-with-clojurezip/)\r\n* Alex Miller: [Zippers with records in Clojure](http://tech.puredanger.com/2010/10/22/zippers-with-records-in-clojure/)", :created-at 1287977279000, :author {:login "zk", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/7194?v=2"}, :_id "542692ecf6e94c6970521f9e"} {:updated-at 1333789044000, :body "Tutorials on zippers:\r\n\r\n* Brian Marick: [\"Editing\" trees in Clojure with clojure.zip](http://www.exampler.com/blog/2010/09/01/editing-trees-in-clojure-with-clojurezip)\r\n\r\n* Alex Miller: [Zippers with records in Clojure](http://tech.puredanger.com/2010/10/22/zippers-with-records-in-clojure/)", :created-at 1333787145000, :author {:login "jafingerhut", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/109629?v=3"}, :_id "542692ecf6e94c6970521fdd"} {:author {:login "PetrGlad", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/124476?v=3"}, :updated-at 1480942234308, :created-at 1480942234308, :body "To work with nested structures you can also use\n* clojure.core/get-in, clojure.core/assoc-in, clojure.core/update-in \n* Balagan library https://github.com/clojurewerkz/balagan\n* Specter library https://github.com/nathanmarz/specter ", :_id "5845629ae4b0782b632278d4"}], :arglists ["branch? children make-node root"], :doc "Creates a new zipper structure. \n\n branch? is a fn that, given a node, returns true if can have\n children, even if it currently doesn't.\n\n children is a fn that, given a branch node, returns a seq of its\n children.\n\n make-node is a fn that, given an existing node and a seq of\n children, returns a new branch node with the supplied children.\n root is the root node.", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/zipper"} {:added "1.0", :ns "clojure.zip", :name "end?", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1455299357645, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "zipper", :ns "clojure.zip"}, :_id "56be1b1de4b0b0491b9ed179"}], :line 258, :examples nil, :notes nil, :arglists ["loc"], :doc "Returns true if loc represents the end of a depth-first walk", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/end_q"} {:added "1.0", :ns "clojure.zip", :name "edit", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1448013007225, :author {:login "damianfijorek", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/963492?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "root", :ns "clojure.zip"}, :_id "564eeccfe4b0be225c0c4797"} {:created-at 1455304694999, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "zipper", :ns "clojure.zip"}, :_id "56be2ff6e4b0b0491b9ed17a"} {:created-at 1574336768778, :author {:login "loeschzwerg", :account-source "github", :avatar-url "https://avatars3.githubusercontent.com/u/24317401?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "replace", :ns "clojure.zip"}, :_id "5dd67900e4b0ca44402ef7e6"}], :line 210, :examples [{:updated-at 1447940484310, :created-at 1447940484310, :author {:login "damianfijorek", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/963492?v=3"}, :body "(require '[clojure.xml :as xml]\n '[clojure.zip :as zip])\n\n;; get xml with content added to root child\n(let [root (zip/xml-zip (xml/parse-str \"\"))\n child (zip/down root)\n new-child (zip/edit child #(assoc-in % [:content] \"content\"))\n new-root (zip/root new-child)]\n (xml/emit-str new-root))\n;;=> \"content\"", :_id "564dd184e4b0538444398273"}], :notes nil, :arglists ["loc f & args"], :doc "Replaces the node at this loc with the value of (f node args)", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/edit"} {:added "1.0", :ns "clojure.zip", :name "make-node", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos nil, :line 83, :examples [{:updated-at 1559115957031, :created-at 1559073900810, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; Useful to perform operations on locations without knowing the\n;; internals of the zipper. For example, here's a generic remove-child to remove\n;; the first children from a node\n(require '[clojure.zip :as zip])\n\n(def vzip\n (zip/vector-zip\n [[1 2]\n [3 4 [5 10 [11 12]]]\n [13 14]]))\n\n(defn remove-child [loc]\n (zip/replace loc \n (zip/make-node loc (zip/node loc) (rest (zip/children loc)))))\n\n(-> vzip zip/down zip/rightmost remove-child zip/root)\n;; [[1 2] [3 4 [5 10 [11 12]]] [14]]", :editors [{:avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4", :account-source "github", :login "reborg"}], :_id "5ced946ce4b0ca44402ef730"}], :notes nil, :arglists ["loc node children"], :doc "Returns a new branch node, given an existing node and new\n children. The loc is only used to supply the constructor.", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/make-node"} {:added "1.0", :ns "clojure.zip", :name "vector-zip", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1283300922000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "seq-zip", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d72"} {:created-at 1283300949000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "xml-zip", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d73"} {:created-at 1320037497000, :author {:login "Arnoldo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a60ef262d016a9a38f5268e088ab32?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "next", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d74"} {:created-at 1320037502000, :author {:login "Arnoldo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a60ef262d016a9a38f5268e088ab32?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "end?", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521d75"}], :line 44, :examples [{:author {:login "Arnoldo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a60ef262d016a9a38f5268e088ab32?r=PG&default=identicon"}, :editors [{:login "Arnoldo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a60ef262d016a9a38f5268e088ab32?r=PG&default=identicon"} {:login "Arnoldo", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/3a60ef262d016a9a38f5268e088ab32?r=PG&default=identicon"} {:login "Jules", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/77c985628bea3a3ff10e76cefcc929c4?r=PG&default=identicon"}], :body "\n(require '[clojure.zip :as zip])\n\n(defn zip-map [f loc]\n \" Map f over every node of the zipper.\n The function received has the form (f node-value loc),\n the node value and its location\"\n (loop [z loc]\n (if (zip/end? z)\n (zip/root z) ; perhaps you can call zip/seq-zip or zip/vector-zip?\n (recur (zip/next (zip/edit z f z))))))\n\n;; Multiply by 100 every node in the tree\nuser=> (zip-map (fn [n nx] (if (vector? n) n (* n 100) )) (zip/vector-zip '[5 [10 20 30] [1 2 3] ]))\n;; Be careful! the returned result by zip/root is not a zipper anymore!\n[500 [1000 2000 3000] [100 200 300]]\n", :created-at 1320036944000, :updated-at 1373138099000, :_id "542692d7c026201cdc327144"} {:updated-at 1587100167390, :created-at 1587100167390, :author {:login "funkrider", :account-source "github", :avatar-url "https://avatars2.githubusercontent.com/u/12958644?v=4"}, :body ";; It may not be obvious however it is worth pointing out that \n;; this implementation assumes that all vectors are branches, \n;; and all non vector data is therefore a leaf node. \n\n;; A vector \"Tree\" [5 [10 20 30] [1 2 3]]) can be visualised as\n;;\n;; --- ♦ ---\n;; / | \\\n;; 5 ♦ ♦\n;; / | \\ / | \\\n;; 10 20 30 1 2 3\n\n;; If you want to put data into a branch node for example a binary tree\n;; you can not use the default zip/vector-zip. Rather you need use zip/zipper\n;; and give a new children function to specify where the children are.\n;; See: https://stackoverflow.com/questions/26268098/can-someone-give-an-example-of-how-edit-function-for-clojure-zip-works", :_id "5e993a07e4b087629b5a18d4"}], :notes nil, :arglists ["root"], :doc "Returns a zipper for nested vectors, given a root vector", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/vector-zip"} {:added "1.0", :ns "clojure.zip", :name "node", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos nil, :line 64, :examples [{:author {:login "Victor", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc41ebab54cc0e0fbe99d753876d45ce?r=PG&default=identicon"}, :editors [{:login "Victor", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc41ebab54cc0e0fbe99d753876d45ce?r=PG&default=identicon"} {:login "Victor", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc41ebab54cc0e0fbe99d753876d45ce?r=PG&default=identicon"}], :body "user=>(require '[clojure.zip :as zip])\nnil\nuser=> (def original [1 '(a b c) 2])\n#'user/original\nuser=> (def root-loc (zip/seq-zip (seq original)))\n#'user/root-loc\n\nuser=> (zip/node (zip/down root-loc))\n1\n", :created-at 1291935344000, :updated-at 1291935456000, :_id "542692d1c026201cdc326f32"}], :notes [{:updated-at 1291935491000, :body "See tutorial of clojure.zip at \r\nhttp://www.exampler.com/blog/2010/09/01/editing-trees-in-clojure-with-clojurezip/", :created-at 1291935491000, :author {:login "Victor", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/bc41ebab54cc0e0fbe99d753876d45ce?r=PG&default=identicon"}, :_id "542692ecf6e94c6970521fad"}], :arglists ["loc"], :doc "Returns the node at loc", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/node"} {:added "1.0", :ns "clojure.zip", :name "up", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1283300764000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "down", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cda"} {:created-at 1283300777000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "left", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cdb"} {:created-at 1283300781000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "right", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cdc"} {:created-at 1283300826000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "next", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cdd"} {:created-at 1283300881000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "seq-zip", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521cde"} {:created-at 1413255010369, :author {:login "tway24", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/9206853?v=2"}, :to-var {:ns "clojure.zip", :name "zipper", :library-url "https://github.com/clojure/clojure"}, :_id "543c8f62e4b001b88094c7ef"}], :line 123, :examples nil, :notes nil, :arglists ["loc"], :doc "Returns the loc of the parent of the node at this loc, or nil if at\n the top", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/up"} {:added "1.0", :ns "clojure.zip", :name "insert-right", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos nil, :line 193, :examples [{:body ";;; zip is not default required in clj\n(require '[clojure.zip :as zip])\n\n(def root-tree (zip/seq-zip '(:root (:1st-left-child ) (:1st-right-child\n))))\n\n;;; get the location , in this case is the root of the tree\n(def location (-> root-tree zip/next))\n\n\n(zip/insert-right location :inserted)\n\n;; = > [:root\n;; {:changed? true,\n;; :l [],\n;; :pnodes [(:root (:1st-left-child) (:1st-right-child))],\n;; :ppath nil,\n;; :r (:inserted (:1st-left-child) (:1st-right-child))}]", :author {:login "zacyang", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/898449?v=3"}, :created-at 1433170538137, :updated-at 1433170538137, :_id "556c726ae4b03e2132e7d183"}], :notes nil, :arglists ["loc item"], :doc "Inserts the item as the right sibling of the node at this loc,\n without moving", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/insert-right"} {:added "1.0", :ns "clojure.zip", :name "rights", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos nil, :line 102, :examples nil, :notes nil, :arglists ["loc"], :doc "Returns a seq of the right siblings of this loc", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/rights"} {:added "1.0", :ns "clojure.zip", :name "root", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1448013056620, :author {:login "damianfijorek", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/963492?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "edit", :ns "clojure.zip"}, :_id "564eed00e4b0be225c0c4798"}], :line 137, :examples nil, :notes nil, :arglists ["loc"], :doc "zips all the way up and returns the root node, reflecting any\n changes.", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/root"} {:added "1.0", :ns "clojure.zip", :name "next", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1559164398312, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "prev", :ns "clojure.zip"}, :_id "5ceef5eee4b0ca44402ef736"}], :line 230, :examples [{:updated-at 1559164278848, :created-at 1559164278848, :author {:login "reborg", :account-source "github", :avatar-url "https://avatars1.githubusercontent.com/u/20086?v=4"}, :body ";; zip-walk takes a transformation function f and a zipper z.\n;; f takes a location and returns location. Applies f\n;; to the nodes in the zipper maintaining the original nesting.\n\n(require '[clojure.zip :as zip])\n\n(defn zip-walk [f z]\n (if (zip/end? z)\n (zip/root z)\n (recur f (zip/next (f z)))))\n\n(zip-walk\n (fn [loc] \n (if (zip/branch? loc) \n loc \n (zip/edit loc * 2)))\n (zip/vector-zip [1 2 [3 4]]))\n\n;; [2 4 [6 8]]\n", :_id "5ceef576e4b0ca44402ef735"}], :notes nil, :arglists ["loc"], :doc "Moves to the next loc in the hierarchy, depth-first. When reaching\n the end, returns a distinguished loc detectable via end?. If already\n at the end, stays there.", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/next"} {:added "1.0", :ns "clojure.zip", :name "seq-zip", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1283300897000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "xml-zip", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e84"} {:created-at 1283300907000, :author {:login "Chouser", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/7a0192050ed6488670acfd3f59405c10?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "vector-zip", :library-url "https://github.com/clojure/clojure"}, :_id "542692ebf6e94c6970521e85"}], :line 35, :examples [{:author {:login "Ljos", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/45b996a79abca465acaf6c0f10b0437?r=PG&default=identicon"}, :editors [], :body "user=> (require '[clojure.zip :as zip])\r\nnil\r\nuser=> (def zz (zip/seq-zip '(a b (c d e) (f (g h) i) j)))\r\n#'user/zz\r\nuser=> zz\r\n[(a b (c d e) (f (g h) i) j) nil]", :created-at 1320013293000, :updated-at 1320013293000, :_id "542692d7c026201cdc327143"}], :notes nil, :arglists ["root"], :doc "Returns a zipper for nested sequences, given a root sequence", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/seq-zip"} {:added "1.0", :ns "clojure.zip", :name "insert-left", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1433170800901, :author {:login "zacyang", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/898449?v=3"}, :to-var {:ns "clojure.zip", :name "insert-right", :library-url "https://github.com/clojure/clojure"}, :_id "556c7370e4b03e2132e7d184"}], :line 183, :examples [{:body ";;; zip is not default required in clj\n(require '[clojure.zip :as zip])\n\n(def root-tree (zip/seq-zip '(:root (:1st-left-child ) (:1st-right-child\n))))\n\n;;; get the location , in this case is the root of the tree\n(def location (-> root-tree zip/next))\n\n\n(zip/insert-left location :inserted)\n\n;;; then the :inserted is on the left of the original tree\n;;;=>[:root\n;;; {:changed? true,\n;;; :l [:inserted],\n;;; :pnodes [(:root (:1st-left-child) (:1st-right-child))],\n;;; :ppath nil,\n;;; :r ((:1st-left-child) (:1st-right-child))}]", :author {:login "zacyang", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/898449?v=3"}, :created-at 1433170211818, :updated-at 1433170211818, :_id "556c7123e4b01ad59b65f4ec"}], :notes nil, :arglists ["loc item"], :doc "Inserts the item as the left sibling of the node at this loc,\n without moving", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/insert-left"} {:added "1.0", :ns "clojure.zip", :name "prev", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos nil, :line 246, :examples nil, :notes nil, :arglists ["loc"], :doc "Moves to the previous loc in the hierarchy, depth-first. If already\n at the root, returns nil.", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/prev"} {:added "1.0", :ns "clojure.zip", :name "right", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1455292718902, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=3"}, :to-var {:library-url "https://github.com/clojure/clojure", :name "zipper", :ns "clojure.zip"}, :_id "56be012ee4b0b0491b9ed177"}], :line 149, :examples nil, :notes nil, :arglists ["loc"], :doc "Returns the loc of the right sibling of the node at this loc, or nil", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/right"} {:added "1.0", :ns "clojure.zip", :name "lefts", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1358376302000, :author {:login "juan.facorro", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/d6f59d93cc17c698f16e550034a2d1ad?r=PG&default=identicon"}, :to-var {:ns "clojure.zip", :name "rights", :library-url "https://github.com/clojure/clojure"}, :_id "542692eaf6e94c6970521b4f"}], :line 96, :examples [{:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [], :body "(def vz (vector-zip [1 2 3 4 5]))\n\n;; root\n;; |________\n;; | | | | |\n;; 1 2[3]4 5\n\n;;go down and then right twice, what's to the left of me now?\n(-> vz down right right lefts)\n=>(1 2)\n\n;;equivalent:\n(-> vz down right right rights)\n=>(4 5)\n\n", :created-at 1329433215000, :updated-at 1329433215000, :_id "542692d7c026201cdc327141"}], :notes nil, :arglists ["loc"], :doc "Returns a seq of the left siblings of this loc", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/lefts"} {:added "1.0", :ns "clojure.zip", :name "xml-zip", :file "clojure/zip.clj", :type "function", :column 1, :see-alsos [{:created-at 1413924240105, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :to-var {:ns "clojure.xml", :name "parse", :library-url "https://github.com/clojure/clojure"}, :_id "5446c590e4b03d20a1024275"}], :line 53, :examples [{:author {:login "Claj", :account-source "clojuredocs", :avatar-url "https://www.gravatar.com/avatar/5fd658a8d2ef549071cb5286b1b874aa?r=PG&default=identicon"}, :editors [], :body "(def xmlzipper (clojure.zip/xml-zip (clojure.xml/parse \"resources/somedata.xml\")))\n\n;;make a zippper pointing at the children to the topnode in somedata.xml\n(clojure.zip/children xmlzipper)\n\n \n\n\n\n\n", :created-at 1323729937000, :updated-at 1323729937000, :_id "542692d7c026201cdc327148"} {:updated-at 1413924196033, :created-at 1335333199000, :body "(require '[clojure.zip :as z])\n\n;; The following example make use of an xml-tree ...\n;; foo barbar\n;; Notice that the xml-parse will not produce the exact \n;; xml object as the \"foo\" and \"bar\" strings are combined.\n\n;; Travel over the zipper in classic lisp style\n(z/right\n (z/down\n (z/xml-zip \n {:tag :root :content [{:tag :any :content [\"foo\" \"bar\"]} \"bar\"]})))\n\n;;=> [\"bar\" {:l [{:content [\"foo\" \"bar\"], :tag :any}], \n;;+> :pnodes [{:content [{:content [\"foo\" \"bar\"], :tag :any} \"bar\"], :tag :root}],\n;;+> :ppath nil, :r nil}]\n\n;; The above can also be written like this using the thread macro style\n(->{:tag :root :content [{:tag :any :content [\"foo\" \"bar\"]} \"bar\"]}\n z/xml-zip \n z/down \n z/right)\n\n;;=> [\"bar\" {:l [{:content [\"foo\" \"bar\"], :tag :any}], \n;;+> :pnodes [{:content [{:content [\"foo\" \"bar\"], :tag :any} \"bar\"], :tag :root}],\n;;+> :ppath nil, :r nil}]\n", :editors [{:avatar-url "https://avatars.githubusercontent.com/u/211644?v=2", :account-source "github", :login "phreed"}], :author {:avatar-url "https://avatars.githubusercontent.com/u/10421?v=3", :account-source "github", :login "devn"}, :_id "542692d7c026201cdc327149"} {:body "(require '[clojure.xml :as xml]\n '[clojure.zip :as zip])\n\n;; Looking at the whole zipper is usually not the goal.\n;; Here is a case where the \"bar\" element is extracted.\n;; The following is derived from the following xml.\n;; foobar\n(->{:tag :root :content [{:tag :any :content [\"foo\"]} \"bar\"]}\n zip/xml-zip\n zip/down\n zip/right\n zip/node)\n;;=> \"bar\"\n\n;; The following shows a slightly larger example including the parser.\n(def data\n \"\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \" )\n\n;; Here is an example of the parser in action\n(def xml-tree\n (-> data \n .getBytes \n java.io.ByteArrayInputStream. \n xml/parse ))\n\n;; Traversing the xml using a zipper\n(-> xml-tree\n zip/xml-zip \n zip/down\n zip/down\n zip/down\n zip/node\n )\n;;=> {:tag :geom, :attrs {:name \"ab1x\"}, :content nil}", :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :created-at 1413923803557, :updated-at 1413923803557, :_id "5446c3dbe4b03d20a1024274"}], :notes [{:body "There are also other libraries for processing xml that provide additional features.\nhttps://github.com/clojure/data.xml", :created-at 1413924401226, :updated-at 1413924401226, :author {:login "phreed", :account-source "github", :avatar-url "https://avatars.githubusercontent.com/u/211644?v=2"}, :_id "5446c631e4b0dc573b892fa4"}], :arglists ["root"], :doc "Returns a zipper for xml elements (as from xml/parse),\n given a root element", :library-url "https://github.com/clojure/clojure", :href "/clojure.zip/xml-zip"}]} \ No newline at end of file