Re: [q-lang-users] newbie question on io, etc
Brought to you by:
agraef
From: <Dr....@t-...> - 2004-02-25 11:35:32
|
Following up to my earlier mail... > But you also asked for an imperative solution. [...] There also is a "real" imperative solution, with variable updates and all that nasty stuff, using Q's expression references (a.k.a. mutable values, cf. 12.13 in the manual). Here goes: // additional control constructs special when ~P X, loop P X; when P X = X if P; = () otherwise; loop P X = X || loop P X if P; = () otherwise; // split data lines into (NAME,VAL) pairs parse S = (NAME,VAL) where (NAME,VAL) = sscanf S "%s %d"; // good value = (NAME,VAL) where (NAME,VAL) = sscanf S "%s %s"; // bad value = (NAME,"") where NAME:String = sscanf S "%s"; // missing value = () otherwise; // empty line // the analysis program, imperative style baz = loop (not feof F) (put LINENO (get LINENO+1) || match (parse (freads F)) (case () (), // skip empty lines case (NAME,VAL) (ifelse (isint VAL) // update statistics (when (eq () (get MIN_VAL) or else (get MIN_VAL>VAL)) (put MIN_VAL VAL || put MIN_NAME NAME) || when (eq () (get MAX_VAL) or else (get MAX_VAL<VAL)) (put MAX_VAL VAL || put MAX_NAME NAME) || put SUM (get SUM+VAL) || put COUNT (get COUNT+1)) // report bad value (fprintf ERROR "bad value '%s' at line %d\n" (VAL,get LINENO)) ))) || // report results ifelse (get COUNT>0) (printf "min score == %d (%s)\nmax score == %d (%s)\n" (get MIN_VAL,get MIN_NAME,get MAX_VAL,get MAX_NAME) || printf "avg score == %g\n" (get SUM/get COUNT)) (fwrites ERROR "no data\n") where F:File = fopen "data.txt" "r", LINENO = ref 0, SUM = ref 0, COUNT = ref 0, MIN_NAME = ref (), MIN_VAL = ref (), MAX_NAME = ref (), MAX_VAL = ref (); Plain ugly, but as you can see it's possible. ;-) By adding some more control structures, one could easily embed a complete imperative sublanguage in Q, very much like those found in ML and Haskell (without the syntactic sugar). But I see no real point in doing so. Mutable values can occasionally be useful to speed things up, though. (Note that these aren't even in the core language, rather they are provided by the clib module.) Albert -- Dr. Albert Gr"af Email: Dr....@t-..., ag...@mu... WWW: http://www.musikwissenschaft.uni-mainz.de/~ag |