Идея, что вы запускаете код, результат которого затем вставляется, называется квазиквотацией. Вы запускаете код без кавычек.
Я знаю, как решить эту проблему с помощью Lua. Я использовал string.gsub
с функцией антиквотации, которую написал сам. Я использовал синтаксис оболочки для антиквотации. Как и в оболочке, код без кавычек возвращает строку, которая затем вставляется в код.
Ниже prog
находится код C с текстом, не заключенным в кавычки, а antiquote
- функция отмены кавычек. Я в полной мере использовал специальные строковые кавычки Lua в двойных квадратных скобках. На практике вы бы этого не сделали; вы бы поместили prog
в отдельный файл.
names = { 'John', 'Paul', 'George', 'Ringo' }
local prog = [===[
#include <stdio.h>
main() {
$(local out = { }
for _, n in ipairs(names) do
table.insert(out, string.format([[ printf("The name is %%s\n", %q);]], n))
end
return table.concat(out, '\n ')
)
}
]===]
local function antiquote(s)
local body = s:match '^%$%((.*)%)$'
return assert(loadstring(body))()
end
prog = prog:gsub('%$%b()', antiquote)
io.stdout:write(prog)
При использовании программа выглядит так:
: nr@curlycoat 1181 ; lua /home/nr/tmp/emit-c.lua
#include <stdio.h>
main() {
printf("The name is %s\n", "John");
printf("The name is %s\n", "Paul");
printf("The name is %s\n", "George");
printf("The name is %s\n", "Ringo");
}
person
Norman Ramsey
schedule
29.12.2008