fork(1) download
  1. local translators = {}
  2.  
  3. local function translate(expr)
  4. return translators[expr.expr_type](expr)
  5. end
  6.  
  7. function translators.var(expr)
  8. return expr.name
  9. end
  10.  
  11. function translators.abs(expr)
  12. local param = expr.param
  13. local body = translate(expr.body)
  14. return "function(" .. param .. ")\nreturn " .. body .. "\nend"
  15. end
  16.  
  17. function translators.app(expr)
  18. local fn = translate(expr.fn)
  19. local arg = translate(expr.arg)
  20. return "(" .. fn .. ")(" .. arg .. ")"
  21. end
  22.  
  23. function translators.str(expr)
  24. return string.format("%q", expr.value)
  25. end
  26.  
  27. local expr = {
  28. expr_type = "app",
  29. fn = {
  30. expr_type = "abs",
  31. param = "x",
  32. body = { expr_type = "var", name = "x" },
  33. },
  34. arg = { expr_type = "str", value = "Hello, world!" },
  35. }
  36.  
  37. print(translate(expr))
  38.  
Success #stdin #stdout 0s 2832KB
stdin
Standard input is empty
stdout
(function(x)
return x
end)("Hello, world!")