function.jl 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #======================================================
  2. FUNCTION DECLARATION
  3. ======================================================#
  4. struct StarpuExprFunction <: StarpuExpr
  5. ret_type :: Type
  6. func :: Symbol
  7. args :: Vector{StarpuExprTypedVar}
  8. body :: StarpuExpr
  9. end
  10. function starpu_parse_function(x :: Expr)
  11. if (x.head != :function)
  12. error("Invalid \"function\" expression")
  13. end
  14. typed_decl = starpu_parse(x.args[1])
  15. if (!isa(typed_decl, StarpuExprTypedExpr))
  16. error("Invalid \"function\" prototype : a return type must me explicited")
  17. end
  18. prototype = typed_decl.expr
  19. if (!isa(prototype, StarpuExprCall))
  20. error("Invalid \"function\" prototype")
  21. end
  22. arg_list = StarpuExprTypedVar[]
  23. for type_arg in prototype.args
  24. if (!isa(type_arg, StarpuExprTypedVar))
  25. error("Invalid \"function\" argument list")
  26. end
  27. push!(arg_list, type_arg)
  28. end
  29. body = starpu_parse(x.args[2])
  30. return StarpuExprFunction(typed_decl.typ, prototype.func, arg_list, body)
  31. end
  32. function print(io :: IO, x :: StarpuExprFunction ; indent = 0)
  33. print(io, starpu_type_traduction(x.ret_type), " ")
  34. print(io, x.func, '(')
  35. for i in (1 : length(x.args))
  36. if (i != 1)
  37. print(io, ", ")
  38. if (i % 4 == 1)
  39. print_newline(io, indent + starpu_indent_size + length(String(x.func)) + 13)
  40. end
  41. end
  42. print(io, x.args[i], indent = indent + starpu_indent_size)
  43. end
  44. print(io, ")")
  45. print_newline(io, indent)
  46. print(io, "{")
  47. print_newline(io, indent + starpu_indent_size)
  48. print(io, x.body, indent = indent + starpu_indent_size)
  49. print_newline(io, indent)
  50. print(io, "}\n\n")
  51. print_newline(io, indent)
  52. end
  53. function apply(func :: Function, expr :: StarpuExprFunction)
  54. args = map((x -> apply(func, x)), expr.args)
  55. body = apply(func, expr.body)
  56. return func(StarpuExprFunction(expr.ret_type, expr.func, args, body))
  57. end