Difference between revisions of "NodeSpace.h"
m |
m (prefix) |
||
Line 3: | Line 3: | ||
// SRC: http://www.organicdesign.co.nz/nodeSpace.c | // SRC: http://www.organicdesign.co.nz/nodeSpace.c | ||
− | #define | + | #define nodeROOT 0 |
− | #define | + | #define nodeFALSE 0 |
− | #define | + | #define nodeCURRENT 1 |
− | #define | + | #define nodeTRUE 1 |
− | #define | + | #define nodeAND 2 |
− | #define | + | #define nodeCODE 3 |
− | #define | + | #define nodeTHEN 4 |
− | #define | + | #define nodeNETWORK 5 |
− | #define | + | #define nodeDESKTOP 6 |
− | #define | + | #define nodeSTREAMINFO 7 |
typedef int node; // node: a type for referring to nodes | typedef int node; // node: a type for referring to nodes | ||
Line 73: | Line 73: | ||
int nodeReduce(node subject) { | int nodeReduce(node subject) { | ||
node cur; | node cur; | ||
− | if ((cur = nodeGetValue(subject, | + | if ((cur = nodeGetValue(subject, nodeCURRENT)) == nodeFALSE) return 0; // return if no CURRENT node |
− | nodeSetValue(subject, | + | nodeSetValue(subject, nodeCURRENT, nodeGetValue(cur, nodeAND)); // test AND first? |
− | if (nodeGetValue(cur, | + | if (nodeGetValue(cur, nodeCODE) == nodeTRUE) { |
− | ((code)nodeGetState(cur, | + | ((code)nodeGetState(cur,nodeROOT))(); // execute code-ref returned in state |
// Later this must declare and build if no function-reference | // Later this must declare and build if no function-reference | ||
// replace self in loop with n.THEN if non-zero | // replace self in loop with n.THEN if non-zero |
Revision as of 23:54, 27 July 2006
// This article and all its includes are licenced under LGPL // GPL: http://www.gnu.org/copyleft/lesser.html // SRC: http://www.organicdesign.co.nz/nodeSpace.c
- define nodeROOT 0
- define nodeFALSE 0
- define nodeCURRENT 1
- define nodeTRUE 1
- define nodeAND 2
- define nodeCODE 3
- define nodeTHEN 4
- define nodeNETWORK 5
- define nodeDESKTOP 6
- define nodeSTREAMINFO 7
typedef int node; // node: a type for referring to nodes typedef void (*code)(); // code: a type for referring to functions node this; // this: the current node, like cwd
// - path is array-of-node node nodeTraverse(node subject,node key) { // select node wco selNode return subject; }
// set nodal value of node/path // - allows null key node nodeGetValue(node subject,node key) { return listGetValue(key?listTraverse((item)subject,(item)key):(item)subject); }
node nodeSetValue(node subject,node key,node value) { // todo: onChange return listSetValue(key?listTraverse((item)subject,(item)key):(item)subject, (item)value); }
node nodeInsertKey(node subject,node key) { // todo: onInstall node instance; return instance; }
void nodeRemoveKey(node subject,node key) { // todo: onRemove }
void nodeLoopInsert(node subject,node loop) { // add object to the passed loop (do error if not a loop) }
void nodeLoopRemove(node subject) { // remove subject from loop if its currently in one }
// State is a pointer to a locally meaningful item which is associated with a node // - doesn't need separate get/set since pointer-based, but keeps it more lang-independent char *nssBuf = malloc(20); void *nodeGetState(node subject,node key) { itob(key?(int)listTraverse((item)subject,(item)key):(int)subject,nssBuf); return *hash(nssBuf); }
void *nodeSetState(node subject,node key,void *state) { itob(key?(int)listTraverse((item)subject,(item)key):(int)subject,nssBuf); return *hash(nssBuf) = state; }
// - Consumes quanta of execution // - Creates History from change events // - Builds, declares and executes functionality // - Should reduction handle cyles (current-cycle etc), or a separate root-thread // - returns false if no more to reduce int nodeReduce(node subject) { node cur; if ((cur = nodeGetValue(subject, nodeCURRENT)) == nodeFALSE) return 0; // return if no CURRENT node nodeSetValue(subject, nodeCURRENT, nodeGetValue(cur, nodeAND)); // test AND first? if (nodeGetValue(cur, nodeCODE) == nodeTRUE) { ((code)nodeGetState(cur,nodeROOT))(); // execute code-ref returned in state // Later this must declare and build if no function-reference // replace self in loop with n.THEN if non-zero } else nodeReduce(cur); return 1; }