Escribo un traductor de Lisp a C y tengo un problema con el manejo de cadenas. Este es un código que transforma una función Lisp unario a un equivalente de C:Concatenación de una lista de cadenas en Prolog
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), !.
Ahora quiero leer cualquier número de funciones y devolverlos como una sola cadena. Lo anterior funs
es lo mejor que podía llegar a, pero funciona de esta manera:
?- 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)); }"].
Mientras yo quiero algo como esto:
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)); }".
para que pueda muy bien swritef
está en un programa completo , entre #include
sy principal(). Una solución alternativa es modificar el traductor de más alto nivel para manejar la lista. Ciertamente se ve así:
program(P) --> define(F), {swritef(P, "#include \"lisp2c.h\" \n\n%t \nint main() { return 0; }", [F])}, !.
¿Cómo podría hacer cualquiera de estos dos? Estoy usando SWI Prolog.
El sujeto menciona Prolog, mientras que el cuerpo de la pregunta se refiere a la traducción de "Lisp a C". Ayudame a resolver qué es lo que aquí. Los fragmentos de código se parecen un poco a Prolog, tal vez porque la sintaxis DCG especial se confunde con la sintaxis más básica de Prolog para las reglas. Mientras que el asunto pregunta acerca de "una lista de cadenas en Prolog", parece que está involucrado el análisis de cadenas que contienen código Lisp. La concatenación de una lista de cadenas es una tarea relativamente simple en Prolog. Su predicado de ejemplo ** funs/2 ** sugiere que desea agregar un par de caracteres de línea nueva entre ... – hardmath
... cadenas consecutivas que se concatenan. Si ese es el alcance de la pregunta, puedo responderla, y podemos resolver la confusión de sintaxis (si es necesario). – hardmath
La traducción de Lisp a C es lo que hace el programa. El programa está escrito en Prolog, usando la sintaxis DCG para traducir casos individuales. La mayor parte del código Lisp analizado predicado, siendo su argumento el código C resultante. Quiero dos nuevas líneas entre cadenas concatenadas. Espero que sea eso. – Igor