Refactor for loop to use cond
This commit is contained in:
parent
92a1f17b36
commit
f2f38a1cf8
@ -31,31 +31,6 @@
|
|||||||
[hy._compat [PY33 PY34]])
|
[hy._compat [PY33 PY34]])
|
||||||
|
|
||||||
|
|
||||||
(defmacro for [args &rest body]
|
|
||||||
"shorthand for nested for loops:
|
|
||||||
(for [x foo
|
|
||||||
y bar]
|
|
||||||
baz) ->
|
|
||||||
(for* [x foo]
|
|
||||||
(for* [y bar]
|
|
||||||
baz))"
|
|
||||||
|
|
||||||
(if (odd? (len args))
|
|
||||||
(macro-error args "`for' requires an even number of args."))
|
|
||||||
|
|
||||||
(if (empty? body)
|
|
||||||
(macro-error None "`for' requires a body to evaluate"))
|
|
||||||
|
|
||||||
(if (empty? args)
|
|
||||||
`(do ~@body)
|
|
||||||
(if (= (len args) 2)
|
|
||||||
; basecase, let's just slip right in.
|
|
||||||
`(for* [~@args] ~@body)
|
|
||||||
; otherwise, let's do some legit handling.
|
|
||||||
(let [[alist (slice args 0 nil 2)]]
|
|
||||||
`(for* [(, ~@alist) (genexpr (, ~@alist) [~@args])] ~@body)))))
|
|
||||||
|
|
||||||
|
|
||||||
(defmacro with [args &rest body]
|
(defmacro with [args &rest body]
|
||||||
"shorthand for nested for* loops:
|
"shorthand for nested for* loops:
|
||||||
(with [[x foo] [y bar]] baz) ->
|
(with [[x foo] [y bar]] baz) ->
|
||||||
@ -113,6 +88,26 @@
|
|||||||
root)
|
root)
|
||||||
|
|
||||||
|
|
||||||
|
(defmacro for [args &rest body]
|
||||||
|
"shorthand for nested for loops:
|
||||||
|
(for [x foo
|
||||||
|
y bar]
|
||||||
|
baz) ->
|
||||||
|
(for* [x foo]
|
||||||
|
(for* [y bar]
|
||||||
|
baz))"
|
||||||
|
(cond
|
||||||
|
[(odd? (len args))
|
||||||
|
(macro-error args "`for' requires an even number of args.")]
|
||||||
|
[(empty? body)
|
||||||
|
(macro-error None "`for' requires a body to evaluate")]
|
||||||
|
[(empty? args) `(do ~@body)]
|
||||||
|
[(= (len args) 2) `(for* [~@args] ~@body)]
|
||||||
|
[true
|
||||||
|
(let [[alist (slice args 0 nil 2)]]
|
||||||
|
`(for* [(, ~@alist) (genexpr (, ~@alist) [~@args])] ~@body))]))
|
||||||
|
|
||||||
|
|
||||||
(defmacro -> [head &rest rest]
|
(defmacro -> [head &rest rest]
|
||||||
;; TODO: fix the docstring by someone who understands this
|
;; TODO: fix the docstring by someone who understands this
|
||||||
(setv ret head)
|
(setv ret head)
|
||||||
|
Loading…
Reference in New Issue
Block a user