     (def = @scopes[i].definition) and def.deferrable and def or
       i > 0 and (@_deferrableDefinitionAtScope i - 1) or undefined
 
+  parentDeferrableDefinitionNames: ->
+    @_parentDeferrableDefinitionNames @scopes.length - 1
+
+  _parentDeferrableDefinitionNames: (i) ->
+    rest =
+      if i > 0
+        @_parentDeferrableDefinitionNames i - 1
+      else
+        []
+    if (def = @scopes[i].definition) and def.deferrable and def.name
+      join [def.name], rest
+    else
+      rest
+
   isDefining: ->
     !!@_scope().definition
 


      polymorphicAssignCompile ctx, call,
        if ctx.shouldDefer()
          deferredExpression()
        else
          # Typing

  if hasName
    macroName = ctx.definitionName()

    macroSource = call_ (token_ 'fn'), (join [paramTuple], rest)
    macroCompiled = (termCompile ctx, macroSource)
    compiledMacro = translateToJs translateIr ctx, macroCompiled
    retrieve call, macroSource
    macroFn = eval compiledMacro
    if macroFn
      ctx.declareMacro ctx.definitionPattern(), (ctx, call) ->
        constantToSource macroFn (_arguments call)...
    else
      malformed ctx, ctx.definitionPattern(), 'Macro failed to compile'

  jsNoop()

