A few notable Space Lua quirks.

Lua implementation notes

Space Lua is intended to be a more or less complete implementation of Lua 5.4. However, a few features are (still) missing:

  • coroutines (not planned, not useful in the SilverBullet context)
  • _ENV (planned)
  • Hexadecimal numeric constants with a fractional part, or binary exponents (not supported by JavaScript number parser either)

Conversion of Strings to Numbers

Space Lua converts strings to numbers like standard Lua.

Syntax:

  • Leading and trailing whitespace (space, tab, newline, carriage return, form feed and vertical tab) is trimmed.
  • The entire string after trimming trailing whitespace must form a number.
  • Optional + or - signs are accepted before the number.
  • Decimal integers and decimal floats are supported with optional exponent (e.g., 42, -3.5, .5, 5., 1e3, -2.5E-2).
  • Hexadecimal integers and hexadecimal floats are also supported:
    • integers (e.g., 0x10, -0XFF),
    • floats require p or P exponent (e.g., 0x1.8p1, -0X10.3P-1).

Failure handling:

  • In arithmetic and unary minus expressions invalid strings cause an Lua exception: attempt to perform arithmetic on a non-number.
  • tonumber(s) returns nil on failure.
  • tonumber(s, base) parses signed integers in bases 2..36 (without decimal points or exponents) and returns nil on invalid input string or base.

Examples (with tonumber function):

CodeResultExpected
tonumber(' 42 ')${tonumber(' 42 ')}42
tonumber('-0xFf ')${tonumber('-0xFf ')}-255
tonumber('0x1.8p1')${tonumber('0x1.8p1')}3.0
tonumber('1e-2')${tonumber('1e-2')}0.01
tonumber('abc')${tonumber('abc')}nil
tonumber('1010', 2)${tonumber('1010', 2)}10
tonumber(' +fF', 16)${tonumber(' +fF', 16)}255
tonumber('8', 8)${tonumber('8', 8)}nil

Examples (with arithmetic operations):

CodeResultExpected
'0xfFfFp1'${'0xfFfFp1'}string: 0xfFfFp1
'0xffffP-3' + 0${'0xffffP-3' + 0}number: 8191.875
-'123E-12'${-'123E-12'}number: -1.23e-10