From: Simon Forman Date: Fri, 23 Sep 2022 02:00:40 +0000 (-0700) Subject: Maybe this is the right thing to do? X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=5ceab61ca11497f4822af33959431f5ab3d39142;p=joypy%2FThun.git Maybe this is the right thing to do? https://stackoverflow.com/questions/59489221/using-the-gmp-library-with-boehms-garbage-collector --- diff --git a/implementations/C/Makefile b/implementations/C/Makefile index 899fe35..224efae 100644 --- a/implementations/C/Makefile +++ b/implementations/C/Makefile @@ -1,5 +1,6 @@ COPTS=-I/usr/local/include +STATIC_GCLIB=/usr/local/lib/libgc.a /usr/local/lib/libgmp.a joy: joy.c - cc $(COPTS) joy.c -o joy + cc $(COPTS) joy.c $(STATIC_GCLIB) -o joy diff --git a/implementations/C/joy b/implementations/C/joy index af5e20f..424aade 100755 Binary files a/implementations/C/joy and b/implementations/C/joy differ diff --git a/implementations/C/joy.c b/implementations/C/joy.c index 3ba565f..25664fa 100644 --- a/implementations/C/joy.c +++ b/implementations/C/joy.c @@ -1,8 +1,46 @@ #include #include +// 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); +} +void deallocate_function (void *ptr, size_t size) { + GC_free(ptr); +} int main(void) { + mp_set_memory_functions( + &GC_malloc, + &reallocate_function, + &deallocate_function + ); return 0; + //return to_i(car(cons(from_i(0),from_i(1)))); }