http://qs321.pair.com?node_id=11120368


in reply to Re^2: 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, using a constant pool, where changing a value would have bizarre effects, like changing the value of "123456" everywhere in the program. Literal strings in C programs are often combined in this way.

The {} and [] operators are defined to produce distinct mutable aggregates every time they are evaluated. In this sense, they are not literals.

I am unsure how this behavior of replacing the reference itself is actually useful, but nor do I see any harm here.

Replies are listed 'Best First'.
Re^4: Shouldn't references be readonly?
by LanX (Saint) on Aug 05, 2020 at 21:50 UTC
    > 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

      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