aboutsummaryrefslogtreecommitdiff

Numeric types

Instead of "number", integer:

  • i8, i16: signed
  • u8, u16: unsigned

Operations:

  • x.lo and x.hi are r/w properties to get/set low/high bytes in 16-bit numbers
  • i8(x), u8(x), i16(x), u16(x) for conversions (there are no implicit conversions)

Consequences:

  • array index is either u8 or u16

Strings

Strings are zero ended arrays of u8 that can be represented as a literal using double quotes.

// 6 characters plus a 0 at the end
var s [7]u8 = "string";

// change value; length <= array size
s = "value";

s = "another";
// error: string is too long for [7]u8

Notes:

  • "xxx" + 0 to initialize an array of u8
  • can be used to change the value
  • the string can be shorter than the array space, but length + 1 must fit in the array

The interpreter built-in println will print literals as strings, but in order to output an array of u8 as a string, use str property:

The following escape sequences are supported in both strings and character literals:

  • In string literals \" for a double quote.
  • In character literals \' for a single quote.
  • \n for end of line.
  • \t for tab.
  • \x00 for a 2 digits hex number (8-bit).
  • \\ for the backslash itself.
// the array is initialized to zeroes
var s [10]u8;

s[0] = 'H';
s[1] = 'e';
s[2] = 'l';
s[3] = 'l';
s[4] = 'o';

println(s.str);
// output: Hello

Constants and expression evaluation

The parser should resolve most constants and expression evaluation.

e.g. a = 1 + 2 -> a = 3

Constant as literal replacement (constants MUST be literals after expression evaluation).

Built-in len should be resolved at parsing time (applies to array size and that is static).

Remove closures

  • why: they are dynamic
  • can we have a limited closure?

Directives

Include a file in current source and it will interpreted / compiled.

include "file.micro"

Include a binary file as an expression list to initialize an array.

var arr [64]number = incbin "file.micro";