Return Styles: Pseud0ch, Terminal, Valhalla, NES, Geocities, Blue Moon. Entire thread

Greenspun's Tenth Rule

Name: Anonymous 2014-04-25 11:23


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

void *apply(void *callee, int argc, void *argv) {
void **as = (void**)argv;
void *(*f)(void *a,...) = (void *(*)(void *a, ...))callee;

switch(argc) {
case 0: return ((void* (*)())f)();
case 1: return f(as[0]);
case 2: return f(as[0], as[1]);
case 3: return f(as[0], as[1], as[2]);
case 4: return f(as[0], as[1], as[2], as[3]);
default:
printf("apply: number of arguments limit reached\n");
abort();
}
}

int main(int argc, char **argv) {
char *as[] = {"hello %s\n" , "world"};
apply(printf, 2, as);
return 0;
}

Name: Anonymous 2014-04-25 13:31

you'll cowards don't even eval

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

typedef struct datum datum;
struct datum {
enum {ATOM, STR, SEXP, QUOTE, NIL} tag;
union {
char *str;
datum *sexp;
};
};

void *apply(void *callee, int argc, void *argv) {
void **as = (void**)argv;
void *(*f)(void *a,...) = (void *(*)(void *a, ...))callee;

switch(argc) {
case 0: return ((void* (*)())f)();
case 1: return f(as[0]);
case 2: return f(as[0], as[1]);
case 3: return f(as[0], as[1], as[2]);
case 4: return f(as[0], as[1], as[2], as[3]);
case 5: return f(as[0], as[1], as[2], as[3], as[4]);
case 6: return f(as[0], as[1], as[2], as[3], as[4], as[5]);
case 7: return f(as[0], as[1], as[2], as[3], as[4], as[5], as[6]);
default:
printf("apply: number of arguments limit reached\n");
abort();
}
}

void *eval(datum *sexp) {
void *val[8];
int i;

switch(sexp->tag) {
case ATOM:
if(!strcmp(sexp->str, "printf")) {
return printf;
}
else { puts("PROGRAMMER ERRROR"); exit(-1); }
case STR:
return sexp->str;
case QUOTE:
return sexp->sexp;
case NIL:
return sexp;
case SEXP:
{
datum *list = sexp->sexp;
for(i = 0; list[i].tag != NIL; i++) {
val[i] = eval(list+i);
}
apply(*val, i-1, val+1);
}
}
}

int main(int argc, char **argv) {
datum as[] = { { .tag = ATOM, .str = "printf" }, { .tag = STR, .str = "hello %s\n" }, { .tag = STR, .str = "world" }, { .tag = NIL } };
datum apple = { .tag = SEXP, .sexp = as };

eval(&apple);
return 0;
}

Newer Posts
Don't change these.
Name: Email:
Entire Thread Thread List