syntax | since v0.0-1853 | in clojure | Edit |
Use %
as the implicit argument to a #() function
, or use the following
if there are more than one:
%1
- first arg%2
- second arg%3
- third arg%&
- rest of the args(map #(* 2 %) [1 2 3])
;;=> (2 4 6)
(def f #(println %1 %2 %&))
(f 1 2 3 4 5)
;; prints: 1 2 (3 4 5)
(defn- read-arg
[rdr pct opts pending-forms]
(if-not (thread-bound? #'arg-env)
(read-symbol rdr pct)
(let [ch (peek-char rdr)]
(cond
(or (whitespace? ch)
(macro-terminating? ch)
(nil? ch))
(register-arg 1)
(identical? ch \&)
(do (read-char rdr)
(register-arg -1))
:else
(let [n (read* rdr true nil opts pending-forms)]
(if-not (integer? n)
(throw (IllegalStateException. "Arg literal must be %, %& or %integer"))
(register-arg n)))))))
(defn- macros [ch]
(case ch
\" read-string*
\: read-keyword
\; read-comment
\' (wrapping-reader 'quote)
\@ (wrapping-reader 'clojure.core/deref)
\^ read-meta
\` read-syntax-quote ;;(wrapping-reader 'syntax-quote)
\~ read-unquote
\( read-list
\) read-unmatched-delimiter
\[ read-vector
\] read-unmatched-delimiter
\{ read-map
\} read-unmatched-delimiter
\\ read-char*
\% read-arg
\# read-dispatch
nil))