I want to be able to do the following pseudocode:
- Pass in symbol a.
- Pass in symbol b.
- Pass in an expression using a and b
- As I change the value of a and b, print the output of c at each moment.
Ideally, I would like the signature to look like:
(runner a b (+ a b))
but I’m not sure that I’m approaching this correctly… I’ve tried changing the function to
(runner 'a 'b (+ 'a 'b))
and this more complicated example:
(runner 'a 'b (+ (* 'a 'b) 'a))
but this does a + on ‘a and ‘b before stepping into runner.
Here’s my first stab at some clojure:
(defn runner [a b c] (
(for [i (range 10)
j (range 10)] (println i j (c i j))
What concept of clojure am I missing?
Function arguments are always evaluated before the function is called. If you want to defer evaluation or represent some computation or code as an object, you have a few options:
evalit.Using a function is what you want to do 99% of the time. 1% of the time, you’ll want macros. You should never need
evalunless you’re generating code at runtime or doing very screwy things.This could also be written as
(runner #(+ %1 %2)or even simply(runner +).There is no need to pass “
a” and “b” into the function as arguments.doseqandforintroduce their own local, lexically scoped names for things. There’s no reason they should useaandb; any name will do. It’s the same forfn. I usedxandyhere because it doesn’t matter.I could’ve used
aandbin thefnbody as well, but they would have been a differentaandbthan the ones thedoseqsees. You may want to read up on scope if this doesn’t make sense.