Concatting eine Liste von strings in Prolog

Schreibe ich ein Lisp-C übersetzer und ich habe ein problem mit der Handhabung von strings. Dies ist ein code, verwandelt eine einfache Lisp-Funktion, um ein C-äquivalent:

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), !.

Nun will ich Lesen, eine beliebige Anzahl von Funktionen auf und schickt Sie als einen einzigen string. Die oben funs ist das beste, das ich kommen könnte, 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 etwas wie dieses:

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)); }".

so, dass ich schön swritef ist in ein komplettes Programm, zwischen #includes und main(). Eine alternative Lösung ist das ändern der höchsten Ebene übersetzer, um mit der Liste arbeiten. Es curently sieht wie folgt aus:

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

Wie würde ich diese zwei? Ich verwende SWI-Prolog.

  • Die Betreff-Zeile erwähnt, Prolog, während der Körper von der Frage fragt nach "Lisp nach C" übersetzung. Helfen Sie mir, Sie zu Sortieren, was was ist hier. Der code-Schnipsel schauen ein wenig wie der Prolog, vielleicht, weil die spezielle DCG-syntax verwechselt wird mit Prolog mehr in der basic-syntax für die Regeln. Während die Betreff-Zeile, fragt etwa "eine Liste von Zeichenketten in Prolog", es scheint, Parsen von strings, die Lisp-code beteiligt ist. Verkettung einer Liste von strings ist eine relativ einfache Aufgabe in Prolog. Dein Beispiel predicate funs/2 schlägt Sie möchten, werfen in ein paar neue-Zeile-Zeichen zwischen...
  • ...aufeinander folgenden Zeichenfolgen verkettet. Wenn das den Umfang der Frage kann ich beantworten, und wir können uns Sortieren, die Verwirrung in der Syntax (falls erforderlich).
  • Lisp nach C übersetzen ist, was das Programm macht. Das Programm ist geschrieben in Prolog, mit der DCG-syntax zu übersetzen Einzelfall. Die meisten ausgesagt analysieren Lisp-code, mit Ihrer Argumentation die daraus resultierende C-code. Ich möchte zwei Zeilenumbrüche zwischen verkettet Zeichenfolgen. Hoffe, das ist es.
  • Also die Lisp-to-C-übersetzung Teil war nicht wirklich Teil der Frage 🙂 Coole Idee, obwohl. Wie gehst du mit der Speicher-Aufteilung?
  • Wenn ich wusste, dass der spezifische Prolog-Implementierung, die Sie verwenden, die ich anpassen könnte die Antwort sein. Es gibt drei Darstellungen von "strings" gemeinsam Prolog: strings, Atome und Listen von Zeichen. Die ISO-Norm sagt lese - /1 und die zugehörigen Prädikate behandeln sollten, Doppel-zitierten text als strings, sondern weil der historische Unterstützung für diese syntax zu bezeichnen Listen von Zeichen, Implementierungen in der Regel mit dem Thema beschäftigen Optionen mit unterschiedlicher syntax.
  • Ich habe gerade malloc Raum für jede variable. So weit, nur #t und () nur einmal initialisiert werden und ich Speicherplatz für jede Zahl, jedes mal, wenn es verwendet wird, aber ich Plane zu halten, eine Liste von zahlen, sind schon reserviert und diese wiederverwenden, wenn notwendig (durch assert, wahrscheinlich).

InformationsquelleAutor Igor | 2011-01-16
Schreibe einen Kommentar