obsolete D libraries/modules

H. S. Teoh hsteoh at quickfur.ath.cx
Mon Sep 2 13:33:17 PDT 2013


On Mon, Sep 02, 2013 at 09:28:37PM +0200, Ramon wrote:
> I see strong points on both sides. Maybe it would be a good thing to
> really have two versions with the second one ("getOpts") getting the
> options in arrays (as introduced above). Like that the "simple"
> version we have now could, besides some minor corrections, stay like
> it is and not disturb existing programs using it. The second version
> would be the "bigger" one with help, valid ranges, eval funcs, and
> other goodies as identified by a crowd discussed wish list (and
> "auto help print" controlled e.g. by a flag).
[...]

Actually, I think it's possible to please both sides with a single
implementation. If we use what was suggested, and add an optional string
parameter per option to serve as a help string, then that takes care of
the auto help functionality.

For checking ranges and stuff, we already support delegates passed to
getopt, for example:

	void main(string[] args) {
		int size;

		getopt(args,
			"-s", (int s) {
				enforce(s >= 10 && s < 20);
				size = s;
			}
		);
	}

So we just need to provide a few commonly-used range-checking option
parsers and we're good to go. For example, with the proposed
enhancements, we could write:

	void main(string[] args) {
		enum A { Aa, Ab, Ac };
		A a;
		int size;

		getopt(args,
			"-a", &a, "Type of data to generate",
			"-s", checkBounds(&size, 10, 20), "Size of input"
		);
	}

Where checkBounds (that is, std.getopt.checkBounds) is defined something
like this:

	auto checkBounds(T)(T* targetVar, T lowerBound, T upperBound) {
		// Returns a delegate usable by the current version of
		// getopt.
		return (string optValue) {
			auto val = to!T(optValue);
			enforce(val >= lowerBound && val < upperBound);
			*targetVar = val;
		};
	}

Other similar helpers that can parse lists, arrays, etc., can be
provided by std.getopt, so that user code will never have to
re-implement any of this boilerplate by hand.


T

-- 
IBM = I'll Buy Microsoft!


More information about the Digitalmars-d mailing list