
Chika هي لغة برمجة تستهدف كل من Arduino كبرامج ثابتة أو Linux كقابلة للتنفيذ. إنه يسهل المهام المتعددة المستدير روبن ، وتحميل البرامج إما من بطاقة SD أو نظام ملفات Linux.
هدفها هو أن تميل نحو الرشاقة على كل من سرعة السرعة والذاكرة ، مع نموذج ذاكرة مكدس فريد ، بناء جملة مستوحى من LISP ، والرسائل الداخلية على غرار MQTT.
روحها هي: فصل كل شيء من خلال التواصل بين المهام.
تفضل بزيارة الموقع لمزيد من المعلومات ، بما في ذلك الأساس المنطقي ، والمقارنات مع المشاريع الأخرى والصور والمزيد.
قم بزيارة الخلاف للدردشة.
انظر Core.Chi وبقية المجموعة لمزيد من الأمثلة الواقعة.
ملاحظة: ;//… يستخدم للاستفادة من تمييز بناء جملة clojure ؛ التعليقات في شيكا هي فقط //…
; //Calculates Nth term of Fibonacci Sequence
( fn fib n
( if ( < n 3 ) 1 i
( + ( fib ( - n 1 )) ( fib ( - n 2 )))))
( fib 35 ) => 9227465
; //LED blink program for Arduino
( p-mode 32 T)
( fn heartbeat on
( dig-w 32 on)
( sleep 1000 w)
( ! on))
; //Prints `15`
( print
( do a= + b= 10 c= 5
( a b c)))
; //Prints `Hello!`
( fn my-print
( print str))
( do str= " Hello! "
( my-print ))
; //Filter function, found in core.chi
; //Note: `empty?`, `st`, `append`, and `odd?` are all implemented in Chika in core.chi
; //Note: `out` is an optional argument, as `append` accepts nil as a vector
( fn filter f v ; ; out
( if ( empty? v)
out
( do next= ( st v)
( recur f ( sect v)
( if ( f next)
( append out next)
out)))))
( filter odd? [ 0 1 2 3 ]) => [ 1 3 ]
; //Returns [15 9], using an inline-function with one argument - `#`
( map {# 12 3 } [+ -])
; //Subscribes to all inter-program messages to do with displays, and prints their payloads
( sub " display/+ " {print # 1 }) افتح Chika_Arduino.ino في Arduino IDE ، تحميل إلى Arduino الخاص بك.
تأكد من وجود بطاقة SD مدرجة مع الملف init.kua . يجب تحميل البرامج الإضافية داخل ملف init.kua مع عملية load .
الأجهزة المناسبة:
يوجد حاليًا بعض الخيارات لتجميع وتنفيذ Chika على Linux.
في المحطة corpus/programs/init.chi يمكنك تشغيل ./compile.sh
لتشغيل ملف مصدر chika .chi أو ملف .kua ، يمكنك استدعاء chika قابل للتنفيذ مع مساره ، مثل: ./chika ../corpus/programs/fibonacci.chi . سيؤدي ذلك إلى تجميع fibonacci.chi كـ fibonacci.kua في دليل العمل القابل للتنفيذ.
يمكن إعداد ملفات المصدر مع shebang إلى chika القابلة للتنفيذ لتنفيذ ملف .chi مباشرة.
على الكمبيوتر الشخصي: استدعاء chika القابلة للتنفيذ مثل ./chika c source.chi . استدعاء بدون علامة c لتجميع ثم تنفيذ الملف الناتج.
على جهاز الكمبيوتر/Arduino: استخدم comp Op داخل Chika لتجميع ملفات مصدر .chi .
ملاحظة: قد يستغرق الأمر بعض الوقت على Arduino أثناء تجميعه بذاكرة محدودة للغاية ، ويكتب معظمها بايت واحد إلى ملف في وقت واحد.
ملاحظة: ينبعث التجميع العديد من الملفات المؤقتة ، والتي يجب حذفها بعد تجميع ناجح.
كل برنامج تم تحميله في VM لديه عمر من:
كل هذه اختيارية ، ولكن على الأقل يجب تحديد نبضات القلب أو الدخول في البرنامج.
يتم تنفيذ الكود في البداية في بداية البرنامج ، قبل أي نبضات أو رسائل ، ولا يتم احتواءها في أي وظائف. يمكن أن تستدعي وظائف حتى قبل إعلانها في الملف المصدر. آخر إدخال أعيد بذور العنصر حالة البرنامج. يتم تفريغ رمز الدخول بعد الاستخدام ، لذلك قد لا يتم استدعاؤه بعد ذلك.
يُطلب من نبضات القلب إيقاف البرنامج فورًا بعد الدخول ، من خلال تضمين وظيفة تسمى heartbeat . يتم تنفيذ هذا بشكل مسطح لكل برنامج نبضات نبضات ، أسلوب روبن مستدير. يتم تمرير وظيفة heartbeat ، وهي الحالة المستمرة للبرنامج كمعلمة ، ويتم استمرار العائد كدولة جديدة.
يتم بث الرسائل في جميع أنحاء VM وتنفيذ أي وظائف رد الاتصال ، كما تم تمرير حالة البرنامج وإعادة الدولة الجديدة.
يمكن أن تتضمن الملصقات وأسماء الوظائف (تقريبًا) أي أحرف باستثناء المسافة البيضاء.
يجب ألا تبدأ أسماء الوظائف برقم.
#num : السطر الأول للملف فقط (أو الثاني في حالة وجود Shebang). يُعلم VM عدد بايتات RAM ( num حتى 64KIB) من قبل البرنامج. وإلا يتم استخدام الحد الأقصى الافتراضي.
(func[ N args]) : نموذج ، مع وظيفة في موضع الرأس ، و 0-n الوسائط مفصولة بالمساحات. يمكن أن تكون الحجج نماذج.
ملاحظة: يمكن أن تكون func عملية أصلية أو وظيفة البرنامج أو الوظيفة المضمنة أو الربط أو الربط الموسع أو المعلمة أو المعلمة الممتدة.
(fn func-name[ N params] [1-N forms]) : تعريف دالة ، مع رموز المعلمة 0-N مفصولة بمسافات ، وأشكال 1-N.
ملاحظة: يرجع استدعاء وظيفة بدون نماذج لا شيء.
{form} : وظيفة مضمنة ، تتألف من نموذج واحد.
ملاحظة: لا يمكن الرجوع إلى معلمات الوظائف المحيطة داخل الوظائف المضمنة. النظر بدلاً من ذلك باستخدام الربط.
ملاحظة: يتم حظر الوظائف المتداخلة.
# : مرجع المعلمة ، إلى المعلمة الأولى من الدالة.
$ : مرجع المعلمة الموسعة ، إلى المعلمة الأولى لوظيفة المتصل بالدالة.
#N و $N : مرجع المعلمة ، إلى المعلمة nth ، على سبيل المثال #3 أو $3 للمعلمة الرابعة إما الدالة أو وظيفة المتصل بالدالة.
ملاحظة: استخدام $ عندما لا تكون هناك وظيفة استدعاء هو سلوك غير محدد.
ملاحظة: يمكن تمحو المراجع القيمة $ عن طريق تحسين ذيل الاتصال.
//… : تعليق ، يمكن أن يكون مناسبًا على خط جديد أو في نهاية خط واحد.
/*…*/ : تعليق متعدد الجوانب. ملاحظة: مثيل */ سيقوم بإنهاء تعليق على الفور ، ولا يمكن احتواءه في تعليق متعدد الأسلحة بحد ذاته
; : فاصلة فاصلة ، تعامل كمسافة بيضاء.
, : فاصلة ، تعامل كمسافة بيضاء ، ومساحة بيضاء بعد محوها.
…= : الربط ، حيث … هي تسمية.
… : مرجع الربط أو مرجع المعلمة اعتمادًا على السياق ، حيث … هو التسمية.
.… : مرجع ملزم ممتد ، حيث … هو التسمية. يشير إلى المثيل السابق للربط على المكدس.
ملاحظة: تأخذ المعلمات سابقة على الروابط لكل وظيفة.
ملاحظة: عند إعادة تعريف الارتباطات ، يجب على المرء استخدام الربط الموسع ، بحيث يتخطى VM المثيل السابق. ضع في اعتبارك: a= (+ 1 .a) ، بحيث لا يشير a إلى العنصر التالي على المكدس في تلك اللحظة - 1 .
لا يمكن تمثيل الوظائف if ، && ، or ، case في الربط أو المعلمة.
نظرًا لأن الوظائف يجب أن تحتوي فقط على نماذج تضمن عوائد استخدام val .
ملاحظة: الأعداد الصحيحة إما بتنسيق عشري عشري أو كبير إنديان.
"…" : سلسلة ، حيث … هي من 0 إلى 128 حرفًا ASCII ، أو "" فارغة." و str للحصول على نقاط مزدوجة ، حيث لا توفر السلاسل أي شخصيات هاربة.0 أو 0x00 : عدد صحيح 8 بت غير موقعة.0w أو 0x0000 : عدد صحيح 16 بت غير موقعة.0i أو 0x00000000 : عدد صحيح موقّع 32 بت.c : حرف ASCII. تمتد: nl newline ، sp Space.[…] : ناقل ، حيث … هي من 0 إلى 2^16 عناصر محددة حسب الفضاء ، أو [] فارغة. السكر النحوي لـ (vec …) args : تنبعث من متجه حجج الوظيفة.T : منطقية حرفية حقيقيةF : منطقي حرفي كاذبN : حرفي لا شيء ملاحظة: [square brackets] تشير إلى وسيط اختيارية.
الرياضية
+ / - / * / / / % / ** /
& / | / ^ / << / >> n arg:
إرجاع SUM / الطرح / الضرب / التقسيم / المعامل / رفع إلى القوة /
و / أو / xor / التحول اليسرى / التحول الأيمن من الأعداد الصحيحة n.
Zero args يعود لا شيء. سوف يلقي جميع المعلمات كنوع من الوسيطة الأولى.
~ n : إرجاع bitwise وليس n .
أمثلة: (+ 1 1) => 2 ، (+ 155 200) => 100 ، (+ 155w 200) => 355w
rand : يعيد منطقية العشوائية الزائفة.
rand b : إرجاع عدد صحيح عشوائي زائفة من 0 إلى b حصري.
rand ab : إرجاع عدد صحيح عشوائي زائفة من a إلى b الحصرية.
ملاحظة: سلبي a أو b يتسبب في فهمهم على أنهم 1.
شرطي
if cond if-true : تقييم وإرجاع if-true إذا كان cond حقيقة ، فلا شيء آخر.
if cond if-true if-false : يقييم وإرجاع if-true cond إذا كان كونه حقيقة ، if-false
case match … N pairs … [default] : يقييم match ثم يقارن مع الأول من كل زوج من الوسائط ، وإعادة الثاني إذا كان الأول يتطابق ؛ إذا لم يتم إجراء أي مباريات default أو يتم إرجاع NIL.
! i : ينفي منطقيا العنصر i .
or n arg: إرجاع الحقيقة الأولى.
&& n arg: إرجاع صحيح إذا كان كل Args الحقيقة.
= n arg: المساواة ، صحيح إذا كانت جميع args من نفس النوع والطول والمساواة البايت. يقارن ints حسب القيمة.
!= n arg: المساواة السلبية.
== n arg: حقوق الملكية ، إرجاع صحيح إذا كانت العناصر n من المساواة البايت.
!== n arg: حقوق الملكية السلبية.
< / <= / > / >= n arg: إرجاع صحيح إذا كانت العناصر n في ترتيب رتابة / غير تناقص / تناقص / غير متزايد.
الوظيفة ذات الصلة
return[ val] : الخروج من وظيفة مبكرًا ، وتقييمًا إلى أي شيء أو val .
recur n arg: على المكدس استبدل المعلمات مع الوسيطات N واستدعاء الوظيفة.
val 1-N Arg: إرجاع حجتها الأولى.
do 1-N Arg: إرجاع حجتها النهائية.
السلسلة ، المتجه ، و blob ذات الصلة
vec 0 arg: إرجاع المتجه الفارغ.
vec N ARG: إرجاع ناقل الحجج.
nth N i : إرجاع العنصر أو الحرف في index N من المتجه أو السلسلة i ، أو لا شيء إذا كان N في نطاق غير لائق.
str 0 arg: إرجاع سلسلة فارغة.
str n arg: إرجاع تسلسل الحجج n كسلسلة.
len i : إرجاع طول المتجه أو السلسلة أو البند الداخلي.
sect v : Returns v مع العنصر الأول (إذا كان المتجه) أو الحرف (إذا كانت السلسلة) تم حذفها ؛
sect v skip : Returns v مع skip العناصر/الشخصيات الأولى ؛
sect v skip take : Returns v مع take skip العناصر/الأحرف الأولى ؛
..sect : نفس sect ولكن بإرجاع العناصر/الشخصيات.
blob ls : إرجاع نقطة طول l مع جميع البايتات التي تم تعيينها على s .
get oltb : إرجاع البند من النوع t والطول l من الإزاحة o بايت من البند b .
get ob : إرجاع قيمة U08 للبايت عند إزاحة o البند b .
set oib : إرجاع blob b مع إزاحة o بايت ضبط على بايت العنصر i .
ملاحظة: كلاهما get الإرجاع set إذا تم طلب إزاحة + Len سيتجاوز حجم النقطة.
ملاحظة: كلاهما يقبل مرجعًا باسم b (على سبيل المثال *binding ) ، وسيقوم بدلاً من ذلك بفحص/تعديل بايت العنصر المرجعي الأصلي ، set إرجاع المرجع أو لا شيء.
.. v : ينفجر ناقل أو سلسلة v على مكدس الوسيطة إما عناصر المتجه أو عناصر الأحرف.
ملاحظة: مثل في clojure العكسي ، apply على سبيل المثال (+ (.. [1 2 3]) (.. [4 5 6])) => 21 .
ملاحظة: إذا لم تكن وسيطتها متجهًا ، فلن يترك أي عناصر على المكدس.
binds : يعرض أي روابط في حججها ، ويفضل الأحدث ، ثم نفاق البقايا.
مثال: (binds a= 1 b= 2 a= 3) => [b= 2 a= 3]
GPIO ذات الصلة
ملاحظة: هذه ليس لها تأثير على الكمبيوتر.
p-mode pin mode : يعين وضع رقم دبوس رقم pin إلى mode المنطقي - الحقيقة كمدخلات ، كاذبة كمخرجات ؛ يعود لا شيء.
dig-r pin : إرجاع حالة الإدخال الرقمي من رقم التعريف pin .
dig-w [1-N pin val] : لكل pin val ، على التوالي ، يحدد حالة الإخراج الرقمي لرقم رقم pin إلى Valean val الحقيقة أو غير الصفر على أنها عالية أو صفر أو منخفضة ؛ يعود لا شيء.
ana-r pin : إرجاع حالة الإدخال التناظرية من رقم التعريف pin .
ana-w [1-N pin val] : لكل pin val ، على التوالي ، يحدد حالة الإخراج التناظرية/PWM من pin رقم PIN إلى val 16 بت ؛ يعود لا شيء.
ana-r pin : إرجاع إدخال عدد صحيح 16 بت التناظرية من pin رقم دبوس.
ملف IO المتعلق
ملاحظة: يجب أن يكون لدى ملفات Arduino مدى لا يزيد عن ثلاثة أحرف.
file-r path : إرجاع Blob من محتويات الملف بالكامل.
file-r path T : إرجاع حجم الملف.
file-r path offset : إرجاع Blob من محتوى الملف بين بايت الإزاحة و EOF.
file-r path offset count : إرجاع blob من محتوى الملف بين الإزاحة وما يصل إلى العد.
كل العودة لا شيء عند الفشل.
file-a path content : قم بإلحاق نقطة أو عنصر كسلسلة إلى ملف.
file-w path content[ offset] : يكتب نقطة أو عنصر كسلسلة إلى ملف ، اختياريًا مع إزاحة بايت (خلاف ذلك 0) ؛ يعود النجاح مثل منطقية.
كلاهما يعود النجاح كما منطقية.
ملاحظة: تتم كتابة الأوتار بدون Terminator NULL.
file-d path : حذف الملف في path ؛ يعود النجاح مثل منطقية.
الأنواع والصب
type i : إرجاع كود نوع العنصر i
type ab : إرجاع رمز النوع للعناصر a & b إذا كانت متساوية ، وإلا nil .
cast it : إرجاع العنصر i به رمز النوع t
ملاحظة: سيتم اقتطاع أرق إلى أرق ، وسيتم إيقاف أرق إلى أوسع ؛
سوف سلسلة إلى blob تفتقر إلى الإنهاء الفارغ. سيتم إلحاق الأملاك بالسلاسل مع الإنهاء الفارغ.
التكرار
reduce f[ s*N] i : إرجاع الحد من المتجه أو السلسلة i خلال f ، مع البذور 0-n. f هو (item acc) => acc .
map fv*N : إرجاع تعيين ناقلات 1-N من خلال f ، حيث f هو (item*N) => mapped .
مثال: (map str [a b c] [1 2 3]) => [a1 b2 c3]
for fv*N : إرجاع رسم الخرائط التكرارية لمتجهات 1-N من خلال f ، حيث f (item*N) => mapped .
مثال: (for str [a b c] [1 2 3]) => [a1 a2 a3 b1 b2 b3 c1 c2 c3]
loop nf : يكرر n 16 بت من المرات الوظيفة f ، حيث f هي (0…n) => any ؛ عودة آخر عودة f .
loop seed nf : كما هو مذكور أعلاه ، ولكن f هو (acc 0…n) => any مكان هو seed acc أولاً ثم عودة التكرار السابق.
loop seed abf : كما هو مذكور أعلاه ، باستثناء النطاقات n من a إلى b
مثال: (loop 2 {print "hello" #}) يطبع "Hello0" و "Hello1" ، إرجاع NIL.
مثال: (loop 0 5 +) => 10 .
مثال: (loop 0 5 10 +) => 35
المرتبطة بالرسالة
الموضوعات هي السلاسل المحددة للأمام ( / ). مواضيع الأمم المتحدة /الاشتراك تستخدم أحواض Wildcards /+/ لأي و /# لأي مشار إليها .
مثال: يطابق house/kitchen/fridge house/+/fridge أو house/# أو +/kitchen/+ أو # ، ولكن ليس garage/# أو house/bedroom/fridge أو house/+/sink .
pub topic[ payload] : أرسل رسالة عبر VM مع topic السلسلة ، واختياريًا payload حمولة (خلاف ذلك) من أي نوع ؛
إرجاع لا شيء ، أو إذا تسببت الرسالة في نشر برنامج آخر في رسالة تم الاشتراك في برنامج النشر الأصلي ،
إرجاع الحالة التي تم إرجاعها بواسطة معالج الاشتراك في برنامج النشر الأصلي.
ملاحظة: النشر فوري ومتزامن - سيتعين على برنامجك الانتظار بينما يقوم المشتركون بمعالجة الرسالة.
sub topic f[ provide-topic] : اشترك في الوظيفة f في topic الرسالة ،
حيث إذا كان provide-topic هو f (state topic payload) => new-state ،
آخر (افتراضي) f هو (state payload) => new-state ؛ يعود لا شيء.
ملاحظة: يتم قبول وظائف البرنامج فقط كـ f - لاستخدام عملية أصلية ، استخدم وظيفة مضمنة.
unsub topic : إزالة الاشتراك السابق topic ؛ يعود لا شيء.
unsub : إسقاط جميع اشتراكات البرنامج ؛ يعود لا شيء.
النظام والبرنامج المتعلق
ms-now : يعيد المللي ثانية منذ تهيئة CHVM.
sleep ms : يؤجل نبضات القلب التالية للبرنامج ms العليا ؛ يعود لا شيء.
print 0-N Arg: مطبوعات نتيجة str of n args ؛ يعود لا شيء.
load path : يقوم بتحميل برنامج Chika المترجم في path (بدون تمديد الملف) ؛ إرجاع منطق نجاح تحميل البرنامج.
comp path-in[ path-out] : يجمع ملف مصدر (من الناحية مثالية *.chi ) في path-in في ثنائي Chika ، إما تم حفظه في نفس المسار مع تمحد الامتداد إلى .kua أو في path-out (من الناحية الطبيعية *.kua ).
halt : ينهي برنامج Chika على الفور.
يتكون Chika Binary فقط من الوظائف . الوظائف تحتوي على نماذج . تحتوي النماذج على args (والتي يمكن أن تكون أيضًا نماذج) وتنتهي مع العملية . تنسيقات البايت السداسية هي:
وظيفة
NNNNLLLL…
NNNN ، uint16_t معرف وظيفة زيادة ؛ LLLL ، uint16_t وظيفة الجسم … ، جسم وظيفة LLLL -length.
استمارة
00…args…OO
00 ، علامة النموذج ؛ [args] ، 0-n args ؛ OO عملية.
arg
أو 00… ، شكل
AA ، uint8_t arg-code ؛ … جسم حجة مفصل الحجم المتغير.
عملية
OO
OO ، UINT8_T OP-Code.
00 FRM شكل
تودو
تودو