我正在编写一个 Lisp 到 C 的翻译器,但我在处理字符串时遇到了问题。这是一个将一元 Lisp 函数转换为 C 等价物的代码:
define(F) --> fun_unary(F), !.
fun_unary(F) --> "(define (", label(Fun), spaces, label(Arg1), ")", spaces, expr(Body), ")",
{swritef(F, "data *%t(data *%t) { return(%t); }", [Fun, Arg1, Body])}, !.
funs([F]) --> define(F), !.
funs([F|Fs]) --> define(F), spaces, funs(Fs), !.
现在我想读取任意数量的函数并将它们作为单个字符串返回。以上funs
是我能想到的最好的,但它的工作原理是这样的:
?- funs(F, "(define (carzero l) (= (car l) 0)) (define (zero n) (= 0 n))", []).
F = ["data *carzero(data *l) { return(eq(car(l), make_atom_int(0))); }", "data *zero(data *n) { return(eq(make_atom_int(0), n)); }"].
虽然我想要这样的东西:
F = "data *carzero(data *l) { return(eq(car(l), make_atom_int(0))); }\n\ndata *zero(data *n) { return(eq(make_atom_int(0), n)); }".
这样我就可以很好地swritef
进入一个完整的程序,在#include
s 和 main() 之间。另一种解决方案是修改最高级别的转换器来处理列表。它现在看起来像这样:
program(P) --> define(F), {swritef(P, "#include \"lisp2c.h\" \n\n%t \nint main() { return 0; }", [F])}, !.
我将如何做这两个?我正在使用 SWI Prolog。