C で curry 化 @lightning
さて上記をポータブルに。 GNU lightning の出番。
http://www.gnu.org/software/lightning/lightning.html
下記コードは i386-linux と ppc-macosx と sparc-solaris で動きました。
#include <stdio.h>
#include "lightning.h"
typedef int (*pifi)(int);
static jit_insn buf[1024];
int (*curry(int (*F)(), int A))() {
pifi code = (pifi)(jit_set_ip(buf).iptr);
int i;
jit_prolog(1);
i = jit_arg_ui();
jit_getarg_ui(JIT_V0, i);
jit_movi_i(JIT_V1, A);
jit_prepare(2);
jit_pusharg_ui(JIT_V1);
jit_pusharg_ui(JIT_V0);
jit_finish(F);
jit_retval(JIT_RET);
jit_ret();
jit_flush_code(buf, jit_get_ip().ptr);
return code;
}
int add(int x, int y) {
return(x + y);
}
int main() {
int (*c)();
c = curry(add, 100);
printf("%d\n", (*c)(10));
}あら簡単。