
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卡。其他程序应加载在init.kua文件中,并使用load操作加载。
合适的设备:
当前有一些在Linux上编译和执行Chika的选项。
在终端中,您可以运行./compile.sh ,以重新编译Chika VM的机器,该机器还使用本机编译器来重新编译corpus/programs/init.chi 。
要运行chika .chi源文件或.kua编译的文件,您可以使用其路径可执行chika可执行文件,例如: ./chika ../corpus/programs/fibonacci.chi 。这将以可执行文件的工作目录中的fibonacci.chi汇编为fibonacci.kua 。
源文件可以用shebang到chika可执行文件中以直接执行.chi文件。
在PC上:调用chika可执行文件,例如./chika c source.chi 。没有c标志来调用以编译,然后执行结果文件。
在PC/Arduino上:使用Chika中的comp OP来编译.chi源文件。
注意:由于内存非常有限,它可能会在Arduino上进行一段时间,其中一次是将一个字节写入文件。
注意:汇编发出了许多临时文件,该文件应在成功编译后删除。
加载到VM中的每个程序都有一生:
所有这些都是可选的,但至少必须在程序中指定心跳或输入。
输入是在程序启动时,在任何心跳或消息之前执行的代码,并且不包含任何功能。它甚至可以在源文件中声明之前调用功能。最后一个条目返回的项目播种程序状态。使用后将输入代码卸载,因此可能不会称为。
需要心跳来停止进入进入后立即终止程序,包括一个称为heartbeat的功能。这是每个程序心跳功能,圆形旋转样式的平面执行。 heartbeat函数通过程序的持续状态作为参数传递,并且返回持续为新状态。
邮件在整个VM中广播,并执行任何回调功能,还通过了程序的状态并返回了新状态。
标签和功能名称可以包括(几乎)(几乎)任何不包括空格的字符。
功能名称不得以数字开头。
#num :仅文件的第一行(如果存在Shebang)。通知程序将使用该程序使用多少个字节( num 64KIB)。否则使用默认最大值。
(func[ N args]) :一种形式,具有头部位置的功能,而0-n参数则由空格隔开。参数可以是表格。
注意: func可以是本机操作,程序功能,内联功能,绑定,扩展绑定,参数或扩展参数。
(fn func-name[ N params] [1-N forms]) :一个函数定义,其0-N参数符号由空格分开,1-n表单。
注意:呼叫没有表格的函数返回零。
{form} :一个内联函数,由一种形式组成。
注意:周围功能的参数不能在内联函数中引用。而是考虑使用绑定。
注意:禁止嵌套的内联函数。
# :参数引用,函数的第一个参数。
$ :扩展参数引用,函数的第一个参数。
#N和$N :参数引用,到nth参数,例如函数或函数呼叫者函数的第四个参数,例如#3或$3 。
注意:没有呼叫功能时使用$是未定义的行为。
注意: $参考可以通过尾部呼叫优化删除。
//… :评论,可以在新线路或一条结尾处进行调整。
/*…*/ :多行论。注意: */将立即终止评论的实例,并且不能包含在多行论本身中
; :被视为白道的半分离龙。
, :删除后的逗号,被视为空格和白道之后。
…= :绑定,在其中…是标签。
… :绑定参考或参数参考,取决于上下文,其标签是… 。
.… …它引用了堆栈上绑定的上一个实例。
注意:参数比每个功能的绑定优先。
注意:重新定义绑定时,必须使用扩展的绑定,因此VM跳过了上一个实例。考虑: 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:
返回总和 /减法 /乘法 /划分 /模量 /筹集 /筹集 /供电 /
和 / OR / XOR /左移 /左移 / n整数的右移。
零args返回零。将所有参数作为第一个参数的类型投放。
~ n :返回n而非n 。
示例: (+ 1 1) => 2 , (+ 155 200) => 100 , (+ 155w 200) => 355w
rand :返回伪随机布尔。
rand b :将一个伪随机整数从0返回到b独家。
rand ab :从a在内的b reko返回一个伪随机整数。
注意:负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 ,然后与每对参数的第一个进行比较,如果第一个匹配项,则返回第二个;如果没有匹配default或返回零。
! i :从逻辑上否定项目i 。
or n arg:首先返回真相。
&& n arg:如果所有人都是真实的,则返回真实。
= n arg:平等,如果所有args均具有相同的类型,长度和字节相等。按值比较int。
!= n arg:负相等。
== n arg:权益,如果n个项目是字节相等性的,则返回true。
!== n arg:负权益。
< / <= / > / >= n arg:如果n个项目单调增加 /非偏移 /减少 /非侵扰顺序,则返回true。
功能相关
return[ val] :尽早退出功能,评估为nil或val 。
recur n arg:在堆栈上,用N参数替换参数并回忆起该功能。
val 1-N Arg:返回其第一个论点。
do 1-n arg:返回其最终论点。
字符串,向量和斑点相关
vec 0 arg:返回空矢量。
vec n arg:返回其论点的向量。
nth N i :返回向量或字符串i索引N的项目或字符,如果N在不当范围内,则nil。
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的项目b的偏移o字节b。
get ob :返回项目b的偏移o字节的U08值。
set oib :返回blob b其偏移o字节设置为项目i的字节。
注意:如果要求, get和set返回零,如果偏移 + len将超过斑点的大小。
注意:两者都接受参考为b (例如*binding ),并且将检查/修改原始参考项目的字节, set返回参考或零。
.. v :将向量或字符串v爆破到参数堆栈中,作为向量项或字符项。
注意:就像在倒置的clojure中一样apply ,例如(+ (.. [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号pin的模式设置为布尔mode - 真相为输入,伪造为输出;返回零。
dig-r pin :返回数字输入状态pin 。
dig-w [1-N pin val] :每个pin val ,连续将数字输出状态设置为布尔val的数字pin状态 - 真实或非零为高,零或低;返回零。
ana-r pin :返回PIN号pin的模拟输入状态。
ana-w [1-N pin val] :每个pin val ,连续将模拟/PWM输出状态pin销的状态设置为16位整数val ;返回零。
ana-r pin :返回PIN数pin的模拟16位整数输入。
文件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] :将blob或item作为字符串写入文件,可选地使用字节偏移(否则为0);作为布尔人的成功返回。
两者都以布尔人的身份返回成功。
注意:字符串是没有零终止器的。
file-d path :删除path上的文件;作为布尔人的成功返回。
类型和铸造
type i :返回项目i的类型代码。
type ab :返回类型a & b的类型代码(如果它们相等),否则nil 。
cast it :返回i作为类型代码t项目。
注意:将截断到更薄,更薄到更宽的将被归零;
字符串到斑点将缺乏零终止;铸件的铸件将附加为无效终止。
迭代
reduce f[ s*N] i :用0-n f返回矢量或字符串i的返回。 f是(item acc) => acc 。
map fv*N :返回1-N向量的映射通过f ,其中f为(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是(acc 0…n) => any首先是acc是seed任何位置,然后再返回上一个迭代。
loop seed abf :与上述相同,除n范围从a到b 。
示例:( (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] :在整个VM中发送带有字符串topic消息,并选择任何类型的有效负载有效payload (否则nil);
返回nil,或者该消息导致另一个程序发布消息,原始发布程序已订阅,
返回原始出版计划的订阅处理程序返回的状态。
注意:发布是直接且同步的 - 您的程序必须在订阅者处理消息时等待。
sub topic f[ provide-topic] :订阅函数f到消息topic ,
如果provide-topic是真实的f是(state topic payload) => new-state ,
else(默认) f为(state payload) => new-state ;返回零。
注意:只有程序函数被接受为f使用本机操作使用内联函数。
unsub topic :删除topic的先前订阅;返回零。
unsub :放弃所有程序订阅;返回零。
系统与程序相关
ms-now :自CHVM初始化以来,返回毫秒。
sleep ms :推迟该程序对MILISECONDS ms的下一个心跳;返回零。
print 0-n arg:n args的str的打印结果;返回零。
load path :在path上加载编译的chika程序(无文件扩展名);返回加载程序的成功的布尔。
comp path-in[ path-out] :在路径上以chika二进制的path-in编译源文件(愚蠢地*.chi ),要么在相同的路径上保存,扩展名更改为.kua或在path-out (惯用地*.kua )。
halt :立即终止Chika计划。
编译的chika二进制文件仅由功能组成。功能包含表格。表格包含args (也可以是表格),并以操作结尾。十六进制字节格式是:
功能NNNNLLLL…
NNNN ,uint16_t增量功能ID; LLLL ,uint16_t功能身体长度; … , LLLL长度函数主体。
形式00…args…OO
00 ,表格标记; [args] ,0-n args; OO操作。
arg
或00… ,一种表格AA ,uint8_t arg-code; …可变大小的定制论点主体。
手术OO
OO ,uint8_t op代码。
00 frm表格
托多
托多