is strictly a name

Mark Waddingham mark at livecode.com
Fri Sep 1 13:23:37 EDT 2023


On 2023-09-01 17:44, Paul Dupuis via use-livecode wrote:
> I may just be experiencing a brain fart, but I have read the release 
> notes several times, and I don't understand the purpose of the new:
> 
> is strictly a name
> 
> operator? Can someone explain its purpose in really basic terms or 
> examples?

Its purposes is so that it is possible to tell when a value is a 'name' 
rather than a 'string' when the distinction is important. The cases 
where this is true are few and far between - indeed, the use-case it was 
added for was so that the exact runtime type of constant values 
generated when parsing script (e.g. from constant initializers) is 
preserved.

There are two kinds of strings internally - strings and names. All names 
are strings, but not all strings are names.

The difference is that there is only ever one instance of a name with a 
given string in memory - e.g. if two variables hold a name whose string 
is "foo", then they will hold the same pointer.

As to what names are - they are an optimization for cases where the 
engine will often do comparisons between them.

Names are implemented in a global hash table in such a way that caseless 
and case-sensitive comparisons are constant time (when both values being 
compared are names).

The keys of an array are names - which means the engine never has to 
compare the actual characters of a key in an array as it does a lookup.

Literals in scripts are stored as names - so if you have 100 instances 
of the string constant "foobar" throughout all your scripts as literals 
- there will only actually be one instance of "foobar"

Similarly, internally, object names, handler names and variable names 
are all stored as, well, names (again - because they are commonly 
compared against each other).

Some examples of where you can observe a name are:

    put "foo" is strictly a name => true

    put ("foo" & empty) is strictly a name => false

    repeat for each key tFoo in { "foo": true }
      put tFoo is a strictly a name => true
    end repeat

There might be a few other places where you could see a name rather than 
a string, but as mentioned above - its unlikely that 99.9% of people 
would ever need to worry about it :)

Warmest Regards,

Mark.

-- 
Mark Waddingham ~ mark at livecode.com ~ http://www.livecode.com/
LiveCode: Build Amazing Things



More information about the use-livecode mailing list