Brainfade time - what's the proper name for a 'local' handler?

Jeff Massung massung at gmail.com
Thu May 27 15:30:35 EDT 2010


On Thu, May 27, 2010 at 2:10 PM, Robert Mann <rman at free.fr> wrote:

>
> >   // Return a list of all books with at least 'threshold' copies sold.
> >   function bestSellingBooks(threshold) {
> >     return bookList.filter(
> >         function (book) { return book.sales >= threshold; }
> >       );
> >   }
>
> did I get it right?? as I understand it, the "closure" replaces a loop?
> Assuming the function book loops through the books?
>
>
Sort-of. The closure does not replace the loop. The closure is called by the
loop. The loop is the filter function. Think of it like this (pseudo-code
that does not work, but might be easier to read and get the idea across):

function make_adder(N)
  return function (X) return N+X end
end

Now, we can do this:

add_10 = make_adder(10)
add_5 = make_adder(5)

Then we can call them like so:

add_10(20) = 30
add_5(4) = 9

Now, in your example, there's a function "filter" that takes a function
(closure) as an argument. It expects that function to return true or false,
and if true, it will keep the element, otherwise it will toss it. More
pseudo-code written in RevTalk style:

function filter tList, tFunction
  local tFilteredList

  repeat for each line tItem in tList
    if tFunction(tItem) is true then
      put tItem & cr after tFilteredList
    end if
  end repeat

  return tFilteredList
end filter

Now, with our function, we could (in theory) do something like so (in a
field control):

function filterBookByName tTitle
  -- only keep titles that start with an article
  if the first word of tTitle is among the items of "a,an,the" then
    return true
  end if
end filterBookByName

And we can pass our lovely filter function to and get rid of a bunch of
books:

put filter(fld "All Books", filterBookByName) into fld "Filtered Books"

Obviously this is just for show to try and indicate how the original
JavaScript might translate over into RevTalk conceptually. It doesn't work,
it doesn't even come close to doing the exact same thing and can't since
RevTalk doesn't support lexical environments. What I did above would be
closer to what's known as a first-class function.

Hope this helps some.

Jeff M.



More information about the use-livecode mailing list