
Chika es un lenguaje de programación dirigido a Arduino como firmware o Linux como ejecutable. Facilita los programas de tareas de alto nivel de alto nivel, cargando programas desde una tarjeta SD o sistema de archivos Linux.
Su objetivo es inclinarse hacia la agilidad sobre la velocidad y la huella de la memoria, con un modelo de memoria de pila único, sintaxis inspirada en Lisp y mensajes internos al estilo MQTT.
Su espíritu es: desacoplar todo a través de la comunicación entre tareas.
Visite el sitio web para obtener más información , incluida la justificación, las comparaciones con otros proyectos, fotos y más.
Visite la discordia para charlar.
Vea Core.Chi y el resto del corpus para más ejemplos realistas.
Nota: ;//… se usa para hacer uso de la sintaxis de Clojure; Los comentarios en Chika son solo //…
; //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 }) Abra Chika_Arduino.ino en Arduino IDE, suba a su Arduino.
Asegúrese de que haya una tarjeta SD insertada con el archivo init.kua . Se deben cargar más programas dentro del archivo init.kua con la operación load .
Dispositivos adecuados:
Actualmente hay algunas opciones para compilar y ejecutar chika en Linux.
En el terminal puede ejecutar ./compile.sh para recompilar Chika VM para su máquina, que también utiliza el compilador nativo para recompilar corpus/programs/init.chi .
Para ejecutar un archivo fuente de chika .chi o un archivo compilado .kua , puede invocar el ejecutable chika con su ruta, como: ./chika ../corpus/programs/fibonacci.chi . Esto compilará fibonacci.chi como fibonacci.kua en el directorio de trabajo del ejecutable.
Los archivos de origen se pueden prever con un shebang al ejecutable de chika para ejecutar un archivo .chi directamente.
En PC: Invoca el ejecutable chika como ./chika c source.chi . Invocar sin el indicador c para compilar y luego ejecute el archivo resultante.
En PC/Arduino: use la comp OP dentro de Chika para compilar archivos de origen .chi .
Nota: puede llevar un tiempo en el Arduino, ya que se compila con memoria muy limitada, principalmente escribiendo un byte a un archivo a la vez.
Nota: La compilación emite muchos archivos temporales, que deben eliminarse después de una compilación exitosa.
Cada programa cargado en la VM tiene una vida útil de:
Todos estos son opcionales, pero al menos un latido o entrada debe especificarse en un programa.
La entrada se ejecuta en el código al inicio del programa, antes de los latidos o mensajes de latidos, y no está contenido dentro de ninguna función. Puede llamar a funciones incluso antes de su declaración en el archivo fuente. La última entrada devolvió el artículo del artículo el estado del programa. El código de entrada se descarga después de su uso, por lo que no se puede llamar a partir de entonces.
Se requieren latidos de los latidos para detener un programa que termine inmediatamente después de la entrada, incluyendo una función llamada heartbeat . Esto se ejecuta de Flat-Out por Función Heartbeat, estilo redondo. La función heartbeat se pasa por el estado persistido del programa como parámetro, y el retorno se persiste como el nuevo estado.
Los mensajes se transmiten a lo largo de la VM y ejecutan cualquier función de devolución de llamada, también se aproban el estado del programa y devuelven el nuevo estado.
Las etiquetas y los nombres de las funciones pueden incluir (casi) cualquier personaje que excluya el espacio en blanco.
Los nombres de las funciones no deben comenzar con un dígito.
#num : Primera línea de archivo solamente (o segundo si hay un shebang presente). Informa a la VM cuántos bytes de RAM ( num hasta 64KIB) serán utilizados por el programa. De lo contrario, se usa un máximo predeterminado.
(func[ N args]) : una forma, con una función en la posición de la cabeza, y argumentos 0-N separados por espacios. Los argumentos pueden ser formas.
Nota: func puede ser una operación nativa, función de programa, función en línea, enlace, enlace extendido, parámetro o parámetro extendido.
(fn func-name[ N params] [1-N forms]) : una definición de función, con símbolos de parámetros 0-N separados por espacios y formularios 1-N.
Nota: Llamar a una función sin formularios devuelve nulo.
{form} : una función en línea, compuesta como una forma.
Nota: Los parámetros de las funciones circundantes no pueden referenciarse dentro de las funciones en línea. Considere en su lugar el uso de una vinculación.
Nota: Las funciones en línea anidadas están prohibidas.
# : una referencia de parámetro, al primer parámetro de una función.
$ : una referencia de parámetros extendidos, al primer parámetro de la función de llamadas de una función.
#N y $N : una referencia de parámetros, al enésimo parámetro, por ejemplo, #3 o $3 para el cuarto parámetro de la función o la función de llamadas de la función.
Nota: Usar $ cuando no había función de llamadas es un comportamiento indefinido.
Nota: El valor $ referencias se puede borrar mediante la optimización de llamadas de cola.
//… : un comentario, que puede estar adecuado en una nueva línea o al final de una.
/*…*/ : Un comentario multiline. Nota: Una instancia de */ terminará un comentario inmediatamente y no puede ser contenido dentro de un comentario multilín
; : Un punto y coma, tratado como espacios en blanco.
, : una coma, tratada como espacios en blanco y espacio en blanco después de que se borre.
…= : Vinculante, por el cual … es una etiqueta.
… : referencia vinculante o referencia de parámetros dependiendo del contexto, por el cual … es su etiqueta.
.… : una referencia vinculante extendida, por la cual … es su etiqueta. Hace referencia a la instancia anterior de una vinculación en la pila.
Nota: Los parámetros toman precedentes sobre los enlaces por función.
Nota: Al redefinir los enlaces, uno debe usar una unión extendida, por lo que la VM omite la instancia anterior. Considere: a= (+ 1 .a) , de modo que a no se refiera al siguiente elemento en la pila en ese momento - 1 .
Las funciones if , && , or , y case no se pueden representar en un enlace o parámetro.
Como las funciones solo deben contener formularios, garantizar que las devoluciones usen val .
NOTA: Los enteros están en formato hexadecimal decimal o grande endian.
"…" : Cadena, por la cual … son de 0 a 128 caracteres ASCII, o "" para vacío." y str para quotaciones dobles, ya que las cadenas no proporcionan caracteres escapados.0 o 0x00 : Integer Unsigned de 8 bits.0w o 0x0000 : Integer Unsigned de 16 bits.0i o 0x00000000 : Integer firmado de 32 bits.c : carácter ASCII. Extendido: nl newline, sp espacio.[…] : Vector, por el cual … son 0 a 2^16 elementos delimitados por el espacio, o [] para vacío. Azúcar sintáctico para (vec …) args : emite un vector de argumentos de función.T : literal booleano verdaderoF : Falso booleano literalN : literal nulo Nota: [square brackets] indican argumentos opcionales.
Matemático
+ / - / * / / / % / ** /
& / | / ^ / << / >> N Arg:
Devuelve suma / subtracción / multiplicación / división / módulo / Raise-to-the-Power /
Y / o / xor / desplazamiento izquierdo / desplazamiento derecho de n enteros.
Zero Args regresa nulo. Arrojará todos los parámetros como el tipo del primer argumento.
~ n : Devuelve bit a bit no de n .
Ejemplos: (+ 1 1) => 2 , (+ 155 200) => 100 , (+ 155w 200) => 355w
rand : Devuelve un booleano pseudo-aleatorio.
rand b : Devuelve un entero pseudo-aleatorio de 0 a b exclusivo.
rand ab : Devuelve un entero pseudo-aleatorio de a inclusive a b exclusivo.
Nota: a o b negativo hace que se entiendan como 1.
Condicional
if cond if-true : evalúa y devuelve if-true si cond es verdad, de lo contrario, nulo.
if cond if-true if-false : evalúa y devuelve if-true si cond es verdad, de lo contrario, if-false .
case match … N pairs … [default] : evalúa match y luego se compara con el 1 ° de cada par de argumentos, devolviendo el segundo si la primera coincide; Si no se realizan coincidencias default o se devuelve nulo.
! i : lógicamente niega el elemento i .
or N Arg: Devuelve First Trutyy Arg.
&& n arg: Devuelve verdadero si todos los args son verdaderos.
= N arg: igualdad, verdadero si todos los args son del mismo tipo, longitud e igualdad de byte. Compara ints por valor.
!= N arg: igualdad negativa.
== n Arg: Equidad, devuelve verdadero si n ítems son de igualdad de bytes.
!== n arg: equidad negativa.
< / <= / > / >= N Arg: Devuelve verdadero si N ítems están en orden monotónicamente aumentado / no decreciente / disminución / no aumentable.
Funciones relacionadas con la función
return[ val] : salga temprano de una función, evaluando a nil o val .
recur n arg: en la pila reemplaza los parámetros con N argumentos y recordar la función.
val 1-N Arg: Devuelve su primer argumento.
do 1-N Arg: Devuelve su argumento final.
String, vector y blob relacionados
vec 0 arg: devuelve vector vacío.
vec n arg: devuelve el vector de sus argumentos.
nth N i : devuelve elemento o carácter en el índice N de vector o cadena i , o nil si N está en un rango inadecuado.
str 0 Arg: Devuelve una cadena vacía.
str N Arg: Devuelve la concatenación de n argumentos como una cadena.
len i : Devuelve la longitud de vector, cadena o elemento interno.
sect v : Devuelve v con el primer elemento (if vector) o el carácter (if string) omitido;
sect v skip : Devuelve v con los primeros skip /caracteres omitidos;
sect v skip take : Devuelve v con take Longitud y primero skip los elementos/caracteres omitidos;
..sect : lo mismo que sect pero devuelve los elementos/caracteres estallando.
blob ls : Devuelve una gota de longitud l con todos los bytes establecidos en s .
get oltb : devuelve el elemento de tipo t y longitud l de desplazamiento o bytes del elemento b .
get ob : Devuelve el valor U08 de byte en la compensación o bytes del elemento b .
set oib : Devuelve Blob b con Offset o bytes establecidos en los bytes del elemento i .
Nota: Tanto get y set retorno nil si se solicita offset + len excedería el tamaño del blob.
Nota: Ambos aceptan una referencia como b (EG *binding ) y, en su lugar, inspeccionarán/modificarán los bytes del elemento de referencia original, set devolviendo la referencia o NIL.
.. v : Explica un vector o cadena v en la pila de argumentos como elementos vectoriales o elementos de caracteres.
Nota: Al igual que en Clojure Inversado, apply Eg (+ (.. [1 2 3]) (.. [4 5 6])) => 21 .
Nota: Si su argumento no es un vector, no deja elementos en la pila.
binds : Deduplica cualquier enlace en sus argumentos, favoreciendo los más nuevos y luego vectorizando los restos.
Ejemplo: (binds a= 1 b= 2 a= 3) => [b= 2 a= 3]
Relacionado con el GPIO
Nota: Estos no tienen ningún efecto en la PC.
p-mode pin mode : Establece el modo de pin del número PIN en el mode booleano: verdadero como entrada, falsificación como salida; Devuelve nulo.
dig-r pin : Devuelve el estado de entrada digital del número del número de pin .
dig-w [1-N pin val] : por pin val , en sucesión, establece el estado de salida digital del número de pin en el val booleano o no cero como alto, cero o bajo; Devuelve nulo.
ana-r pin : Devuelve el estado de entrada analógica del número de pin de pin.
ana-w [1-N pin val] : por pin val , en sucesión, establece el estado de salida analógico/pwm del número de pin pin en el val entero de 16 bits; Devuelve nulo.
ana-r pin : Devuelve entrada entero analógica de 16 bits del pin número de pin.
Archivo IO Relacionado
Nota: En los archivos Arduino deben tener extensiones de no más de tres caracteres.
file-r path : Devuelve Blob de contenido completo del archivo.
file-r path T : Devuelve el tamaño del archivo.
file-r path offset : Devuelve Blob de contenido de archivo entre bytes de compensación y EOF.
file-r path offset count : Devuelve Blob de contenido de archivo entre Offset y UP para contar bytes.
Todos devuelven nulo al fallar.
file-a path content : agrega un blob o elemento como cadena para archivar.
file-w path content[ offset] : escribe un blob o elemento como cadena en un archivo, opcionalmente con un desplazamiento de byte (de lo contrario 0); Devuelve el éxito como booleano.
Ambos devuelven el éxito como booleano.
Nota: Las cadenas se escriben sin terminador nulo.
file-d path : elimina el archivo en path ; Devuelve el éxito como booleano.
Tipos y casting
type i : devuelve el código de tipo de elemento i .
type ab : Devuelve el código de tipo de elementos a y b si son iguales, de lo contrario nil .
cast it : Devuelve el elemento i emití como código de tipo t .
Nota: se truncará más ancho a más delgado, más delgado a más ancho se cero;
La cadena a Blob carecerá de terminación nula; Los fundidos a las cuerdas se agregarán con terminación nula.
Iteración
reduce f[ s*N] i : devuelve la reducción del vector o la cadena i a f , con semillas 0-N. f es (item acc) => acc .
map fv*N : Devuelve la asignación de vectores 1-N a través de f , donde f es (item*N) => mapped .
Ejemplo: (map str [a b c] [1 2 3]) => [a1 b2 c3]
for fv*N : Devuelve la asignación iterativa de los vectores 1-N a través de f , donde f es (item*N) => mapped .
Ejemplo: (for str [a b c] [1 2 3]) => [a1 a2 a3 b1 b2 b3 c1 c2 c3]
loop nf : repite n número de 16 bits de veces la función f , donde f es (0…n) => any ; Devuelve el último retorno de f .
loop seed nf : igual que arriba, pero f es (acc 0…n) => any lugar donde acc se seed en primer lugar, entonces el retorno de la iteración anterior.
loop seed abf : igual que arriba, excepto que n varía de a a b
Ejemplo: (loop 2 {print "hello" #}) Imprime "Hello0" y "Hello1", devuelve nil.
Ejemplo: (loop 0 5 +) => 10 .
Ejemplo: (loop 0 5 10 +) => 35
Relacionado con el mensaje
Los temas son cuerdas delimitadas de ventaja hacia adelante ( / ). Temas de suscripción UN /Use los comodines /+/ para cualquiera y /# para cualquier en adelante .
Ejemplo: la house/kitchen/fridge coincide con la house/+/fridge o house/# o +/kitchen/+ o # , pero no garage/# o house/bedroom/fridge o house/+/sink .
pub topic[ payload] : envíe un mensaje a lo largo de la VM con el topic del tema de la cadena y, opcionalmente, una payload de carga (de lo contrario) de cualquier tipo;
Devuelve nulo, o si el mensaje hizo que otro programa publicara un mensaje al que se suscribió el programa de publicación original,
Devuelve el estado devuelto por el controlador de suscripción del programa de publicación original.
Nota: La publicación es inmediata y sincrónica: su programa tendrá que esperar a medida que los suscriptores procesen el mensaje.
sub topic f[ provide-topic] : suscribir la función f a un topic de tema de mensaje,
donde si provide-topic es verdad f es (state topic payload) => new-state ,
else (predeterminado) f es (state payload) => new-state ; Devuelve nulo.
Nota: Solo las funciones del programa se aceptan como f - para usar una operación nativa Use una función en línea.
unsub topic : eliminar la suscripción anterior del topic ; Devuelve nulo.
unsub : suelte todas las suscripciones del programa; Devuelve nulo.
Relacionado con el sistema y el programa
ms-now : Devuelve milisegundos desde la inicialización de CHVM.
sleep ms : pospone el próximo latido del programa para ms Miliseconds; Devuelve nulo.
print 0-N Arg: Impresiones resultado de str de N Args; Devuelve nulo.
load path : Carga el programa chika compilado en path (sin extensión de archivo); Devuelve Bool de éxito de cargar el programa.
comp path-in[ path-out] : compila un archivo de origen (idiomáticamente *.chi ) en path-in como un binario chika, ya sea guardado en la misma ruta con la extensión cambiada a .kua o en path-out (idiomáticamente *.kua ).
halt : inmediatamente termina el programa Chika.
Un binario chika compilado está compuesto únicamente de funciones . Las funciones contienen formularios . Los formularios contienen args (que también pueden ser formularios) y terminan con una operación . Los formatos de bytes hexadecimales son:
función
NNNNLLLL…
NNNN , uint16_t ID de función de incremento; LLLL , uint16_t longitud del cuerpo de la función; … , LLLL -length Function Body.
forma
00…args…OO
00 , marcador de formulario; [args] , 0-N Args; OO una operación.
argumento
o 00… , un formulario
AA , uint8_t arg-código; … Cuerpo de argumentos a medida de tamaño variable.
operación
OO
OO , UINT8_T OP-Code.
00 FRM Forma
HACER
HACER