std.getopt suggestion
Regan Heath
regan at netmail.co.nz
Wed Oct 5 04:53:25 PDT 2011
On Tue, 04 Oct 2011 20:39:42 +0100, Andrei Alexandrescu
<SeeWebsiteForEmail at erdani.org> wrote:
> On 10/4/11 12:46 PM, Jacob Carlborg wrote:
>> On 2011-10-04 17:48, Andrei Alexandrescu wrote:
>>> On 10/04/11 09:09, Jacob Carlborg wrote:
>>>> On 2011-10-04 13:21, Regan Heath wrote:
>>>>> In this particular case, because these std,.getopt options are global
>>>>> variables, building something which uses them, or std.getopt will
>>>>> introduce side effects to other uses of std.getopt. Meaning the
>>>>> current
>>>>> design makes it impossible to build upon in an orthogonal manner.
>>>>> This
>>>>> is the 'problem' people have with it.
>>>>>
>>>>
>>>> Exactly, yet another reason why std.getopt is badly designed.
>>>
>>> Wait, I thought that was the one! Now I wonder what the others were.
>>>
>>> Andrei
>>
>> Ok, sorry. I meant something like: yet another reason why global values
>> are bad. And another thing that will hard(er) to do with the current
>> design of std.getopt.
>
> Did it ever prevent you from getting anything done with it?
That's not the question we should be asking. The question we should be
asking is, will anyone ever want to re-use getopts parser for something
other than a once off command line parse for a command line application.
The answer is, maybe. And given that, isn't it better if they can re-use
it without running any risk of side-effects etc.
Lets imagine a possible use-case. Say you have an application, like a
development environment. In it, you have external tools configured, each
with it's own customisable set of command line options. Lets say, for a
certain argument or set of arguments that you pass to the tool, you need
to behave/react in different ways. Now, it makes sense to use getopt to
parse the arguments you're going to pass to the tool, to decide how to
behave prior to running it. The tool may be used multiple times in the
lifetime of the development environment, so getopt is being reused
repeatedly. Now, lets suppose each tool uses slightly different command
line arguments, such that one of more of the existing global variables
need to be set, for it to parse correctly. For this to work each use of
getopt MUST set all 3 globals, or risk one of them being set by another
use. Now, lets further suppose that these tools can/are run in parallel.
With getopt in it's current incarnation it would be impossible to re-use
it for this.
With a very small change we can retain the current simple interface, but
also encapsulate the globals and make the whole re-usable, for example...
// ** Current getopt **
dchar optionChar = '-';
string endOfOptions = "--";
dchar assignChar = '=';
void getopt(T...)(ref string[] args, T opts) {}
// ** Proposed getopt **
struct GetOpt
{
dchar optionChar = '-';
string endOfOptions = "--";
dchar assignChar = '=';
void getopt(T...)(ref string[] args, T opts) {}
}
void getopt(T...)(ref string[] args, T opts)
{
GetOpt go;
return go.getOpt(args, opts);
}
Seems like a no-brainer to me. Unless you want to argue that stacking a
struct is too inefficient for a once off command line parse, done once at
the start of a command line application .. I think not.
R
--
Using Opera's revolutionary email client: http://www.opera.com/mail/
More information about the Digitalmars-d
mailing list