I had been meaning to ask this same question myself (and thanks to dave
for bringing it up). I wrote a quick launcher namely for the console,
it uses rotate to select options and settings, that changes the options
list "in place" and worked really well actually, I like the effect.
Then I wanted to insert INTO the options list using command line
switches, and there I was stumped at first, wondering what is
destructive, what is not and so forth (or what that even IS), finally
returned a rebuilt options list to an assignment, but thinking all
along that "there must be a better way".
So made some changes using your suggestion with set and nth:
Replaced this:
#(de insert_opt (Id X)
# (setq *opts
# (make
# (for L *opts
# (if (= Id (car L))
# (link (place 4 L (cons X (last L))))
# (link L) ) ) ) ) )
with this:
(de insert_opt (Id X)
(let L (nth (assoc Id *opts) 4)
(set L (cons X (car L))) ) )
(this uses a let because I couldn't get a @ or @@ working...)
Usage:
By the way, if you fire up ez_opts (its fun), use j and k to select
options, h and l to rotate presets (the car in a presets list is the
active setting), and if the car is itself a list, you can rotate it with
the i key. That's it! The opts menu here is for (what else!) a
flashcard-like program, but could be anything.
***
#!/usr/bin/picolisp /usr/lib/picolisp/lib.l
(setq
*ed2 "^[[2J" *cud3i "^[[3B " *cr "^M" *esc "^["
*ezkeys '("h" "j" "k" "l" "i") )
(de cupyx (Y X)
(pack "^[[" Y ";" X "H") )
(de rotl (L)
(do (- (length L) 1) (rot L)) )
(de gopt (X)
(car (last (assoc X *opts))) )
(de ez_opts ()
(loop
(prin *ed2 (cupyx 2 3) *title)
(for L (reverse *opts)
(prin (cupyx (cadr L) 3) (caddr L))
(print (last L)) )
(prin *cr)
(T (not (member (setq K (key)) *ezkeys)) K)
(case K
("j" (rotl *opts))
("k" (rot *opts))
("l" (rot (last (car *opts))))
("h" (rotl (last (car *opts))))
("i" (rot (car (last (car *opts))))) ) ) )
#(de insert_opt (Id X)
# (setq *opts
# (make
# (for L *opts
# (if (= Id (car L))
# (link (place 4 L (cons X (last L))))
# (link L) ) ) ) ) )
(de insert_opt (Id X)
(let L (nth (assoc Id *opts) 4)
(set L (cons X (car L))) ) )
(de l ()
(let X (any (opt))
(when (info X) (load X)) ) )
### end of "lib-able" ez_opts, start of cards ###
(setq *title "CARDS: ")
(setq *opts '(
(hst 4 "hosts: " (pc fb))
(fil 6 "files: " (de dgs paz saz))
(sel 8 "limit: " (5 10 20 50))
(dsp 10 "views: " ((1 2) (d_ de) (p de) (sp 1) (v de)))
(sec 12 "times: " ((-1 2) (-1 -1) (3 2) (1 1)))
(duh 14 "lkeys: " ((l) (l NIL)))
(dia 16 "sshow: " (1 2 5)) ))
(de main NIL
(seed (time))
(while (<> (ez_opts) *esc) )
# cards program code removed - exit with ESC! #
(prin *ed2 "^[[1;1H")
(raw NIL) )
# usage: -v "4 5" (adds (4 5) to views presets)
(de v ()
(let X (str (opt))
(when (lst? X) (insert_opt 'dsp X) ) ) )
# usage: -f xxx (file must exist, adds to presets)
(de f ()
(let X (any (opt))
(when (info X) (insert_opt 'fil X) ) ) )
(load T)
(main)
(bye)
--
UNSUBSCRIBE: mailto:[email protected]?subject=Unsubscribe