[1/5] from: andrew::martin::colenso::school::nz at: 24-Dec-2003 22:45
Here's my Library loader script: use [Patches Files Provided Do_Script Defer_Script Script Header Requires Provides] [ do Patches: %Patches.r Files: exclude read %./ reduce [Rebol/script/header/File Patches] Provided: make block! 100 Do_Script: [ do Script if all [ not none? Provides Provides: get Provides any [ word? Provides block? Provides ] ] [ insert tail Provided Provides ] true ] foreach File Files [ Defer_Script: [ insert/only tail Files Script ] Script: any [ if block? File [ File ] if all [ file? File found? find/last File %.r ] [ load/header File ] ] if Script [ Header: first Script Requires: in Header 'Requires Provides: in Header 'Provides any [ if none? Requires Do_Script if word? Requires: get Requires [ either found? find Provided Requires Do_Script Defer_Script ] if block? Requires [ either empty? exclude Requires Provided Do_Script Defer_Script ] ] ] ] ] It examines each script's header for the 'Requires and 'Provides fields, like (from my ML.r %script): Requires: [Build-Tag Push Pop] Provides: [ML] It doesn't attempt to do any versioning or downloading, just 'load-s and 'do-es scripts so that scripts that require words defined are 'do-ne after scripts that provide values for those words. For the above example, the files that provide 'Build-Tag, 'Push & 'Pop are 'do-ne before the file containing a value for 'ML. One problem the above script has, it that if a script requires a value for a word that no other script provides, the above function never returns. I haven't figured out a solution for this. Can anyone think of one? Andrew J Martin Attendance Officer Speaking in tongues and performing miracles. Colenso High School Arnold Street, Napier. Tel: 64-6-8310180 ext 826 Fax: 64-6-8336759 http://colenso.net/scripts/Wiki.r?AJM http://www.colenso.school.nz/ DISCLAIMER: Colenso High School and its Board of Trustees is not responsible (or legally liable) for materials distributed to or acquired from user e-mail accounts. You can report any misuse of an e-mail account to our ICT Manager and the complaint will be investigated. (Misuse can come in many forms, but can be viewed as any material sent/received that indicate or suggest pornography, unethical or illegal solicitation, racism, sexism, inappropriate language and/or other issues described in our Acceptable Use Policy.) All outgoing messages are certified virus-free by McAfee GroupShield Exchange 5.10.285.0 Phone: +64 6 843 5095 or Fax: +64 6 833 6759 or E-mail: [postmaster--colenso--school--nz]
[2/5] from: antonr:iinet:au at: 12-Nov-2003 0:16
Pretty nice, straight-forward code. Just at the end, you might like to save a bit of code. If word? Requires [Requires: reduce [Requires]] Now you know it's a block and you can remove one if. Is the infinite loop because the script keeps getting deferred? Can you explain the flow in & out of the stacks you have a bit? Also watch out for load/header. In the rare case that you have a script with only a header in it, and no code following, load/header gives you the header object back directly, not in a block. Usually, you get a block with the header object in first position, followed by all the code. That bit me when I tried to process all my scripts using it. Anton.
[3/5] from: greggirwin:mindspring at: 11-Nov-2003 8:58
Hi Anton, AR> If word? Requires [Requires: reduce [Requires]] AR> Now you know it's a block and you can remove one if. You can also use COMPOSE to blockify things: requires: compose [(requires)] -- Gregg
[4/5] from: nitsch-lists:netcologne at: 11-Nov-2003 21:12
Am Dienstag, 11. November 2003 16:58 schrieb Gregg Irwin:
> Hi Anton, > > AR> If word? Requires [Requires: reduce [Requires]] > AR> Now you know it's a block and you can remove one if. > > You can also use COMPOSE to blockify things: > > requires: compose [(requires)] >
I guess its to direct, but how about requires: to-block requires ? ;)
>> to-block 
>> to-block 1
> -- Gregg
[5/5] from: antonr:iinet:au at: 12-Nov-2003 18:27
I think the problem is that the stack of files you maintain does not include any information about dependencies, so you can't check later that they have been provided for. The stack is a simple list of files that only tells you in what order to do them. Perhaps you can maintain two lists: - All-Provided: all the words provided by all the scripts - All-Required: all the words required by all the scripts then you can check if there are any missing by looking in exclude All-Required All-Provided . But if I were you, I'd probably redesign the algorithm and just rewrite it. It's short enough. Anton.