Lisp から C へのトランスレータを書いていますが、文字列の処理に問題があります。これは、単項 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), !.
ここで、任意の数の関数を読み取り、それらを 1 つの文字列として返したいと考えています。上記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)); }".
s と main() のswritef
間の完全なプログラムにうまく入ることができるように。#include
別の解決策は、最上位レベルのトランスレータを変更してリストを処理することです。現在、次のようになっています。
program(P) --> define(F), {swritef(P, "#include \"lisp2c.h\" \n\n%t \nint main() { return 0; }", [F])}, !.
これら2つのいずれかを行うにはどうすればよいですか?SWI プロローグを使用しています。