X-Git-Url: http://uxul.de/gitweb/?p=lazyeval.git;a=blobdiff_plain;f=withMulklib.c;fp=withMulklib.c;h=1da0e37f5aa396a669b7cde2c2298750f6753ade;hp=f8c4b341d5224a99faff8a42d977b3dc4c6d11e9;hb=9f57f92b36f36e6dfac6dd702432cbb4c8515f2b;hpb=551dec71ea4a993089a4b72ceb667a50ba3b6f92 diff --git a/withMulklib.c b/withMulklib.c index f8c4b34..1da0e37 100644 --- a/withMulklib.c +++ b/withMulklib.c @@ -10,6 +10,8 @@ #define __USE_GNU #include +#include "lists.h" + /* This code is only for x86_64 gcc linux. It is NOT threadsafe. */ void* slice_alloc (size_t length) { @@ -105,6 +107,8 @@ void*** lazy_alloc (void* (*calculate) (void*), void* opt) { return ret; } +void initializeSignalHandler(); + void handle_segv(int segv, siginfo_t* siginfo, void* ucontext) { ucontext_t* uc = (ucontext_t*) ucontext; @@ -213,7 +217,7 @@ void handle_segv(int segv, siginfo_t* siginfo, void* ucontext) { intptr_t address = uc->uc_mcontext.gregs[setreg]; if (!bpt_has_key(pointer_tree, address)) { - printf("Address not found in Patricia tree.\n"); + printf("Address not found in Patricia tree: %d.\n", address); exit(-1); } @@ -229,20 +233,46 @@ inline void initializeSignalHandler () { struct sigaction q; bzero(&q, sizeof(q)); q.sa_sigaction = handle_segv; - q.sa_flags = SA_SIGINFO; + q.sa_flags = SA_SIGINFO | SA_NODEFER; sigaction(11, &q, NULL); } -void *calculateLazy24 (void* bla) { - int* ret = (int*) slice_alloc (sizeof(int)); - *ret = 42; +typedef struct { + int i; + int (*fun) (int, list); + list initial; +} listComprehensionRecursorR; + +void * listComprehensionRecursor (void* x) { + listComprehensionRecursorR* lcr = (listComprehensionRecursorR*) x; + int value = (lcr->fun)(lcr->i, lcr->initial); + lcr->i++; + + list cdr = (list) lazy_alloc(listComprehensionRecursor, (void*)lcr); + cons * ret = (cons*) slice_alloc(sizeof(cons)); + doCons(value, cdr, ret); return (void*) ret; } +list listComprehension (int (*fun) (int, list)) { + listComprehensionRecursorR* lcr = + (listComprehensionRecursorR*) slice_alloc + (sizeof(listComprehensionRecursorR)); + lcr->i = 0; + lcr->fun=fun; + lcr->initial = (list) lazy_alloc(listComprehensionRecursor, (void*)lcr); + return lcr->initial; +} + +int fib (int x, list l) { + return x == 0 ? 0 : (x == 1 ? 1 : elt(l, x-1) + elt(l, x-2)); +} + int main (void) { initializePointerTree (); initializeSignalHandler (); - void *** lazy42 = lazy_alloc(calculateLazy24, NULL); - printf("%d\n", **((int**)lazy42)); - + list lst = listComprehension(fib); + int i; + for (i = 0; i < 10; i++) + printf("%d\n", elt(lst, i)); }