
Chika adalah bahasa pemrograman yang menargetkan Arduino sebagai firmware atau linux sebagai yang dapat dieksekusi. Ini memfasilitasi program multi-tasking round-robin tingkat tinggi, memuat program dari kartu SD atau sistem file Linux.
Tujuannya adalah untuk condong ke arah kelincahan selama kecepatan dan jejak memori, dengan model memori tumpukan yang unik, sintaksis yang terinspirasi LISP, dan pesan internal gaya MQTT.
Semangatnya adalah: Dispouple semuanya melalui komunikasi antar-tugas.
Kunjungi situs web untuk informasi lebih lanjut , termasuk alasan, perbandingan dengan proyek lain, foto, dan banyak lagi.
Kunjungi perselisihan untuk mengobrol.
Lihat Core.chi dan seluruh korpus untuk lebih banyak, contoh realistis.
Catatan:; ;//… digunakan untuk menggunakan penyorotan sintaks clojure; Komentar di Chika hanya //… .
; //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 }) Buka Chika_Arduino.ino di Arduino IDE, unggah ke Arduino Anda.
Pastikan ada kartu SD yang dimasukkan dengan file init.kua . Program lebih lanjut harus dimuat dalam file init.kua dengan operasi load .
Perangkat yang cocok:
Saat ini ada beberapa opsi untuk menyusun dan mengeksekusi Chika di Linux.
Di terminal Anda dapat menjalankan ./compile.sh untuk mengkompilasi ulang Chika VM untuk mesin Anda, yang juga menggunakan kompiler asli untuk mengkompilasi ulang corpus/programs/init.chi .
Untuk menjalankan file sumber chika .chi atau file yang dikompilasi .kua , Anda dapat memohon chika yang dapat dieksekusi dengan jalurnya, seperti: ./chika ../corpus/programs/fibonacci.chi . Ini akan mengkompilasi fibonacci.chi sebagai fibonacci.kua di direktori kerja yang dapat dieksekusi.
File sumber dapat diisi dengan shebang ke chika yang dapat dieksekusi untuk menjalankan file .chi secara langsung.
Di PC: Invoke the chika Executable seperti ./chika c source.chi . Invoke tanpa bendera c untuk dikompilasi dan kemudian jalankan file yang dihasilkan.
Pada PC/Arduino: Gunakan comp op di dalam chika untuk mengkompilasi file sumber .chi .
Catatan: Butuh beberapa saat di Arduino karena dikompilasi dengan memori yang sangat terbatas, sebagian besar menulis satu byte ke file pada satu waktu.
Catatan: Kompilasi memancarkan banyak file sementara, yang harus dihapus setelah kompilasi yang berhasil.
Setiap program yang dimuat ke dalam VM memiliki seumur hidup:
Semua ini opsional, tetapi setidaknya detak jantung atau masuk harus ditentukan dalam suatu program.
Entri adalah kode yang dijalankan pada awal program, sebelum detak jantung atau pesan, dan tidak terkandung dalam fungsi apa pun. Ini dapat memanggil fungsi bahkan sebelum deklarasi mereka di file sumber. Entri terakhir yang dikembalikan item seeds status program. Kode entri diturunkan setelah digunakan, jadi mungkin tidak dipanggil setelahnya.
Detak jantung diminta untuk menghentikan program segera berakhir setelah masuk, dengan memasukkan fungsi yang disebut heartbeat . Ini dieksekusi flat-out per program fungsi detak jantung, gaya round-robin. Fungsi heartbeat dilewatkan keadaan program yang bertahan sebagai parameter, dan pengembalian tetap ada sebagai keadaan baru.
Pesan disiarkan di seluruh VM dan menjalankan fungsi panggilan balik apa pun, juga melewati keadaan program dan mengembalikan negara baru.
Label dan nama fungsi dapat mencakup (hampir) karakter apa pun yang tidak termasuk whitespace.
Nama fungsi tidak boleh dimulai dengan digit.
#num : Baris pertama hanya file (atau kedua jika ada shebang). Menginformasikan VM berapa banyak byte RAM ( num hingga 64KIB) akan digunakan oleh program. Jika tidak, maksimum default digunakan.
(func[ N args]) : Suatu formulir, dengan fungsi di posisi kepala, dan argumen 0-n dipisahkan oleh spasi. Argumen bisa berupa bentuk.
Catatan: func dapat berupa operasi asli, fungsi program, fungsi inline, pengikatan, pengikatan yang diperluas, parameter, atau parameter yang diperluas.
(fn func-name[ N params] [1-N forms]) : Definisi fungsi, dengan simbol parameter 0-N dipisahkan oleh spasi, dan bentuk 1-N.
Catatan: Memanggil fungsi tanpa formulir mengembalikan nol.
{form} : Fungsi inline, terdiri sebagai satu bentuk.
Catatan: Parameter fungsi di sekitarnya tidak dapat dirujuk dalam fungsi inline. Pertimbangkan sebagai gantinya menggunakan ikatan.
Catatan: Fungsi inline bersarang dilarang.
# : referensi parameter, ke parameter pertama suatu fungsi.
$ : Referensi parameter yang diperluas, ke parameter pertama fungsi penelepon fungsi.
#N dan $N : referensi parameter, ke parameter ke -n, misalnya #3 atau $3 untuk parameter keempat dari fungsi atau fungsi penelepon fungsi.
Catatan: Menggunakan $ ketika tidak ada fungsi panggilan adalah perilaku yang tidak ditentukan.
Catatan: Nilai $ Referensi dapat dihapus dengan optimasi panggilan-panggilan.
//… : komentar, yang dapat dipenuhi pada baris baru atau di akhir.
/*…*/ : komentar multiline. CATATAN: Sebuah instance dari */ akan segera menghentikan komentar, dan tidak dapat terkandung dalam komentar multiline itu sendiri
; : titik koma, diperlakukan sebagai whitespace.
, : koma, diperlakukan sebagai whitespace, dan whitespace setelah dihapus.
…= : Mengikat, di mana … adalah label.
… : Referensi yang mengikat atau referensi parameter tergantung pada konteks, di mana … adalah labelnya.
.… : Referensi pengikatan yang diperluas, di mana … adalah labelnya. Ini merujuk contoh sebelumnya dari ikatan pada tumpukan.
Catatan: Parameter mengambil preseden lebih dari binding per fungsi.
Catatan: Saat mendefinisikan ulang binding, seseorang harus menggunakan ikatan yang diperluas, sehingga VM melewatkan contoh sebelumnya. Pertimbangkan: a= (+ 1 .a) , sehingga a tidak merujuk ke item berikutnya pada tumpukan pada saat itu - 1 .
Fungsi if , && , or , dan case tidak dapat direpresentasikan dalam pengikatan atau parameter.
Sebagai fungsi hanya boleh berisi formulir memastikan pengembalian menggunakan val .
Catatan: Bilangan bulat dalam format heksadesimal desimal atau besar.
"…" : String, di mana … adalah 0 hingga 128 karakter ASCII, atau "" untuk kosong." dan str untuk kutipan ganda, karena string tidak memberikan karakter yang diloloskan.0 atau 0x00 : integer unsigned 8-bit.0w atau 0x0000 : Integer unsigned 16-bit.0i atau 0x00000000 : Integer yang ditandatangani 32-bit.c : Karakter ASCII. Extended: nl newline, sp .[…] : Vektor, di mana … adalah 0 hingga 2^16 item yang dibatasi oleh ruang, atau [] untuk kosong. Gula sintaksis untuk (vec …) args : memancarkan vektor argumen fungsi.T : literal boolean benarF : boolean literal falseN : Literal nil Catatan: [square brackets] Tunjukkan argumen opsional.
Matematis
+ / - / * / / / % / ** /
& / | / ^ / << / >> n arg:
Mengembalikan jumlah / pengurangan / multiplikasi / divisi / modulus / raise-to-the-power /
Dan / atau / xor / shift kiri / shift kanan n bilangan bulat.
Zero Args mengembalikan nol. Akan melemparkan semua parameter sebagai jenis argumen pertama.
~ n : mengembalikan bitwise bukan dari n .
Contoh: (+ 1 1) => 2 , (+ 155 200) => 100 , (+ 155w 200) => 355w
rand : Mengembalikan boolean semu-acak.
rand b : Mengembalikan integer semu-acak dari 0 ke b eksklusif.
rand ab : Mengembalikan integer semu-acak dari a ke b eksklusif.
Catatan: a atau b negatif menyebabkan mereka dipahami sebagai 1.
Bersyarat
if cond if-true : mengevaluasi dan mengembalikan if-true jika cond adalah kebenaran, selain itu nil.
if cond if-true if-false : mengevaluasi dan mengembalikan if-true if cond adalah kebenaran, selain itu if-false .
case match … N pairs … [default] : Mengevaluasi match kemudian dibandingkan dengan yang pertama dari setiap pasangan argumen, mengembalikan ke -2 jika yang pertama mencocokkan; Jika tidak ada kecocokan yang dibuat default atau nol dikembalikan.
! i : Secara logis meniadakan item i .
or n arg: mengembalikan kebenaran pertama.
&& n arg: returns true jika semua args kebenaran.
= N arg: kesetaraan, benar jika semua arg memiliki jenis, panjang, dan kesetaraan byte yang sama. Membandingkan ints dengan nilai.
!= N arg: kesetaraan negatif.
== n arg: ekuitas, returns true jika item n adalah kesetaraan byte.
!== n arg: ekuitas negatif.
< / <= / > / >= N arg: Mengembalikan true jika n item dalam peningkatan monotonik / tidak memisahkan / penurunan / tidak meningkat pesanan.
Fungsi terkait
return[ val] : Keluar dari fungsi lebih awal, mengevaluasi ke NIL atau val .
recur n arg: Pada tumpukan ganti parameter dengan N argumen dan ingat fungsi.
val 1-n Arg: Mengembalikan argumen pertamanya.
do 1-n Arg: Mengembalikan argumen terakhirnya.
String, vektor, dan gumpalan terkait
vec 0 Arg: Mengembalikan vektor kosong.
vec n arg: mengembalikan vektor argumennya.
nth N i : Mengembalikan item atau karakter pada indeks N vektor atau string i , atau nil jika N berada dalam kisaran yang tidak tepat.
str 0 Arg: Mengembalikan string kosong.
str n arg: Mengembalikan gabungan n argumen sebagai string.
len i : Mengembalikan kedua vektor, string, atau panjang item internal.
sect v : Mengembalikan v dengan item pertama (jika vektor) atau karakter (jika string) dihilangkan;
sect v skip : Mengembalikan v dengan item skip /karakter pertama dihilangkan;
sect v skip take : Returns v dengan take Long dan First skip Items/Karakter dihilangkan;
..sect : Sama dengan sect tetapi mengembalikan item/karakter meledak.
blob ls : Mengembalikan gumpalan panjang l dengan semua byte diatur ke s .
get oltb : Mengembalikan item tipe t dan panjang l dari offset o byte item b .
get ob : Mengembalikan nilai U08 byte pada saat offset o byte item b .
set oib : Mengembalikan gumpalan b dengan Offset o byte yang diatur ke byte item i .
Catatan: Keduanya get dan set pengembalian nil jika diminta Offset + Len akan melebihi ukuran gumpalan.
Catatan: Keduanya menerima referensi sebagai b (misalnya *binding ), dan sebaliknya akan memeriksa/memodifikasi byte dari item referensi asli, set mengembalikan referensi atau nol.
.. v : meledak vektor atau string v ke tumpukan argumen sebagai item vektor atau item karakter.
Catatan: Seperti di clojure terbalik apply misalnya (+ (.. [1 2 3]) (.. [4 5 6])) => 21 .
Catatan: Jika argumennya bukan vektor, ia tidak meninggalkan item di tumpukan.
binds : Dedupasi ikatan dalam argumennya, mendukung yang lebih baru, dan kemudian memvektorkan sisa -sisa.
Contoh: (binds a= 1 b= 2 a= 3) => [b= 2 a= 3]
Terkait GPIO
Catatan: Ini tidak berpengaruh pada PC.
p-mode pin mode : Mengatur mode pin pin pin ke mode boolean - kebenaran sebagai input, salah sebagai output; mengembalikan nihil.
dig-r pin : Mengembalikan status input digital pin pin pin .
dig-w [1-N pin val] : per pin val , berturut-turut, menetapkan status output digital pin pin ke val boolean-kebenaran atau non-nol setinggi, nol atau rendah; mengembalikan nihil.
ana-r pin : Mengembalikan status input analog dari pin pin pin .
ana-w [1-N pin val] : per pin val , berturut-turut, mengatur status output analog/pwm dari pin pin ke val integer 16-bit; mengembalikan nihil.
ana-r pin : Mengembalikan input integer 16-bit analog dari pin pin pin .
File IO Terkait
Catatan: Pada file Arduino harus memiliki perpanjangan tidak lebih dari tiga karakter.
file-r path : Mengembalikan gumpalan seluruh konten file.
file-r path T : Mengembalikan ukuran file.
file-r path offset : Mengembalikan gumpalan konten file antara byte offset dan EOF.
file-r path offset count : Mengembalikan gumpalan konten file antara offset dan up to count byte.
Semua kembali nol setelah kegagalan.
file-a path content : Tambahkan gumpalan atau item sebagai string ke file.
file-w path content[ offset] : Menulis gumpalan atau item sebagai string ke file, secara opsional dengan byte offset (jika tidak 0); mengembalikan kesuksesan sebagai Boolean.
Keduanya kembali sukses sebagai Boolean.
Catatan: String ditulis tanpa Null Terminator.
file-d path : Menghapus File di path ; mengembalikan kesuksesan sebagai Boolean.
Jenis dan casting
type i : Mengembalikan Jenis Kode Item i .
type ab : Mengembalikan Jenis Kode Item a & b Jika mereka sama, jika tidak nil .
cast it : Returns Item i Berikan sebagai Kode Jenis t
CATATAN: Lebih lebar hingga lebih tipis akan dipotong, lebih tipis ke lebih luas akan dimusnahkan;
String to Blob akan kekurangan penghentian nol; Gips ke string akan ditambahkan dengan penghentian nol.
Perulangan
reduce f[ s*N] i : Mengembalikan pengurangan vektor atau string i hingga f , dengan biji 0-n. f is (item acc) => acc .
map fv*N : Mengembalikan pemetaan vektor 1-n melalui f , di mana f adalah (item*N) => mapped .
Contoh: (map str [a b c] [1 2 3]) => [a1 b2 c3]
for fv*N : Mengembalikan pemetaan iteratif vektor 1-n melalui f , di mana f adalah (item*N) => mapped .
Contoh: (for str [a b c] [1 2 3]) => [a1 a2 a3 b1 b2 b3 c1 c2 c3]
loop nf : mengulangi n 16-bit berapa kali fungsi f , di mana f adalah (0…n) => any ; pengembalian terakhir kembalinya f .
loop seed nf : Sama seperti di atas, tetapi f adalah (acc 0…n) => any acc adalah seed pertama kali lipat dari pengembalian iterasi sebelumnya.
loop seed abf : Sama seperti di atas, kecuali n berkisar dari a ke b
Contoh: (loop 2 {print "hello" #}) mencetak "hello0" dan "hello1", mengembalikan nihil.
Contoh: (loop 0 5 +) => 10 .
Contoh: (loop 0 5 10 +) => 35
Terkait pesan
Topik adalah string yang dibatasi-slash ( / ). Topik langganan Un /Gunakan wildcard /+/ untuk semua dan /# untuk apa pun selanjutnya .
Contoh: Topik house/kitchen/fridge cocok dengan house/+/fridge atau house/# atau +/kitchen/+ atau # , tetapi bukan garage/# atau house/bedroom/fridge atau house/+/sink .
pub topic[ payload] : Kirim pesan di seluruh VM dengan topic Topik String, dan secara opsional payload muatan (jika tidak nihil) dari jenis apa pun;
Mengembalikan nihil, atau jika pesan tersebut menyebabkan program lain menerbitkan pesan, program penerbitan asli berlangganan,
Mengembalikan negara yang dikembalikan oleh penangan langganan program penerbitan asli.
Catatan: Penerbitan langsung dan sinkron - program Anda harus menunggu ketika pelanggan memproses pesan.
sub topic f[ provide-topic] : Berlangganan fungsi f ke topic Pesan Topik,
di mana jika provide-topic adalah kebenaran f adalah (state topic payload) => new-state ,
else (default) f is (state payload) => new-state ; mengembalikan nihil.
Catatan: Hanya fungsi program yang diterima sebagai f - untuk menggunakan operasi asli menggunakan fungsi inline.
unsub topic : Hapus langganan topic sebelumnya; mengembalikan nihil.
unsub : Jatuhkan semua langganan program; mengembalikan nihil.
Sistem & Program Terkait
ms-now : Mengembalikan milidetik sejak inisialisasi CHVM.
sleep ms : Menunda detak jantung program berikutnya untuk ms milidetik; mengembalikan nihil.
print 0-N Arg: Cetak Hasil str N Args; mengembalikan nihil.
load path : Memuat program Chika yang dikompilasi di path (tanpa ekstensi file); Mengembalikan bool keberhasilan memuat program.
comp path-in[ path-out] : Mengompilasi file sumber (idiomatik *.chi ) di path-in sebagai biner chika, baik disimpan di jalur yang sama dengan ekstensi diubah menjadi .kua atau di path-out (idiomatik *.kua ).
halt : Segera mengakhiri program Chika.
Biner chika yang dikompilasi hanya terdiri dari fungsi . Fungsi berisi formulir . Formulir berisi arg (yang juga dapat berupa bentuk) dan diakhiri dengan operasi . Format byte heksadesimal adalah:
fungsi
NNNNLLLL…
NNNN , uint16_t Menambah ID fungsi; LLLL , uint16_t panjang tubuh fungsi; … , LLLL -length function body.
membentuk
00…args…OO
00 , penanda bentuk; [args] , 0-n args; OO sebuah operasi.
arg
atau 00… , formulir
AA , uint8_t arg-code; … Badan argumen khusus berukuran variabel.
operasi
OO
OO , OP-CODE UINT8_T.
00 FRM Formulir
Todo
Todo