On Tue, May 08, 2007 at 09:34:35PM -0400, Douglas Allan Tutty wrote:
> On Tue, May 08, 2007 at 01:22:10PM -0700, Bryan Irvine wrote:
>
> > I need a fairly simple menu, and have thought about just simple
> > selects but figured now would also be a good time to learn something
> > new as well. It's nothing so complex that I need to go ncurses to do.
> > Just a basic <option 1> then <option 3> then <run some command>
> > thing.
>
> My front-ends I do in python. It doesn't have a case/select. I just
> use if/then/elif/....
>
> Then there's Fortran with computed gotos; very slick. I forget the
> syntax but is something like goto (10+choice)
> 11 ch1()
> ...
> 12 ch2()
> ...
> 13 ch3()
> ...
>
> It means that only one computation takes place instead of one comparison
> for each choice until one matches.
Just pointing out: if Python can do the job at all, you almost certainly
don't need that kind of micro-optimization in Fortran code. Also, this
is a menu. Efficiency is not exactly a big goal.
However, and this is where I go completely off-topic, while we're at it,
you don't need Fortran for this, most languages have equivalent
constructs (C):
switch(option) {
case 1:
...
case 2:
...
case 3:
...
default:
/* error! */
...
}
or even
void (*dispatch[])(void) = {
proc_opt1,
proc_opt2,
proc_opt3
}
void
proc_opt1(void)
{
...
}
void
proc_opt2(void)
{
...
}
void
proc_opt3(void)
{
...
}
In languages with higher order-functions, this can be written even more
concisely (Scheme):
(define dispatch
(vector
(lambda () ...)
(lambda () ...)
(lambda () ...)))
A suiteable make-menu macro could even make something like
(define toplevel-menu
(make-menu
("opt1" (lambda () ...))
("opt2" (lambda () ...))
("another menu" another-menu)))
(define another-menu
(make-menu
("opt3" (lambda () ...))
("opt4" (lambda () ...))
("top" toplevel-menu)))
do what it looks like it should do.
However, all of this is massively overkill. Just use a shell script.
Joachim
--
TFMotD: mirroring-ports (7) - how to build a mirror for ports distfiles