Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW
 
PerlMonks  

Re^4: Shouldn't references be readonly?

by LanX (Cardinal)
on Aug 05, 2020 at 21:50 UTC ( #11120370=note: print w/replies, xml ) Need Help??


in reply to Re^3: Shouldn't references be readonly?
in thread Shouldn't LITERAL references be readonly? (updated)

> I am considering "literals" as more like constants embedded in the program,

I understand your POV ...

... BUT literals with the exception of undef are not constant!

Re^2: Shouldn't references be readonly?

It's always a new ref, hence constructed.

The semantics in JS are 100% the same, and they refer to [] and {} as "literal (object) constructors"

And I can't find any definition claiming literals to be constants, I think that was made up in this thread.

Cheers Rolf
(addicted to the Perl Programming Language :)
Wikisyntax for the Monastery

Replies are listed 'Best First'.
Re^5: Shouldn't references be readonly?
by jcb (Vicar) on Aug 05, 2020 at 22:13 UTC

    Perl is not JS. Does JS even have references as first-class values like Perl does?

    I just tested it and was surprised that overwriting a reference to a literal number or string through $_ in map raises an error, even if multiple layers of references are involved, but overwriting a reference (even through metareferences) to an array is fine.

    Devel::Peek reveals that the READONLY flag is apparently copied by the \ operator. If you start with a literal value, such as 1 or "abc" (which has the READONLY flag) the references are similarly seen to be read-only values, but if you start with an anonymous aggregate, which is mutable, the references are mutable. I would argue that, if there is a bug here, it is that references to constants, which should themselves (the references) be mutable, are incorrectly marked read-only.

      > Perl is not JS. Does JS even have references as first-class values like Perl does?

      All objects are references in JS and implicitly dereferenced. Passing an object means passing the reference.

      I doubt that JS has a way to reveal the counter printed like in Perl, so the use of references is transparently hidden.

      But the semantics are the same, and IIRC does ECMA explicitly name the concept of "reference".

      And yes, JS has no reference constructor like \ but you can compare objects for identity with ===

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      Wikisyntax for the Monastery

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://11120370]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others wandering the Monastery: (10)
As of 2020-10-30 12:50 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    My favourite web site is:












    Results (279 votes). Check out past polls.

    Notices?