Slang
Example code
# this is a comment
#| and that is a
multiline one. |#
const u32 n = 123123 # n is of type const u32
const i64 m = 10**18 # m is of type const i64
const int z = 2**128 # z is of type const int (unsized)
const auto q = 2**256 # q is of type const int
char f(str x) { # f() is of type char, x is of type str
auto c = x[1] # c is of type char
return c
}
char g(str x) { # g() is of type char, x is of type str
return x[0] # retval is of type char
}
int h(int x) = x+1 # h() is of type int, x is of type int
void main() {
print(h(n), \
f('123asd') + g('32') + 1) #--> «123124 f»
print(q/z/2**96) #--> «4294967296.0»
}
main()
Tokens
Token resolution order
- Special
- Operator
- Literal
- Keyword
- Identifier
Syntax structures
Note: * after syntax unit means any number of them.
Abstract
{[<\n | ;>]* <<expr> <\n | ;>>* [<\n | ;>]*}—code<<expr> | <code>>—block
Primitive
<<literal> | <funccall> | <attrget> | <itemget> | <identifier> | <lambda>>—value<value>\[<value>\]—itemget<(<expr>) | <value> | <operator> <expr> | <expr> <operator> <expr>>—expr(f(x+3)is an instance ofexpr, alsof,x+3andxareexprs too)
Non-final
[modifier]* <type>—typedef(left-hand type definition)[typedef] <identifier> [? | + | * | ** | =<expr>]—argdef(argument definition)
?— if present then argument value,noneelse.
+— tuple with at least one argument.
*— tuple with any number of arguments.
**— object with keyword arguments.
=— default value if argument not specified.
([<argdef>[, <argdef>]*]) -> <typedef> = <expr>—lambda(lambda function)<<expr>[, <expr>]*[, *<expr>] | *<expr>>—callargs<<identifier>=<expr>[, <identifier>=<expr>]*[, **<expr>] | **<expr>>—callkwargs
Final (ordered by resolution order)
<typedef> <identifier>([<argdef>[, <argdef>]*]) <<code> | = <expr>>—funcdef(function definition)<exprkeyword> [expr]—keywordexpr(keyword expression)<typedef> <identifier> [= <value>]—vardef(variable definition)<identifier> = <value>—assignment<value>([<callargs> | <callkwargs> | <callargs>, <callkwargs>])—funccall(function call)<expr>— expr evaluation (only in REPL)if (<expr>) <block>—conditionalfor (<identifier> in <expr>) <block>—forloopwhile (<expr>) <block>—whileloopelse <block>—elseclause
Keywords
return [expr]— return from function
Modifiers
const— immutable/constant variable
Reserved keywords
def
Identifiers
Non-empty sequence of alphanumeric characters plus underscore («_»), not starting with a digit character.
Regex: [_\w]+[_\w\d]*
Data types
-
i8,i16,i32,i64,i128— fixed size integer -
u8,u16,u32,u64,u128— fixed size unsigned integer -
f8,f16,f32,f64,f128— fixed size IEEE-754 floating point number -
uf8,uf16,uf32,uf64,uf128— fixed size unsigned floating point number -
int— unsized («big») integer -
uint— unsized unsigned integer -
float— unsized floating point number -
ufloat— unsized unsigned floating point -
bool— logical (boolean) value -
byte— single byte -
char— UTF-8 character -
str— UTF-8 string -
void— nothing (or anything...) -
auto— compile-time type deduction based on value
Literals
Note: * after syntax unit here means any number of them, + means at least one.
<<0<b | o | x>><digit+> | <digit+>.<digit*> | <digit*>.<digit+>>— number<"<character*>" | '<character*>'>— string
Operators
<operator> <operand>— unary operators usage<operand> <operator> <operand>— binary operators usage<operand> <operator>= <operand>— in-place operator usage
Character operators
A set of pre-defined character operators:
!$%&*+-:^~— unary charset%&*+-/<=>^|— binary charset==,**,//,<<,>>— double-char binary operators
Keyword operators
A set of pre-defined keyword operators:
not— unary keyword operatorand,or,xor,is,is not,to— binary keyword operators
Specials
#,#|,|#— comment specials;— expr separator special->,@.,@,.,:— attrget optype specials[,]— itemget specials\,?=(){}— other specials charset
Footnotes
All character class checks are performed in current locale.
by Sdore, 2019