On Monday, 25 February 2013 at 21:06:54 UTC, Vladimir Panteleev wrote:
On Monday, 25 February 2013 at 20:06:19 UTC, Lars T. Kyllingstad wrote:
That is also incredibly obscure. I'd venture a guess that only ~10% of D's user base have even heard of Lynx. Everyone knows firefox, and will understand what the example is supposed to illustrate. (I admit that the ls/grep examples will also be rather incomprehensible to someone not familiar with the *NIX command line, and I will replace them with something else. The D toolchain, as you suggest below, is a very good idea.)

I still think using Firefox is a bad idea, but I've already presented my arguments.

BTW, browse() should never have been added to std.process, in my opinion. Maybe to some other utility module, but then it should at least be done right, and be properly documented.

What would you improve about it?

1. I would document it properly.
2. As long as it runs in the background, I would return some kind of process ID from it. (Yes, most browsers today may just signal another instance to open a new tab and then return, but would be surprised if they *all* do.)
(3. Maybe put it in a different module, I'm not sure.)

Also, and this is of course extremely subjective, it just looks out of place and very much "alone". Where is writeEmailInDefaultClient(address)? Where is openInAssociatedApp(file)?

I have no opinion on its location in Phobos, but std.process is the most fitting one if you don't consider creating a new module.

Maybe.

[...]

Then, a end-user tries setting the config variable to a path that contains spaces, and everything breaks. Wrapping the path in quotes does not help either. Due to the way the function is designed, it is IMPOSSIBLE for the end-user to configure the application to launch a program located at a path containing spaces. To end-users, this comes off as a classical problem in badly written applications that don't handle command-line escaping properly.

Exposing the specifics of whatever programming language you are using to the end user?

I don't understand what you mean here. It's not exposing any specifics if you don't implement anything in a way specific to D.

You pass a string directly from a config file into a rather low-level function in the programming language's standard library without any kind of validation.

[...]

You almost have me convinced that the single-string non-shell functions must go. In the case of pipeProcess() and execute(), pipeShell() and shell() do the same job, with (arguably, still) less surprises. Maybe it would then be a good idea to add a spawnShell() function to go with spawnProcess().

How about something that converts a ProcessPipes instance into a Tuple!(int, "status", string, "output") as returned by shell? Then you could do e.g.

auto result = shell("command").collectOutput();
// use result.status or result.output

That's pretty elegant. :)

Lars

Reply via email to