
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表格
托多
托多