
Chika é uma linguagem de programação direcionada ao Arduino como firmware ou Linux como executável. Ele facilita os programas de carregamento multitarefa de alto nível de robin-robin, de um sistema de arquivos Linux.
Seu objetivo é se inclinar para a agilidade na pegada de velocidade e memória, com um modelo exclusivo de memória de pilha, sintaxe de inspiração LISP e mensagens internas no estilo MQTT.
Seu espírito é: desacoplar tudo através da comunicação entre tarefas.
Visite o site para obter mais informações , incluindo a justificativa, comparações com outros projetos, fotos e muito mais.
Visite a discórdia para conversar.
Veja Core.chi e o restante do corpus para obter mais exemplos realistas.
Nota:; ;//… é usado para fazer uso da sintaxe de clojure Destaques; Os comentários em chika são justos //… .
; //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 em Arduino IDE, faça o upload para o seu Arduino.
Verifique se há um cartão SD inserido com o arquivo init.kua . Outros programas devem ser carregados no arquivo init.kua com a operação load .
Dispositivos adequados:
Atualmente, existem algumas opções para compilar e executar o Chika no Linux.
No terminal, você pode executar ./compile.sh para recompilar a VM Chika para sua máquina, que também usa o compilador nativo para recompilar corpus/programs/init.chi .
Para executar um arquivo de origem chika .chi ou um arquivo compilado .kua , você pode invocar o executável chika com seu caminho, como: ./chika ../corpus/programs/fibonacci.chi . Isso compilará fibonacci.chi como fibonacci.kua no diretório de trabalho do executável.
Os arquivos de origem podem ser antecipados com um shebang para o executável Chika para executar um arquivo .chi diretamente.
No PC: Invoque o executável chika , como ./chika c source.chi . Invoque sem o sinalizador c para compilar e executar o arquivo resultante.
No PC/Arduino: use o comp com o Chika para compilar arquivos de origem .chi .
Nota: pode demorar um pouco no Arduino, pois ele compila com memória muito limitada, principalmente escrevendo um byte em um arquivo por vez.
Nota: A compilação emite muitos arquivos temporários, que devem ser excluídos após uma compilação bem -sucedida.
Cada programa carregado na VM tem uma vida inteira de:
Tudo isso é opcional, mas pelo menos um batimento cardíaco ou entrada deve ser especificado em um programa.
A entrada é o código executado no início do programa, antes de qualquer batimento cardíaco ou mensagens, e não está contido em nenhuma função. Ele pode chamar funções mesmo antes de sua declaração no arquivo de origem. A última entrada retornou o item de semente do estado do programa. O código de entrada é descarregado após o uso, portanto, pode não ser chamado a partir de então.
Os batimentos cardíacos são obrigados a interromper um programa terminando imediatamente após a entrada, incluindo uma função chamada heartbeat . Isso é executado de acordo com a função de batimentos cardíacos, estilo de robina redonda. A função heartbeat é aprovada no estado persistido do programa como um parâmetro e o retorno é persistido como o novo estado.
As mensagens são transmitidas por toda a VM e executam quaisquer funções de retorno de chamada, também passaram pelo estado do programa e retornando o novo estado.
Rótulos e nomes de funções podem incluir (quase) todos os caracteres excluindo o espaço em branco.
Os nomes de funções não devem começar com um dígito.
#num : primeira linha de arquivo apenas (ou segundo se um shebang estiver presente). Informa a VM quantos bytes de RAM ( num até 64kib) serão usados pelo programa. Caso contrário, um máximo padrão é usado.
(func[ N args]) : um formulário, com uma função na posição da cabeça e argumentos 0-n separados por espaços. Argumentos podem ser formulários.
Nota: func pode ser uma operação nativa, função do programa, função embutida, ligação, ligação estendida, parâmetro ou parâmetro estendido.
(fn func-name[ N params] [1-N forms]) : uma definição de função, com símbolos de parâmetros 0-n separados por espaços e formulários 1-n.
NOTA: Chamar uma função sem formulários retorna nil.
{form} : uma função inline, composta como uma forma.
Nota: Os parâmetros das funções circundantes não podem ser referenciados em funções em linha. Considere em vez de usar uma ligação.
NOTA: As funções em linha aninhadas são proibidas.
# : uma referência de parâmetro, ao primeiro parâmetro de uma função.
$ : uma referência de parâmetro estendida, ao primeiro parâmetro da função de chamador de uma função.
#N e $N : uma referência de parâmetro, ao enésimo parâmetro, por exemplo, #3 ou $3 para o quarto parâmetro da função ou da função do chamador da função.
Nota: Usar $ quando não houve função de chamada é um comportamento indefinido.
NOTA: As referências de valor $ podem ser apagadas pela otimização da chamada cauda.
//… : Um comentário, que pode ser adequado em uma nova linha ou no final de uma.
/*…*/ : Um comentário multilina. Nota: Uma instância de */ encerrará um comentário imediatamente e não pode ser contido em um comentário multiline
; : Um semicolon, tratado como espaço em branco.
, : uma vírgula, tratada como espaço em branco e espaço em branco depois de ser apagado.
…= : Ligação, pela qual … é um rótulo.
… : Referência de ligação ou referência de parâmetro Dependendo do contexto, pelo qual … é o seu rótulo.
.… : Uma referência de ligação estendida, pela qual … é o seu rótulo. Ele faz referência à instância anterior de uma ligação na pilha.
NOTA: Os parâmetros têm precedentes sobre as ligações por função.
Nota: Ao redefinir as ligações, é preciso usar uma ligação estendida, para que a VM ignore a instância anterior. Considere: a= (+ 1 .a) , de modo que a não se refere ao próximo item na pilha naquele momento - 1 .
As funções if , && , or , e case não pode ser representado em uma ligação ou parâmetro.
Como as funções devem conter apenas os formulários garantem as devoluções, use val .
NOTA: Os números inteiros estão em formato hexadecimal decimal ou endiano.
"…" : string, por que … são de 0 a 128 caracteres ASCII, ou "" para vazio." e str para quadras duplas, pois as strings não fornecem caracteres escapados.0 ou 0x00 : número inteiro não assinado de 8 bits.0w ou 0x0000 : número inteiro não assinado de 16 bits.0i ou 0x00000000 : número inteiro assinado de 32 bits.c : caractere ascii. Estendido: nl newline, sp espaço.[…] : Vector, pelo qual … são de 0 a 2^16 itens delimitados pelo espaço ou [] para vazio. Açúcar sintático para (vec …) args : emite um vetor de argumentos de função.T : Literal Boolean TrueF : Falso booleano literalN : Nil literal Nota: [square brackets] indicam argumentos opcionais.
Matemático
+ / - / * / / / % / ** /
& / | / ^ / << / >> n arg:
Retorna Sum / Subtração / Multiplicação / Divisão / Modulus / Rister-to-the-Power /
E / ou / xor / deslocamento esquerdo / mudança direita de n números inteiros.
Zero Args retorna nil. Lançará todos os parâmetros como o tipo do primeiro argumento.
~ n : retorna bit nessa não de n .
Exemplos: (+ 1 1) => 2 , (+ 155 200) => 100 , (+ 155w 200) => 355w
rand : Retorna um pseudo-aleatório booleano.
rand b : Retorna um número inteiro pseudo-aleatório de 0 a b exclusivo.
rand ab : Retorna um número inteiro pseudo-aleatório de a exclusivo inclusivo para b
Nota: a ou b negativo faz com que eles sejam entendidos como 1.
Condicional
if cond if-true : avalia e retorna if-true se cond for verdade, caso contrário, nil.
if cond if-true if-false : avaliar e retornar if-true se cond for verdade, caso contrário if-false .
case match … N pairs … [default] : Avalia match e compara -se com o 1º de cada par de argumentos, retornando o segundo se o 1º corresponde; Se nenhuma correspondência for feita default ou nulo for devolvido.
! i : Logicamente nega o item i .
or n arg: retorna a primeira verdadeira arg.
&& n arg: retorna true se tudo args truthy.
= N arg: igualdade, verdadeira se todos os args são do mesmo tipo, comprimento e igualdade de bytes. Compara INTs por valor.
!= N arg: igualdade negativa.
== N ARG: O patrimônio líquido retorna true se n itens forem de igualdade de bytes.
!== N Arg: patrimônio líquido negativo.
< / <= / > / >= N arg: retorna true se n itens estiverem em ordem monotonicamente aumentando / não decrescente / diminuindo / não aumentando.
Função relacionada
return[ val] : Saia de uma função cedo, avaliando para NIL ou val .
recur N ARG: Na pilha, substitua os parâmetros por N argumentos e lembre -se da função.
val 1-N Arg: retorna seu primeiro argumento.
do 1-N Arg: retorna seu argumento final.
String, vetor e blob relacionados
vec 0 ARG: retorna vetor vazio.
vec N ARG: Retorna o vetor de seus argumentos.
nth N i : retorna item ou caractere no índice N de vetor ou string i , ou nil se N estiver em uma faixa inadequada.
str 0 arg: retorna string vazia.
str n arg: retorna concatenação de n argumentos como uma string.
len i : retorna o comprimento do vetor, string ou item interno.
sect v : Retorna v com primeiro item (se vetor) ou caractere (se string) omitido;
sect v skip : Retorna v com itens/caracteres de Primeiro skip omitidos;
sect v skip take : Returns v take o comprimento e os itens/caracteres do primeiro skip omitidos;
..sect : O mesmo que sect , mas retorna itens/caracteres estourou.
blob ls : Retorna uma bolha de comprimento l com todos os bytes definidos como s .
get oltb : retorna o item do tipo t e o comprimento l do deslocamento o bytes do item b .
get ob : retorna o valor U08 do byte no deslocamento o item b .
set oib : retorna o blob b com o deslocamento o bytes definido para os bytes do item i .
Nota: Ambos get e set Return nil se solicitado Offset + Len excederia o tamanho da blob.
Nota: Ambos aceitam uma referência como b (por exemplo *binding ) e, em vez disso, inspecionarão/modificarão os bytes do item de referência original, set retornando a referência ou NIL.
.. v : explode um vetor ou string v na pilha de argumentos como itens vetoriais ou itens de caracteres.
NOTA: Como no clojure inverso, apply por exemplo (+ (.. [1 2 3]) (.. [4 5 6])) => 21 .
Nota: Se seu argumento não for um vetor, não deixa itens na pilha.
binds : desduplica quaisquer ligações em seus argumentos, favorecendo as mais recentes e depois vetorizando os restos mortais.
Exemplo: (binds a= 1 b= 2 a= 3) => [b= 2 a= 3]
Relacionado ao GPIO
Nota: estes não têm efeito no PC.
p-mode pin mode : define o modo de número de número de pin no mode booleano - verdade como entrada, falsey como saída; Retorna nil.
dig-r pin : retorna o estado de entrada digital do pin .
dig-w [1-N pin val] : por pin val , em sucessão, define o estado de saída digital do pin do número de pinos para o booleano val -verdadeiro ou diferente de zero, zero ou baixo; Retorna nil.
ana-r pin : Retorna o estado de entrada analógico do pin do número de pinos.
ana-w [1-N pin val] : por pin val , em sucessão, define o estado de saída analógico/PWM do pin do número do pino para o número val de 16 bits; Retorna nil.
ana-r pin : Retorna entrada analógica de 16 bits de número inteiro do pino do número do pin .
Relacionado a IO do arquivo
Nota: Nos arquivos Arduino, deve ter extensões de não mais de três caracteres.
file-r path : Retorna BLOB de conteúdo de arquivo inteiro.
file-r path T : Retorna o tamanho do arquivo.
file-r path offset : Retorna BLOB do conteúdo do arquivo entre bytes de deslocamento e EOF.
file-r path offset count : Retorna o BLOB do conteúdo do arquivo entre o deslocamento e o Up to Count Bytes.
Todos retornam nulo após o fracasso.
file-a path content : anexa um blob ou item como string a arquivo.
file-w path content[ offset] : grava um blob ou item como string em um arquivo, opcionalmente com um deslocamento de byte (caso contrário, 0); Retorna o sucesso como booleano.
Ambos retornam o sucesso como booleano.
NOTA: As strings são escritas sem terminador nulo.
file-d path : Exclui o arquivo no path ; Retorna o sucesso como booleano.
Tipos e elenco
type i : retorna o código do tipo de item i .
type ab : Retorna o código do tipo de itens a & b se forem iguais, caso contrário, nil .
cast it : retorna o item que i fundi como código do tipo t .
NOTA: Mais largo para o mais fino será truncado, mais fino a mais amplo será zerado;
String to Blob não terá terminação nula; Os elencos em cordas serão anexados com rescisão nula.
Iteração
reduce f[ s*N] i : Retorna a redução do vetor ou a corda i a f , com sementes de 0-N. f é (item acc) => acc .
map fv*N : Retorna o mapeamento de vetores 1-N através de f , onde f é (item*N) => mapped .
Exemplo: (map str [a b c] [1 2 3]) => [a1 b2 c3]
for fv*N : retorna o mapeamento iterativo de vetores 1-n através de f , onde f é (item*N) => mapped .
Exemplo: (for str [a b c] [1 2 3]) => [a1 a2 a3 b1 b2 b3 c1 c2 c3]
loop nf : repete n número de 16 bits de vezes a função f , onde f é (0…n) => any ; Retorna o último retorno de f .
loop seed nf : O mesmo que acima, mas f é (acc 0…n) => any lugar onde acc é primeiro seed e o retorno da iteração anterior.
loop seed abf : O mesmo que acima, exceto n varia de a a b
Exemplo: (loop 2 {print "hello" #}) imprime" hello0 "e" hello1 ", retorna nil.
Exemplo: (loop 0 5 +) => 10 .
Exemplo: (loop 0 5 10 +) => 35
Mensagem relacionada
Os tópicos são strings delimitados para a frente ( / ). Tópicos da ONU /assinatura usam os curingas /+/ para qualquer e /# para qualquer futuro .
Exemplo: a house/kitchen/fridge combina com a house/+/fridge ou house/# ou +/kitchen/+ ou # , mas não garage/# ou house/bedroom/fridge ou house/+/sink .
pub topic[ payload] : Envie uma mensagem durante toda a VM com o topic da string e opcionalmente uma payload útil (caso contrário NIL) de qualquer tipo;
Retorna nil, ou se a mensagem fez com que outro programa publique uma mensagem à qual o programa de publicação original foi assinado,
Retorna o estado retornado pelo manipulador de assinatura do programa de publicação original.
NOTA: A publicação é imediata e síncrona - seu programa terá que esperar à medida que os assinantes processam a mensagem.
sub topic f[ provide-topic] : Inscreva-se a função f em um topic de mensagem,
onde se provide-topic é verdade f é (state topic payload) => new-state ,
else (padrão) f é (state payload) => new-state ; Retorna nil.
Nota: Somente as funções do programa são aceitas como f - para usar uma operação nativa, use uma função embutida.
unsub topic : remova a assinatura anterior do topic ; Retorna nil.
unsub : soltar todas as assinaturas do programa; Retorna nil.
Sistema e programa relacionados
ms-now : retorna milissegundos desde a inicialização do CHVM.
sleep ms : adioa o próximo batimento cardíaco do programa para ms Milissegunds; Retorna nil.
print 0-n arg: impressões resultado de str de n args; Retorna nil.
load path : carrega o programa Chika compilado no path (sem extensão de arquivo); Retorna o BOOL de sucesso de carregar o programa.
comp path-in[ path-out] : compila um arquivo de origem (idiomaticamente *.chi ) no path-in como um binário chika, salvo no mesmo caminho com a extensão alterada para .kua ou no path-out (idiomaticamente *.kua ).
halt : termina imediatamente o programa Chika.
Um binário chika compilado é composto apenas por funções . As funções contêm formulários . Os formulários contêm args (que também podem ser formulários) e terminar com uma operação . Os formatos de bytes hexadecimais são:
função
NNNNLLLL…
NNNN , uint16_t ID ID da função; LLLL , uint16_t Comprimento do corpo da função; … ,, Corpo de função de comprimento LLLL .
forma
00…args…OO
00 , marcador de formulário; [args] , 0-n args; OO uma operação.
Arg
ou 00… , um formulário
AA , UINT8_T Código arg; … O corpo de argumento de tamanho variável.
operação
OO
OO , UINT8_T-Código OP.
00 Formulário FRM
PENDÊNCIA
PENDÊNCIA