#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

#define setarr(a)  [sizeof(a)-1] = (a) // remove NULL from end of string 

void my_char_plus(const void *a, const void *b, void *c)
{
  char tmp =  (*(char*)a + *(char*)b);
  memcpy(c,(void*)(&tmp),sizeof(char));
}

void my_char_minus(const void *a, const void *b, void *c)
{
  char tmp =  (*(char*)a - *(char*)b);
  memcpy(c,(void*)(&tmp),sizeof(char));
}



void operation(const void *funct(const void*,const void*,void*),
                      const void *a, const void *b, void *c )
{
  funct(a,b,c);
}

char ret_last_arg(const void *funct(const void*,const void*,void*),
                      const void *a, const void *b)
{
  char c;
  funct(a,b,(void*)&c);
  return c;
}



int main(void)
{

  char a, b;
  a = 5; b = 7;
  
  
  void *plus = &my_char_plus; char c;
  operation(plus, (const void*)&a, (const void*)&b, (void*)&c);
  printf("5 + 7 = %i\n", c);
  
  
  void *minus = &my_char_minus;
  char d = ret_last_arg(minus, (const void*)&a, (const void*)&b);
  printf("5 - 7 = %i\n", d);
  
  
// LISP LISP LISP
#define LISP(ar,aa,bb) ret_last_arg(ar, (const void*)&(char){aa}, (const void*)&(char){bb} )

  char e = LISP(plus,2,LISP(plus,2,2));
  printf("( + 2 ( + 2 2 ) = %i\n", e);
  
  return 0;
}