Piszę tłumacz Lisp to C i mam problem z obsługą napisów. Jest to kod, który przekształca jednoargumentowy funkcji Lisp do równowartości C:Sprawdzanie listy napisów w Prologu
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), !.
Teraz chcę przeczytać dowolną liczbę funkcji i zwraca je w postaci pojedynczego łańcucha. Powyższy funs
jest najlepszym mogę wymyślić, ale to działa tak:
?- 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)); }"].
Gdy chcę coś takiego:
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)); }".
tak, że można ładnie swritef
jest do kompletnego programu , pomiędzy #include
s i main(). Alternatywnym rozwiązaniem jest zmodyfikowanie translatora najwyższego poziomu do obsługi listy. Obecnie wygląda to tak:
program(P) --> define(F), {swritef(P, "#include \"lisp2c.h\" \n\n%t \nint main() { return 0; }", [F])}, !.
Jak mógłbym wykonać którekolwiek z tych dwóch? Używam SWI Prolog.
Przedmiotem wymienia Prolog, a ciało pytanie dotyczy tłumaczenia "Lisp to C". Pomóż mi uporządkować to, co jest tutaj. Fragmenty kodu wyglądają trochę jak Prolog, być może dlatego, że specjalna składnia DCG jest pomieszana z bardziej podstawową składnią reguł Prologu. Podczas gdy wiersz tematu pyta o "listę ciągów w Prologu", wydaje się, że analizowane są ciągi zawierające kod Lisp. Konkatenacja listy łańcuchów jest stosunkowo prostym zadaniem w Prologu. Twój przykładowy predykat ** funs/2 ** sugeruje, że chcesz rzucić kilka znaków nowej linii między ... – hardmath
... kolejne ciągi są łączone. Jeśli to jest zakres pytania, mogę na nie odpowiedzieć i możemy rozwiązać problem składni składni (w razie potrzeby). – hardmath
Lisp to C tłumaczenie jest tym, co robi program. Program napisany jest w Prologu, przy użyciu składni DCG do tłumaczenia pojedynczych przypadków. Większość z predykowanych parse kodu Lisp, z ich argumentem będącym wynikowym kodem C. Chcę dwa nowe linie między połączonymi łańcuchami. Mam nadzieję, że to wszystko. – Igor