50
$\begingroup$

What does the function Internal`InheritedBlock do? How is it different from the regular Block?

$\endgroup$
1

1 Answer 1

59
$\begingroup$

Internal`InheritedBlock (IIB) is similar to Block, except that it preserves the original definition of the function being passed to it. The function can then be modified as we wish inside the IIB without affecting the external definition.

Let's see how Block works first:

f[x_] := x
Block[{f},
    Print@DownValues[f];
    f[x_, y_] := x y;
    Print@DownValues[f];
];
Print@DownValues[f];

(* {} *)
(* {HoldPattern[f[x_, y_]] :> x y} *)
(* {HoldPattern[f[x_]] :> x} *)

You notice that the original definition of f is not available inside the Block. On the other hand, look at what IIB does:

f[x_] := x
Internal`InheritedBlock[{f}, 
    Print@DownValues[f];
    f[x_, y_] := x y;
    Print@DownValues[f];
];
Print@DownValues[f];

(* {HoldPattern[f[x_]] :> x} *)
(* {HoldPattern[f[x_]] :> x, HoldPattern[f[x_,y_]] :> x y} *)
(* {HoldPattern[f[x_]] :> x} *)

The original definition of f is available inside its scope, and new definitions are added to the existing ones (as is the usual behaviour), unless you explicitly clear them.

$\endgroup$
1
  • $\begingroup$ But is Internal`InheritedBlock faster or slower than Block/Module (when performing the same operation)? $\endgroup$
    – user688486
    Commented Dec 14, 2023 at 6:38

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.