Wednesday, January 17, 2018

#1 2015-01-14 07:46:42 am

McUsrII
Member
Registered: 2012-11-21
Posts: 3046
Website

Javascript closures in AppleScript

There is another kind of closure in AppleScript, in which you 'freeze' a state of a free variable, when you access it from within a script object in AppleScript, I call that kind of closure for a 'lisp closure'.

The great thing about a Javascript closure, is that it lets you have a global variable, ( or more like a static variable in C) that doesn't interfere with anything else in the name space.

Applescript:

to Counter(seed)
   script
       property mv : seed
       to inc()
           set mv to mv + 1
           return mv
       end inc
   end script
end Counter

set m to Counter(4)
m's inc()
m's inc()
m's inc()
set k to Counter(4)
log k's inc()
# 5
log m's inc()
# 8

Last edited by McUsrII (2015-01-14 07:47:23 am)


Filed under: closure

Offline

 

#2 2015-01-14 08:03:20 am

McUsrII
Member
Registered: 2012-11-21
Posts: 3046
Website

Re: Javascript closures in AppleScript

Hello.

This is an example of a 'lisp closure', as opposed to the javascript closure, I have never used a lisp closure for anything practical, but they may pop up unexpectedly now and then during debugging. smile

The thing here, is that since x in the example below is a property declared at the top level, it is saved with the context of the script, when the script is assigned to a variable, so that there is no way you can change the value of x as seen from inside the script at the time the script was assigned to a variable.

Now, if we don't assign the script to a variable, then the script will get that x has changed, if we run it at different stages.

This feature of saving the context, can also lead to a situatin where  a script can't run, because the address space is 'used up', by this 'context saving' (when run repeatedly).

Applescript:

property x : 5

script myscript
   display dialog x
end script

set x to 20

set dummy to myscript

set x to 10

run myscript -- ( or run dummy )
(* 20 *)

This example is stolen from the book "Applescript the Definitive guide" By Matt Neuburg.

Edit

Specified, that the 'freezing' only works for declared properties, and (not for globals for instance).

Last edited by McUsrII (2015-01-14 08:18:44 am)


Filed under: closure, lisp

Offline

 

Board footer

Powered by FluxBB

RSS (new topics) RSS (active topics)