- the assumption baked into this argument is that cdr of an empty list returns an empty list. Switching nil to #f and letting empty list be truthy avoids this problem.
- Good names are important. ~empty? isn't really a fair characterization. Lumen uses (some? xs). There is also another way: Update `no` to be (or (is x nil) (empty x)), and then use (~no xs).
Second option, part a: I actually find `~empty?` clearer than `some` in this case. Also `some` means something different in Arc.
Second option, part b: wait, then `(if xs ...)` would sometimes not do the opposite of `(if (no xs) ...)`!
(expect subject pattern else
(def map1 (f xs)
(expect xs (cons x xs) ()
(cons (f x) (map1 f xs))))