Add anaphoric versions of map, filter, and foreach
Anaphoric macros reduce the need to specify a lambda by binding a special name in a form passed as a parameter to the macro. This allows you to write more concise code: (= (list (--filter (even? it) [1 2 3 4])) [2 4]) This patch just adds a few basic ones. Other forms that can be converted to anaphoric versions include reduce, remove, enumerate, etc.
This commit is contained in:
parent
63a9e35f7f
commit
2106a0e5d4
@ -3,6 +3,7 @@
|
|||||||
;; Copyright (c) 2013 Nicolas Dandrimont <nicolas.dandrimont@crans.org>
|
;; Copyright (c) 2013 Nicolas Dandrimont <nicolas.dandrimont@crans.org>
|
||||||
;; Copyright (c) 2013 Paul Tagliamonte <paultag@debian.org>
|
;; Copyright (c) 2013 Paul Tagliamonte <paultag@debian.org>
|
||||||
;; Copyright (c) 2013 Konrad Hinsen <konrad.hinsen@fastmail.net>
|
;; Copyright (c) 2013 Konrad Hinsen <konrad.hinsen@fastmail.net>
|
||||||
|
;; Copyright (c) 2013 James King <james@agentultra.com>
|
||||||
;;
|
;;
|
||||||
;; Permission is hereby granted, free of charge, to any person obtaining a
|
;; Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
;; copy of this software and associated documentation files (the "Software"),
|
;; copy of this software and associated documentation files (the "Software"),
|
||||||
@ -116,3 +117,20 @@
|
|||||||
;; TODO: this needs some gensym love
|
;; TODO: this needs some gensym love
|
||||||
`(foreach [_hy_yield_from_x ~iterable]
|
`(foreach [_hy_yield_from_x ~iterable]
|
||||||
(yield _hy_yield_from_x)))
|
(yield _hy_yield_from_x)))
|
||||||
|
|
||||||
|
|
||||||
|
(defmacro --each [lst &rest body]
|
||||||
|
`(foreach [it ~list] ~@body))
|
||||||
|
|
||||||
|
|
||||||
|
(defmacro --map [form lst]
|
||||||
|
`(let [[f (lambda [it] ~form)]]
|
||||||
|
(foreach [v ~lst]
|
||||||
|
(yield (f v)))))
|
||||||
|
|
||||||
|
|
||||||
|
(defmacro --filter [form lst]
|
||||||
|
`(let [[pred (lambda [it] ~form)]]
|
||||||
|
(foreach [val ~lst]
|
||||||
|
(if (pred val)
|
||||||
|
(yield val)))))
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
;; Copyright (c) 2013 Paul Tagliamonte <paultag@debian.org>
|
;; Copyright (c) 2013 Paul Tagliamonte <paultag@debian.org>
|
||||||
;; Copyright (c) 2013 Bob Tolbert <bob@tolbert.org>
|
;; Copyright (c) 2013 Bob Tolbert <bob@tolbert.org>
|
||||||
|
;; Copyright (c) 2013 James King <james@agentultra.com>
|
||||||
|
|
||||||
;; Permission is hereby granted, free of charge, to any person obtaining a
|
;; Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
;; copy of this software and associated documentation files (the "Software"),
|
;; copy of this software and associated documentation files (the "Software"),
|
||||||
@ -391,3 +392,23 @@
|
|||||||
(assert-equal res [None None])
|
(assert-equal res [None None])
|
||||||
(setv res (list (take-while (fn [x] (not (none? x))) [1 2 3 4 None 5 6 None 7])))
|
(setv res (list (take-while (fn [x] (not (none? x))) [1 2 3 4 None 5 6 None 7])))
|
||||||
(assert-equal res [1 2 3 4]))
|
(assert-equal res [1 2 3 4]))
|
||||||
|
|
||||||
|
(defn test-anaphoric-each []
|
||||||
|
"NATIVE: testing anaphoric each"
|
||||||
|
(setv res [])
|
||||||
|
(--each [1 2 3 4] (.append res it))
|
||||||
|
(assert-equal res [1 2 3 4]))
|
||||||
|
|
||||||
|
(defn test-anaphoric-map []
|
||||||
|
"NATIVE: testing anaphoric map"
|
||||||
|
(assert-equal (list (--map (* it 3) [1 2 3]))
|
||||||
|
[3 6 9])
|
||||||
|
(assert-equal (list (--map (* it 3) []))
|
||||||
|
[]))
|
||||||
|
|
||||||
|
(defn test-anaphoric-filter []
|
||||||
|
"NATIVE: testing anaphoric filter"
|
||||||
|
(assert-equal (list (--filter (> it 2) [1 2 3 4]))
|
||||||
|
[3 4])
|
||||||
|
(assert-equal (list (--filter (even? it) [1 2 3 4]))
|
||||||
|
[2 4]))
|
||||||
|
Loading…
Reference in New Issue
Block a user