
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.
В терминале вы можете запустить ./compile.sh , чтобы перекомпилировать виртуальную машину Chika для вашей машины, которая также использует нативного компилятора для перекомпиляции corpus/programs/init.chi .
Чтобы запустить исходный файл CHIKA .chi или скомпилированный файл .kua , вы можете вызвать исполняемый файл chika с его пути, например: ./chika ../corpus/programs/fibonacci.chi . Это будет компилировать fibonacci.chi как fibonacci.kua в рабочем каталоге исполняемого файла.
Исходные файлы могут быть приготовлены с помощью шебанга к исполняемому файлу Chika для непосредственного выполнения файла .chi .
На ПК: вызвать исполняемый файл chika , такой как ./chika c source.chi . Вызове без флага c для компиляции, а затем выполните полученный файл.
На ПК/Arduino: используйте comp Op в Chika для компиляции исходных файлов .chi .
Примечание. На Arduino может потребоваться некоторое время, поскольку он компилируется с очень ограниченной памятью, в основном записывая один байт в файл за раз.
Примечание. Компиляция излучает много временных файлов, которые должны быть удалены после успешной компиляции.
Каждая программа, загруженная в виртуальную машину, имеет всю жизнь:
Все это необязательно, но, по крайней мере, сердцебиение или запись должны быть указаны в программе.
Вход - это код, выполняемый в начале программы, перед любым сердцебиением или сообщениями, и не содержится в каких -либо функциях. Он может вызвать функции еще до их объявления в исходном файле. Последняя запись возвращала предмет семян в состоянии программы. Код входа разгружается после использования, поэтому после этого может не называть.
Сердцебиение необходимо, чтобы остановить программу, немедленно завершающуюся после въезда, включив функцию, называемую heartbeat . Это выполняется ровно на программу функцию сердцебиения, в стиле круглого робина. Функция heartbeat выполняется в постоянном состоянии программы в качестве параметра, и возврат сохраняется как новое состояние.
Сообщения транслируются по всей виртуальной машине и выполняют любые функции обратного вызова, также передавали состояние программы и возвращая новое состояние.
Метки и имена функций могут включать (почти) любые символы, за исключением пробелов.
Имена функций не должны начинаться с цифры.
#num : только первая строка файла (или вторая, если присутствует шебанг). Информирует виртуальную машину, сколько байтов оперативной памяти ( num до 64 киб) будет использоваться программой. В противном случае используется максимум по умолчанию.
(func[ N args]) : форма, с функцией в положении головы и аргументами 0-N, разделенными пространствами. Аргументы могут быть формами.
Примечание. func может быть собственной операцией, функцией программы, встроенной функцией, привязкой, расширенным привязкой, параметром или расширенным параметром.
(fn func-name[ N params] [1-N forms]) : определение функции, с символами параметров 0-N, разделенными пространствами, и 1-N форм.
Примечание. Вызов функции без форм возвращает NIL.
{form} : встроенная функция, состоящая как одна форма.
ПРИМЕЧАНИЕ. Параметры окружающих функций не могут быть направлены на вставленные функции. Вместо этого рассмотрим, используя привязку.
Примечание: вложенные вложенные функции запрещены.
# : ссылка на параметр, на первый параметр функции.
$ : расширенная ссылка на параметр, на первый параметр функции функции вызывающего функции.
#N и $N : ссылка на параметр, на NTH PARAMATER, EG #3 или $3 США для четвертого параметра либо функции, либо функции функции вызывающего функции.
Примечание. Использование $ , когда не было вызовой функции, является неопределенным поведением.
ПРИМЕЧАНИЕ. Ссылки на значение $ может быть стерто с помощью оптимизации хвостового вызова.
//… : комментарий, который может быть приготовлен на новой линии или в конце одного.
/*…*/ : Многослойный комментарий. Примечание: экземпляр */ будет немедленно прекратить комментарий и не может быть содержат в самом многослойном комментарии
; : Полуиколон, рассматриваемый как пробел.
, : запятая, рассматривается как пробел и пробел после того, как она будет стерта.
…= : Связывание, за которым … это ярлык.
… : Ссылка на привязку или ссылку на параметры в зависимости от контекста, посредством чего … его этикетка.
.… : Расширенная ссылка на привязку, посредством которой … его этикетка. Он ссылается на предыдущий экземпляр привязки в стеке.
ПРИМЕЧАНИЕ. Параметры имеют прецедент по сравнению с привязками для функции.
Примечание. При переопределении привязков необходимо использовать расширенную привязку, поэтому виртуальная машина пропускает предыдущий экземпляр. Рассмотрим: 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:
Возвращает сумму / вычитание / умножение / разделение / модуль / подъем на силу /
И / или / xor / левый сдвиг / Правая сдвиг n целых чисел.
Ноль арг. Возвращает ноль. Будет отменять все параметры как тип первого аргумента.
~ n : возвращается по биче, а не n .
Примеры: (+ 1 1) => 2 , (+ 155 200) => 100 , (+ 155w 200) => 355w
rand : Возвращает псевдолудочный логический.
rand b : Возвращает псевдолудочное целое число от 0 до b Exclusive.
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 , затем сравнивается с 1 -й из каждой пары аргументов, возвращая 2 -е место, если 1 -е совпадение; Если никаких совпадений не сделано default или возвращается нуль.
! i : логически отрицает элемент i .
or n arg: возвращает первую правдивую арг.
&& n arg: возвращает истинность, если все Args, правда.
= N arg: равенство, правда, если все аргументы имеют одинаковый тип, длину и равенство байта. Сравнивает INT по значению.
!= N Arg: отрицательное равенство.
== n arg: справедливость, возвращает true, если n элементы имеют равенство байтов.
!== n arg: отрицательный капитал.
< / <= / > / >= N arg: возвращает true, если 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 : возвращает элемент или символ в индексе N вектора или строки i , или nil, если N находится в неправильном диапазоне.
str 0 Arg: возвращает пустую строку.
str n arg: возвращает конкатенацию n аргументов как строку.
len i : возвращает либо вектор, строку или внутреннюю длину элемента.
sect v : возвращает v с первым элементом (если вектор) или символом (если строка) опущен;
sect v skip : Возвращает v с первыми skip элементов/символов, опущенных;
sect v skip take : Возвращает v с take и первым skip /символами, опущенными;
..sect : то же самое, что и sect , но возвращает элементы/символы.
blob ls : возвращает каплей длины l со всеми байтами, установленными в s
get oltb : возвращает элемент типа t и длины l из смещения o Bytes of Item b .
get ob : Возвращает значение u08 байта в смещении o Bytes of Item b .
set oib : возвращает Blob b с смещением o Bytes, установленными на байты элемента i .
ПРИМЕЧАНИЕ. Оба get и set возврат NIL, если запрос Offset + Len превысит размер капли.
ПРИМЕЧАНИЕ. Оба принимают ссылку в виде b (например *binding ) и вместо этого будут осматривать/изменять байты исходного эталонного элемента, set возвращение ссылки или нуля.
.. v : разрывает вектор или строку v в стек аргументов как векторные элементы или элементы символов.
Примечание: как в инверсированном Clojure apply EG (+ (.. [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 - правда как вход, Falsey как выход; Возвращает ноль.
dig-r pin : возвращает состояние цифрового ввода вывода pin кода.
dig-w [1-N pin val] : за pin val , последовательно, устанавливает цифровое состояние вывода номера pin в логический val -правда или ненулевой, как высокий, нулевой или низкий; Возвращает ноль.
ana-r pin : возвращает аналоговое входное состояние контакта pin кода.
ana-w [1-N pin val] : за pin val , последовательно, устанавливает аналоговое/ШИМ-выходное состояние вывода PIN- pin в 16-битное целое число val ; Возвращает ноль.
ana-r pin : возвращает аналоговое 16-битное целочисленное вход штифта pin .
Файл IO связан
Примечание. В файлах Arduino должны быть эксплуатации не более трех символов.
file-r path : возвращает каплей всего содержимого файла.
file-r path T : возвращает размер файла.
file-r path offset : возвращает каплей содержимого файла между смещенными байтами и EOF.
file-r path offset count : возвращает каплей содержимого файла между смещением и до подсчета байтов.
ВСЕ ВОЗВРАЩАЕТ НИЛ ПОСЛОВАТЬ.
file-a path content : добавляет каждую часть или элемент в качестве строки в файл.
file-w path content[ offset] : записывает капля или элемент в качестве строки в файл, при желании с смещением байта (в противном случае 0); Возвращает успех как логический.
Оба возвращают успех как логический.
Примечание. Строки написаны без нулевого терминатора.
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 IS (item acc) => acc .
map fv*N : возвращает отображение 1-N векторов через f , где f IS (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 IS (acc 0…n) => any , где acc , сначала seed , затем возврат предыдущей итерации.
loop seed abf : То же, что и выше, за исключением n диапазонов от a до b .
Пример: (loop 2 {print "hello" #}) печатает "hello0" и "hello1", возвращает ноль.
Пример: (loop 0 5 +) => 10 .
Пример: (loop 0 5 10 +) => 35
Сообщение связано
Темы-это отстранимые ( / ) разграниченные струны. Темы ООН /подписка используют подстановочные знаки /+/ для любого и /# для любого в будущем .
Пример: house/kitchen/fridge сочетает в себе house/+/fridge или house/# или +/kitchen/+ или # , но не garage/# или house/bedroom/fridge или house/+/sink .
pub topic[ payload] : отправьте сообщение по всей виртуальной машине с topic строки и, необязательно полезной payload (в противном случае NIL) любого типа;
Возвращает NIL, или если сообщение заставило другую программу опубликовать сообщение, на которую была подписана оригинальная программа публикации, на
Возвращает штат, возвращаемый оригинальным обработчиком подписки оригинальной программы публикации.
Примечание: публикация является непосредственной и синхронной - ваша программа должна будет ждать, поскольку подписчики обрабатывают сообщение.
sub topic f[ provide-topic] : подписать функцию f к topic темы сообщения,
где, если provide-topic является правдой f (state topic payload) => new-state ,
else (по умолчанию) f IS (state payload) => new-state ; Возвращает ноль.
ПРИМЕЧАНИЕ. Только программные функции принимаются как f - для использования собственной операции Используйте встроенную функцию.
unsub topic : удалить предыдущую подписку topic ; Возвращает ноль.
unsub : бросить все подписки на программу; Возвращает ноль.
Связанный с системой и программой
ms-now : возвращает миллисекунды с момента инициализации CHVM.
sleep ms : откладывает следующее сердцебиение программы для ms Miliseconds; Возвращает ноль.
print 0-N ARG: печатает результат str n args; Возвращает ноль.
load path : загружает скомпилированную программу Chika на path (без расширения файлов); Возвращает Bool успеха загрузки программы.
comp path-in[ path-out] : Скомпилируйте исходный файл (идиоматически *.chi ) по path-in в качестве двоичного чика, либо сохраняемый на том же пути с расширением, измененным на .kua или по path-out (идиоматически *.kua ).
halt : немедленно завершает программу Чика.
Скомпилированный бинар Чика состоит из функций . Функции содержат формы . Формы содержат ARG (которые также могут быть формами) и заканчиваются операцией . Шестнадцатеричные форматы байтов:
функция
NNNNLLLL…
NNNN , uint16_t идентификатор функции увеличения; LLLL , uint16_t Функциональной длины тела; … , LLLL -Length Function Body.
форма
00…args…OO
00 , маркер формы; [args] , 0-n args; OO Операция.
Арг
или 00… , форма
AA , uint8_t arg-code; … Аргументованное тело с переменным размером.
операция
OO
OO , uint8_t Op-код.
00 FRM Form
Тодо
Тодо