Η Crystal είναι μια μεταγλωττισμένη, αντικειμενοστρεφής γλώσσα προγραμματισμού. Μερικοί από τους στόχους της γλώσσας είναι οι εξής:
Σύνταξη εμπνευσμένη από τη Ruby.
Στατικός έλεγχος τύπων, χωρίς να χρειάζεται να προσδιορίζεις τον τύπο μεταβλητών ή ορισμάτων μεθόδων.
Να μπορείς να καλέσεις κώδικα C γράφοντας συνδέσεις προς αυτόν σε Crystal.
Αξιολόγηση και παραγωγή κώδικα σε χρόνο μεταγλώττισης, ώστε να αποφεύγεται ο επαναλαμβανόμενος κώδικας.
Μεταγλώττιση σε αποδοτικό εγγενή κώδικα.
Η ανάπτυξη της Crystal ξεκίνησε το 2011 με στόχο τη δημιουργία μιας γλώσσας με την κομψότητα και την παραγωγικότητα της Ruby, αλλά με την απόδοση και την ασφάλεια τύπων μιας μεταγλωττισμένης γλώσσας. Ο μεταγλωττιστής της γλώσσας γράφτηκε αρχικά σε Ruby, αλλά ξαναγράφτηκε σε Crystal το 2013. Οι Ary Borenszweig, Juan Wajnerman και Brian Cardiff ανέπτυξαν και σχεδίασαν τη γλώσσα.
Για να δηλώσεις μια μεταβλητή, χρησιμοποίησε τον τελεστή ανάθεσης =.
Στην Crystal, οι μεταβλητές πρέπει να ακολουθούν τη μορφή snake_case.
number = 1
puts number # => 1
number = 2
puts number # => 2
Οι σταθερές δηλώνονται με τον ίδιο τελεστή ανάθεσης =, αλλά χρησιμοποιούν μόνο κεφαλαία γράμματα, γνωστά ως SCREAMING_SNAKE_CASE.
NUMBER = 1
puts NUMBER # => 1
Η ανάθεση τιμής σε μια σταθερά που έχει ήδη οριστεί θα έχει ως αποτέλεσμα ένα σφάλμα σε χρόνο μεταγλώττισης.
NUMBER = 1
NUMBER = 2
# Error: already initialized constant NUMBER
Η Crystal είναι μια μεταγλωττισμένη γλώσσα, που σημαίνει ότι σε κάθε μεταβλητή ή όρισμα μεθόδου αποδίδεται ένας τύπος σε χρόνο μεταγλώττισης. Ο μεταγλωττιστής μπορεί να συμπεράνει τον τύπο μιας μεταβλητής ή ενός ορίσματος μεθόδου. Ωστόσο, σε ορισμένες περιπτώσεις είναι απαραίτητο να προσδιορίσεις τον τύπο. Οι περιπτώσεις που απαιτούν ορισμό τύπου θα εξηγηθούν σε επόμενες έννοιες.
Οι μέθοδοι είναι ένας τρόπος να ομαδοποιείς ένα σύνολο εντολών που μπορούν να χρησιμοποιηθούν ξανά.
Στην Crystal, οι μέθοδοι ορίζονται συχνά μέσα σε μια κλάση, ένα module ή ένα struct.
Ωστόσο, οι μέθοδοι μπορούν να οριστούν και έξω από μια κλάση, ένα module ή ένα struct.
Οι μέθοδοι δηλώνονται με τη λέξη-κλειδί def, ακολουθούμενη από το όνομα της μεθόδου.
Στην Crystal, οι μέθοδοι πρέπει να γράφονται σε snake_case.
Μπορείς να παραλείψεις τις παρενθέσεις όταν μια μέθοδος δεν έχει ορίσματα.
Για να δηλώσεις το τέλος μιας μεθόδου, πρέπει να χρησιμοποιήσεις τη λέξη-κλειδί end.
def hello
puts "Hello World!"
end
Η χρήση μιας μεθόδου που δεν υπάρχει για τον τύπο μιας μεταβλητής ή ενός ορίσματος μεθόδου θα έχει ως αποτέλεσμα ένα σφάλμα σε χρόνο μεταγλώττισης.
number = 1
number + "1"
# Error: no overload matches 'Int32#+' with type String
Οι μέθοδοι μπορούν να έχουν ορίσματα. Τα ορίσματα είναι δεδομένα που περνιούνται σε μια μέθοδο. Για να μπορείς να δώσεις ορίσματα σε μια μέθοδο, πρέπει να προσδιορίσεις το όνομα του ορίσματος. Στην Crystal, τα ορίσματα πρέπει να γράφονται σε snake_case. Μια μέθοδος μπορεί να έχει πολλά ορίσματα, αλλά τα ορίσματα πρέπει να χωρίζονται με κόμμα.
def hello(name)
puts "Hello #{name}!"
end
Οι μέθοδοι μπορούν επίσης να έχουν πολλά ορίσματα. Σε αυτή την περίπτωση, τα ορίσματα πρέπει να χωρίζονται με κόμμα.
def hello(name, language)
puts "Hello #{name}! You are learning #{language}."
end
Όταν καλείς μια μέθοδο που ανήκει σε μια κλάση, ένα module ή ένα struct, πρέπει να χρησιμοποιήσεις τον τελεστή τελείας(.).
Η μορφή πρέπει να είναι: <ClassName>.<method_name>.
Όταν μια μέθοδος δεν ανήκει σε μια κλάση, ένα module ή ένα struct, μπορείς απλώς να την καλέσεις γράφοντας το όνομά της.
Οι μέθοδοι επιστρέφουν πάντα έμμεσα την τιμή της τελευταίας έκφρασης.
Όταν μια μέθοδος έχει ορίσματα, μπορείς να χρησιμοποιήσεις παρενθέσεις όταν προσδιορίζεις τα ορίσματα στην κλήση και στον ορισμό της μεθόδου, όπως παρακάτω: <method_name>(<argument_1>, <argument_2>, ...).
Όταν μια μέθοδος δεν έχει ορίσματα, οι παρενθέσεις πρέπει να παραλείπονται.
def hello(name)
"Hello #{name}!"
end
hello("Crystal")
# => Hello Crystal!
Όταν καλείς μια μέθοδο με πολλά ορίσματα, τα ορίσματα πρέπει να χωρίζονται με κόμμα. Τα ορίσματα πρέπει να δίνονται με την ίδια σειρά όπως τα ορίσματα της μεθόδου.
def hello_language(name, language)
"Hello #{name}! You are learning #{language}."
end
hello_language("World", "Crystal")
# => Hello World! You are learning Crystal.
Η κλήση μιας μεθόδου με λάθος αριθμό ορισμάτων θα έχει ως αποτέλεσμα ένα σφάλμα σε χρόνο μεταγλώττισης.
hello_language("Crystal")
# wrong number of arguments for 'hello_language' (given 1, expected 2)
Στην Crystal, μπορείς να χρησιμοποιήσεις τον τελεστή + για να προσθέσεις δύο αριθμούς μαζί.
Μπορείς επίσης να χρησιμοποιήσεις τον τελεστή - για να αφαιρέσεις δύο αριθμούς.
Και μπορείς να χρησιμοποιήσεις τον τελεστή * για να πολλαπλασιάσεις δύο αριθμούς.
1 + 1
# => 2
2 - 1
# => 1
2 * 2
# => 4
Στην Crystal, τα σχόλια γράφονται με τον χαρακτήρα #, ακολουθούμενο από ένα κενό και έπειτα το σχόλιο.
Τα σχόλια χρησιμοποιούνται για την τεκμηρίωση του κώδικα.
Ο μεταγλωττιστής δεν εκτελεί τα σχόλια.
# This is a comment