Hey Zach,
Thanks for writing this book - I was excited to hear you're close to finishing on the podcast I listened to the other day.
I'd like to query one detail in the sample chapter though, if I may (haven't bought it yet but I plan to, so sorry if you've addressed this already in the full copy)
So, we have a function (get-jovian-moon [m k] ... ) and you say that the parameters have reasonable names. You later make the point about choosing narrow names for most code. I'd argue that this first example's parameters could and should be a lot narrower.
'm' and 'k', i.e. 'map' and 'key' are about as high level as it gets, and if we were writing assoc or dissoc it'd make perfect sense to use these names, as assoc and dissoc will really work with any map and key. In this case, the map must follow a certain structure and the key must represent a Jovian moon. An arbitrary map and key will return nil.
I think you covered better names later in the chapter - something like (get-jovian-moon [system->planet->moon moon] ... ), assuming there's no well known name for a map with this structure in the domain.
I'm particularly interested because if a skilled mentee gave me that function definition, I'd make this point and I'd put it in a context of "avoid mixing different levels of abstraction in the same function definition" - in this case, the function does something very narrow, but then the much more abstract 'm' and 'k'. If there's some reasoning I'm not aware of going on here feel free to put me right.
I hope this is a useful question - and that it hasn't already been asked and answered somewhere! Thanks again for all your hard work on this book and your libraries.
Thanks,
Paul