In this chapter, you will work with lists and vectors, along with the
reduce functions. All of these take functions as one of their arguments, and are thus higher-order functions.
This is a quick warm-up étude. Given a list of integers that have zeros interspersed throughout, move all the zeros to the end. Name the function
move-zeros; it accepts a list as an argument and returns a new list with the zeros at the end. I saw the problem at this page, solved in Java, and wondered if I could do it in ClojureScript. Answer: yes, I could. And so can you. Hint:
filter is useful. After I solved it, I realized just how much my thinking about functional programming had changed the way I look at imperative code. You may have the same experience:
move-zeros.core=> (move-zeros [1 0 0 2 0 3 0 4 5 0 6]) (1 2 3 4 5 6 0 0 0 0 0)
See a suggested solution: “Solution 3-1”.
Write a function named
ordinal-day that takes a day, month, and year as its three arguments and returns the ordinal (Julian) day of the year. Bonus points if you return zero for invalid dates such as 29-02-2015 or 40-40-2015. Don’t worry about handling dates before the year 1584 correctly.
You will need to know if a year is a leap year or not. I’ll give you that one for free:
(defn leap-year? "Return true if given year is a leap year; false otherwise" [year] (or (and (= 0 (rem year 4)) (not= ...