Advertisement
Guest User

Untitled

a guest
May 20th, 2018
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.89 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "p99/p99_id.h"
  5.  
  6. typedef struct {
  7.     char** n_;
  8.     void*** v_;
  9.     int l;
  10. } closure;
  11.  
  12. #define LAMBDA__L(t, arg, esc) \
  13.          ({void* t(closure *env_, void* arg) {append_(env_, arg, ""#arg); closure* clos_par = env_; esc;} \
  14.           (void*)t;})
  15.  
  16. #define function(arg, esc) LAMBDA__L(P99_UNIQ(LAMBDA_FUNCTION_L), arg, esc)
  17. #define eval(func_lambda, x) ((void*(*)(void*, void*)) func_lambda) (env_, x)
  18. #define LAMBDA(x) ({closure* env_ = lambda__(); x;})
  19. #define $(x) s_search(clos_par, ""#x)
  20. #define L_FUNCTION void*
  21.  
  22. closure* lambda__() {
  23.      closure* env_ = malloc(sizeof(closure));
  24.      env_->n_ = malloc(sizeof(char*));
  25.      env_->v_ = malloc(sizeof(void*[2]));
  26.      env_->l = 0;
  27.     return env_;
  28. }
  29.  
  30. void append_(closure* closure_, void* arg, char* n) {
  31.     char* s = malloc(sizeof(char*)*100);
  32.     *(closure_->v_ + closure_->l) = malloc(sizeof(void*)*2);
  33.     strncpy(s, n, strlen(n));
  34.     memcpy(*(closure_->v_ + closure_->l), (void*[2]){arg, (void*)s}, sizeof(void*)*2);
  35.     closure_->v_ = realloc(closure_->v_, sizeof(void*[2])*++closure_->l);
  36.     //if (closure_->l >= 10000) {printf("\nLAMBDA FUNCTION: STACKOVERFLOR\n"); exit(EXIT_SUCCESS);}
  37. }
  38.  
  39. void* s_search(closure* closure__, char* par) {
  40.     int i = 0;
  41.     for (void** p =  *closure__->v_; i <= (closure__->l-1); p++) {
  42.         if (strcmp(par, (char*)*(*(closure__->v_ + i) + 1)) == 0) {
  43.             return **(closure__->v_ + i);
  44.         }
  45.         i++;
  46.     }
  47.   printf("LAMBDA FUNCTION: PARAMETER %s DON'T FOUND\n", par);
  48.   exit(EXIT_SUCCESS);
  49.   return NULL;
  50. }
  51.  
  52. int main() {  
  53.   int* d = malloc(sizeof(int));
  54.   (*d) = 234;
  55.   int* x = malloc(sizeof(int));
  56.   (*x) = 100;
  57.    
  58.     void* t = function(x, return function(y, return function(_, return eval(eval($(_), $(y)), $(x)););););
  59.     void* first = function(l, return function(e, return $(l);););
  60.     void* f = LAMBDA(
  61.         eval(eval(eval(t, d), x), first);
  62.     );
  63.  
  64.   return 0;
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement