in short :

a UDF is a costum kixtart function which can be making the impossible work (functions not build in) ... one can compare UDFs with GOSUBs, nearly the same but not exactly : UDFs are more elegant ...

To help you out with your current case, how about this :

code:
break on

CLS
? "Choisi le numéro de l'application que vous voulez vérifier ou Q pour quitter?"
?

$Choices = "","app1.exe","app2.exe","app3.exe","app4.exe","app5.exe","app6.exe",
"app7.exe","app8.exe","app9.exe","app10.exe","app11.exe","app12.exe",
"app13.exe","app14.exe","app15.exe","app16.exe"

box(3,0,13,57,"")
AT (4,1) "(1) Appli1"
AT (4,16) "(2) Appli2"
AT (4,40) "(3) Appli3"
AT (6,1) "(4) Appli4"
AT (6,16) "(5) Appli5"
AT (6,40) "(6) Appli6"
AT (8,1) "(7) Appli7"
AT (8,16) "(8) Appli8"
AT (8,40) "(9) Appli9"
AT (10,1) "(10) Appli10"
AT (10,16) "(11) Appli11"
AT (10,40) "(12) Appli12"
AT (12,1) "(13) Appli13"
AT (12,16) "(14) Appli14"
AT (12,40) "(15) Appli15"
??
? "Votre Choix (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,Q) : " GET $answer

if $answer = "q" quit() endif

if val($answer) > 0 and val($answer) < 16
$ = RunChosenApp(val($answer)) ;call the running UDF with the number of choice as parameter
endif

get $

function RunChosenApp($n)
$ = execute("run '$Choices[$n]'") ; translated : run 'appn.exe'
endfunction

This won't fit exactly to your need but you'll get the picture
_________________________