LiveCode 10 - what are your thoughts on the new features?
Mark Waddingham
mark at livecode.com
Wed Sep 8 03:50:14 EDT 2021
On 2021-09-08 01:33, Alex Tweedly via use-livecode wrote:
> But
> put [1, 2, 3 ] into tVar2
> isn't clear to me. If it was in Python it would be a list - but LC
> doesn't have 'lists'.
>
> Is it equivalent to
> put true into tVar2[1]
> put true into tVar2[2]
> put true into tVar2[3] ??
Yes.
A sequence in LC is a numerically-keyed array where the keys range from
1...the number of elements.
Admittedly they are (currently) still implemented as a 'normal' array
internally, but they do have different functionality in `repeat for each
element` which iterates in numeric order, and not hash order.
> Why can't I say
> put { myvar: "first", anothervar: tWhatever } into tVar2 ?
So if one treats array literals as an equivalent to an ordered sequence
of put statements (which is the canonical interpretation really!) then
there is, in principal, no problem with allowing non-constant
expressions for both key and value.
Certainly non-constant value expressions are no problem at all, and
would be included in the initial implementation... I'm not averse to
non-constant key expressions either really, I'm just a little skittish
over the resulting reservation of ':' (which is probably fine), and the
interplay with variables and unquoted-literals (more in terms of
difference that might occur between what the engine thinks something
means and what the writer intended).
> But I was disappointed to not see my two biggest 'constant' wishes
>
> 1. multi-line constants e.g. amongst other ways, Python's
>
> put """line 1
>
> line 2
>
> line 3""" into tVar
I'm not averse to the idea of multi-line literals - although
constant-folding does go a long way to assuage the problems they solve
in many cases.
e.g. You can use format("dfsdf\ndfgdfg") for short strings with newlines
in, and any chained sequence of concatenations of constants will be
evaluated at compile time.
The main issue here is the effect on tooling really - any code which
processes LiveCode Script in any way would need to change to take them
into account. This not only includes syntax highlighters and editors but
any code which groks script for other reason. This means that what might
be a relatively simple change to the engine, actually introduces a
ripple effect where the whole implementation burden is a great deal
higher.
[ I'd point out that I don't think there is a single piece of tooling in
existence which actually fully supports the *current* lexical structure
of LiveCode - which has not actually changed since day dot - including
the existing Script Editor ]
That being said, in terms of what multiline syntax I'd propose, if it
were to be added - I'd be in favour of Swift's model. Most other
languages have added multiline strings with no thought to code
structure, however the Swift team really have:
var foo = """
Line 1 - spaces before stripped
Line 2 - spaces before stripped
"""
There are two simple rules at play here.
The first is that no string content is present on the lines containing
""" - i.e. the string content starts on the line after the opening """,
and the string content ends on the line before the closing """.
The second is that whitespace is stripped from each line of the string
content based on the whitespace before the final """. i.e. If the """ is
indented by 3 spaces, then 3 spaces are removed from all lines of the
content.
This means indenting of such literals is no different from any other
construct - and is merely predicated on identifying the lines in such a
literal as continuations (i.e. each line is an extension to the last).
> 2. global constants. Most compiled languages will allow an 'include'
> file which can specify constants, which you can then rely on to be
> defined properly (and the same) everywhere. So that's probably too
> much at odds with LC's model - but could be handled by 'protect'
> global variables (or, I'm sure, another 10 ways that Mark W. could
> think of).
So if by 'global constant' you mean being able to define a token which
means the same thing in all scripts - then yes, that does not really fit
at all as it breaks the logical independence of all scripts in terms of
what tokens mean.
Put another way, all scripts would have to be recompiled when a script
defines such a thing, which would then potentially change the meaning of
any script if it happens to internally use said token for something else
(in the worse case scripts which did not have syntax errors before might
do so after). This is why you have to declare global variables in all
scripts which use them.
The request for 'global constants' comes up repeatedly, but I don't
really recall anyone proposing a single use-case which couldn't be
solved in a 'better' (relative to xTalkiness existing featurs) way :D
Warmest Regards,
Mark.
--
Mark Waddingham ~ mark at livecode.com ~ http://www.livecode.com/
LiveCode: Everyone can create apps
More information about the use-livecode
mailing list