withMulklib working the first time
[lazyeval.git] / withMulklib.c
index f8c4b34..1da0e37 100644 (file)
@@ -10,6 +10,8 @@
 #define __USE_GNU
 #include <ucontext.h>
 
+#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));
 }