
Chika 는 Arduino를 펌웨어 또는 Linux로 실행 파일로 타겟팅하는 프로그래밍 언어입니다. SD 카드 또는 Linux 파일 시스템의 고급 라운드 로빈 멀티 태스킹,로드 프로그램을 용이하게합니다.
그것의 목표는 독특한 스택 메모리 모델, LISP에서 영감을 얻은 구문 및 MQTT 스타일의 내부 메시징을 통해 속도와 메모리 발자국에 민첩성을 향해 기울어 진 것입니다.
그 정신은 : 작업 간 커뮤니케이션을 통해 모든 것을 분리합니다.
이론적 근거, 다른 프로젝트, 사진 등을 포함한 자세한 내용은 웹 사이트를 방문하십시오 .
불화를 방문하여 채팅을하십시오.
더 많은 현실적인 예는 Core.chi 및 나머지 코퍼스를 참조하십시오.
참고 : ;//… Clojure 구문을 사용하는 데 사용됩니다. Chika의 의견은 단지 //… 입니다.
; //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 }) Arduino Ide에서 Chika_Arduino.ino 열고 Arduino에 업로드하십시오.
init.kua 파일에 SD 카드가 삽입되어 있는지 확인하십시오. 추가 프로그램은 load 작동과 함께 init.kua 파일 내에로드해야합니다.
적절한 장치 :
현재 Linux에서 Chika를 컴파일하고 실행하기위한 몇 가지 옵션이 있습니다.
터미널에서는 ./compile.sh 실행하여 기계를 위해 Chika VM을 다시 컴파일 할 수 있으며, 기본 컴파일러를 사용하여 corpus/programs/init.chi 를 다시 컴파일합니다.
Chika .chi 소스 파일 또는 .kua 컴파일 파일을 실행하려면 ./chika ../corpus/programs/fibonacci.chi 과 같은 경로로 chika 실행 파일을 호출 할 수 있습니다. 이렇게하면 실행 파일의 작업 디렉토리에서 fibonacci.chi fibonacci.kua 로 컴파일됩니다.
소스 파일은 chika 실행 파일로 Shebang을 사용하여 .chi 파일을 직접 실행할 수 있습니다.
PC : ./chika c source.chi 와 같은 chika 실행 파일을 호출하십시오. c 플래그없이 호출하여 컴파일 한 다음 결과 파일을 실행하십시오.
PC/Arduino에서 : Chika 내의 comp op를 사용하여 .chi 소스 파일을 컴파일합니다.
참고 : Arduino에서는 매우 제한된 메모리로 컴파일하므로 한 번에 하나의 바이트를 한 번에 파일에 작성하므로 시간이 걸릴 수 있습니다.
참고 : 컴파일은 많은 임시 파일을 제출하여 성공적인 컴파일 후에 삭제해야합니다.
VM에로드 된 각 프로그램에는 수명이 있습니다.
이들 모두 선택 사항이지만 최소한 하트 비트 또는 항목은 프로그램에 지정되어야합니다.
항목은 프로그램 시작시 하트 비트 나 메시지 전에 실행 된 코드이며 기능 내에 포함되어 있지 않습니다. 소스 파일의 선언 전에도 함수를 호출 할 수 있습니다. 마지막 항목은 반환 된 항목이 프로그램 상태를 시드합니다. 입력 코드는 사용 후에 언로드되므로 이후에 호출되지 않을 수 있습니다.
하트 비트는 heartbeat 라는 기능을 포함하여 진입 후 즉시 종료 된 프로그램을 중지해야합니다. 이것은 프로그램 당 평평하게 실행됩니다. 하트 비트 기능, 라운드 로빈 스타일. heartbeat 함수는 프로그램의 지속 상태가 매개 변수로 전달되며, 반환은 새로운 상태로 유지됩니다.
메시지는 VM 전반에 걸쳐 방송되고 모든 콜백 기능을 실행하고 프로그램의 상태를 통과하고 새로운 상태를 반환합니다.
레이블 및 기능 이름에는 공백을 제외한 모든 문자가 포함될 수 있습니다.
함수 이름은 숫자로 시작해서는 안됩니다.
#num : 파일의 첫 번째 줄 만 (또는 Shebang이있는 경우 두 번째). 이 프로그램에서 VM에 얼마나 많은 RAM ( num 을 64KIB)을 사용할 수 있는지 VM에 알려줍니다. 그렇지 않으면 기본 최대 값이 사용됩니다.
(func[ N args]) : 헤드 위치에 함수가있는 양식 및 0-N 인수는 공백으로 분리됩니다. 인수는 형태 일 수 있습니다.
참고 : func 기본 작동, 프로그램 기능, 인라인 기능, 바인딩, 확장 바인딩, 매개 변수 또는 확장 된 매개 변수 일 수 있습니다.
(fn func-name[ N params] [1-N forms]) : 0-n 매개 변수 기호가 공백으로 분리 된 함수 정의 및 1-n 형식.
참고 : 양식이없는 함수를 호출하면 NIL이 반환됩니다.
{form} : 하나의 형태로 구성된 인라인 기능.
참고 : 주변 함수의 매개 변수는 인라인 기능 내에서 참조 할 수 없습니다. 대신 바인딩을 고려하십시오.
참고 : 중첩 된 인라인 성분은 금지되어 있습니다.
# : 함수의 첫 번째 매개 변수에 대한 매개 변수 참조.
$ : 함수의 발신자 함수의 첫 번째 매개 변수에 대한 확장 된 매개 변수 참조.
#N 및 $N : nth 매개 변수에 대한 매개 변수 참조, 예를 들어 함수 또는 함수의 발신자 함수의 네 번째 매개 변수에 대해 #3 또는 $3 .
참고 : 호출 기능이 없을 때 $ 사용하는 것은 정의되지 않은 동작입니다.
참고 : 값 $ 참조는 테일 콜 최적화로 지워질 수 있습니다.
//…
/*…*/ : 다중 댓글. 참고 : */ 의 인스턴스는 즉시 주석을 종료하며 다중 댓글 자체 내에 포함될 수 없습니다.
; : 세미콜론, 공백으로 취급.
,
…= : 바인딩, 여기서 … 레이블입니다.
… : 컨텍스트에 따라 바인딩 참조 또는 매개 변수 참조. 여기서 …
.… : 확장 된 바인딩 참조, 여기서 … 스택의 바인딩의 이전 인스턴스를 참조합니다.
참고 : 매개 변수는 함수 당 바인딩보다 우선합니다.
참고 : 바인딩을 재정의 할 때 확장 된 바인딩을 사용해야하므로 VM은 이전 인스턴스를 건너 뜁니다. 고려 : a= (+ 1 .a) , a 그 순간에 스택의 다음 항목을 참조하지 않도록 - 1 .
if , && or case 바인딩 또는 매개 변수로 표시 될 수 없습니다.
함수는 양식 만 포함되어야합니다. 반품은 val 사용하십시오.
참고 : 정수는 10 진수 또는 대기업 16 진수 형식입니다.
"…" "" 문자열, 여기서 …" 및 str 사용하십시오.0 또는 0x00 : 8 비트 서명되지 않은 정수.0w 또는 0x0000 : 16 비트 서명되지 않은 정수.0i 또는 0x00000000 : 32 비트 서명 정수.c : ASCII 문자. 확장 : nl Newline, sp 공간.[…] : 벡터, 여기서 … 공간으로 구분 된 0 ~ 2^16 항목은 비어 있거나 [] 있습니다. 구문 설탕 (vec …) args : 기능 인수의 벡터를 방출합니다.T : 문자적인 부울 참F : 문자적인 부울 거짓N : 문자 그대로 nil 참고 : [square brackets] 선택적 인수를 나타냅니다.
매우 정확한
+ / - / * / / / % / ** /
& / | / ^ / << / >> n Arg :
합계 / 뺄셈 / 곱셈 / 디비전 / 모듈러스 / 상승 간 전원을 반환합니다.
및 / XOR / 왼쪽 시프트 / 오른쪽 시프트 N 정수.
제로 args는 nil을 반환합니다. 모든 매개 변수를 첫 번째 인수의 유형으로 시전합니다.
~ n : n 이 아닌 비트를 반환합니다.
예 : (+ 1 1) => 2 , (+ 155 200) => 100 , (+ 155w 200) => 355w
rand : 의사 랜덤 부울을 반환합니다.
rand b : 의사 랜덤 정수를 0에서 b 독점으로 반환합니다.
rand ab : Pseudo-Random Integer를 a 인 b 독점으로 반환합니다.
참고 : 부정적인 a 또는 b 로 인해 1으로 이해됩니다.
가정 어구
if cond if-true : cond 진실한 경우 if-true 평가하고 반환합니다.
if cond if-true if-false if-false cond 가 진실한 경우 if-true 평가하고 반환합니다.
CASE MATCH… match case match … N pairs … [default] 일치하지 않으면 default 일치하지 않거나 NIL이 반환됩니다.
! i : 논리적으로 항목을 무효화합니다. i .
or n Arg : 첫 번째 진실한 arg를 반환합니다.
&& n Arg : 모든 args truthy가 있으면 true를 반환합니다.
= n Arg : 평등, 모든 args가 동일한 유형, 길이 및 바이트 평등 인 경우 사실. ints를 값으로 비교합니다.
!= n Arg : 부정적인 평등.
== n Arg : quarity, n 항목이 바이트 평등 인 경우 true를 반환합니다.
!== n Arg : 부정적인 지분.
< / <= / > / >= n Arg : N 항목이 단조로 증가 / 비정치 / 감소 / 비 침수 순서에있는 경우 TRUE를 반환합니다.
기능 관련
return[ val] : NIL 또는 val 을 평가하여 기능을 일찍 종료하십시오.
recur arg : 스택에서 매개 변수를 N 인수로 바꾸고 함수를 회상하십시오.
val 1-N Arg : 첫 번째 인수를 반환합니다.
1-N Arg : 최종 인수를 반환 do .
문자열, 벡터 및 블로브 관련
vec 0 ARG : 빈 벡터를 반환합니다.
vec n arg : 인수의 벡터를 반환합니다.
nth N i : N 부적절한 범위에있는 경우 벡터 또는 문자열 i 의 색인 N 에서 항목 또는 문자를 반환합니다.
str 0 ARG : 빈 문자열을 반환합니다.
str n arg : n 인수를 문자열로 반환합니다.
len i : 벡터, 문자열 또는 내부 항목 길이를 반환합니다.
sect v : 첫 번째 항목 (벡터 인 경우) 또는 문자 (문자열이면)가 생략 된 v 반환합니다.
sect v skip : 첫 번째 skip 항목/문자가 생략 된 v 반환합니다.
sect v skip take : take 길이와 첫 번째 skip 항목/문자가 생략 된 v 반환합니다.
..sect sect
blob ls : 모든 바이트가 s 로 설정된 길이 l 의 덩어리를 반환합니다.
get oltb : 항목 b 의 오프셋 o 바이트에서 t 형 및 길이 l 의 항목을 반환합니다.
get ob : 항목 b 의 오프셋 o 바이트에서 바이트의 u08 값을 반환합니다.
set oib : 오프셋 o 바이트가 항목 i 의 바이트에 설정된 Blob b 반환합니다.
참고 : 요청 된 오프셋 + Len이 Blob의 크기를 초과하면 get and set return nil을 모두 설정합니다.
참고 : 참조를 b (예 : *binding )로 받아들이고 대신 원래 참조 항목의 바이트를 검사/수정 set 참조 또는 NIL을 반환합니다.
.. 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 관련
참고 : PC에는 영향을 미치지 않습니다.
p-mode pin mode : 핀 번호 pin 모드를 부울 mode 로 설정합니다. -truthy는 입력으로, 출력으로 falsey; NIL을 반환합니다.
dig-r pin : PIN 번호 pin 의 디지털 입력 상태를 반환합니다.
dig-w [1-N pin val] : pin val 에 따라 연속적으로 PIN 번호 pin 의 디지털 출력 상태를 부울 발로 설정합니다 val NIL을 반환합니다.
ana-r pin : 핀 번호 pin 의 아날로그 입력 상태를 반환합니다.
ana-w [1-N pin val] : pin val 에 따라 연속적으로 핀 번호 pin 의 아날로그/PWM 출력 상태를 16 비트 정수 val 로 설정합니다. NIL을 반환합니다.
ana-r pin : 핀 번호 pin 의 아날로그 16 비트 정수 입력을 반환합니다.
파일 IO 관련
참고 : Arduino의 파일에는 3 자 이하의 범위가 있어야합니다.
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에 대한 문자열에는 null 종료가 부족합니다. 문자열에 대한 캐스트는 Null 종료로 추가됩니다.
반복
reduce f[ s*N] i : 0-n 씨앗으로 f 를 통해 벡터 또는 스트링 i 의 감소를 반환합니다. f 는 (item acc) => acc 입니다.
map fv*N : f 통해 1-n 벡터의 매핑을 반환합니다. 여기서 f 는 (item*N) => mapped .
예 : (map str [a b c] [1 2 3]) => [a1 b2 c3]
for fv*N : f 통해 1-n 벡터의 반복 매핑을 반환합니다. 여기서 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 acc 먼저 seed 인 경우 이전 반복의 반환입니다.
loop seed abf : a 에서 b 까지의 n 범위를 제외하고는 위와 동일합니다.
예 : (loop 2 {print "hello" #}) "Hello0"및 "Hello1"을 인쇄하고 NIL을 반환합니다.
예 : (loop 0 5 +) => 10 .
예 : (loop 0 5 10 +) => 35
메시지 관련
주제는 전진 슬래시 ( / ) 구분 된 문자열입니다. UN /구독 주제는 이후 에 와일드 카드 /+/ 및 /# 을 사용합니다.
예 : 주제 house/kitchen/fridge 소시 house/+/fridge 또는 house/# 또는 +/kitchen/+ 또는 # 과 일치하지만 garage/# 또는 house/bedroom/fridge 또는 house/+/sink 아닙니다.
pub topic[ payload] : String Topic topic 와 함께 VM 전체에 메시지를 보내고 선택적으로 모든 유형의 페이로드 payload (그렇지 않으면);
NIL을 반환하거나 메시지로 인해 다른 프로그램이 메시지를 게시하게 한 경우 원래 출판 프로그램이 구독 한 메시지를 게시합니다.
원래 출판 프로그램의 가입 핸들러가 반환 한 주를 반환합니다.
참고 : 게시자는 즉각적이고 동기식입니다. 가입자가 메시지를 처리 할 때 프로그램이 기다려야합니다.
sub topic f[ provide-topic] : 기능 f 메시지 주제에 구독하고, 주제 topic 에 가입하고,
provide-topic Truthy f 인 경우 (state topic payload) => new-state ,
else (기본값) f 는 (state payload) => new-state ; NIL을 반환합니다.
참고 : 기본 작업을 사용하려면 인라인 함수를 사용하기 위해 프로그램 기능 만 f 로 허용됩니다.
unsub topic : topic 의 이전 구독을 제거하십시오. NIL을 반환합니다.
unsub : 모든 프로그램 구독을 삭제하십시오. NIL을 반환합니다.
시스템 및 프로그램 관련
ms-now : CHVM 초기화 이후 밀리 초를 반환합니다.
sleep ms : ms MILISECONDS에 대한 프로그램의 다음 심장 박동을 연기; NIL을 반환합니다.
print 0-N Arg : N args의 str 의 인쇄 결과; NIL을 반환합니다.
load path : path 에서 컴파일 된 Chika 프로그램을로드합니다 (파일 확장없이). 프로그램을로드하는 성공의 Bool을 반환합니다.
comp path-in[ path-out] : chika binary로 path-in 에서 소스 파일 (관용적으로 *.chi )을 컴파일합니다. 확장자가 .kua 로 변경되거나 path-out (Idiomically *.kua )으로 동일한 경로에서 저장됩니다.
halt : 즉시 Chika 프로그램을 종료합니다.
컴파일 된 치카 바이너리는 함수 로만 구성됩니다. 함수에는 양식이 포함됩니다. 양식에는 Args (형태 일 수도 있음)가 포함되어 있으며 작업 으로 끝납니다. 16 진 바이트 형식은 다음과 같습니다.
기능
NNNNLLLL…
NNNN , UINT16_T 기능 ID 증가; LLLL , UINT16_T 기능 신체 길이; … , LLLL 길이의 기능 본체.
형태
00…args…OO
00 , 형태 마커; [args] , 0-n Args; OO 작업.
arg
또는 00… , 양식
AA , UINT8_T ARG 코드; … 가변 크기의 맞춤형 인수 본문.
작업
OO
OO , uint8_t op-code.
00 FRM 형태
TODO
TODO