Составление списка строк в Прологе

Я пишу переводчик с Лиспа на Си, и у меня проблема с обработкой строк. Это код, который преобразует унарную функцию 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 и main (). Альтернативное решение - изменить переводчик верхнего уровня для обработки списка. На данный момент это выглядит так:

program(P) --> define(F), {swritef(P, "#include \"lisp2c.h\" \n\n%t \nint main() { return 0; }", [F])}, !.

Как бы я сделал что-нибудь из этих двух? Я использую SWI Prolog.

6
задан false 26 November 2011 в 01:58
поделиться