Update: The solutions (without these mistakes) can be found in this repo: meadsteve/advent-of-code-2020
For this year’s advent of code I decided to try a new language: crystal. I wanted to write about the challenges I’ve faced writing in a language new to me.
Here are some of the mistakes I made (often more than once) whilst working with this new language.
assignment (=) when I meant equality check (==)
I had a block of code like this:
if char == 'F' row_range = row_range.lower_half elsif char = 'B' row_range = row_range.upper_half elsif char = 'L' col_range = col_range.lower_half elsif char = 'R' col_range = col_range.upper_half end
It took me a longer than I’d care to admit to notice that the second
if was mutating the value of
char. I’d love to have some immutability in the language here
to help me not fall into this trap. Maybe it has that? Maybe it has some patterns
Forgetting constructors are .new
My current day job is writing python where constructing a new class looks like this
MyNewClass(data). In crystal it’s
taking my muscle memory a while to learn this. In addition
MyNewClass(data) can mean something in crystal but it’s not construction of a new object.
Overriding a method in the same class :facepalm:
I wrote code like this (I’ve abridged for clarity):
class ThingDoer def my_very_important_thing false end def my_very_important_thing true end end
I did not realise it was possible for a function to be overwritten in the same definition of a class. Took me a while to spot this silly mistake. I wonder what the use case for this is.
' for chars and
" for strings
I was iterating over
"some_string".chars and I wondered why this if statement was never true
char == "F". The
.chars function returns charecters as an
enumerable which means I needed to compare it to
'F' which is the charecter F not
"F" which is a string made up of a single F.
The harder thing is the feeling that the code I’m writing is clumsy and not embracing the language yet. I think the solution here would be spending more time reading Crystal (and probably) ruby code.