Case sensitivity in Livecode ??

Mark Waddingham mark at livecode.com
Tue Jun 7 13:55:52 EDT 2022


On 2022-06-07 17:16, Mark Wieder via use-livecode wrote:
> 1. Because it's a function, not a constant.
>   put gkMyMagicValue() into tVar
> is cognitively different from
>   put gkMyMagicValue into tVar
> 
> Something like 17 is a trivial case. Something more like real world
> usage would be
> 
> constant kRootURL="http://example.com/aUrlThatMightChange/api/v2"

I see and what is kRootURL the Url for? If I were writing a library for 
a web-service and needed (for some reason) to expose the underlying URL 
to callers of the library, then I'd have simply define a function as 
part of its public API:

   function myRestLibraryGetRootUrl
     return "http://example.com/aUrlThatMightChange/api/v2"
   end myRestLibraryGetRootUrl

I don't buy the 'cognitively different' argument - different languages 
have different patterns. I really don't see that getting into the habit 
of using 'constant functions' instead of 'constant variables' is any 
different from getting into the habit of doing assignment as 'source 
into target', rather than 'target = source'; or getting your head around 
the message path.

It is definitely *not* unusual for libraries in any language to expose 
*all* that they do via functions - whilst you can use enums and 
preprocessor defines in C/C++ for global constants - they make your 
library unwrappable easily by higher-level languages. Indeed, you tend 
to find that as published low-level (C/C++) libraries have evolved they 
have changed to ensure their interfaces are entirely function based ones 
(indeed, oftentimes C++-based libraries gain a C function wrapper to 
make this easier - as C++ is a nightmare to wrap stuff from due to the 
immensely complicated semantics, these days, of C++ classes).

> 2. Because the server already build supports the "include" keyword
> which would neatly solve the issue, but none of the other platforms
> do. Why?

You can't really compare the features of the PHP (C preprocessor) style 
operation of the server engine with the object-based scripting of the 
normal LiveCode engine.

In that PHP-likeness, 'include' makes sense as the server engine is 
essentially doing a continuous 'merge' - emitting interleaved blocks of 
content (text) with content generated from code.

The include which is present there makes sense for that form of coding - 
i.e. for generating text documents from a mixture of prewritten text, 
and evaluated script. I don't think it makes sense when scripts are 
attached to objects where more structure is needed and they exist in a 
dynamic environment.

Critically, the server engine loads and parses files in a linear fashion 
- emitting the text, and executing the interleaved script. Everything is 
completely transient - when the document has finished being emitted, the 
engine terminates.

It raises too many edge-cases and questions as to what should happen in 
various different scenarios (as well as being a very large noose with 
which people could hang themselves) when you try to add its 'include' 
operation to the normal LiveCode environment.

Remember that in the server engine include operates on a file so  what 
would you expect to happen if you change the file? Does the engine have 
to track changes and recompile any object scripts including it when they 
change? (Remember that object scripts are compiled on being set, or when 
first tickled by a handler lookup if already set and loaded from disk).

> 3. Because every other language I've used has global constants and
> makes this easy. It's only xtalk that makes this hard. If an LC goal
> is to provide a tool for learning coding then multiple definitions of
> the same constant is a paradigm that is not transportable to other
> languages, and indeed will probably result in a compiler error.

xTalk does not make it hard - see above - its just different because of 
its model.

Of the languages you've used how many are object-based, where objects 
have scripts which can be dynamically (re-)attached continuously 
throughout the lifetime of a programs execution and, moreover, can be 
dynamically created at runtime; and more specifically, where a script is 
a defined set of handlers and other definitions which are completely 
independent (from the point of view of compiling) of any other script?

For those which you have found which fit that pattern, do any of them 
have global constants?

> 4. Because it gets tiresome having to explain to new developers that
> you have to declare constants in multiple scripts even though it's the
> same constant you already declared and the workaround is to use a
> getter function as you described.

Then tell new developers that the xTalk way to do global constants is 
constant functions in the message path!

Saying that is a workaround is akin to telling them that:

   "The workaround for not being able use the syntax 'X := Y' is to use 
the syntax 'put X into Y'"

Or telling someone learning Java that:

   "The workaround for defining a global function is to make it a static 
method of some class"

The point being that how you do things in different languages is 
different...

xTalks don't have a concept of 'global constant' because the language 
and runtime model isn't one which really supports such a thing (as it 
stands) - however if you need a constant available globally then 
leverage a function in the message path to do so.

Java doesn't have the concept of a 'global function' because it is a 
pure class-based language - however if you do need a global function, 
then you can just make a static method in a class.

Neither of these things are 'workarounds' - they are how you do things 
in that language!

FWIW, I'm not entirely sure whether what you (Mark) want from 'global 
constants' is quite the same as what Alex wants from 'global constants', 
and I'm not entirely sure whether what I *think* you both mean when you 
ask for 'global constants' is what you are actually thinking of when you 
ask for 'global constants'...

In that vein, what would be helpful is, instead of just going 'can we 
have global constants', propose problems you need to solve / would like 
to solve and use-cases you have encountered where the existing xTalky 
feature set is not sufficient to solve it in some reasonably elegant 
fashion without 'global constants'.*

Warmest Regards,

Mark.

* I potentially have use-cases for non-script-local constants, but I 
don't have any for 'global variable'-like 'global constants' which 
aren't expressible with existing xTalk notions - hence why my request to 
'put up or shut up' ;)

---
Mark Waddingham ~ mark at livecode.com ~ http://www.livecode.com/
LiveCode: Everyone can create apps



More information about the use-livecode mailing list