public Object readForthNode( File f, LoadContext<?> parentContext ) throws ScriptError, IOException {
		final HashMapLoadContext<Object> ctx = new HashMapLoadContext<Object>(parentContext);
		
		Interpreter interp = new Interpreter();
		SafeProcedures.register(interp.wordDefinitions);
		interp.wordDefinitions.put("include", new StandardWordDefinition() {
			@Override
			public void run(Interpreter interp, SourceLocation sLoc) throws ScriptError {
				String filename = interp.stackPop(String.class, sLoc);
				File f = findOnIncludePath(filename);
				if( f == null ) {
					throw new ScriptError("Couldn't find '"+filename+"' on include path", sLoc);
				}
				try {
					runScript(interp, f);
				} catch( IOException e ) {
					throw new RuntimeException(e);
				}
			}
		});
		interp.wordDefinitions.put("ctx-get", new StandardWordDefinition() {
			// name -> value
			@Override public void run( Interpreter interp, SourceLocation sLoc ) throws ScriptError {
				String name = interp.stackPop(String.class, sLoc);
				try {
					Object o = get( name, ctx );
					if( o == null ) {
						throw new ScriptError("Couldn't resolve '"+name+"' from load context", sLoc);
					}
					interp.stackPush( o );
				} catch(IOException e) {
					throw new RuntimeException(e);
				}
			}
		});
		interp.wordDefinitions.put("ctx-put", new StandardWordDefinition() {
			// value, name -> ()
			@Override public void run( Interpreter interp, SourceLocation sLoc ) throws ScriptError {
				String name = interp.stackPop(String.class, sLoc);
				Object value = interp.stackPop(Object.class, sLoc);
				ctx.put( name, value );
			}
		});
		
		try {
			runScript(interp, f);
		} catch( ScriptError e ) {
			throw e;
		} catch( IOException e ) {
			throw e;
		}
		
		return interp.stackPop( Object.class, new BaseSourceLocation(f.getPath(), 0, 0) );
	}