
Chikaは、ArduinoをファームウェアまたはLinuxの両方を実行可能ファイルとして標的とするプログラミング言語です。 SDカードまたはLinuxファイルシステムのいずれかからの高レベルのラウンドロビンマルチタスク、ロードプログラムを容易にします。
その目標は、一意のスタックメモリモデル、LISPにインスパイアされた構文、およびMQTTスタイルの内部メッセージングを使用して、速度とメモリの両方のフットプリントに敏ility性に傾くことです。
その精神は次のとおりです。タスク間通信を通じてすべてを切り離します。
理論的根拠、他のプロジェクトとの比較、写真などを含む詳細については、ウェブサイトにアクセスしてください。
不一致にアクセスしてチャットしてください。
現実的な例については、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.kuaとしてfibonacci.chiがコンパイルされます。
ソースファイルは、Chika実行可能ファイルにシバンを使用して、 .chiファイルを直接実行することができます。
PCで: ./chika c source.chiなどのchika実行可能ファイルを呼び出します。 cフラグなしで呼び出してコンパイルし、結果のファイルを実行します。
PC/Arduinoで:Chika内のcomp OPを使用して、 .chiソースファイルをコンパイルします。
注:Arduinoは、非常に限られたメモリでコンパイルされているため、ほとんどのバイトを1バイトに1つのファイルに書き込みます。
注:コンピレーションは、コンピレーションが成功した後に削除する必要がある多くの一時的なファイルを放出します。
VMにロードされた各プログラムには、次の寿命があります。
これらはすべてオプションですが、少なくともハートビートまたはエントリをプログラムで指定する必要があります。
エントリは、ハートビートやメッセージの前にプログラムの開始時に実行されたコードであり、関数内に含まれていません。ソースファイルでの宣言の前であっても、関数を呼び出すことができます。最後のエントリは、プログラムの状態にシードされたアイテムを返しました。エントリコードは使用後にアンロードされるため、その後は呼ばれない場合があります。
Heartbeatsは、 heartbeatという関数を含めることにより、入力後すぐに終了するプログラムを停止する必要があります。これは、プログラムあたりのフラットアウト、ハートビート機能、ラウンドロビンスタイルです。 heartbeat関数は、プログラムの永続的な状態をパラメーターとして渡され、リターンは新しい状態として持続します。
メッセージはVM全体でブロードキャストされ、コールバック関数を実行し、プログラムの状態も通過し、新しい状態を返しました。
ラベルと関数名には、(ほぼ)Whitespaceを除くすべての文字を含めることができます。
関数名は数字で起動してはなりません。
#num :ファイルの最初の行のみ(または、シェバンが存在する場合は2番目)。 VMに、プログラムで使用されるRAM(最大64KIBまでのnum )の数を通知します。それ以外の場合は、デフォルトの最大値が使用されます。
(func[ N args]) :ヘッド位置に関数を持つ形式、スペースで区切られた0-n引数。引数は形式である可能性があります。
注: func 、ネイティブ操作、プログラム機能、インライン機能、バインディング、拡張バインディング、パラメーター、または拡張パラメーターになります。
(fn func-name[ N params] [1-N forms]) :関数定義、スペースで分離された0-nパラメーターシンボル、および1-nフォーム。
注:フォームなしで関数を呼び出すと、nilが返されます。
{form} :1つのフォームとして構成されるインライン機能。
注:周囲の関数のパラメーターは、インライン対応内で参照することはできません。代わりにバインディングを使用することを検討してください。
注:ネストされたインライン関数は禁止されています。
# :関数の最初のパラメーターへのパラメーター参照。
$ :関数の発信者関数の最初のパラメーターへの拡張パラメーター参照。
#Nおよび$N :n番目のパラメーターへのパラメーター参照、例:関数または関数の発信者関数の4番目のパラメーターの#3または$3 。
注:呼び出し関数がなかったときに$使用することは未定義の動作です。
注:値$参照は、テールコール最適化によって消去できます。
//… :コメント。これは、新しい行または1つの終わりに適しています。
/*…*/ :マルチラインコメント。注: */のインスタンスはすぐにコメントを終了し、マルチラインコメント自体に含めることはできません
; :セミコロン、白人として扱われます。
, :コンマは、空白が消去された後に白人として扱われます。
…= :バインディング、それは…ラベルです。
… :コンテキストに応じてバインディング参照またはパラメーターの参照は、そのラベルです…
.… :拡張されたバインディングリファレンス、つまりその…です。スタックのバインディングの前のインスタンスを参照します。
注:パラメーターは、関数ごとのバインディングよりも先例を取ります。
注:バインディングを再定義するときは、拡張バインディングを使用する必要があるため、VMは前のインスタンスをスキップします。考えてみてください: a= (+ 1 .a) 。A aその瞬間にスタックの次の項目を参照しないように1 。
関数if 、 && 、 or caseバインディングまたはパラメーターで表すことはできません。
関数にはフォームのみが含まれている必要があるため、return valを返すことを保証します。
注:整数は、10進数形式または大型の六分位形式のいずれかです。
"…" :文字列、それは… 0から128のASCII文字、または""です。"とstr使用します。0または0x00 :8ビット符号なし整数。0wまたは0x0000 :16ビット符号なし整数。0iまたは0x00000000 :32ビット署名整数。c :ASCII文字。拡張: nl newline、 spスペース。[…] :ベクトル、 …スペースで区切られた0〜2^16アイテム、または空の場合[] 。 (vec …)の構文砂糖args :関数引数のベクトルを放出します。T :リテラルブールトゥルーF :文字通りのブールFALSEN :文字通りのnil 注: [square brackets]オプションの引数を示しています。
数学
+ / - / * / / / % / ** /
& / | / ^ / << / >> n arg:
sum / suptraction /乗算 /除算 /弾性率 /昇給 /
および /または / xor /左シフト / n整数の右シフト。
Zero argsはnilを返します。最初の引数のタイプとしてすべてのパラメーターをキャストします。
~ n : nのビットワイズを返します。
例: (+ 1 1) => 2 、 (+ 155 200) => 100 、 (+ 155w 200) => 355w
rand :擬似ランダムブールを返します。
rand b :擬似ランダム整数を0からb排他的に返します。
rand ab : a的からb排他的に擬似ランダム整数を返します。
注:ネガティブaまたはbにより、それらは1として理解されます。
条件付き
if cond if-true : cond真実である場合、 if-trueを評価して返します。
if cond if-true if-false : cond真実である場合、 if-false if-trueを評価して返します。
case match … N pairs … [default] : matchを評価してから、各引数のペアの1番目と比較し、1回目の一致の場合は2番目のペアを返します。マッチがdefaultなっていない場合、またはNILが返されます。
! i :論理的に項目iを無効にします。
or n arg:最初のtruthy argを返します。
&& n arg:すべてのargが真実である場合、trueを返します。
= n arg:平等、すべてのargが同じタイプ、長さ、およびバイトの平等である場合は真です。 INTを値ごとに比較します。
!= n arg:負の平等。
== n arg:equityは、nアイテムがバイトの平等である場合にtrueを返します。
!== n arg:ネガティブエクイティ。
< / <= / > / >= n arg:nアイテムが単調に増加している /非減少 /減少 /非増加順にある場合、trueを返します。
関数関連
return[ val] :nilまたはvalに評価して、早期に関数を終了します。
recur n arg:スタックでパラメーターをN引数に置き換え、関数を思い出します。
val 1-N ARG:最初の引数を返します。
do -n arg:最終的な引数を返します。
文字列、ベクトル、およびBLOB関連
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 :vをtakeしてvを返し、最初にskipアイテム/文字を省略します。
..sect : sectと同じですが、アイテム/キャラクターがバーストを返します。
blob ls :すべてのバイトがsに設定された長さlのブロブを返します。
get oltb :タイプtのアイテムと長さlオフセットoアイテムbのバイトから返します。
get ob :アイテムbのオフセットoバイトでバイトのU08値を返します。
set oib :オフセットoバイトをアイテムiのバイトに設定してBlob bを返します。
注:オフセット +レンがBLOBのサイズを超えた場合、NILをgetおよびset 。
注:両方とも参照をb (例えば*binding )として受け入れ、代わりset元の参照項目のバイトを検査/変更します。
.. v :ベクトル項目または文字項目のいずれかとして、ベクトルまたは文字列v引数スタックにバーストします。
注:逆のclojureのように、eg (+ (.. [1 2 3]) (.. [4 5 6])) => 21 apply 。
注:その引数がベクトルでない場合、スタックにアイテムが残りません。
binds :その議論のバインディングを推定し、新しいものを好み、その後遺体をベクトル化します。
例:( (binds a= 1 b= 2 a= 3) => [b= 2 a= 3]
GPIO関連
注:これらはPCには影響しません。
p-mode pin mode :ピン番号pinのモードをブールmodeに設定します - 真実として入力として、falseyは出力として偽ります。 nilを返します。
dig-r pin :ピン番号pinのデジタル入力状態を返します。
dig-w [1-N pin val] : pin valごとに、PIN NUMBER 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 :オフセットとカウントバイトの間にファイルコンテンツのブロブを返します。
すべてが失敗したときにnilを返します。
file-a path content :ファイルする文字列としてブロブまたはアイテムを追加します。
file-w path content[ offset] :blobまたはアイテムをファイルに文字列として書き込みます。 Booleanとして成功を返します。
どちらもBooleanとして成功をもたらします。
注:文字列はヌルターミネーターなしで記述されます。
file-d path : pathでファイルを削除します。 Booleanとして成功を返します。
タイプとキャスト
type i :アイテムのタイプコードを返しますi
type ab :アイテムがnil場合はb aのタイプコードを返します。
cast it : iキャストしたアイテムをタイプコードtとして返します。
注:幅が広く薄くなり、薄くなり、幅が広くなります。
BLOBからBLOBへの文字列には、ヌル終了がありません。文字列へのキャストは、ヌル終了で追加されます。
反復
reduce f[ s*N] i 、ベクターまたはstring iからfを介して削減します。 f is (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 (item*N) => mapped fを介して1-nベクトルの反復マッピングを返します。
例:( (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からb aの範囲を除き、上記と同じです。
例:( (loop 2 {print "hello" #}) 「hello0」と「hello1」を印刷し、nilを返します。
例:( (loop 0 5 +) => 10 。
例:( (loop 0 5 10 +) => 35
メッセージ関連
トピックは、フォワードスラッシュ( / )区切り文字列です。 un /subscriptionトピックは、任意の任意の場合はワイルドカード/+/ /#使用します。
例:トピックhouse/kitchen/fridge 、サブクリションhouse/+/fridgeまたはhouse/#または+/kitchen/+または#と一致しますが、 garage/#またはhouse/bedroom/fridgeまたはhouse/+/sink 。
pub topic[ payload] :文字列topic 、およびオプションであらゆるタイプのペイロードpayload (それ以外の場合はnil)を使用して、VM全体でメッセージを送信します。
NILを返します。または、メッセージが別のプログラムがメッセージを公開した場合、元の公開プログラムがサブスクライブされた場合、
元のPublishingプログラムのサブスクリプションハンドラーによって返された状態を返します。
注:公開は即時かつ同期しています - プログラムは、サブスクライバーがメッセージを処理するときに待つ必要があります。
sub topic f[ provide-topic] :メッセージfをメッセージtopicに登録します。
ここで、 provide-topic場合はTruthy f is (state topic payload) => new-state 、
else(default) f is (state payload) => new-state ; nilを返します。
注:プログラム関数のみがfとして受け入れられます - ネイティブ操作を使用するには、インライン関数を使用します。
unsub topic : topicの以前のサブスクリプションを削除します。 nilを返します。
unsub :すべてのプログラムサブスクリプションをドロップします。 nilを返します。
システムとプログラム関連
ms-now :CHVM初期化以来ミリ秒を返します。
sleep ms : ms Milisecondsのプログラムの次のハートビートを延期します。 nilを返します。
0-N arg print :n argのstrの結果を印刷します。 nilを返します。
load path : path (ファイル拡張機能なし)にコンパイルされたチカプログラムをロードします。プログラムの読み込みの成功のブールを返します。
comp path-in[ path-out] : path-inでソースファイル(イディオマティック*.chi )をチカバイナリとしてコンパイルし、拡張機能を.kuaに変更するか、 path-out (イディオマタリー*.kua )に変更して同じパスで保存します。
halt :すぐにチカプログラムを終了します。
コンパイルされたChikaバイナリは、機能のみで構成されています。関数にはフォームが含まれています。フォームには、 ARGS (フォームでもあります)が含まれ、操作で終了します。 16進バイト形式は次のとおりです。
関数NNNNLLLL…
NNNN 、UINT16_T増分関数ID; LLLL 、uint16_t関数ボディの長さ。 … 、 LLLL -Length関数本体。
形状00…args…OO
00 、フォームマーカー。 [args] 、0-n args; OO操作。
arg
または00… 、フォームAA 、uint8_t arg-code; …可変サイズのオーダーメイドの引数本体。
手術OO
OO 、uint8_t op-code。
00 FRMフォーム
トト
トト