Ich schreibe einen Lisp zu C Übersetzer und ich habe ein Problem mit der Handhabung von Strings. Dies ist ein Code, der eine einstellige Lisp-Funktion auf einen C äquivalent transformiert:Eine Liste von Strings in Prolog einbetten
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), !.
Jetzt habe ich eine beliebige Anzahl von Funktionen lesen will und sie als einzelne Zeichenfolge zurück. Die obigen funs
ist das Beste, was ich tun konnte, aber es funktioniert wie folgt:
?- 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)); }"].
Während ich so etwas wie dies will:
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)); }".
damit ich schön swritef
in ein komplettes Programm , zwischen #include
s und main(). Eine alternative Lösung besteht darin, den Übersetzer der höchsten Ebene zu modifizieren, um die Liste zu bearbeiten. Es sieht derzeit so aus:
program(P) --> define(F), {swritef(P, "#include \"lisp2c.h\" \n\n%t \nint main() { return 0; }", [F])}, !.
Wie würde ich eines dieser beiden tun? Ich benutze SWI Prolog.
Die Betreffzeile erwähnt Prolog, während der Körper von die Frage fragt nach "Lisp to C" Übersetzung. Hilf mir, herauszufinden, was hier ist. Die Code-Snippets sehen ein wenig wie Prolog aus, vielleicht weil die spezielle DCG-Syntax mit Prologs einfacherer Syntax für Regeln verwechselt wird. Während die Betreffzeile nach "einer Liste von Strings in Prolog" fragt, scheint das Parsen von Strings, die Lisp-Code enthalten, beteiligt zu sein. Die Verkettung einer Liste von Strings ist eine relativ einfache Aufgabe in Prolog. Ihr Beispiel-Prädikat ** farts/2 ** schlägt vor, dass Sie ein paar Zeilenumbrüche zwischen ... – hardmath
... einfügen möchten, die aufeinanderfolgende Strings verketten. Wenn das der Umfang der Frage ist, kann ich sie beantworten, und wir können die Verwirrung der Syntaxen (wenn nötig) aussortieren. – hardmath
Lisp zu C Übersetzung ist, was das Programm tut. Das Programm ist in Prolog geschrieben und verwendet die DCG-Syntax, um einzelne Fälle zu übersetzen. Die meisten Prädikate analysieren Lisp-Code, wobei ihr Argument der resultierende C-Code ist. Ich möchte zwei Zeilenumbrüche zwischen verketteten Strings. Hoffe das ist es. – Igor