Reputation: 10695
The first of the following two functions, fn-apply-cmp-vals, returns a partial function that is used in the second function, apply-cmp-vals.
What is the correct syntax to embed fn-apply-cmp-vals as an anonymous function in apply-cmp-vals?
(defn fn-apply-cmp-vals
[fn cmp-sos cmp-idx]
(partial fn cmp-sos cmp-idx))
(defn apply-cmp-vals
[cmp-vec cmp-vals cmp-vec-idx]
(let [fn-cmp (fn-apply-cmp-vals ret-non-match-rows cmp-vec cmp-vec-idx)]
(map #(fn-cmp %1) cmp-vals)))
Specifically, I want to replace fn-apply-cmp-vals ret-non-match-rows cmp-vec cmp-vec-idx)
with an anonymous function instead of a function call.
Thank You.
Upvotes: 2
Views: 240
Reputation: 22425
Lets take a look at this, in detail, one step at a time.
Your goal is to inline fn-apply-cmp-vals
as an anonymous function in apply-cmp-vals
. So lets do that first. Here is what your function looks like with no other changes:
(defn apply-cmp-vals
[cmp-vec cmp-vals cmp-vec-idx]
(let [fn-cmp ((fn [f cmp-sos cmp-idx] (partial f cmp-sos cmp-idx))
ret-non-match-rows cmp-vec cmp-vec-idx)]
(map #(fn-cmp %1) cmp-vals)))
This accomplishes your goal, but there is room for improvement. Since your function simply calls partial
with the given arguments, lets replace the anonymous function with a direct call to partial
with the correct arguments. This works because partial
returns a partially applied function.
(defn apply-cmp-vals
[cmp-vec cmp-vals cmp-vec-idx]
(let [fn-cmp (partial ret-non-match-rows cmp-vec cmp-vec-idx)]
(map #(fn-cmp %1) cmp-vals)))
Now, lets look where fn-cmp
is used. It is being called in its own anonymous function with a single argument. Since your partial function satisfies this requirement, you could instead just pass fn-cmp
into the map function directly.
(defn apply-cmp-vals
[cmp-vec cmp-vals cmp-vec-idx]
(let [fn-cmp (partial ret-non-match-rows cmp-vec cmp-vec-idx)]
(map fn-cmp cmp-vals)))
Finally, if you desire, you can completely remove the let
form:
(defn apply-cmp-vals
[cmp-vec cmp-vals cmp-vec-idx]
(map (partial ret-non-match-rows cmp-vec cmp-vec-idx) cmp-vals)))
So it turns out you didn't need an anonymous function at all!
Upvotes: 3
Reputation: 61031
I think what you are looking for is:
(defn apply-cmp-vals
[cmp-vec cmp-vals cmp-vec-idx]
(let [fn-cmp (partial ret-non-match-rows cmp-vec cmp-vec-idx)]
(map fn-cmp cmp-vals)))
fn-apply-cmp-vals
wasn't doing anything other than passing its arguments to partial
.
(partial ret-non-match-rows cmp-vec cmp-vec-idx)
will return an anonymous function.
fn-cmp
is a function, so replace (map #(fn-cmp %1) cmp-vals)
with (map fn-cmp com-vals)
.
Upvotes: 2