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، غالبًا ما تُعرَّف الطرق داخل صنف أو وحدة أو بنية.
لكن يمكن أيضًا تعريفها خارج الصنف أو الوحدة أو البنية.
تُعرَّف الطرق باستخدام الكلمة المفتاحية 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
عند استدعاء طريقة تنتمي إلى صنف أو وحدة أو بنية، يجب استخدام عامل النقطة (.).
وتكون الصيغة: <ClassName>.<method_name>.
وعندما لا تنتمي الطريقة إلى صنف أو وحدة أو بنية، يمكنك ببساطة استدعاؤها بكتابة اسمها.
تُرجع الطرق دائمًا قيمة التعبير الأخير ضمنيًا.
عندما تحتوي الطريقة على وسائط، يمكنك استخدام الأقواس الهلالية عند تحديد الوسائط في استدعاء الطريقة وتعريفها، على النحو التالي: <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