【toit:esp32】toit文法は難しい?

arduinoはC++と同じではありませんがC++の文法で記述できます。

ではtoit.ioで使われる"toit文法は?"ということでarduinoと対比しながら実行してみました。

スポンサーリンク

toit と c++ の比較

arduinoのスケッチ(プログラム)はあまり意識しませんがC++の文法でコードを記述しているので、C++とtoitを比較してみました。 

***ToitC++
Current objectthisthis
Single line comments////
Logical 'and’, 'or’ and 'not’ operatorsand or not&& || ! (or and or not)

***ToitC++
Shift left, right, unsigned right<< >> >>><< >> >> (on unsigned type)
Integer division/ (on integer types)/ (on integer type)
Integer sizes648/16/32/64…
Statement grouping(indent)
Define a class Foo that inherits from Barclass Foo extends Bar:class Foo : public Bar {
Define constructor for class Fooconstructor x:Foo(int x) {
Define constructor for class Foo that calls constructor of superclass Barconstructor x: super xFoo(int x) : Bar(x) {
Constructor that assigns to fieldsconstructor .x:Foo(int x) : x(x) {
Check object has typebar is Foo(dynamic_cast(bar) != null)
Check object does not have typebar is not Foo(dynamic_cast(bar) == null)
Call a method foo with two argumentsfoo x yfoo(x, y);
Declare a member variable in a classx := null x := ? x/int := 0 x/int := ?int x; int x = 0;
Declare a local variable in a methodx := null x := ? x/int := 0 x/int := ?int x; int x = 0;
Define a constantX ::= 0const int X = 0;
Define a constant in a classstatic X ::= 0static const int X = 0;
Define a top-level functionfoo x y:int foo(int x, int y) {
Define an instance method in a classfoo x y:int foo(int x, int y) {
Define a static method in a classstatic foo x ystatic int foo(int x, int y) {
If statementif condition:if (condition) {
Fixed loopend.repeat:i | | for (int i = 0; i < end; i++) {
Three-part expression loopfor i := 0; i < end; i++:for (int i = 0; i < end; i++) {
Iterate over collectioncollection.do:x | | for (auto x : collection) {
While loopwhile condition:while (condition) {
Import local from libraryimport .library#include “file"
Import from libraryimport library#include
Import into current namespaceimport library show *#include using namespace file;
Print/logprint “Hello"cout << "Hello\n"
Print with interpolationprint “Hello $name"cout << "Hello " << name << "\n";

lf 条件式

構文

if 条件式 :

[php]
x := 5
main:
if x == 5 :
print "true"
[/php]

実行結果

[おうち栽培] 2022-02-06T02:28:13.919593Z: [おうち栽培] true
[おうち栽培] 2022-02-06T02:28:14.389776Z:

&&

toit の記述法では”&&" ⇒ "and"ということでそのものズバリ!です。^^;

[php]
x := 5
y := 3
main:
if x == 5 and y == 2 :
print "true"
else :
print "false"
[/php]

[おうち栽培] 2022-02-06T02:15:30.151037Z: [おうち栽培] false
[おうち栽培] 2022-02-06T02:15:31.859656Z:

正しく機能しています。^^;

||

構文

A or B

[php]
x := 5
y := 3
main:
if x == 5 or y == 5 :
print "true"
[/php]

実行結果

[おうち栽培] 2022-02-06T02:43:35.846957Z: [おうち栽培] true
[おうち栽培] 2022-02-06T02:43:36.379575Z:

!

構文

not A

[php]
x := 5
main:
if not x == 3 :
print "true"
[/php]

実行結果

[おうち栽培] 2022-02-06T03:09:35.210009Z: [おうち栽培] true
[おうち栽培] 2022-02-06T03:09:35.726220Z:

|| !

構文

A or not B

[php]
x := 5
y := 3
main:
if x == 3 or not y == 3:
print "true"
[/php]

[おうち栽培] 2022-02-06T03:00:56.250123Z: [おうち栽培] 2022-02-06T03:00:56.774173Z:

x = 5 ,y = 3 であり、どちらの条件にも当てはまらないので何も出力されません。

[php]
x := 5
y := 3
main:
if x == 3 or not y == 5 :
print "true"
[/php]

実行結果

[おうち栽培] 2022-02-06T03:26:16.469036Z: [おうち栽培] true
[おうち栽培] 2022-02-06T03:26:16.986342Z:

x = 5 で条件には当てはまりませんが、”又は” という別の条件ではy は5 では無い( y = 3 )という条件に当てはまるので”true"になります。

for で繰り返すには?

構文

for i := 0; i < end; i++:

[php]
end := 10
main:
for i := 0; i < end; i++:
print "$i"
[/php]

実行結果

[おうち栽培] 2022-02-06T03:47:07.188131Z: [おうち栽培] 0
[おうち栽培] 1
[おうち栽培] 2
[おうち栽培] 3
[おうち栽培] 4
[おうち栽培] 5
[おうち栽培] 6
[おうち栽培] 7
[おうち栽培] 8
[おうち栽培] 9
[おうち栽培] 2022-02-06T03:47:07.962791Z:

float ⇒ int型に変換する

float型をint型に変換します。

[php]
x := 3.1415926
main:
y / int := (x).to_int
print y
[/php]

実行結果

[おうち栽培] 2022-02-06T05:14:54.646172Z: [おうち栽培] 3
[おうち栽培] 2022-02-06T05:14:55.165492Z:

float ⇒ 桁数を指定する

小数以下の長い出力を指定した桁数で表示します。

[php]
x := 3.1415926
main:
y / string := "$(%0.2f x)"
print y
[/php]

実行結果

[おうち栽培] 2022-02-06T05:34:09.106804Z: [おうち栽培] 3.14
[おうち栽培] 2022-02-06T05:34:09.624160Z:
0.2f ⇒ 0.3f とすると 3.142 と出力するんだね…

fixed_point

toitにはarduino には無い機能の一つに"fixed_point"があります。

使い方は”import fixed_point show FixedPoint”の一行を加えます。

[php]
import fixed_point show FixedPoint
x := 3.1415926
main:
y := FixedPoint –decimals = 3 x
print y
[/php]

実行結果

[おうち栽培] 2022-02-06T09:09:27.269500Z: [おうち栽培] 3.142
[おうち栽培] 2022-02-06T09:09:32.411292Z:

コンマ以下3桁を出力します。

スポンサーリンク

MEMO

Posted by KAZU