# `CEL.Expr.MacroCall`
[🔗](https://github.com/hansihe/pb_ex/blob/v0.2.0/cel_ex/lib/cel/expr.ex#L179)

A macro, as written: `l.all(x, p)`, `l.exists(x, p)`, `l.exists_one(x, p)`,
`l.map(x, f)`, `l.map(x, p, f)`, `l.filter(x, p)`, the two-variable forms
such as `m.all(k, v, p)`, `cel.bind(v, init, body)`, `o.optMap(v, f)` and
`o.optFlatMap(v, f)`.

`function` is the macro's name and `target` its receiver, or `nil` for
`cel.bind`. `args` start with the variables the macro binds, as
`CEL.Expr.Ident` nodes with `scope: :local` and their types, followed
by the other arguments.

For a comprehension macro, `expansion` is the `CEL.Expr.Comprehension`
it expands to, which evaluation runs; its subexpressions include the
nodes in `args`. It is `nil` for `cel.bind`, `optMap` and `optFlatMap`.
`has(m.f)` is not a `MacroCall` but a `CEL.Expr.Select` with
`test_only: true`.

# `t`

```elixir
@type t() :: %CEL.Expr.MacroCall{
  args: [CEL.Expr.t()],
  expansion: CEL.Expr.Comprehension.t() | nil,
  function: String.t(),
  id: CEL.Checked.expr_id(),
  target: CEL.Expr.t() | nil,
  type: CEL.Expr.type()
}
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
