PurelyFunctional.tv Newsletter 395: types depend on context
Sign up for weekly Clojure tips, software design, and a Clojure coding challenge.
Clojure Tip 💡
types depend on context
I think one aspect is the abstractions over types that we have in
Clojure. For instance, in Clojure, the sequence operations work on all
collections, as well as Strings and
nil. That abstraction lets us
easily forget about the concrete types we have and think instead about
sequence or non-sequence. Clojure provides a very useful handful of such
abstractions and consistent operations over them.
Even still, we use fewer types in Clojure in general. At least it feels like we do. Strings, Numbers, Booleans, Vectors, Maps, etc. It's a small core list, then we have a few extra classes we might use in particular domains, such as URI or File. But otherwise, we're operating more on structure than on types.
I think Nil Punning has a lot to do
with it as well. As we get more skilled in Clojure, we get a sense of
what kinds of code will safely deal with
nils without us doing
anything. I wish it wasn't something you have to learn tacitly with a
lot of experience. It's bad for beginners and it's not likely to be
fixed or even documented because many people eventually grow out of it.
But in my conversations with Clojurists, there seem to be people who
complain a lot about NullPointerExceptions and those who don't
encounter them that much. It would be really nice to figure out what
secret they're using.
I don't think I've really gotten to the bottom of why types don't feel so necessary in Clojure. Either way, it was worth exploring. But this idea does point to types being used as a bandaid, like linting, to enforce a good subset of a bad language. I wonder what a type system that made Clojure feel better would look like.
Quarantine update 😷
I know a lot of people are going through tougher times than I am. If you, for any reason, can't afford my courses, and you think the courses will help you, please hit reply and I will set you up. It's a small gesture I can make, but it might help.
I don't want to shame you or anybody that we should be using this time to work on our skills. The number one priority is your health and safety. I know I haven't been able to work very much, let alone learn some new skill. But if learning Clojure is important to you, and you can't afford it, just hit reply and I'll set you up. Keeping busy can keep us sane.
Also, if you just want to subscribe for a paid membership, I have opened them back up for the moment. Register here.
Stay healthy. Wash your hands. Stay at home. Wear a mask. Take care of loved ones.
Clojure Challenge 🤔
Last week's challenge
- FizzBuzz with no conditionals or loops - submissions
There were tons of clever ways to do FizzBuzz without conditionals or loops.
Please do participate in the discussion at the submission links above. It's active and it's a great way to get comments on your code.
This week's challenge
Big change: Please submit your solutions as comments on the gist linked below.
Well, it's Hurricane Season here in the Gulf South. But that's not the kind of seasons I'm talking about now.
Your job is to take a month (keyword) day (number) and a hemisphere
:south) and determine which season it is (return a
keyword), according to this handy table.
Start End North South March 1 May 31 Spring Autumn June 1 August 31 Summer Winter September 1 November 30 Autumn Spring December 1 February 29 Winter Summer
(which-season :north :march 5) ;=> :spring (which-season :south :december 25) ;=> :summer
Please submit your solutions as comments to this gist. Discussion is welcome.
Big change: Please submit your solutions as comments on the gist linked above.