Scriptlike: New lib to aid in writing script-like programs

Nick Sabalausky SeeWebsiteToContactMe at semitwist.com
Tue Feb 11 17:44:06 PST 2014


On 2/11/2014 8:01 PM, Jesse Phillips wrote:
> On Wednesday, 12 February 2014 at 00:07:42 UTC, Nick Sabalausky wrote:
>> As for the license, if you don't mind switching to zlib then great,
>> just go ahead and submit a pull request if you'd like to. But I'm not
>> married to zlib license or anything. My reasons for using zlib license
>> are relatively minor, and I'm not opposed to switching to Boost,
>> especially since it's already the Phobos license after all. What are
>> your thoughts?
>
> I've been using Boost to be compatible Phobos. I haven't released
> anything which I feel needs a more restrictive license (zlib I think is
> permissive).
>

zlib's about as permissive (and easy to read) as it gets without going 
all the way to the "Do WTF You Want" license (which I actually use for 
REALLY trivial things)

It's basically like a re-worded MIT license:
http://opensource.org/licenses/Zlib


>> So with Scriptlike, I'm hoping to avoid the need to ever deal with
>> slashes at all, because all the clutter and meticulous care of always
>> doing it the proper std.path-way is (hopefully) hidden
>> behind-the-scenes via the Path type.
>
> Any hard coded paths I'll use / and buildPath for everything else. My
> experience so far has been positive on Windows (but maybe I still have
> some legacy conversions from the old days).

Yea, I like to use hardcoded / too, it's visually pleasant, 
minimally-verbose and Windows usually does accept it just fine. Problem 
is I can't always *rely* on paths always having / without being careful 
to sanitize my inputs.


> Ah, I use execute(char[][]) and pipeProcess(char[][]) these bypass the
> shell (it seems) and require that the arguments aren't quoted. I prefer
> these because:

Oh, that's right, it's "execute", not "executeProcess". I overlooked 
that naming detail. And it's possible I misunderstood pipeProcess when I 
looked at it before, I'll have to look again.

The "*Shell" ones are nice because I know I can do anything I can do on 
the cmdline, like piping and redirecting and such, in just the same way 
as I would the command line. Luckily it works pretty much the same on 
both Windows and Bash. Although come to think of it, BSD's default shell 
(which I actually quite like in certain ways - specifically, searching 
through the command history) handles redirecting differently.


>      auto cmd = ["dmd"];
>      cmd ~= "file.d";//...
>
> Is just a nice way to build a command.
>

Hmm, yea, that's a good point.

In any case, I didn't necessarily intend to leave Scriptlike's process 
features limited to just the current "runShell", so this is all good 
stuff to think about.


>> Do you think enabling dry run should automatically enable command
>> echoing?
>
> Yes, I can't think of a reason I wouldn't want it to.
>

The only downside I can think of is if there *were* some reason to do 
dry-run without echoing, there'd be no way to do it. Then again, I 
already intended to allow a custom OutputRange sink for the echoing, so 
if someone really wanted to squelch the echoing, they could just pass in 
a do-nothing OutputRange. Ok, I'll do it that way then.


> Hmm, I've been needing to retain the output and do things with it quite
> a bit. Haven't played with it, but you may be able to get interaction by
> using pipeProcess, but then there is just more work to make it act like
> spawn.
>

Yea, that parsing the output can definitely be useful in certain cases. 
I haven't really done it much yet because the old std.process couldn't 
really handle it well, and since then, I either haven't needed to or 
maybe I've just gotten used to avoiding it.

Actually, I've been really wanting to make a D equivalent of...I forget 
the name offhand, but it's fairly well-established tcl lib specifically 
designed for automating interactive text-based sessions. "expect", I 
think? I may do that soon, it'd fit well in Scriptlike.


>> - runShell optionally takes a Path to use as the initial working
>> directory to launch the process from (and then uses scope(exit) to
>> automatically chdir back when the process finishes). Nothing in
>> std.process does that right now, although there is a request in
>> bugzilla for it: http://d.puremagic.com/issues/show_bug.cgi?id=11363
>
> That is likely quite useful.

Yea, I've needed to do that SOOO many times. I've gotten really tired of 
cluttering my scripts with:

{
     auto saveDir = getcwd();
     chdir(somePath);
     scope(exit) chdir(saveDir);
     ...
}

Thank goodness it's D though, otherwise that'd be much worse. Scope 
guards are one of my favorite features of D. Brilliant solution.



More information about the Digitalmars-d-announce mailing list