Number literals
FunC supports decimal and hexadecimal integer literals, including those with leading zeros. Examples of valid integer literals:0
, 123
, -17
, 00987
, and -0
.
Examples of valid hexadecimal literals: 0xef
, 0xEF
, 0x0
, -0xfFAb
, 0x0001
, and -0x0
.
Identifiers
FunC allows a broad range of identifiers for functions and variable names. Any single-line string that meets the following conditions qualifies as a valid identifier:- It does not contain special symbols:
;
,,
,(
,)
,[
,]
, spaces including tabs,~
, and.
. - It does not start as a comment or a string literal (i.e., with
"
at the beginning). - It is not a number literal.
- It is not an underscore
_
. - It is not a reserved keyword.
- It is not the name of a built-in.
.
or ~
.
FunC allows an exception regarding identifiers for local variables. Local variables can use the name of a
built-in with a non-symbolic name.
query
,query'
,query''
elem0
,elem1
,elem2
CHECK
_internal_value
message_found?
get_pubkeys&signatures
dict::udict_set_builder
fatal!
123validname
2+2=2*2
-alsovalidname
0xefefefhahaha
{hehehe}
pa{--}in"`aaa`"
fun_a
~fun_a?
._how123
take(first)Entry
- contains parentheses(
and)
"not_a_string
- starts with a"
, like a string literalmsg.sender
- includes a.
send_message,then_terminate
- contains a,
_
- just an underscore, which is not valid on its ownpa;;in"`aaa`"
- contains;
{-aaa-}
- it is a commentaa(bb
- contains an opening parenthesis123
- a number literal_+_
- it is a reserved builtin name
`
. These identifiers can contain any characters except:
- Newline characters
\n
- Backticks
`
themselves, except the opening and closing ones.
`I'm a variable identifier too`
`any symbols ; ~ () are allowed here...`
Identifiers in FunC usually follow these naming conventions:
-
Apostrophe
'
at the end: used when a variable is a modified version of its original value.- Example:
Here, function
udict_set
updates key0
with valuev
in dictionarydict
. The updated dictionary name isdict'
.
- Example:
-
Question mark (?) at the end: typically used for boolean variables or functions that return a success flag.
- Example:
Here, function
udict_get?
looks up index0
in dictionarydict
, and returns the associated valuev
(if found) and a flagfound?
which indicates whether the index was found in the dictionary.
- Example:
Constants
FunC allows defining compile-time constants that are substituted and pre-computed during compilation. Syntax:optional-type
(e.g.,int
orslice
) is optional but improves readability and ensures type correctness.value-or-expression
can be a literal or an expression involving literals and previously defined constants.
const
declaration by separating them with ,
.
Example usage:
Numeric constants are replaced during compilation,
which means that all optimizations and pre-computations apply efficiently.
Compile-time built-ins
FunC has a special syntax for compile-time operations that compute slices and integer hashes out of ASCII strings. These compile-time operations are invoked by enclosing the ASCII string in double quotes"
, followed
by a suffix representing the compile-time operation to apply on the string, like:
u
represents the compile-time operation to invoke on the ASCII string.
These built-ins are evaluated during compilation time, which means that the FunC compiler replaces the built-in call anywhere
it occurs with the result of the call. In particular, it is possible to use these compile-time built-ins while declaring constants:
String without suffix
If no suffix is provided, the compiler computes a slice from the ASCII string, such that the contents of the slice is the binary code of the ASCII string.String with suffix s
Suffix s
interprets the string as an hexadecimal number and produces a slice having the binary representation of the hexadecimal number.
If the string is not an hexadecimal number, the compiler signals an error.
String with suffix a
Suffix a
interprets the string as an address and creates a slice containing a MsgAddressInt
structure from the address.
MsgAddressInt structure link is missing!!
String with suffix u
Suffix u
produces the decimal representation of the binary code of the ASCII string.
String with suffix h
Suffix h
generates an integer from the first 32 bits of the string’s SHA-256 hash.
String with suffix H
Suffix H
generates an integer from the full 256-bit SHA-256 hash of the string.
String with suffix c
Suffix c
generates an integer from the crc32
value of the string.
String with multiple lines
Special characters like\n
are not supported in strings, but you can create multi-line strings by writing the text across multiple lines,
all surrounded by triple quotes """
. The triple quotes syntax also supports the previously described suffixes.
For example: