Deeper lookup
This commit is contained in:
parent
fccc3b4f8c
commit
730d2ff638
32
src/eval.c
32
src/eval.c
|
@ -9,7 +9,7 @@
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
static struct Object *lookup(struct Object *namespace, struct Object *name);
|
static struct Object *lookup(struct Object *environment, struct Object *name);
|
||||||
|
|
||||||
static struct Object *eval_list(
|
static struct Object *eval_list(
|
||||||
struct Object *object,
|
struct Object *object,
|
||||||
|
@ -21,13 +21,12 @@ struct Object *eval(
|
||||||
struct Object *const environment
|
struct Object *const environment
|
||||||
) {
|
) {
|
||||||
assert(Object_is_pair(environment));
|
assert(Object_is_pair(environment));
|
||||||
assert(OBJECT_IS_NULL(environment->pair.cdr));
|
|
||||||
|
|
||||||
// NULL is an empty list, can't eval
|
// NULL is an empty list, can't eval
|
||||||
assert(!OBJECT_IS_NULL(object));
|
assert(!OBJECT_IS_NULL(object));
|
||||||
|
|
||||||
// SYMBOL performs lookup
|
// SYMBOL performs lookup
|
||||||
if (Object_is_symbol(object)) return lookup(environment->pair.car, object);
|
if (Object_is_symbol(object)) return lookup(environment, object);
|
||||||
|
|
||||||
// Almost everything evaluates to itself
|
// Almost everything evaluates to itself
|
||||||
if (!Object_is_pair(object)) return object;
|
if (!Object_is_pair(object)) return object;
|
||||||
|
@ -77,18 +76,27 @@ struct Object *eval_list(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Object *lookup(struct Object *namespace, struct Object *const name)
|
struct Object *lookup(struct Object *environment, struct Object *const name)
|
||||||
{
|
{
|
||||||
assert(OBJECT_IS_LIST_HEAD(namespace));
|
assert(OBJECT_IS_LIST_HEAD(environment));
|
||||||
assert(Object_is_symbol(name));
|
assert(Object_is_symbol(name));
|
||||||
|
|
||||||
while (!OBJECT_IS_NULL(namespace)) {
|
while (!OBJECT_IS_NULL(environment)) {
|
||||||
assert(Object_is_pair(namespace));
|
assert(Object_is_pair(environment));
|
||||||
struct Object *const item = namespace->pair.car;
|
struct Object *namespace = environment->pair.car;
|
||||||
assert(Object_is_pair(item));
|
|
||||||
assert(Object_is_symbol(item->pair.car));
|
while (!OBJECT_IS_NULL(namespace)) {
|
||||||
if (strcmp(item->pair.car->s, name->s) == 0) return item->pair.cdr;
|
assert(Object_is_pair(namespace));
|
||||||
namespace = namespace->pair.cdr;
|
struct Object *const item = namespace->pair.car;
|
||||||
|
|
||||||
|
assert(Object_is_pair(item));
|
||||||
|
assert(Object_is_symbol(item->pair.car));
|
||||||
|
if (strcmp(item->pair.car->s, name->s) == 0) return item->pair.cdr;
|
||||||
|
|
||||||
|
namespace = namespace->pair.cdr;
|
||||||
|
}
|
||||||
|
|
||||||
|
environment = environment->pair.cdr;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Object *const builtin_procedure = builtins_get(name->s);
|
struct Object *const builtin_procedure = builtins_get(name->s);
|
||||||
|
|
Loading…
Reference in New Issue