Mark,

Thanks for this fantastic explanation of controls and objects and lots more. 
I’m happy to learn that what I’ve always thought I understood is not far off 
from reality. :) The definig of audioclips and videoclips as objects, not 
controls, within the stack tree, cleared up one point of confusion for me. I 
had always explained *clips to students as “objects that have no visual 
component.”

Now as regards any fixes and changes to terminology in the docs (Guides or 
dictionary API), I would be happy to help anyone who sees a confusing passage 
and who would like to fix it. I have recently been doing a fair amount of work 
as time permits to make improvements to the dictionary and user guides. If you 
see a problem in the docs and don’t have the time to grok the Github system, 
drop me a note and I’d be happy to help out.

Regards,

Devin


> On Jun 20, 2016, at 3:28 AM, Mark Waddingham <m...@livecode.com> wrote:
> 
> On 2016-06-19 09:19, Richmond wrote:
>> I am currently teaching some children Livecode programming and ran
>> into some difficulty
>> on Friday when a child asked me why the menus were full of the word "Control"
>> when I had been talking about "Objects".
>> Well?
>> How about changing every use of the word "Control" to "Object"?
> 
> Replying to the original post, as a lot was mentioned in this thread (it 
> tries to cover most of what came up in the thread, not just this particular 
> question).
> 
> An object (regardless of what language it is rendered in, or with whatever 
> specific kind of 'oop' methodology you care to subscribe to) is simply some 
> state (i.e. variables which are distinct for each instance of the object) 
> with an associated list of handlers/methods/functions which act on that 
> state. (Indeed, really I think one should require that the state is entirely 
> hidden and encapsulated within the object and not visible from the outside 
> world - although most OOP languages do this very very poorly).
> 
> In LiveCode, this is perhaps slightly hidden behind the English-like 
> syntactic sugar. For example, one can imagine that:
> 
>   get the fooBar of myObject
> 
> Is the same as (in a non English-like language):
> 
>   it := myObject.GetFooBar()
> 
> Or something like:
> 
>   copy myObject
> 
> Is the same as (again, in a non English-like language):
> 
>   myObject.Copy()
> 
> Therefore, I have absolutely no hesitation in saying that LiveCode is 
> object-oriented (for some definition of object-oriented). Indeed, it always 
> has been - everyone who has ever programming in an xTalk had been doing 
> object-oriented programming since it started to become 'popular' (HyperCard 
> appeared in 1987, Cfront - the original C++ - appeared in 1985 - although the 
> first 'object oriented' languages such as Simula appeared perhaps a decade 
> before).
> 
> The reason why I tend to hesitate saying LiveCode is object-oriented 
> explicitly (well, up until 8, at least) is that the kind of way you do 
> programming in LiveCode is perhaps not quite the same as what people expect 
> when they hear that 'a language is object oriented'. The LiveCode model is 
> essentially that of aggregation and adaptation, rather than inheritance 
> (people tend to be highly aware of the later, but not aware of the former 
> even though they will be implicitly doing it day-in-day-out in any 
> programming language they are a practitioner of).
> 
> In LiveCode, you build applications by using the building-blocks you drag 
> from the control palette to build more complicated things (aggregation), and 
> then you apply scripts to each object to change the behavior of the 
> building-blocks appropriate to your app (adaptation).
> 
> Now, inheritance is orthogonal to the idea of aggregation and adaptation - 
> and it should be noted that most 'traditional' OOP languages allow you to do 
> inheritance, but you have to build the framework to do aggregation and 
> adaptation yourself (hence why Java, Obj-C, C++ etc. all have a large variety 
> of 'frameworks' you can leverage to actually build apps - if you tried to do 
> so with the 'raw' language, you'll find yourself just reinventing some sort 
> of structure which is probably not too dissimilar to LiveCode's).
> 
> When we added 'behaviors' you could argue that 'inheritance' did actually 
> start to creep in - behaviors allow you to factor out the code which you use 
> to adapt the building blocks (i.e. your scripts) into an informal hierarchy. 
> (Informal here refers to the fact you don't need to make type definitions - 
> which is entirely appropriate to LiveCode which tends not to force that kind 
> of thing on you anywhere - except in Builder, and only then if you really 
> want to).
> 
> With 8, however, you can start to see the 'class inheritance' ability being 
> added to LiveCode - that is what widgets are. i.e. You can write your own 
> building blocks (in LiveCode Builder). (For those of you who have looked at 
> Builder, then although it is not yet explicit - a module is essentially a 
> class - a widget is a module which can have multiple instances and a library 
> is a module which only ever has a single instance).
> 
> So, right now in LiveCode, the objects you have to play with are stacks, 
> cards, audioclips, videoclips, fields, buttons, scrollbars, players, images, 
> buttons, groups, graphics and widgets. However, remember that 'widgets' are a 
> completely extensible set of things, so this list is no longer fixed as it 
> was before.
> 
> To go back to the original point about controls vs objects then this is 
> actually very well defined (indeed, it is embodied in the source of the 
> engine - i.e. how LiveCode is actually implemented). A control is an object 
> which sits on a card or in a group.
> 
> Indeed, you have the following 'inheritance' hierarchy:
> 
>    Object
>       Stack
>       Card
>       AudioClip
>       VideoClip
>       Control
>         Group
>         Field
>         Button
>         Scrollbar
>         Player
>         Image
>         Button
>         Graphic
>         Widget
>           <all widgets>
> 
> This means that a stack is an object, but not a control. A player is a 
> control, and therefore an object. AudioClips and VideoClips aren't really 
> 'controls' in this sense because they sit on a stack , and not a card 
> (although the Import Menu does call them so - which is perhaps the reason for 
> the slight amount of confusion).
> 
> At runtime, objects in LiveCode form themselves into a tree (note this tree 
> is about *ownership* of instances of objects, not inheritance):
> 
>    Stack
>      Substack
>        <same as stack>
>      AudioClips
>      Videoclips
>      Cards
>        Controls
>        Groups
>          Controls
> 
> You use LiveCode Script to attach 'adaptations' to your objects, and the 
> message path allows a simple way for these adaptations to communicate.
> 
> As LiveCode Script does not have 'strong references to objects' (and cannot 
> have them unless we want to lose stringyness entirely - which is actually one 
> of the main differences between Script and Builder) you create named objects 
> in this hierarchy and then manipulate them using chunk expressions - i.e. 
> references are strings describing a path in the object tree such as 'button 
> "Foo" of card "Bar" of stack "Baz".
> 
> Another way to think about this is that, in LiveCode Script, every object 
> must have an explicit name. You use chunk expressions to select an object 
> based on various criteria (type, owner). Once created, objects exist in the 
> tree until they are explicitly deleted.
> 
> Indeed, one of the reasons 'OOP as you see it in other languages' is very 
> unlikely to appear in LiveCode Script is because there is no way to represent 
> a reference to a temporary object which disappears when there are no 
> references to it. As all references must be strings, and strings can sit in 
> arbitrary other strings, there is no way for the engine to ever know when you 
> don't need an object anymore - you have to tell it. I don't really see this 
> as a limitation, however, because that is the object model of LiveCode Script 
> - you adapt named instances of building blocks with your scripts!
> 
> Of course, it would be nice if you could write widgets in 'LiveCode Script' - 
> however, I'm not sure it is entirely appropriate. The stringy type system 
> which Script has compared to Builder means that some things you really need 
> to be able to do to write widgets in the way Builder does become quite 
> tortuous. That being said, there is room for 'Builder' to come closer to 
> 'Script' in terms of its strictness - at least as an option - i.e. Script 
> without the 'everything is a string' concept.
> 
> Perhaps the thing which is much more important at the Script level is the 
> ability to take a collection of LiveCode objects and scripts etc. and wrap 
> them up with an 'inner script' which presents them as a single black-box 
> control - just like a widget. This is the idea of 'template objects', or 
> custom controls 'done properly' (for some definition of properly, of course). 
> This is a recursive application of the ideas which you are already familiar 
> with when you build your apps and has a very nice 'self-similarity' and 
> symmetry ("It's turtles all the way down").
> 
> So, anyway, to sum up:
> 
>   1) Objects and Controls are very well defined concepts in LiveCode and 
> always have been. There might be some places in the docs and IDE, however, 
> where it uses the wrong term and I that should be corrected (i.e. if you 
> notice an instance of this file a report, and we'll look into correcting it).
> 
>   2) LiveCode is definitely object-oriented:
> 
>      i) You build black-box objects in LiveCode Builder (which is, although 
> not explicitly yet exposed, class-based).
> 
>      ii) You aggregate black-box objects together then adapt and glue them 
> together using LiveCode Script.
> 
>   3) LiveCode Script is designed to allow this rapid gluing and adaptation, 
> and as such has a loose stringy type-system and dynamic message path to aid 
> this rapidity.
> 
>   4) LiveCode Builder could become less strict in the future as an option, to 
> make it easier for people who are familiar with Script to write Builder to 
> build widgets.
> 
>   5) LiveCode Script is probably not the thing to use to write widgets, but 
> the ability to be able to package up a group of controls as a black-box just 
> like a widget would be entirely consistent and self-similar with the existing 
> environment.
> 
> The final thing which was touched on in this thread (and indeed was the point 
> of it originally) was about how to teach LiveCode to kids - and I have to say 
> that I'm not sure I'm qualified to actually help there! All I will say is 
> that surely kids at the level you are talking about are able to reason about 
> facts like:
> 
>   i) A Car is Vehicle; a Lorry is a Vehicle; a Car is not a Lorry so not all 
> Vehicles are Cars
> 
>   ii) A Potato is a Vegetable; an Onion is a Vegetable; a Potato is not an 
> Onion so not all Vegetables are Potatoes
> 
> Which has the direct analog with (something similar to):
> 
>   A Control is an Object; a Card is an Object; a Card is not a Control so not 
> all Objects are Controls
> 
> Of course, having just written that, I do remember a number of computer 
> science textbooks I have read (which are aimed at undergraduates) belabouring 
> such points as these (almost in this direct fashion) - which suggests that it 
> isn't a very easy concept to get across even to those who are 18+. i.e. I 
> suspect it is more difficult to teach than I perhaps imagine!
> 
> Warmest Regards,
> 
> Mark.
> 
> -- 
> Mark Waddingham ~ m...@livecode.com ~ http://www.livecode.com/
> LiveCode: Everyone can create apps
> 
> 
> _______________________________________________
> use-livecode mailing list
> use-livecode@lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your subscription 
> preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode

Devin Asay
Office of Digital Humanities
Brigham Young University

_______________________________________________
use-livecode mailing list
use-livecode@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode

Reply via email to