Yes a learning mode for crystal has started to be planned. I started planning for about a month ago and after a first-round a feedback from the crystal community. I am now requesting feedback from the exercism community.
Here is what currently every category covers:
Basics
Create variabels and constants
How to define a method and how to call a method
Default parameters
Numbers
Cover basic “math” methods (+, -, *, **, /, %)
How to round a number
Floats, Uint, int and all the forms of them e.g int16 etc
How to convert between different number types
Prioritization in math methods
Binary & octal & hexadecimal
How to create Binary & octal & hexadecimal
TBD
Bools
True/False
&&, ||
!
classes
General oop
Initialize
Instance variables
Class variables
Getters/setters
Getter
Property
Strings
What a string is and how to create them
Interpolation
Empty?
Size
Indexing
Convert a string to a number and the other way around
String methods
Escaping
gsub
TBD
Conditionals
If/elsif/else
Comparisons operators(==, <= etc)
Unless
Case (switch)
How to create a case
When to use a case
Modules
How to create a module
Difference between a class and a module
Extend & include
Ternary operator
How to create a ternary operator
Char
Basics of what a char is and how to use them
TBD
While & Until
How to create a while loop
Next
Break
Until
Difference between until and while
Range
Range with numbers, chars, and strings
Range with .. and ...
How to slice a String
Nil
Introduction to nil
Explain that [x]? returns the item if it exists otherwise nil.
Union types
Explain how to create a union type
Explain that assigning for example Int32? means (Int32 | Nil)
Explain typeof vs .class
Rasing errors
Explain how to raise errors
Explain errors in crystal
Array
How to create an array
Declaring an empty array
Declaring a nested array
Indexing and slicing arrays
Join and split
Explain that arrays are mutable
Explain append(<<)
Delete/pop
Array methods
Sort
uniq
shift
fil
concat
Compact
First
Last
Flatten
Reverse
Rotate
Shuffle
Index
TBD
Blocks(Procs)
This category is a little bit TBD.
It is suppose to give you enough knowledge for a student to be able to use methods like each. But perhaps not know how to use yield. So the block part may be taken away for a later concept so we only cover proc.
Enumeration
each
all?
any?
count
each_with_index
find
none?
map
map_with_index
one?
products
reduce
sum
Sort_by
More enumeration
Comment: Some of this will there not be any deep dive on, just a mention
chunks
cycles
each cons
each cons pair
each slice
group_by
in_groups_of
max_by
max_of
min_by
min_of
reject
Select
skip_while
skip
take_while
Symbols
What a symbol is
Comparison between symbols and strings
Convert a symbol to a string
Tuples
How to create a tuple
Difference between array and tuple
When to use a tuple and when to use an array
Explain that tuples are immutable
Hashes
Explain how to create a hash
Explain how to create a hash with symbols
Explain how to create an empty hash
Explain hash methods TBD
Named tuple
How to create a named tuple and the difference between a hash.
I have no idea how Crystal works and which paradigms it is based on. I guess functional and object-oriented, from the syllabus. As I am doing the same thing with the C++ track, there are many good things here that I am going to build on. Thank you, for the inspiration!
One comment really and that’s that the scope of each exercise needs to be pretty small, which it turn means that means that for OOP things like instance mhhtods, class methods, initializer etc probably need to be 3 separate exercises. For the arrays section - that’s again likely a few exercises etc.
Often it’s enough to teach the concept of something in the Concept exercise (e.g. arrays have methods - try this one or two) and then let the student discover a wider selection of methods themselves in the practice exercises.
I’d also say the tracks that have suceeded in building out syllabuses the best tend to have chosen a few core concepts to start with and then built from there rather than doing too much up front planning. Many have discovered that Mike Tyson’s famous quote (“Everyone has a plan until they get punched in the mouth”) can often apply to building out the exercises!
Hmm, yeah I mean I will see, at the same time it is hard to do initializer without instance mehtods. As with everything, how I work is that I look how other people have done it. And Crystal and Ruby is quite alike so I can look at that track for what I like and what I dont.
At the same time I rellay also on coming to a concept and seeing whats fits and doesnt. I can reveal that the developemnt (writting) of the crystal syllabus has been in active development for a week. But I can still take feedback for later parts.
It is a hard question, there is a lot of data types and which to put first is a hard decision. I can tell you in an earlier version array was actually placed further down in the tree, but I decided to move it up. But to make an exercise for arrays, it could be good to know basic loops and I personally think that knowing union types before arrays are really helpful.
I am up for suggestions on moving concepts, but I have a pretty hard lock on that symbols have to come before hashes, but other than that feel free to suggest more specific changes.
Most concepts of the tree are data types, strings, numbers, char, range, nil, arrays, tuples, hashes, symbols, named tuples, and block. All of these are just data types and union types are another concept that is important to be able to utilize types to the fullest.
I have for a while thinking about how to approach numbers, should I do a single big concept? splitting floats and int? I have come to the conclusion that it may be best to separate it in such a way to first introduce numbers as a quite “dynamic” thing. Not talking too much about the type more or less saying that there are int and floats and here are methods to work with.
Then adding a concept right after named number types, which explains all forms of int, a short introduction to the uint and all types of floats. And explaining why there are multiple types and how to work with them. Then when I get the time or feel like it there will be another concept branching of the tree that explains Bignumber types (bigint, bigfloat etc).
My advice is to first figure out the exercise early when planning a concept. What classes and methods will be highlighted by a “generic numbers” concept?
I am a bit unsure of the number types concept, but for the generic number concept I am thinking temperature exercises, where you are supposed to among other thinks convert celsius to kelvin and farenhiet