Previous Page
Next Page

9.5. Pass by Reference

Parameters passed to a handler, and the value returned from a handler, are normally passed by value in AppleScript. This means that a copy of the value is passed to, and used by, the handler code.

But four datatypeslists, records, dates, and script objectswhen they are passed as parameters to a handler, are passed by reference , meaning that no copy is made; the handler and the caller both end up with access to the very same value. These are the only mutable datatypesthe only datatypes whose values can be modified in place. Whatever mutation is made to the parameter by the handler applies to it in the context of the caller as well. (Compare "Set by Reference" in Chapter 7.)

Here's an example showing that a list is passed by reference:

on extend(LL)
    set end of LL to "Jack"
end extend
set L to {"Mannie", "Moe"}
extend(L)
L -- {"Mannie", "Moe", "Jack"}

Even though the caller didn't capture the value of the handler call extend( ), and even though the caller didn't change L, and even though the handler extend never speaks explicitly of L, yet after the call, L has changed in the caller's context. The handler extend was able to modify L.

Here's an example showing that a script object is passed by reference:

script myScript
    property x : 10
end script
on myHandler(s)
    set s's x to 20
end myHandler
myHandler(myScript)
display dialog myScript's x -- 20

It makes sense that these datatypes can be passed by reference, but it is a little disturbing that they are passed by reference automatically, without giving you any choice in the matter. Passing by reference gives the handler great power over the parameter, which the handler can misuse. So, to prevent accidents, it is up to you to remember that list, record, date, and script object parameters are passed by reference, and that things you do in a handler to such parameters have an effect outside the handler. If you wish to avoid this, then if you like you can pass them by value, by making a copy and passing the copy:

on byValue(x)
    copy x to y
    return y
end byValue
on extend(LL)
    set end of LL to "Jack"
end extend
set L to {"Mannie", "Moe"}
extend(byValue(L))
L -- {"Mannie", "Moe"}

What about values that are not lists, records, dates, or script objects? How can they be passed by reference? They can't. Well, sometimes they can, but only in situations where it is pointless to do so. See "Reference as Parameter" in Chapter 12.


Previous Page
Next Page