Add some predicates
This commit is contained in:
parent
ad15acd3e0
commit
4d5b9d2be8
4 changed files with 143 additions and 138 deletions
|
@ -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
210
main.c
|
@ -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));
|
||||
))));
|
||||
*/
|
||||
}
|
||||
|
|
50
object.c
50
object.c
|
@ -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) {
|
||||
|
|
19
object.h
19
object.h
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue