1
0
Fork 0

Add some predicates

This commit is contained in:
Alex Kotov 2023-05-04 23:00:00 +04:00
parent ad15acd3e0
commit 4d5b9d2be8
Signed by: kotovalexarian
GPG key ID: 553C0EBBEB5D5F08
4 changed files with 143 additions and 138 deletions

View file

@ -164,7 +164,7 @@ struct Object *func_not(struct Object *args)
assert(args->type == TYPE_PAIR);
assert(args->pair.b == NULL);
return Object_new_boolean(IS_FALSE(args->pair.a));
return Object_new_boolean(Object_is_false(args->pair.a));
}
/******

210
main.c
View file

@ -187,47 +187,41 @@ void test()
void test_booleanQN()
{
struct Object *result = NULL;
// (boolean? '())
// #f
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("boolean?"),
NULL
));
assert(IS_FALSE(result));
))));
// (boolean? #t)
// #t
result = eval(Object_build_list(
assert(Object_is_true(eval(Object_build_list(
2,
Object_new_symbol("boolean?"),
Object_new_boolean(true)
));
assert(IS_TRUE(result));
))));
// (boolean? #f)
// #t
result = eval(Object_build_list(
assert(Object_is_true(eval(Object_build_list(
2,
Object_new_symbol("boolean?"),
Object_new_boolean(false)
));
assert(IS_TRUE(result));
))));
// (boolean? #\n)
// #f
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("boolean?"),
Object_new_char('\n')
));
assert(IS_FALSE(result));
))));
// (boolean? 'foo)
// #f
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("boolean?"),
Object_build_list(
@ -235,83 +229,73 @@ void test_booleanQN()
Object_new_symbol("quote"),
Object_new_symbol("foo")
)
));
assert(IS_FALSE(result));
))));
// (boolean? "foo")
// #f
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("boolean?"),
Object_new_string("foo")
));
assert(IS_FALSE(result));
))));
// (boolean? 123)
// #f
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("boolean?"),
Object_new_number(123)
));
assert(IS_FALSE(result));
))));
// (boolean? (cons 123 456))
// #f
// TODO
/*
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("boolean?"),
Object_new_pair(Object_new_number(123), Object_new_number(456))
));
assert(IS_FALSE(result));
))));
*/
}
void test_charQN()
{
struct Object *result = NULL;
// (char? '())
// #f
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("char?"),
NULL
));
assert(IS_FALSE(result));
))));
// (char? #t)
// #f
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("char?"),
Object_new_boolean(true)
));
assert(IS_FALSE(result));
))));
// (char? #f)
// #f
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("char?"),
Object_new_boolean(false)
));
assert(IS_FALSE(result));
))));
// (char? #\n)
// #t
result = eval(Object_build_list(
assert(Object_is_true(eval(Object_build_list(
2,
Object_new_symbol("char?"),
Object_new_char('\n')
));
assert(IS_TRUE(result));
))));
// (char? 'foo)
// #f
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("char?"),
Object_build_list(
@ -319,83 +303,73 @@ void test_charQN()
Object_new_symbol("quote"),
Object_new_symbol("foo")
)
));
assert(IS_FALSE(result));
))));
// (char? "foo")
// #f
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("char?"),
Object_new_string("foo")
));
assert(IS_FALSE(result));
))));
// (char? 123)
// #f
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("char?"),
Object_new_number(123)
));
assert(IS_FALSE(result));
))));
// (char? (cons 123 456))
// #f
// TODO
/*
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("char?"),
Object_new_pair(Object_new_number(123), Object_new_number(456))
));
assert(IS_FALSE(result));
))));
*/
}
void test_nullQN()
{
struct Object *result = NULL;
// (null? '())
// #t
result = eval(Object_build_list(
assert(Object_is_true(eval(Object_build_list(
2,
Object_new_symbol("null?"),
NULL
));
assert(IS_TRUE(result));
))));
// (null? #t)
// #f
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("null?"),
Object_new_boolean(true)
));
assert(IS_FALSE(result));
))));
// (null? #f)
// #f
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("null?"),
Object_new_boolean(false)
));
assert(IS_FALSE(result));
))));
// (null? #\n)
// #f
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("null?"),
Object_new_char('\n')
));
assert(IS_FALSE(result));
))));
// (null? 'foo)
// #f
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("null?"),
Object_build_list(
@ -403,83 +377,73 @@ void test_nullQN()
Object_new_symbol("quote"),
Object_new_symbol("foo")
)
));
assert(IS_FALSE(result));
))));
// (null? "foo")
// #f
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("null?"),
Object_new_string("foo")
));
assert(IS_FALSE(result));
))));
// (null? 123)
// #f
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("null?"),
Object_new_number(123)
));
assert(IS_FALSE(result));
))));
// (null? (cons 123 456))
// #f
// TODO
/*
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("null?"),
Object_new_pair(Object_new_number(123), Object_new_number(456))
));
assert(IS_FALSE(result));
))));
*/
}
void test_numberQN()
{
struct Object *result = NULL;
// (number? '())
// #f
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("number?"),
NULL
));
assert(IS_FALSE(result));
))));
// (number? #t)
// #f
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("number?"),
Object_new_boolean(true)
));
assert(IS_FALSE(result));
))));
// (number? #f)
// #f
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("number?"),
Object_new_boolean(false)
));
assert(IS_FALSE(result));
))));
// (number? #\n)
// #f
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("number?"),
Object_new_char('\n')
));
assert(IS_FALSE(result));
))));
// (number? 'foo)
// #f
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("number?"),
Object_build_list(
@ -487,83 +451,73 @@ void test_numberQN()
Object_new_symbol("quote"),
Object_new_symbol("foo")
)
));
assert(IS_FALSE(result));
))));
// (number? "foo")
// #f
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("number?"),
Object_new_string("foo")
));
assert(IS_FALSE(result));
))));
// (number? 123)
// #t
result = eval(Object_build_list(
assert(Object_is_true(eval(Object_build_list(
2,
Object_new_symbol("number?"),
Object_new_number(123)
));
assert(IS_TRUE(result));
))));
// (number? (cons 123 456))
// #f
// TODO
/*
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("number?"),
Object_new_pair(Object_new_number(123), Object_new_number(456))
));
assert(IS_FALSE(result));
))));
*/
}
void test_not()
{
struct Object *result = NULL;
// (not '())
// #f
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("not"),
NULL
));
assert(IS_FALSE(result));
))));
// (not #t)
// #f
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("not"),
Object_new_boolean(true)
));
assert(IS_FALSE(result));
))));
// (not #f)
// #t
result = eval(Object_build_list(
assert(Object_is_true(eval(Object_build_list(
2,
Object_new_symbol("not"),
Object_new_boolean(false)
));
assert(IS_TRUE(result));
))));
// (not #\n)
// #f
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("not"),
Object_new_char('\n')
));
assert(IS_FALSE(result));
))));
// (not 'foo)
// #f
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("not"),
Object_build_list(
@ -571,36 +525,32 @@ void test_not()
Object_new_symbol("quote"),
Object_new_symbol("foo")
)
));
assert(IS_FALSE(result));
))));
// (not "foo")
// #f
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("not"),
Object_new_string("foo")
));
assert(IS_FALSE(result));
))));
// (not 123)
// #f
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("not"),
Object_new_number(123)
));
assert(IS_FALSE(result));
))));
// (not (cons 123 456))
// #f
// TODO
/*
result = eval(Object_build_list(
assert(Object_is_false(eval(Object_build_list(
2,
Object_new_symbol("not"),
Object_new_pair(Object_new_number(123), Object_new_number(456))
));
assert(IS_FALSE(result));
))));
*/
}

View file

@ -105,6 +105,56 @@ struct Object *Object_build_list(int count, ...)
return list;
}
bool Object_is_null(struct Object *object)
{
return object == NULL;
}
bool Object_is_procedure(struct Object *object)
{
return object && object->type == TYPE_PROCEDURE;
}
bool Object_is_pair(struct Object *object)
{
return object && object->type == TYPE_PAIR;
}
bool Object_is_boolean(struct Object *object)
{
return object && object->type == TYPE_BOOLEAN;
}
bool Object_is_char(struct Object *object)
{
return object && object->type == TYPE_CHAR;
}
bool Object_is_symbol(struct Object *object)
{
return object && object->type == TYPE_SYMBOL;
}
bool Object_is_string(struct Object *object)
{
return object && object->type == TYPE_STRING;
}
bool Object_is_number(struct Object *object)
{
return object && object->type == TYPE_NUMBER;
}
bool Object_is_false(struct Object *object)
{
return Object_is_boolean(object) && object->boolean == false;
}
bool Object_is_true(struct Object *object)
{
return Object_is_boolean(object) && object->boolean == true;
}
void Object_print(struct Object *const self, const unsigned indent)
{
for (unsigned index = 0; index < indent; ++index) {

View file

@ -6,13 +6,6 @@
#include <stdbool.h>
#include <stdint.h>
#define IS_TRUE(object) \
((object != NULL) && (object)->type == TYPE_BOOLEAN && (object)->boolean)
#define IS_FALSE(object) \
((object != NULL) && (object)->type == TYPE_BOOLEAN && !(object)->boolean)
#define IS_TRUTHY(object) (!IS_FALSE(object))
struct Object {
enum Type type;
union {
@ -49,6 +42,18 @@ struct Object *Object_new_number(int64_t i);
struct Object *Object_build_list(int count, ...);
bool Object_is_null(struct Object *object);
bool Object_is_procedure(struct Object *object);
bool Object_is_pair(struct Object *object);
bool Object_is_boolean(struct Object *object);
bool Object_is_char(struct Object *object);
bool Object_is_symbol(struct Object *object);
bool Object_is_string(struct Object *object);
bool Object_is_number(struct Object *object);
bool Object_is_false(struct Object *object);
bool Object_is_true(struct Object *object);
void Object_print(struct Object *self, unsigned indent);
#endif