Hi frad, If I may make a suggestion. Lists are not random-access like arrays are. Similarly, checking a list's length traverses the whole list.
You should always iterate over a list by using car and cdr, not list-ref. So, to your "do" loop, you could add another loop variable over the list called L, iterate over it using cdr, and as the termination condition, test with null?. Then your list-ref becomes car. The way you have it, the algorithm is O(n^2). If you need random access you should use a vector, however that is not necessary for your test program. Jim > On May 2, 2015, at 07:34, f...@indexi.net wrote: > > Hi, > > (Sorry for my English) > > Newbie with Scheme, i try to use the termbox egg. > It seems me a very nice and cool library and the documentation helps me a lot. > I am learning Scheme and appreciate Chicken implementation. > Here a little piece of code to print a simple text menu. > But this code isn't in the functionnal way (very iterative). > > ---- > (use termbox) > (init) > > (define running (make-parameter #t)) > (define choice 1) > > (define (menu x y lst) > (let loop () > (if (> choice (length lst)) (set! choice 1)) > (if (< choice 1) (set! choice (length lst))) > (do ((i 0 (+ i 1))) > ((= i (length lst))) > (if (= choice (+ i 1)) > (bprintf x (+ y i) (style black) (style white) (list-ref lst i)) > (bprintf x (+ y i) (style white) (style black) (list-ref lst i)))) > (present) > (poll (lambda (mod key ch) > (cond > ((eq? key key-arrow-down) (set! choice (+ choice 1))) > ((eq? key key-arrow-up) (set! choice (- choice 1))) > ((eq? key key-enter) (running #f)))) > (lambda (w h) (loop))) > (when (running) (loop)))) > > ;; an example > (menu 5 8 '("Choice 1" "Choice 2" "Choice 3" "Other")) > > (shutdown) > > (printf "Your choice: ~a\n" choice) > ---- > > Maybe, someone could give me some advices or corrections to make it better. > > Regards, > frad > > http://blog.indexi.net > > > > > > > _______________________________________________ > Chicken-users mailing list > Chicken-users@nongnu.org > https://lists.nongnu.org/mailman/listinfo/chicken-users _______________________________________________ Chicken-users mailing list Chicken-users@nongnu.org https://lists.nongnu.org/mailman/listinfo/chicken-users