YOLOL

Last-modified: 2023-11-16 (木) 14:13:38


概要

YOLOLは、デバイスを制御・管理するためのSTARBASE独自のプログラミング言語です。
プログラムのコードはYOLOLチップに記載されており、チップソケットに挿入されたチップのコードを読み取って命令を実行します。
このプログラミング言語は、ほとんどすべてのデバイスのプログラミングと制御を可能にします。

基本情報

使い方

コードはYOLOLチップに書き込まれて実行され、データネットワークに接続されたデバイスの監視と制御の両方に使用される。
コードの行は、上から下へと順番に実行され、最後の20行目が実行された後、最初の行に戻り、また上から下へ順番に実行を繰り返します。ただし、スクリプトに特定の行へジャンプしたり、実行を完全に停止したりする命令が含まれている場合はこの限りではありません。
この言語はgoto命令をサポートしています。

要点

  1. コードの実行は1行目から
  2. 1行目を実行した後、チップの時間間隔(0.2秒)だけ停止してから次の行に進みます。
  3. このプロセスは、2行目、3行目、4行目...と繰り返されます。
  4. チップは、最後の行が実行された後、再び1行目の実行を開始します。(最後の行にgoto文が含まれている場合や、実行が一時停止されている場合を除く)
  5. このように、空行でも0.2秒を使用するので、短い実行遅延として使用することができます。(コメントのみの行は実質的に空行と同じです)

制限事項

1行に記載されたコードの実行には0.2秒かかります。
すべての行の命令を実行するのに4秒かかります。
1行に入力できる文字数は最大70文字(コメント、スペースを含む)です。
Memoryチップは、100(125?)文字しか保存することが出来ません。
一部の機能は、特定のYOLOLチップでのみ動作します。
そのため、以下の例のようにゲーム内で動作しないことがありますのでご注意ください。

コマンドリファレンス

大文字小文字を区別しない

YOLOLは、大文字と小文字を区別しません。
つまり、次の2つのコードの例では、互いに同じ機能を持っています:

if ButtonState == 1 then DoorState = 1 end
IF buttonstate == 1 THEN doorstate = 1 END

どちらのスクリプトも、ButtOnStateの値が1であれば、DoorState変数を1に設定します。
プログラミング言語の文字は、小文字でも大文字でも書くことができます。
大文字小文字を区別せずに解析されます。
このようにして、コードを少し整理することができます。

変数

YOLOLの変数は弱い型付け(型の有効性を強制しない)で、2つのデータ型をサポートしています。固定小数点の10進数(0.001までの精度)と文字列(長さ 1024 文字まで)。
簡単に言うと、変数は文字列か数値のどちらかで宣言することができ、前の変数の型が同一でない場合は、エラーを起こさずに前の変数の型を無視します。
各変数は常に単一の型ですが、必要に応じて暗黙のうちに変換されます。
初期化されていない変数のデフォルト値は0で、NULL値はサポートされていません。
True/Falseは、0以外の数値と0の数値です。

True =! 0
False == 0

変数に値を代入すると、その変数は常に新しく代入された値の型に変換されます。

例:

ultimateAutopilot= 128.643

この結果、変数 ultimateAutopilot には 128.643 という数値が格納されます。

ultimateAutopilot= "Error prone"

この結果、変数 ultimateAutopilot は文字列変数 "Error prone" となり、数値 128.643 が削除されます。

小数点以下

YOLOLにおける数値は、64ビット固定小数点の10進数です。 変数は小数点第3位までの数値が格納されます。 そのため、最大値の範囲(演算中も含む)は -9223372036854775.808~9223372036854775.807 となります。

pieVariable= 3.142

上記のスクリプトでは、変数 pieVariable に 3.142 という数値が割り当てられています。
変数が格納できる値よりも正確な値を与えても動作しますが、最終的な結果には影響しません。

notPieVariable= 0.5772156649

上記のスクリプトは、変数 notPieVariable に 0.5772156649 という数値を割り当てようとしています。
最終的な結果は notPieVariable == 0.577 です。
ここでは、より詳細な値が切り取られて、少数第3位までが残されます。

文字列

YOLOLで文字列変数を指定するには、希望する文字列の値をダブルクォーテーションで囲む必要があります。

badRobots= "saltberia"

このスクリプトは、"saltberia" という文字列値を変数 badRobots に割り当てます。

デバイスフィールド / 外部変数(グローバル変数)

外部変数とデバイス・フィールドは、プログラミング言語で次のような構文で使用できます:

:variableName
  • variableNameには設定されたデバイスフィールドIDを指定します。

接頭辞のコロン「:」は、スクリプト内で宣言または使用されていない変数を使用するために、外部変数にアクセスしていることをスクリプトに伝えるために使用されます。
YOLOLチップをデバイスに有効なデバイスネットワークに接続すると、同じネットワーク内のすべてのデバイスにアクセスできます。
そして、アクセスできるすべてのデバイスフィールドの値を変更したり、取得することができます。

if :ButtonState == 1 then :DoorState = 1 end

上記のスクリプトは、データネットワーク上でButtonStateの値が1の場合、デバイスフィールドにDoorStateを設定したすべてのデバイスに1の値を送信します。

変数名の制限

変数に if や end などのキーワードが含まれていると、プログラムが正しく解析されません。
必ず気を付ける必要があります。

演算子とコマンド

YOLOLチップの種類によって、使用できる演算子や関数は制限されています。
Basic YOLOL Chipは限られた機能しかありませんが、Advanced YOLOL Chipではより複雑な機能を使うことができます。

基本的な算術演算子と代入演算子について

命令数値演算文字列演算チップの種類
A + B加算文字列Aに文字列Bを足す。すべて
A - B減算文字列 A の中で文字列 B の最後の出現部分が文字列 A から削除されます。すべて
A * B乗算ランタイムエラー。この行の残りの部分はスキップされます。すべて
A / B除算ランタイムエラー。この行の残りの部分はスキップされます。すべて
A ++ポストインクリメント (A=A+1)文字列 A にスペースを追加します。すべて
A --ポストインクリメント (A=A-1)文字列の最後の文字を削除します。""(空白)を削除しようとするとランタイムエラーになります。元の値に評価されます。すべて
++ Aプレインクリメント (A=A+1)文字列 A にスペースを追加します。すべて
-- Aプレインクリメント (A=A-1)文字列の最後の文字を削除します。""(空白)を削除しようとするとランタイムエラーになります。元の値に評価されます。すべて
A = B代入 (変数 A に変数 B の値を設定)代入すべて
A += B加算の代入 (A=A+B)文字列操作 A+B の値を代入する。すべて
A -= B減算の代入(A=A-B)文字列操作 A-B の値を代入する。すべて
A *= B乗算の代入 (A=A*B)ランタイムエラー。この行の残りの部分はスキップされます。すべて
A /= B除算の代入 (A=A/B)ランタイムエラー。この行の残りの部分はスキップされます。すべて
A ^= B累乗の代入 (A=A^B)ランタイムエラー。この行の残りの部分はスキップされます。Advanced, Professional
A %= B余りの代入 (A=A%B)ランタイムエラー。この行の残りの部分はスキップされます。Advanced, Professional
A ^ B累乗ランタイムエラー。この行の残りの部分はスキップされます。Advanced, Professional
A % B余りランタイムエラー。この行の残りの部分はスキップされます。Advanced, Professional
ABS(A)対数係数(絶対値) (A=A if A>=0, else A=-A)と同じ処理となる。ランタイムエラー。この行の残りの部分はスキップされます。Advanced, Professional
A!階乗ランタイムエラー。この行の残りの部分はスキップされます。Advanced, Professional
SQRT(A)Aの平方根ランタイムエラー。この行の残りの部分はスキップされます。Advanced, Professional
SIN(A)AのSIN(度)ランタイムエラー。この行の残りの部分はスキップされます。Professional
COS(A)AのCOS(度)ランタイムエラー。この行の残りの部分はスキップされます。Professional
TAN(A)AのTAN(度)ランタイムエラー。この行の残りの部分はスキップされます。Professional
ASIN(A)AのASIN(度)ランタイムエラー。この行の残りの部分はスキップされます。Professional
ACOS(A)AのACOS(度)ランタイムエラー。この行の残りの部分はスキップされます。Professional
ATAN(A)AのATAN(度)ランタイムエラー。この行の残りの部分はスキップされます。Professional

論理演算子

論理演算子は、命令が真か偽かを識別します。
すべての論理演算は、0:偽または1:真のいずれかを返します。
また、NOT、AND、ORキーワードは、0:偽とし、0以外を真とします。

命令数値演算文字列演算チップの種類
A < BAはBより小さい文字列Aがアルファベット順で1番目の場合は1を、そうでない場合は0を返します。すべて
A > BAはBより大きい文字列Aがアルファベット順で1番目の場合は0を、そうでない場合は1を返します。すべて
A <= BAはB以下文字列Aがアルファベット順で1番目の場合か、文字列Bと同じであれば1を、そうでない場合は0を返します。すべて
A >= BAはB以上文字列Aがアルファベット順で1番目の場合か、文字列Bと同じであれば0を、そうでない場合は1を返します。すべて
A != BAはBと異なる文字列Aが文字列Bと等しくない場合は1を、等しい場合は0を返します。すべて
A == BAはBと同じ文字列Aが文字列Bと等しい場合は1を、等しくない場合は0を返します。すべて
NOT A真偽反転A が 0 であれば 1 を、そうでなければ 0 を返します。すべて
A AND BAとBの両方A も B も 0 でなければ 1 を、そうでなければ 0 を返します。すべて
A OR BAまたはBのどちらかA または B のどちらかが 0 でない場合は 1 を、そうでない場合は 0 を返します。すべて


演算における変数型の混在

演算の中で変数の型を混在させると、すべての変数の型を文字列として演算を行います。

previouslyNumber= "10" + 15

上記スクリプトの結果、precedlyNumber には文字列値 "1015" が格納されます。
関連する変数自体の型は変更されず、命令が完了するまで一時的に文字列として変換されいるだけであることに注意してください。

purelyNumber = 15
purelyString = "10" + purelyNumber

このスクリプトが実行されたとき、purelyString には文字列値の "1015" が、purelyNumber には数値値の "15" が入っています。

goto文

goto文は、通常のスクリプトの1->20の読み順が望ましくない場合や、変更する必要がある場合に使用します。

gotoは次のような構文で使用します:

goto lineNumber
  1. lineNumber は、このコマンドがスクリプトの実行を開始する行数の値です。
  2. goto コマンドの後に同じ行にある残りのスクリプトは実行されません。
  3. goto の前に if 文を使用すると、if 文が false であると仮定して、goto の構文を無視します。
  4. 条件式を使って同じ行に複数のgotoコマンドを追加することができます。Falseのgotoコマンドはスキップされます。
  5. [1,20] の範囲外の数値は、この範囲に固定されます。
  6. 非整数の値は整数として扱われます。
  7. 文字列値はランタイムエラーになります。
if variable == 5 then goto 4 end goto 6

上のスクリプトは、もしvariableの値が5であれば、4行目に進みます。
それ以外の場合は、6行目に進みます。数値演算はgoto文の中でも行うことができます。(例)

 goto 4+1


if-else文

if-else文は、条件式でスクリプトを分岐させるために使用します。
以下のような構文になります:

if 条件式 then 命令 else 命令 end

条件式は結果が数値になる必要があり(0はFalse、それ以外はTrueとして解析されます)で、命令は実行されるスクリプトの一部です。
すべての if-else文は、文が完了した後に end 命令を記述しなければなりません。

If は、スクリプトの実行を変数の値に基づいて2つの結果に分岐させるために使用できます。
例:

if variable != 2 then endResult = 3 else endResult = 4 end

このスクリプトは、variableが2の値の場合、endResult の値を3に設定します。
variableの値が2の場合、endResultの値は4に設定されます。
なお、else 文の部分は、必要なければ省略することができます。
例:

if variable != 2 then endResult = 3 end

このスクリプトは、variableの値が2でない場合に、endResult に3の値を設定するだけで、他には何もしていません。
if文の入れ子
true/false文のブロックの中にif文を入れることで、さらに実行を分岐させることができます。
例:

if variable == 0 then endResult = 1 else if variable == 1 then endResult = 2 end end

このスクリプトは、variableが0の場合、endResult を1に設定します。
variable が 0 にならず、1 になる場合、endResult は 2 に設定されます。
例:

if variable == 0 then if endResult == 1 then endResult = 2 end else endResult = 1 end

このスクリプトは、vaiableの値が0で、endResultが1の場合、endResult を2に設定します。
そうでなければ endResult を 1 に設定します。
なお、入れ子になったif文を含むスクリプトは、インデントされたきれいな形にフォーマットしたほうが、スクリプトの流れを計画したり、デバッグしたりしやすいかもしれません。
注意:このようにスクリプトを書いてもチップでは動作しませんが、スクリプトをデバッグする際にはこのようにすると便利です。

これは、2つ目の入れ子になった例を整形したものです:

if variable == 0 then
   if otherVariable == 1 then
       otherVariable = 2
   end
else
   otherVariable = 1
end


コメント

コメントは、多くのプログラマが参照するコードを書くときに便利な機能です。
また、コメントは1行70文字の文字数制限にカウントされることに注意してください。
コメントは次のような構文で使用します。

// text

textは一行分の任意の文字集合です。
コメント構文の例は次のとおりです。

// これはコメントです。他の行のスクリプトがどのように動作するかを説明します。


エラー

プログラミング言語では、2種類のエラーが発生することがあります。

  1. 構文エラー(Syntax errors)
  2. ランタイムエラー(Runtime errors)

構文エラーは、無効で解析不能なスクリプトから発生し、その行全体が実行されません。
ランタイムエラーは、スクリプトが実行されている間のみ発生します。ランタイムエラーは、スクリプトが実行されている間にのみ発生し、その行の実行は中断されますが、エラーが発生するまでの効果は残ります。

既知のバグ/意図しない動作

以下は、YOLOLに関する既知の問題のリストです:
"if" のようなキーワードを含む 変数名は、そのキーワードを考慮して解析され、シンタックスエラーになります。例: :life は :l if e と解析されます。