closures in c
Name:
Anonymous
2012-01-25 2:28
thou shalt always accompany a call back with a void* argument that may be used arbitrarily by the caller:
void kind_values(struct relation* self, char* key, void(*call_back)(void* userdata, char* value), void* userdata) {
for(char* value matching key in self) {
call_back(userdata, value);
}
}
and thou shalt have the satisfaction of passing a closure through the stack.
Name:
Anonymous
2012-01-25 2:32
(defun nigger (nig)
(lambda (nigga)
(return nigga))
nig)
Your code is ass.
Name:
Anonymous
2012-01-25 2:44
>>2
I find your choices of variables names to be offensive, allow me to optimize it:
(defun f (x) x) ;; lisp
(define (f x) x) ;; scheme
function (x) return x end -- lua
function (x) { return x; } -- javascript
template <typename T> // seeples
T f(T x) {
return x;
}
class IdentityFunction<T> { // Java
public T f(T x) {
return T;
}
}
{} %% postscript
sub { return shift; } ## perl
#define DEFINE_IDENTITY_FUNCTION(TYPE,TYPENAME) TYPENAME f_##TYPE(TYPENAME x) { return x; }
DEFINE_IDENTITY_FUNCTION(char,char)
DEFINE_IDENTITY_FUNCTION(int,int)
DEFINE_IDENTITY_FUNCTION(float,float)
DEFINE_IDENTITY_FUNCTION(double,double)
DEFINE_IDENTITY_FUNCTION(long,long)
DEFINE_IDENTITY_FUNCTION(long_long,long long)
// see
Name:
Anonymous
2012-01-25 6:06
JJJJJJJJJJJEEEEEEEEEEEEEEEEEEEEEEWWWWWWWW WWWWWWWW SSSSSSSSSSSSSSS
J:::::::::JE::::::::::::::::::::EW::::::W W::::::W SS:::::::::::::::S
J:::::::::JE::::::::::::::::::::EW::::::W W::::::WS:::::SSSSSS::::::S
JJ:::::::JJEE::::::EEEEEEEEE::::EW::::::W W::::::WS:::::S SSSSSSS
J:::::J E:::::E EEEEEE W:::::W WWWWW W:::::W S:::::S
J:::::J E:::::E W:::::W W:::::W W:::::W S:::::S
J:::::J E::::::EEEEEEEEEE W:::::W W:::::::W W:::::W S::::SSSS
J:::::j E:::::::::::::::E W:::::W W:::::::::W W:::::W SS::::::SSSSS
J:::::J E:::::::::::::::E W:::::W W:::::W:::::W W:::::W SSS::::::::SS
JJJJJJJ J:::::J E::::::EEEEEEEEEE W:::::W W:::::W W:::::W W:::::W SSSSSS::::S
J:::::J J:::::J E:::::E W:::::W:::::W W:::::W:::::W S:::::S
J::::::J J::::::J E:::::E EEEEEE W:::::::::W W:::::::::W S:::::S
J:::::::JJJ:::::::J EE::::::EEEEEEEE:::::E W:::::::W W:::::::W SSSSSSS S:::::S
JJ:::::::::::::JJ E::::::::::::::::::::E W:::::W W:::::W S::::::SSSSSS:::::S
JJ:::::::::JJ E::::::::::::::::::::E W:::W W:::W S:::::::::::::::SS
JJJJJJJJJ EEEEEEEEEEEEEEEEEEEEEE WWW WWW SSSSSSSSSSSSSSS
Name:
Anonymous
2012-01-25 6:14
JJJJJJJJJJJEEEEEEEEEEEEEEEEEEEEEEWWWWWWWW WWWWWWWW SSSSSSSSSSSSSSS
J:::::::::JE::::::::::::::::::::EW::::::W W::::::W SS:::::::::::::::S
J:::::::::JE::::::::::::::::::::EW::::::W W::::::WS:::::SSSSSS::::::S
JJ:::::::JJEE::::::EEEEEEEEE::::EW::::::W W::::::WS:::::S SSSSSSS
J:::::J E:::::E EEEEEE W:::::W WWWWW W:::::W S:::::S
J:::::J E:::::E W:::::W W:::::W W:::::W S:::::S
J:::::J E::::::EEEEEEEEEE W:::::W W:::::::W W:::::W S::::SSSS
J:::::j E:::::::::::::::E W:::::W W:::::::::W W:::::W SS::::::SSSSS
J:::::J E:::::::::::::::E W:::::W W:::::W:::::W W:::::W SSS::::::::SS
JJJJJJJ J:::::J E::::::EEEEEEEEEE W:::::W W:::::W W:::::W W:::::W SSSSSS::::S
J:::::J J:::::J E:::::E W:::::W:::::W W:::::W:::::W S:::::S
J::::::J J::::::J E:::::E EEEEEE W:::::::::W W:::::::::W S:::::S
J:::::::JJJ:::::::J EE::::::EEEEEEEE:::::E W:::::::W W:::::::W SSSSSSS S:::::S
JJ:::::::::::::JJ E::::::::::::::::::::E W:::::W W:::::W S::::::SSSSSS:::::S
JJ:::::::::JJ E::::::::::::::::::::E W:::W W:::W S:::::::::::::::SS
JJJJJJJJJ EEEEEEEEEEEEEEEEEEEEEE WWW WWW SSSSSSSSSSSSSSS
Name:
Anonymous
2012-01-25 6:14
JJJJJJJJJJJEEEEEEEEEEEEEEEEEEEEEEWWWWWWWW WWWWWWWW SSSSSSSSSSSSSSS
J:::::::::JE::::::::::::::::::::EW::::::W W::::::W SS:::::::::::::::S
J:::::::::JE::::::::::::::::::::EW::::::W W::::::WS:::::SSSSSS::::::S
JJ:::::::JJEE::::::EEEEEEEEE::::EW::::::W W::::::WS:::::S SSSSSSS
J:::::J E:::::E EEEEEE W:::::W WWWWW W:::::W S:::::S
J:::::J E:::::E W:::::W W:::::W W:::::W S:::::S
J:::::J E::::::EEEEEEEEEE W:::::W W:::::::W W:::::W S::::SSSS
J:::::j E:::::::::::::::E W:::::W W:::::::::W W:::::W SS::::::SSSSS
J:::::J E:::::::::::::::E W:::::W W:::::W:::::W W:::::W SSS::::::::SS
JJJJJJJ J:::::J E::::::EEEEEEEEEE W:::::W W:::::W W:::::W W:::::W SSSSSS::::S
J:::::J J:::::J E:::::E W:::::W:::::W W:::::W:::::W S:::::S
J::::::J J::::::J E:::::E EEEEEE W:::::::::W W:::::::::W S:::::S
J:::::::JJJ:::::::J EE::::::EEEEEEEE:::::E W:::::::W W:::::::W SSSSSSS S:::::S
JJ:::::::::::::JJ E::::::::::::::::::::E W:::::W W:::::W S::::::SSSSSS:::::S
JJ:::::::::JJ E::::::::::::::::::::E W:::W W:::W S:::::::::::::::SS
JJJJJJJJJ EEEEEEEEEEEEEEEEEEEEEE WWW WWW SSSSSSSSSSSSSSS
Name:
Anonymous
2012-01-25 6:14
JJJJJJJJJJJEEEEEEEEEEEEEEEEEEEEEEWWWWWWWW WWWWWWWW SSSSSSSSSSSSSSS
J:::::::::JE::::::::::::::::::::EW::::::W W::::::W SS:::::::::::::::S
J:::::::::JE::::::::::::::::::::EW::::::W W::::::WS:::::SSSSSS::::::S
JJ:::::::JJEE::::::EEEEEEEEE::::EW::::::W W::::::WS:::::S SSSSSSS
J:::::J E:::::E EEEEEE W:::::W WWWWW W:::::W S:::::S
J:::::J E:::::E W:::::W W:::::W W:::::W S:::::S
J:::::J E::::::EEEEEEEEEE W:::::W W:::::::W W:::::W S::::SSSS
J:::::j E:::::::::::::::E W:::::W W:::::::::W W:::::W SS::::::SSSSS
J:::::J E:::::::::::::::E W:::::W W:::::W:::::W W:::::W SSS::::::::SS
JJJJJJJ J:::::J E::::::EEEEEEEEEE W:::::W W:::::W W:::::W W:::::W SSSSSS::::S
J:::::J J:::::J E:::::E W:::::W:::::W W:::::W:::::W S:::::S
J::::::J J::::::J E:::::E EEEEEE W:::::::::W W:::::::::W S:::::S
J:::::::JJJ:::::::J EE::::::EEEEEEEE:::::E W:::::::W W:::::::W SSSSSSS S:::::S
JJ:::::::::::::JJ E::::::::::::::::::::E W:::::W W:::::W S::::::SSSSSS:::::S
JJ:::::::::JJ E::::::::::::::::::::E W:::W W:::W S:::::::::::::::SS
JJJJJJJJJ EEEEEEEEEEEEEEEEEEEEEE WWW WWW SSSSSSSSSSSSSSS
Name:
Anonymous
2012-01-25 6:15
JJJJJJJJJJJEEEEEEEEEEEEEEEEEEEEEEWWWWWWWW WWWWWWWW SSSSSSSSSSSSSSS
J:::::::::JE::::::::::::::::::::EW::::::W W::::::W SS:::::::::::::::S
J:::::::::JE::::::::::::::::::::EW::::::W W::::::WS:::::SSSSSS::::::S
JJ:::::::JJEE::::::EEEEEEEEE::::EW::::::W W::::::WS:::::S SSSSSSS
J:::::J E:::::E EEEEEE W:::::W WWWWW W:::::W S:::::S
J:::::J E:::::E W:::::W W:::::W W:::::W S:::::S
J:::::J E::::::EEEEEEEEEE W:::::W W:::::::W W:::::W S::::SSSS
J:::::j E:::::::::::::::E W:::::W W:::::::::W W:::::W SS::::::SSSSS
J:::::J E:::::::::::::::E W:::::W W:::::W:::::W W:::::W SSS::::::::SS
JJJJJJJ J:::::J E::::::EEEEEEEEEE W:::::W W:::::W W:::::W W:::::W SSSSSS::::S
J:::::J J:::::J E:::::E W:::::W:::::W W:::::W:::::W S:::::S
J::::::J J::::::J E:::::E EEEEEE W:::::::::W W:::::::::W S:::::S
J:::::::JJJ:::::::J EE::::::EEEEEEEE:::::E W:::::::W W:::::::W SSSSSSS S:::::S
JJ:::::::::::::JJ E::::::::::::::::::::E W:::::W W:::::W S::::::SSSSSS:::::S
JJ:::::::::JJ E::::::::::::::::::::E W:::W W:::W S:::::::::::::::SS
JJJJJJJJJ EEEEEEEEEEEEEEEEEEEEEE WWW WWW SSSSSSSSSSSSSSS
Name:
Anonymous
2012-01-25 6:15
JJJJJJJJJJJEEEEEEEEEEEEEEEEEEEEEEWWWWWWWW WWWWWWWW SSSSSSSSSSSSSSS
J:::::::::JE::::::::::::::::::::EW::::::W W::::::W SS:::::::::::::::S
J:::::::::JE::::::::::::::::::::EW::::::W W::::::WS:::::SSSSSS::::::S
JJ:::::::JJEE::::::EEEEEEEEE::::EW::::::W W::::::WS:::::S SSSSSSS
J:::::J E:::::E EEEEEE W:::::W WWWWW W:::::W S:::::S
J:::::J E:::::E W:::::W W:::::W W:::::W S:::::S
J:::::J E::::::EEEEEEEEEE W:::::W W:::::::W W:::::W S::::SSSS
J:::::j E:::::::::::::::E W:::::W W:::::::::W W:::::W SS::::::SSSSS
J:::::J E:::::::::::::::E W:::::W W:::::W:::::W W:::::W SSS::::::::SS
JJJJJJJ J:::::J E::::::EEEEEEEEEE W:::::W W:::::W W:::::W W:::::W SSSSSS::::S
J:::::J J:::::J E:::::E W:::::W:::::W W:::::W:::::W S:::::S
J::::::J J::::::J E:::::E EEEEEE W:::::::::W W:::::::::W S:::::S
J:::::::JJJ:::::::J EE::::::EEEEEEEE:::::E W:::::::W W:::::::W SSSSSSS S:::::S
JJ:::::::::::::JJ E::::::::::::::::::::E W:::::W W:::::W S::::::SSSSSS:::::S
JJ:::::::::JJ E::::::::::::::::::::E W:::W W:::W S:::::::::::::::SS
JJJJJJJJJ EEEEEEEEEEEEEEEEEEEEEE WWW WWW SSSSSSSSSSSSSSS
Name:
Anonymous
2012-01-25 6:15
JJJJJJJJJJJEEEEEEEEEEEEEEEEEEEEEEWWWWWWWW WWWWWWWW SSSSSSSSSSSSSSS
J:::::::::JE::::::::::::::::::::EW::::::W W::::::W SS:::::::::::::::S
J:::::::::JE::::::::::::::::::::EW::::::W W::::::WS:::::SSSSSS::::::S
JJ:::::::JJEE::::::EEEEEEEEE::::EW::::::W W::::::WS:::::S SSSSSSS
J:::::J E:::::E EEEEEE W:::::W WWWWW W:::::W S:::::S
J:::::J E:::::E W:::::W W:::::W W:::::W S:::::S
J:::::J E::::::EEEEEEEEEE W:::::W W:::::::W W:::::W S::::SSSS
J:::::j E:::::::::::::::E W:::::W W:::::::::W W:::::W SS::::::SSSSS
J:::::J E:::::::::::::::E W:::::W W:::::W:::::W W:::::W SSS::::::::SS
JJJJJJJ J:::::J E::::::EEEEEEEEEE W:::::W W:::::W W:::::W W:::::W SSSSSS::::S
J:::::J J:::::J E:::::E W:::::W:::::W W:::::W:::::W S:::::S
J::::::J J::::::J E:::::E EEEEEE W:::::::::W W:::::::::W S:::::S
J:::::::JJJ:::::::J EE::::::EEEEEEEE:::::E W:::::::W W:::::::W SSSSSSS S:::::S
JJ:::::::::::::JJ E::::::::::::::::::::E W:::::W W:::::W S::::::SSSSSS:::::S
JJ:::::::::JJ E::::::::::::::::::::E W:::W W:::W S:::::::::::::::SS
JJJJJJJJJ EEEEEEEEEEEEEEEEEEEEEE WWW WWW SSSSSSSSSSSSSSS
Name:
Anonymous
2012-01-25 11:14
Name:
Anonymous
2012-01-25 15:59
>>1
closures in c
for(char* value matching key in self)
What, is this some new shit in C11 or something?
Name:
Anonymous
2012-01-25 22:25
>>12
naw, but I didn't feel like getting explicit about the data structure being traversed there.
Name:
Anonymous
2012-01-25 23:57
>>12
heres a better example
#include <stdio.h>
#include <malloc.h>
#include <assert.h>
struct cons {
void* car;
struct cons* cdr;
};
struct cons* cons(void* car, struct cons* cdr) {
struct cons* a = malloc(sizeof(struct cons));
assert(a);
a->car = car;
a->cdr = cdr;
return a;
}
int* Int(int n) {
int* a = malloc(sizeof(int));
assert(a);
*a = n;
return a;
}
void free_conses(struct cons* list) {
while(list) {
struct cons* next = list->cdr;
free(list);
list = next;
}
}
typedef void* (*oper1_t)(void* userdata, void* arg1);
struct cons* map1(oper1_t operator, void* userdata, struct cons* list1) {
if(!list1) return NULL;
struct cons* head;
struct cons* tail;
head = tail = cons(operator(userdata, list1->car), NULL);
list1 = list1->cdr;
while(list1) {
struct cons* new_tail = cons(operator(userdata, list1->car), NULL);
tail->cdr = new_tail;
tail = new_tail;
list1 = list1->cdr;
}
return head;
}
void forall(oper1_t operator, void* userdata, struct cons* list) {
while(list) {
operator(userdata, list->car);
list = list->cdr;
}
}
struct cons* range(int i, int j) {
struct cons* head = NULL;
while(i <= j) {
head = cons(Int(j), head);
--j;
}
return head;
}
void* array_indexer(void** array, int* index) {
return array[*index];
}
void* print_string(FILE* file, char* string) {
fprintf(file, "%s\n", string);
return NULL;
}
struct closure1 {
oper1_t fn;
void* userdata;
};
void* call_closure1(struct closure1* this, void* arg1) {
return this->fn(this->userdata, arg1);
}
void* oper1_free(void* userdata, void* arg1) {
free(arg1);
return NULL;
}
struct composition {
oper1_t f;
void* f_userdata;
oper1_t g;
void* g_userdata;
};
void* call_composition(struct composition* this, void* arg1) {
return this->f(this->f_userdata, this->g(this->g_userdata, arg1));
}
int main(int argc, char** argv) {
printf("Printing argv using (forall print_string (map (lambda (i) (vector-get argv i)) (range 1 (- argc 1))))\n");
struct cons* nums = range(0, argc - 1);
struct cons* args = map1((oper1_t)array_indexer, argv, nums);
forall((oper1_t)print_string, stdout, args);
printf("Printing argv using (forall (compose print_string (lambda (i) (vector-get argv i))) (range 1 (- argc 1)))\n");
struct composition print_string_argv = {
(oper1_t)print_string, // f
stdout,
(oper1_t)array_indexer, // g
argv,
};
forall((oper1_t)call_composition, &print_string_argv, nums);
forall(oper1_free, NULL, nums); // frees the integers
free_conses(args);
free_conses(nums);
return 0;
}
/* example usage:
$ a.out hey there man
Printing argv using (forall print_string (map (lambda (i) (vector-get argv i)) (range 1 (- argc 1))))
a.out
hey
there
man
Printing argv using (forall (compose print_string (lambda (i) (vector-get argv i))) (range 1 (- argc 1)))
a.out
hey
there
man
$
*/
Newer Posts