#include <gc.h>
#include <gmp.h>
-// Example S-exprs
-// https://www.hboehm.info/gc/04tutorial.pdf
-
-typedef union se
-{
- struct cons * cp;
- mpz_t i;
-} sexpr;
-struct cons
-{
- union se head;
- union se tail;
+enum JoyTypeType {
+ joySymbol,
+ joyTrue,
+ joyFalse,
+ joyInt,
+ joyList
};
-#define car(s) (s).cp->head
-#define cdr(s) (s).cp->tail
-#define from_i(z) ({sexpr tmp; tmp.i=z; tmp;})
-#define to_i(s) (s).i
+typedef struct list_node* JoyList;
-sexpr cons(sexpr a, sexpr b) {
- sexpr tmp = {GC_MALLOC(sizeof(struct cons))};
- car(tmp) = a; cdr(tmp) = b;
- return (tmp);
-};
+typedef struct JoyType {
+ enum JoyTypeType kind;
+ union {
+ int b; // bool
+ mpz_t i;
+ JoyList el;
+ };
+} name ;
+
+typedef struct list_node {
+ struct JoyType head;
+ struct list_node* tail;
+} *JoyList;
+
+
+// Example S-exprs
+// https://www.hboehm.info/gc/04tutorial.pdf
+/**/
+/*typedef union se*/
+/*{*/
+/* struct cons * cp;*/
+/* mpz_t i;*/
+/*} sexpr;*/
+/**/
+/*struct cons*/
+/*{*/
+/* union se head;*/
+/* union se tail;*/
+/*};*/
+/**/
+/*#define car(s) (s).cp->head*/
+/*#define cdr(s) (s).cp->tail*/
+/*#define from_i(z) ({sexpr tmp; tmp.i=z; tmp;})*/
+/*#define to_i(s) (s).i*/
+/**/
+/*sexpr cons(sexpr a, sexpr b) {*/
+/* sexpr tmp = {GC_MALLOC(sizeof(struct cons))};*/
+/* car(tmp) = a; cdr(tmp) = b;*/
+/* return (tmp);*/
+/*};*/
void* reallocate_function (void *ptr, size_t old_size, size_t new_size) {
return GC_realloc(ptr, new_size);
mpz_clear(*obj);
}
-sexpr new_int(void) {
- sexpr tmp = {GC_MALLOC(sizeof(struct cons))};
- mpz_init(tmp.i);
- GC_register_finalizer(tmp.i, my_callback, NULL, NULL, NULL);
- return (tmp);
-}
+/*sexpr new_int(void) {*/
+/* sexpr node = {GC_MALLOC(sizeof(struct cons))};*/
+/* mpz_init(node.i);*/
+/* GC_register_finalizer(node.i, my_callback, NULL, NULL, NULL);*/
+/* return (node);*/
+/*}*/
int main(void)
mpz_init_set_str (pi, "25d0c79fe247f31777d922627a74624", 16);
gmp_printf ("%Zd = %Zx\n", pi, pi);
GC_register_finalizer(pi, my_callback, NULL, NULL, NULL);
-
- sexpr i = new_int();
- mpz_add(i.i, pi, pi);
- gmp_printf ("%Zd\n", i.i);
+
+ /*sexpr i = new_int();*/
+ /*mpz_add(i.i, pi, pi);*/
+ /*gmp_printf ("%Zd\n", i.i);*/
return 0;
//return to_i(car(cons(from_i(0),from_i(1))));