A little Clojure challenge inspired by Let over Lambda.
Write a macro (you can try a function, but it's impossible) that accepts four arguments:
- an expression that returns a number
- something to return if that number's negative
- something to return if that number's zero
- something to return if that number's positive
Here's the signature: (defmacro nif [expr neg zero pos] ...)
To pass my test, the following form should print "pos!" and return "pos.", with no other side effects:
(nif 10
(do (println "Negative!") "negative.")
(do (Thread/sleep 1000000) "zero.")
(do (println "pos!") "pos."))
May the best lisper win!
@mdiin yeah, the trick with the macro here is that a function evaluates all of it's arguments, so you have to scramble a bit to prevent that evaluation. The
nif
macro lets you think of the inputs as unevaluated lists (or numbers, or whatever they happen to be), and shuffle them into the proper form before they hit the compiler.