Login
7 branches 0 tags
Ben (X13/Void) Removed [**] alias, use [pow] instead 14527fa 3 years ago 492 Commits
nujel / lib / operation / predicates.c
/* Nujel - Copyright (C) 2020-2021 - Benjamin Vincent Schulenburg
 * This project uses the MIT license, a copy should be included under /LICENSE
 */
#include "../operation.h"

#include "../nujel.h"
#include "../type-system.h"
#include "../collection/list.h"
#include "../collection/string.h"
#include "../type/native-function.h"
#include "../type/symbol.h"
#include "../type/val.h"

#include <ctype.h>
#include <math.h>
#include <stdio.h>

static lVal *lnfLess(lClosure *c, lVal *v){
	(void)c;
	const int cmp = lValCompare(lCar(v), lCadr(v));
	return lValBool(cmp == 2 ? false : cmp < 0);
}

static lVal *lnfUnequal(lClosure *c, lVal *v){
	(void)c;
	const int cmp = lValCompare(lCar(v), lCadr(v));
	return lValBool(!(cmp == 2 ? false : cmp == 0));
}

static lVal *lnfEqual(lClosure *c, lVal *v){
	(void)c;
	const int cmp = lValCompare(lCar(v), lCadr(v));
	return lValBool(cmp == 2 ? false : cmp == 0);
}

static lVal *lnfLessEqual(lClosure *c, lVal *v){
	(void)c;
	const int cmp = lValCompare(lCar(v), lCadr(v));
	return lValBool(cmp == 2 ? false : cmp <= 0);
}

static lVal *lnfGreater(lClosure *c, lVal *v){
	(void)c;
	const int cmp = lValCompare(lCar(v), lCadr(v));
	return lValBool(cmp == 2 ? false : cmp > 0);
}

static lVal *lnfGreaterEqual(lClosure *c, lVal *v){
	(void)c;
	const int cmp = lValCompare(lCar(v), lCadr(v));
	return lValBool(cmp == 2 ? false : cmp >= 0);
}

static lVal *lnfNilPred(lClosure *c, lVal *v){
	(void)c;
	return lValBool(lCar(v) == NULL);
}

static lVal *lnfKeywordPred(lClosure *c, lVal *v){
	(void)c;
	lVal *car = lCar(v);
	return lValBool(car ? car->type == ltKeyword : false);
}

void lOperationsPredicate(lClosure *c){
	lAddNativeFunc(c,"<",    "[α β]","Return true if α is less than β",  lnfLess);
	lAddNativeFunc(c,"<=",   "[α β]","Return true if α is less or equal to β", lnfLessEqual);
	lAddNativeFunc(c,"==",   "[α β]","Return true if α is equal to β", lnfEqual);
	lAddNativeFunc(c,"!=",   "[α β]","Return true if α is not equal to  β", lnfUnequal);
	lAddNativeFunc(c,">=",   "[α β]","Return true if α is greater or equal than β", lnfGreaterEqual);
	lAddNativeFunc(c,">",    "[α β]","Return true if α is greater than β",  lnfGreater);
	lAddNativeFunc(c,"nil?", "[α]",  "Return true if α is #nil", lnfNilPred);
	lAddNativeFunc(c,"keyword?", "[α]",  "Return true if α is a keyword symbol", lnfKeywordPred);
}