Navigation
Synopsis Built-in and user-defined datatypes.
Description Rascal provides a rich set of datatypes:
  • Boolean (bool).
  • Infinite precision Integer (int), Real (real), and Number (num).
  • Strings (str) that can act as templates with embedded expressions and statements.
  • Source code Locations (loc) based on an extension of Universal Resource Identifiers (URI) that allow precise description of text areas in local and remote files.
  • Date and time values (DateTime, datetime).
  • List (list).
  • Tuple (tuple).
  • Set (set).
  • Map (map)
  • Relation (rel).
  • Untyped tree structures (Node, node).
  • User-defined algebraic datatypes (Declarations/AlgebraicDataType, data) allow the introduction of problem-specific types and are a subtype of node. This makes it possible to have typed and untyped views on the same data. A special case are syntax trees that are the result of parsing source files are represented as datatypes (Tree).
There is a wealth of built-in operators and library functions available on the standard datatypes.

These built-in datatypes are closely related to each other:
  • In a list all elements have the same static type and the order of elements matters. A list may contain the same value more than once.
  • In a set all elements have the same static type and the order of elements does not matter. A set contains an element only once. In other words, duplicate elements are eliminated and no matter how many times an element is added to a set, it will occur in it only once.
  • In a tuple all elements (may) have a different static type. Each element of a tuple may have a label that can be used to select that element of the tuple.
  • A relation is a set of tuples which all have the same static tuple type.
  • A map is an associative table of (key, value) pairs. Key and value (may) have different static type and a key can only be associated with a value once.
Examples Here are some examples of the built-in data types:
Type Examples
bool true, false
int 11, 101, 1-11, 1123456789
real 1.01, 11.0232e201, 1-25.5
str "abc", "first\nnext", "result: <X>"
loc |file:///etc/passwd|
dateTime $2101-09-05T07:16:19.714+0200
tuple[T1,...,Tn] <1,2>, <"john", 43, true>
list[T] [], [1], [1,2,3], [true, 2, "abc"]
set[T] {}, {1,2,3,5,7}, {"john", 4.0}
rel[T1,...,Tn] {<1,2>,<2,3>,<1,3>}, {<1,10,100>, <2,20,200>}
map[T, U] (), (1:true, 2:false), ("a":1, "b":2)
node f(), add(x,y), g("abc", [2,3,4])

A fragment of the datatype that defines the abstract syntax for statements (assignment, if, while) in a programming language would look as follows:
data STAT = asgStat(Id name, EXP exp)
          | ifStat(EXP exp,list[STAT] thenpart,
                           list[STAT] elsepart) 
          | whileStat(EXP exp, list[STAT] body)
          ;
Here are some examples how Rascal responds to values of the above built-in datatypes:
rascal>true;
bool: true
rascal>101;
int: 101
rascal>3.14;
real: 3.14
rascal>"Rascal";
str: "Rascal"
rascal>|file:///etc/passwd|;
loc: |file:///etc/passwd|
rascal>$2101-09-05;

rascal>[30, 20, 10];
list[int]: [30,20,10]
rascal><"Rascal", 100000>;
tuple[str,int]: <"Rascal",100000>
rascal>{"apples", "oranges", "bananas"};
set[str]: {"oranges","bananas","apples"}
rascal>{<"apples", 10, 15>, <"oranges", 5, 7>, <"bananas", 9, 11>};
rel[str,int,int]: {
  <"apples",10,15>,
  <"oranges",5,7>,
  <"bananas",9,11>
}
rascal>("apples" : 100, "oranges": 150, "bananas": 75);
map[str, int]: ("oranges":150,"bananas":75,"apples":100)
rascal>"abc"(1, 2, 3);
node: "abc"(1,2,3)
Is this page unclear, or have you spotted an error? Please add a comment below and help us to improve it. For all other questions and remarks, visit ask.rascal-mpl.org.