Joy in UVM NCC code.
This commit is contained in:
parent
5b6185209a
commit
fd2ba3b67d
|
|
@ -0,0 +1,109 @@
|
||||||
|
#include <uvm/syscalls.h>
|
||||||
|
// In the Thun dialect of Joy we have four types of values:
|
||||||
|
// Integers, Booleans, Symbols, and Lists.
|
||||||
|
// We don't have Unions, Enums, or Typedefs.
|
||||||
|
//
|
||||||
|
// So how do we represent Joy types?
|
||||||
|
//
|
||||||
|
// In SICP they use a pair of arrays of pointers, one for heads and one
|
||||||
|
// for tails.
|
||||||
|
|
||||||
|
#define HEAP_SIZE 1024
|
||||||
|
|
||||||
|
u32 heads[HEAP_SIZE];
|
||||||
|
u32 tails[HEAP_SIZE];
|
||||||
|
|
||||||
|
// > A pointer to a pair is an index into the two vectors.
|
||||||
|
|
||||||
|
u32 free = 0;
|
||||||
|
|
||||||
|
// > We also need a representation for objects other than pairs (such as
|
||||||
|
// numbers and symbols) and a way to distinguish one kind of data from
|
||||||
|
// another. There are many methods of accomplishing this, but they all
|
||||||
|
// reduce to using typed pointers, that is, to extending the notion of
|
||||||
|
// ``pointer'' to include information on data type.
|
||||||
|
|
||||||
|
#define TYPE_OF(pointer) (pointer >> 30)
|
||||||
|
#define VALUE_OF(pointer) (pointer & 0x3fffffff)
|
||||||
|
#define JOY_VALUE(type, value) ((type & 3) << 30) | (value & 0x3fffffff)
|
||||||
|
|
||||||
|
u8 joyInt = 0;
|
||||||
|
u8 joyList = 1;
|
||||||
|
u8 joySymbol = 2;
|
||||||
|
u8 joyBool = 3;
|
||||||
|
|
||||||
|
u32 empty_list = 0x3fffffff;
|
||||||
|
|
||||||
|
u32
|
||||||
|
cons(u32 head, u32 tail)
|
||||||
|
{
|
||||||
|
if (free >= HEAP_SIZE)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
heads[free] = head;
|
||||||
|
tails[free] = tail;
|
||||||
|
u32 cell = JOY_VALUE(joyList, free);
|
||||||
|
++free;
|
||||||
|
return cell;
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 head(u32 list) { return heads[VALUE_OF(list)]; }
|
||||||
|
u32 tail(u32 list) { return tails[VALUE_OF(list)]; }
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
print_joy_value(u32 jv)
|
||||||
|
{
|
||||||
|
u8 type = TYPE_OF(jv);
|
||||||
|
if (type == joyInt) {
|
||||||
|
print_i64(VALUE_OF(jv));
|
||||||
|
} else if (type == joyBool) {
|
||||||
|
print_str(VALUE_OF(jv) ? "true" : "false");
|
||||||
|
} else if (type == joyList) {
|
||||||
|
print_str("[");
|
||||||
|
print_joy_list(jv);
|
||||||
|
print_str("]");
|
||||||
|
} else if (type == joySymbol) {
|
||||||
|
// print_str(symbols[VALUE_OF(jv)]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
print_joy_list(u32 list)
|
||||||
|
{
|
||||||
|
if (TYPE_OF(list) != joyList) {
|
||||||
|
1/0;
|
||||||
|
}
|
||||||
|
while (list != empty_list) {
|
||||||
|
print_joy_value(head(list));
|
||||||
|
list = tail(list);
|
||||||
|
if (list != empty_list) {
|
||||||
|
print_str(" ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
u32 joy_true = JOY_VALUE(joyBool, 1);
|
||||||
|
u32 joy_false = JOY_VALUE(joyBool, 0);
|
||||||
|
|
||||||
|
u32 el = empty_list;
|
||||||
|
el = cons(48, el);
|
||||||
|
el = cons(el, el);
|
||||||
|
|
||||||
|
u32 stack = empty_list;
|
||||||
|
|
||||||
|
stack = cons(23, stack);
|
||||||
|
stack = cons(joy_true, stack);
|
||||||
|
stack = cons(42, stack);
|
||||||
|
stack = cons(el, stack);
|
||||||
|
stack = cons(joy_false, stack);
|
||||||
|
stack = cons(273, stack);
|
||||||
|
print_joy_list(stack);
|
||||||
|
print_endl();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Loading…
Reference in New Issue