# dmd.delegatize

Implements conversion from expressions to delegates for lazy parameters.

Specification: Lazy Parameters

#### Authors

Walter Bright

#### License

Boost License 1.0

Source: delegatize.d

Documentation: https://dlang.org/phobos/dmd_delegatize.html

Coverage: https://codecov.io/gh/dlang/dmd/src/master/src/dmd/delegatize.d

- `toDelegate`

  #### Declaration

  `Expression `toDelegate`(Expression `e`, Type `t`, Scope* `sc`);`

  Convert expression into a delegate.

  #### Discussion

  Used to convert the argument to a lazy parameter.

  #### Parameters

  `Expression `e`` | argument to convert to a delegate
  `Type `t`` | the type to be returned by the delegate
  `Scope* `sc`` | context

  #### Return Value

  A delegate literal

- `lambdaCheckForNestedRef`

  #### Declaration

  `bool `lambdaCheckForNestedRef`(Expression `e`, Scope* `sc`);`

  Look for references to variables in a scope enclosing the new function literal.

  #### Discussion

  Essentially just calls `checkNestedReference() for each variable reference in` `e``.

  #### Parameters

  `Scope* `sc`` | context
  `Expression `e`` | expression to check

  #### Return Value

  `true` if error occurs.

- `ensureStaticLinkTo`

  #### Declaration

  `bool `ensureStaticLinkTo`(Dsymbol `s`, Dsymbol `p`);`

  See if context ``s`` is nested within context ``p``, meaning it ``p`` is reachable at runtime by walking the static links. If any of the intervening contexts are function literals, make sure they are delegates.

  #### Parameters

  `Dsymbol `s`` | inner context
  `Dsymbol `p`` | outer context

  #### Return Value

  `true` means it is accessible by walking the context pointers at runtime

  References: for static links see https://en.wikipedia.org/wiki/Call_stack#Functions_of_the_call_stack