สิ่งที่จำเป็นต้องมีสำหรับสไตล์การเขียนโปรแกรมการทำงานคือฟังก์ชันชั้นหนึ่ง มันอาจจำลองในพกพา C ถ้าคุณทนต่อไป:
- การจัดการด้วยตนเองของการผูกขอบเขตคำศัพท์หรือการปิด
- การจัดการด้วยตนเองของอายุการใช้งานฟังก์ชันตัวแปร
- ไวยากรณ์ทางเลือกของแอปพลิเคชั่น / การโทร
/*
* with constraints desribed above we could have
* good approximation of FP style in plain C
*/
int increment_int(int x) {
return x + 1;
}
WRAP_PLAIN_FUNCTION_TO_FIRST_CLASS(increment, increment_int);
map(increment, list(number(0), number(1)); // --> list(1, 2)
/* composition of first class function is also possible */
function_t* computation = compose(
increment,
increment,
increment
);
*(int*) call(computation, number(1)) == 4;
รันไทม์สำหรับรหัสดังกล่าวอาจมีขนาดเล็กเท่ากับหนึ่งด้านล่าง
struct list_t {
void* head;
struct list_t* tail;
};
struct function_t {
void* (*thunk)(list_t*);
struct list_t* arguments;
}
void* apply(struct function_t* fn, struct list_t* arguments) {
return fn->thunk(concat(fn->arguments, arguments));
}
/* expansion of WRAP_PLAIN_FUNCTION_TO_FIRST_CLASS */
void* increment_thunk(struct list_t* arguments) {
int x_arg = *(int*) arguments->head;
int value = increment_int(x_arg);
int* number = malloc(sizeof *number);
return number ? (*number = value, number) : NULL;
}
struct function_t* increment = &(struct function_t) {
increment_thunk,
NULL
};
/* call(increment, number(1)) expands to */
apply(increment, &(struct list_t) { number(1), NULL });
ในสาระสำคัญเราเลียนแบบฟังก์ชั่นชั้นหนึ่งด้วยการปิดที่แสดงเป็นคู่ของฟังก์ชั่น / ข้อโต้แย้งบวกพวงของมาโคร รหัสเสร็จสมบูรณ์อาจจะพบได้ที่นี่