RE: "a reference to"
RE: "a reference to"
- Subject: RE: "a reference to"
- From: Scott Babcock <email@hidden>
- Date: Thu, 24 Jan 2008 10:34:39 -0800
- Acceptlanguage: en-US
- Thread-topic: "a reference to"
Yes, recordRef is bound to the {foo:"foo"} record, but it's not an AppleScript 'reference' object. Only a 'reference' can be coerced to 'reference', and an error is thrown if you try this on recordRef. Even so, the 'contents of' operator de-references recordRef into a local copy:
set theList to {{foo:"foo", bar:{baz:"baz"}}}
repeat with itemRef in theList
set recordRef to (contents of itemRef)
set foo of recordRef to "ref"
set localItem to (contents of recordRef)
set foo of localItem to "local"
set baz of bar of localItem to "ref"
return {recordRef, localItem}
end repeat
--> {{foo:"ref", bar:{baz:"ref"}}, {foo:"local", bar:{baz:"ref"}}}
The fact that setting the baz property through localItem is reflected in the original list confirms that it is indeed a shallow copy.
> Here's the example again:
> >
> > set theList to {{foo:"foo"}}
> > repeat with itemRef in theList
> >
> > set recordRef to (contents of itemRef)
> > set foo of recordRef to "ref"
> > set localItem to (contents of recordRef)
> > set foo of localItem to "local"
> > return {itemRef, recordRef, localItem}
> >
> > end repeat
> >
> > --> {item 1 of {{foo:"ref"}}, {foo:"ref"}, {foo:"local"}}
> >
> > * recordRef is a reference to the record that's the first item of
> > theList. This is demonstrated by the fact that the change to the
> > [foo] property of recordRef is reflected in theList.
> > * localItem is merely a copy of the original record. Changes to its
> > [foo] property don't affect either theList or recordRef.
>
> - The itemRef variable is bound to a reference to item 1 of the list.
>
> - The recordRef variable is bound to the {foo:"foo"} record.
>
> - The localItem variable is bound to a copy of the original {foo:"foo}
> record. Apparently, asking for the contents of a list or record
> performs a shallow copy [1][2].
-----Original Message-----
Date: Wed, 23 Jan 2008 16:14:09 +0000
From: has <email@hidden>
Subject: Re: "a reference to"
To: Applescript Users <email@hidden>
Message-ID: <email@hidden>
Content-Type: text/plain; charset=US-ASCII; format=flowed; delsp=yes
On 22 Jan 2008, at 21:41, Scott Babcock wrote:
> (I failed to set the correct subject when I sent this the first
> time...)
>
> No, I mean a reference to *any* object.
OK, not important.
> The word "reference" is far too overloaded for my taste.
>
> AppleScript has a 'reference' data type, but it appears also to play
> with references of another sort, one that it hides.
No, there's only one reference type. The confusion comes from how and
when AppleScript constructs and resolves references, since that does
differ depending on whether they point to application objects or
AppleScript objects.
> Here's the example again:
>
> set theList to {{foo:"foo"}}
> repeat with itemRef in theList
>
> set recordRef to (contents of itemRef)
> set foo of recordRef to "ref"
> set localItem to (contents of recordRef)
> set foo of localItem to "local"
> return {itemRef, recordRef, localItem}
>
> end repeat
>
> --> {item 1 of {{foo:"ref"}}, {foo:"ref"}, {foo:"local"}}
>
> * recordRef is a reference to the record that's the first item of
> theList. This is demonstrated by the fact that the change to the
> [foo] property of recordRef is reflected in theList.
> * localItem is merely a copy of the original record. Changes to its
> [foo] property don't affect either theList or recordRef.
- The itemRef variable is bound to a reference to item 1 of the list.
- The recordRef variable is bound to the {foo:"foo"} record.
- The localItem variable is bound to a copy of the original {foo:"foo}
record. Apparently, asking for the contents of a list or record
performs a shallow copy [1][2].
Examples:
set var1 to {x:1, y:2}
set x of var1 to 3
log var1 --> {x:3, y:2}
log var2 --> {x:3, y:2}
set var1 to {x:1, y:2}
set var2 to var1
set x of var2 to 3
log var1 --> {x:3, y:2}
log var2 --> {x:3, y:2}
set var1 to {x:1, y:2}
set var2 to contents of var1 -- this shallow-copies the object bound
to var1
set x of var2 to 3
log var1 --> {x:1, y:2}
log var2 --> {x:3, y:2}
> From this behavior, I infer that list items with non-primitive data
> types (lists, records, application objects) are stored in the list
> as references. This makes sense, since it means that complex items
> in the list are no more difficult to manage than primitive items.
> However, these references are apparently not presented as
> 'reference' objects; they seem to be of some internal data type.
Incorrect inference (see above), though you have my sympathies (it
took me several years and many wrong turns to figure out how
AppleScript works to a reasonable level of accuracy).
BTW, and just to be sure: don't confuse the specific behaviours
associated with AppleScript's reference type with the normal
behaviours you see in any object-oriented language, i.e. stack-
allocated objects and internal pass-everything-by-reference semantics.
You don't - and shouldn't - need to think down to that level to
understand user-facing behaviours. As far as users are concerned, all
values are objects, and variables are simply names that can be bound
to objects; c.f. Smalltalk, Python, etc. Thus, for example, in the
following script var1 and var2 both point to the same object:
set var1 to {1, 2, 3}
set var2 to var1
whereas here var1 and var2 point to different objects (the 'copy'
command deep-copies an AppleScript object):
set var1 to {1, 2, 3}
copy var1 to var2
HTH
has
[1] With the one exception that if the record contains a 'contents'
property it returns the value of that property instead.
[2] I can't be bothered trawling the ASLG to check if this is
documented behaviour or not. Personally I would prefer an exception
was raised - either way, the current behaviour is obscure and a
potential source of confusion - but, hey, this is AppleScript after all.
--
http://appscript.sourceforge.net
http://rb-appscript.rubyforge.org
_______________________________________________
Do not post admin requests to the list. They will be ignored.
AppleScript-Users mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
Archives: http://lists.apple.com/archives/applescript-users
This email sent to email@hidden