Hello,

This example is a notable use of fry; it would be awkward without it.

I wanted to monitor a directory and update some variables in the current 
namespace upon changes made to the directory or it's contents.

The help for 'with-monitors' mentions that the quot is run inside a new scope. 
This signals to me that I need to turn my quot into a namespace closure 
(vocab: rewrite-closures).

In this example, I'll increment the value of a variable 'a' when changes to a 
directory "/tmp/test-dir-105" are made.

Here's some setup:

----------------------------------------------------------------------
USING: threads io.monitors rewrite-closures fry ;

SYMBOL: a

0 a set

: action ( monitor -- monitor )
  [ next-change 2drop a get 1 + a set ] [ action ] bi ;
----------------------------------------------------------------------

The code to start monitoring often resembles something like this:

    [
      [ "/tmp/test-dir-105" t <monitor> action ] with-monitors
    ]
  in-thread

The problem there is that 'action' is run in the scope provided 
by 'with-monitors'.

Here's an attempt:

        C[ "/tmp/test-dir-105" t <monitor> action ]

        [ with-monitors ] curry in-thread

Now the 'action' is inside a quot closed over the current namespace, but this 
still doesn't work. The problem is that '<monitor>' needs to be run in the 
namespace provided by 'with-monitors'.

So finally, we have this:

        C[ action ]
          '[
             [ "/tmp/test-dir-105" t <monitor> , call ] with-monitors
           ]
        in-thread

This does the job and depends on fry's ability to embed items into nested 
quotations.

Ed

-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
Factor-talk mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/factor-talk

Reply via email to