#include "Cello.h"
int main(int argc, char** argv) {
/* Stack objects are created using "$" */
var i0 = $(Int, 5);
var i1 = $(Int, 3);
var i2 = $(Int, 4);
/* Heap objects are created using "new" */
var items = new(Array, Int, i0, i1, i2);
/* Collections can be looped over */
foreach (item in items) {
print("Object %$ is of type %$\n",
item, type_of(item));
}
/* Heap objects destructed via Garbage Collection */
return 0;
}
Cello is a library that brings higher level programming to C.
By acting as a modern, powerful runtime system Cello makes many things easy
that were previously impractical or awkward in C such as:
- Generic Data Structures
- Polymorphic Functions
- Interfaces / Type Classes
- Constructors / Destructors
- Optional Garbage Collection
- Exceptions
- Reflection
And because Cello works seamlessly alongside standard C you get all the other
benefits such as great performance, powerful tooling, and extensive
libraries.
#include "Cello.h"
int main(int argc, char** argv) {
/* Shorthand $ can be used for basic types */
var prices = new(Table, String, Int);
set(prices, $S("Apple"), $I(12));
set(prices, $S("Banana"), $I( 6));
set(prices, $S("Pear"), $I(55));
/* Tables also support iteration */
foreach (key in prices) {
var val = get(prices, key);
print("Price of %$ is %$\n", key, val);
}
return 0;
}
Articles
Learning Resources.
Articles about its creation and internal workings.
#include "Cello.h"
int main(int argc, char** argv) {
var items = new(Array, Int,
$I( 8), $I( 5), $I(20),
$I(15), $I(16), $I(98));
/* Iterate over indices using "range" */
foreach (i in range($I(len(items)))) {
print("Item Range %i is %i\n", i, get(items, i));
}
/* Iterate over every other item with "slice" */
foreach (item in slice(items, _, _, $I(2))) {
print("Item Slice %i\n", item);
}
return 0;
}
#include "Cello.h"
/* Define a normal C structure */
struct Point {
float x, y;
};
/* Make it compatible with Cello */
var Point = Cello(Point);
int main(int argc, char** argv) {
/* Create on Stack or Heap */
var p0 = $(Point, 0.0, 1.0);
var p1 = new(Point, $(Point, 0.0, 2.0));
/* It can be shown, compared, hashed, etc...
**
** p0: <'Point' At 0x000000000022FC58>
** p1: <'Point' At 0x00000000004C7CC8>
** cmp: 1
** hash: 2849275892l
*/
print("p0: %$\np1: %$\ncmp: %i\nhash: %ul\n",
p0, p1, $I(cmp(p0, p1)), $I(hash(p0)));
/* And collected by the GC when out of scope */
return 0;
}
|