anchor.diff:      List<dart.Code> visitBody(List<Expression> body) => [
             for (final expression in body) ...expression.accept(this),
             if (body.isNotEmpty && node.type != CandyType.unit)
  -            _refer(node.id).assign(_refer(body.last.id)).statement,
  +            _refer(node.id).safeAssign(body.last).statement,
           ];
   
       return [
         ...node.condition.accept(this),
  -      dart.Code('void ${_name(node.id)};'),
  +      dart.literalNull
  +          .assignVar(_name(node.id), compileType(context, node.type))
  +          .statement,
         dart.Code('if (${_name(node.condition.id)}) {'),
         ...visitBody(node.thenBody),
         dart.Code('} else {'),
  
positive.code: 
    @override
    List<dart.Code> visitLoopExpression(LoopExpression node) => [
          dart.Code('void ${_name(node.id)};'),
          dart.Code('${_label(node.id)}:\nwhile (true) {'),
          for (final expression in node.body) ...expression.accept(this),
          dart.Code('}'),
  
negative.code:         const dart.Code('~/'),
          other.code,
        ]));
  
    /// Assigns the `other` expression. If the type of the `other` expression is
    /// `Unit`, assigns `null`.
    /// Why? Candy's `Unit` is represented by Dart's `void` (type) and `null`
    /// (value). In Dart, the result of a statement producing `void` can't be
    /// assigned to anything, so we manually substitute `null` as the value.
    dart.Expression safeAssign(Expression other) =>
        assign(other.type == CandyType.unit
            ? dart.literalNull
            : DartExpressionVisitor._refer(other.id));
  }
  
  extension on dart.Method {
  