Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is meant by proper closure here

This is a code lifted straight from Perl Cookbook:

@colors = qw(red blue green yellow orange purple violet);
for my $name (@colors) {
no strict 'refs';
*$name = sub { "<FONT COLOR='$name'>@_</FONT>" };
}

It's intention is to form 6 different subroutines with names of different colors. In the explanation part, the book reads:

These functions all seem independent, but the real code was in fact only compiled once. This technique saves on both compile time and memory use. To create a proper closure, any variables in the anonymous subroutine must be lexicals. That's the reason for the my on the loop iteration variable.

What is meant by proper closure, and what will happen if the my is omitted? Plus how come a typeglob is working with a lexical variable, even though typeglobs cannot be defined for lexical variables and should throw error?

like image 724
SexyBeast Avatar asked Aug 21 '12 15:08

SexyBeast


People also ask

What is does closure mean?

Definition of closure 1 : an act of closing : the condition of being closed closure of the eyelids business closures the closure of the factory. 2 : an often comforting or satisfying sense of finality victims needing closure also : something (such as a satisfying ending) that provides such a sense.

What do people mean by closure?

Closure is something people seek at the finality of something. For example, people seek closure after a romantic relationship ends; however, this is not the only kind of closure that people desire. For instance, after a parent dies, their children might need some form of closure to deal with their grief.

Why proper closure is important?

Closure is important after a breakup because:Your brain needs an authentic narrative to make sense of what happened. Without closure you might keep going back to a relationship that wasn't working. You could be doomed to repeat the same relationship patterns the next time around without closure.

What is meant by I need closure?

For example, when a relationship ends, having closure means that you know the reason for the end of the relationship, and you know for certain where life is headed afterward. When we have closure after a break-up, our partner has told us the reasons the relationship has ended and what will happen moving forward.


2 Answers

As others have mentioned the cookbook is using the term "proper" to refer to the fact that a subroutine is created that carries with it a variable that is from a higher lexical scope and that this variable can no longer be reached by any other means. I use the over simplified mnemonic "Access to the $color variable is 'closed'" to remember this part of closures.

The statement "typeglobs cannot be defined for lexical variables" misunderstands a few key points about typeglobs. It is somewhat true it you read it as "you cannot use 'my' to create a typeglob". Consider the following:

my *red = sub { 'this is red' };

This will die with "syntax error near "my *red" because its trying to define a typeglob using the "my" keyword.

However, the code from your example is not trying to do this. It is defining a typeglob which is global unless overridden. It is using the value of a lexical variable to define the name of the typeglob.

Incidentally a typeglob can be lexically local. Consider the following:

my $color = 'red';

# create sub with the name "main::$color". Specifically "main:red"
*$color = sub { $color };

# preserve the sub we just created by storing a hard reference to it.
my $global_sub = \&$color;

{
  # create a lexically local sub with the name "main::$color".
  # this overrides "main::red" until this block ends
  local *$color = sub { "local $color" };

  # use our local version via a symbolic reference.
  # perl uses the value of the variable to find a
  # subroutine by name ("red") and executes it
  print &$color(), "\n";

  # use the global version in this scope via hard reference.
  # perl executes the value of the variable which is a CODE
  # reference.
  print &$global_sub(), "\n";

  # at the end of this block "main::red" goes back to being what
  # it was before we overrode it.
}

# use the global version by symbolic reference
print &$color(), "\n";

This is legal and the output will be

local red
red
red

Under warnings this will complain "Subroutine main::red redefined"

like image 169
benrifkah Avatar answered Oct 31 '22 16:10

benrifkah


I believe that "proper closure" just means actually a closure. If $name is not a lexical, all the subs will refer to the same variable (whose value will have been reset to whatever value it had before the for loop, if any).

*$name is using the value of $name as the reference for the funny kind of dereferencing a * sigil does. Since $name is a string, it is a symbolic reference (hence the no strict 'refs').

like image 20
ysth Avatar answered Oct 31 '22 18:10

ysth