utility functions for implementing noja functions in c; built-ins for socket management; http server draft in noja

This commit is contained in:
Francesco Cozzuto
2023-01-15 00:51:36 +01:00
parent 2c7e0ae2ba
commit 74a1648af8
27 changed files with 1705 additions and 299 deletions
+101
View File
@@ -0,0 +1,101 @@
cat = string.cat;
fun Node(T) {
K = { item: T, next: none };
K.next = ?K;
return K;
}
fun makeNode(item)
return { item: item, next: none };
fun Stack(T)
return { size: int, head: ?Node(T) };
fun StackIterator(T)
return { stack: Stack(T), index: ?int, cursor: ?Node(T), next: Callable };
fun makeStackIterator(stack: Stack(any))
return {
stack: stack,
index: none,
cursor: stack.head,
fun toString(iter: StackIterator(stack.type))
return cat("StackIterator(", toString(stack), ")");
fun next(iter: StackIterator(stack.type)) {
if iter.index == none: {
iter.index = 0;
iter.cursor = iter.stack.head;
} else {
if iter.cursor != none: {
iter.cursor = iter.cursor.next;
iter.index = iter.index+1;
}
}
if iter.cursor == none:
return none;
return iter.cursor.item, iter.index;
}
fun haveNext(iter: StackIterator(stack.type)) {
return none != iter.cursor
and none != iter.cursor.next;
}
};
fun makeStack(T)
return {
type: T,
size: 0,
head: none,
fun push(stack: Stack(T), item: T) {
if item == none:
error("Can't insert \"none\" into a stack");
node = makeNode(item);
node.next = stack.head;
stack.head = node;
stack.size = stack.size+1;
}
fun pop(stack: Stack(T)) {
node = stack.head;
if node != none: {
stack.head = node.next;
stack.size = stack.size-1;
}
return node.item;
}
fun isEmpty(stack: Stack(T))
return stack.head == none;
fun toString(stack: Stack(T)) {
iter = stack->iter();
s = "[";
while (item = iter->next()) != none: {
s = cat(s, toString(item));
if iter->haveNext():
s = cat(s, ", ");
}
s = cat(s, "]");
return s;
}
fun print(stack: Stack(T))
print(stack->toString());
fun iter(stack: Stack(T))
return makeStackIterator(stack);
};
return {
Stack: Stack,
makeStack: makeStack,
StackIterator: StackIterator,
makeStackIterator: makeStackIterator
};
+17
View File
@@ -0,0 +1,17 @@
stack, error = import("stack.noja");
print(error, "\n");
Stack = stack.Stack;
makeStack = stack.makeStack;
StackIterator = stack.StackIterator;
makeStackIterator = stack.makeStackIterator;
s1 = makeStack(int);
s1->push(1);
s1->push(2);
s1->push(3);
print(toString(s1), "\n");
iter = makeIterator(s1);
print(toString(iter), "\n");
while (val, key = iter->next()) != none:
print(key, " => ", val, "\n");