On Oct 19, 2007, at 10:49 AM, James Harkins wrote:
I have a proof of concept to fix this, but felt I should run it by the list before committing anything. The main issue is that formerly, there was only one directory for Instr definitions, ./Instr. Since Instr now also looks in quark directories, the old method of assigning the path -- using the one and only directory plus the first entry in the symbolized name -- won't work because you can't assume the location. That leads to something I've wanted for quite some time -- the ability to know in the middle of code execution, if you're in a file, what file it is. (That would be very helpful to me in chucklib also.) Just a few simple changes: In Main.sc: // proof-of-concept: the interpreter can set this variable when executing code in a file // should be nil most of the time classvar <>currentFile; --- In Kernel.sc (Interpreter class): executeFile { arg pathName ... args; var result; if (File.exists(pathName).not) { ["file \"",pathName,"\" does not exist."].join.postln; ^nil }; Main.currentFile = pathName; protect { result = this.compileFile(pathName).valueArray(args) } { Main.currentFile = nil }; ^result } --- Then, to fix Instr: init { arg specs,outsp; path = Main.currentFile; // this line is new this.makeSpecs(specs ? #[]); if(outsp.isNil,{ outSpec = nil; },{ outSpec = outsp.asSpec; }); this.class.put(this); } Or maybe Instr:init should have path = Main.currentFile ?? { Document.current.path }; Any issues with this? I think it's generally useful. Oh yes, and guiBody needs to check path.notNil before calling File.exists(path) -- because it's legit to have an Instr with no path (if you create it in an unsaved document). hjh : H. James Harkins : jamshark70@xxxxxxxxxxxxxxxxx : http://www.dewdrop-world.net .::!:.:.......:.::........:..!.::.::...:..:...:.:.:.:..: "Come said the Muse, Sing me a song no poet has yet chanted, Sing me the universal." -- Whitman |