TFP

George Peter Staplin 2006-07-28: TFP is my new programming system. I've created what I call box programming. Basically each box is an asynchronous process that communicates with other boxes via ports. In TFP each box forks from the router, and does a unique job. TFP is a domain-specific language built on top of Tcl.

lexfiend 2006-08-12: Which begs the question: Is TFP short for Tcl Flow-based Programming?

George Peter Staplin 2006-08-12: Yes. I wrote a paper for the conference about this, and I give credit to Flow-Based Programming for inspiring what I created. It will appear after the conference. What's unique is my box abstraction and the domain-specific language I've created for it in Tcl. I also used processes rather than threads, unlike some other modern implementations of FBP. I've also changed the names of some components, because I think "router" is a better description than "scheduler" for my implementation.

The first application built with TFP is called TFP Shell. It's an interactive shell with image support.


For instance here is an image box:

box image {
    load [file join $::shellbinpath pngext2.so] Pngext2
} takes filename {
    if {[catch {out 1 [pngext2:decode file $filename]} result]} {
                out 0 error
                out 1 $result
                return
        }
         out 0 image
} out 2

To use that box I might have something like:

box interactor {
    #
    # This is the init path.  It can contain procs and other startup code.
    #
    package require Tk
    load [file join $::shellbinpath megaimagetk.so]
    pack [button .b -text {Load image} -command {
        out 0 /path/to/somefile.png}]
    pack [label .img]
} takes {type data} {
    switch -- $type {
        error {
            tk_messageBox -icon error -message $data
        }

        image {
            set img [image create photo]
            megaimage.to.photo $data $img
            .img configure -image $img
        }
    }
} out 1

Then I connect the boxes like so:

connect interactor 0 image 0
connect image 0 interactor 0
connect image 1 interactor 1
router
vwait forever