local translators = {}
local function translate(expr)
return translators[expr.expr_type](expr)
end
function translators.var(expr)
return expr.name
end
function translators.abs(expr)
local param = expr.param
local body = translate(expr.body)
return "function(" .. param .. ")\nreturn " .. body .. "\nend"
end
function translators.app(expr)
local fn = translate(expr.fn)
local arg = translate(expr.arg)
return "(" .. fn .. ")(" .. arg .. ")"
end
function translators.str(expr)
return string.format("%q", expr.value)
end
local expr = {
expr_type = "app",
fn = {
expr_type = "abs",
param = "x",
body = { expr_type = "var", name = "x" },
},
arg = { expr_type = "str", value = "Hello, world!" },
}
print(translate(expr))
bG9jYWwgdHJhbnNsYXRvcnMgPSB7fQoKbG9jYWwgZnVuY3Rpb24gdHJhbnNsYXRlKGV4cHIpCglyZXR1cm4gdHJhbnNsYXRvcnNbZXhwci5leHByX3R5cGVdKGV4cHIpCmVuZAoKZnVuY3Rpb24gdHJhbnNsYXRvcnMudmFyKGV4cHIpCglyZXR1cm4gZXhwci5uYW1lCmVuZAoKZnVuY3Rpb24gdHJhbnNsYXRvcnMuYWJzKGV4cHIpCglsb2NhbCBwYXJhbSA9IGV4cHIucGFyYW0KCWxvY2FsIGJvZHkgPSB0cmFuc2xhdGUoZXhwci5ib2R5KQoJcmV0dXJuICJmdW5jdGlvbigiIC4uIHBhcmFtIC4uICIpXG5yZXR1cm4gIiAuLiBib2R5IC4uICJcbmVuZCIKZW5kCgpmdW5jdGlvbiB0cmFuc2xhdG9ycy5hcHAoZXhwcikKCWxvY2FsIGZuID0gdHJhbnNsYXRlKGV4cHIuZm4pCglsb2NhbCBhcmcgPSB0cmFuc2xhdGUoZXhwci5hcmcpCglyZXR1cm4gIigiIC4uIGZuIC4uICIpKCIgLi4gYXJnIC4uICIpIgplbmQKCmZ1bmN0aW9uIHRyYW5zbGF0b3JzLnN0cihleHByKQoJcmV0dXJuIHN0cmluZy5mb3JtYXQoIiVxIiwgZXhwci52YWx1ZSkKZW5kCgpsb2NhbCBleHByID0gewoJZXhwcl90eXBlID0gImFwcCIsCglmbiA9IHsKCQlleHByX3R5cGUgPSAiYWJzIiwKCQlwYXJhbSA9ICJ4IiwKCQlib2R5ID0geyBleHByX3R5cGUgPSAidmFyIiwgbmFtZSA9ICJ4IiB9LAoJfSwKCWFyZyA9IHsgZXhwcl90eXBlID0gInN0ciIsIHZhbHVlID0gIkhlbGxvLCB3b3JsZCEiIH0sCn0KCnByaW50KHRyYW5zbGF0ZShleHByKSkK