The simplest use of menu-choose is when each item is not a list. In that case, the entire item will be printed and is also the value to be returned.
(clim:menu-choose '("One" "Two" "Seventeen"))
If you want to return a value that is different from what was printed, the simplest method is as follows. Each item is a list; the first element is what will be printed, the remainder of the list is treated as a
plist
--the
:value
property will be returned. (Note
nil
is returned if you click on
Seventeen
since it has no
:value
.)
(clim:menu-choose
'(("One" :value 1 :documentation "the loneliest number")
("Two" :value 2 :documentation "for tea")
("Seventeen"
:documentation "teen magazine")))
The list of items you pass to menu-choose can serve other purposes in your application, so you might not want to put the printed appearance in the first element. You can supply a :printer function that will be called on the item to produce its printed appearance.
(clim:menu-choose '(1 2 17)
:printer #'(lambda (item stream)
(format stream "~R" item)))
The items in the menu needn't be printed textually:
(clim:menu-choose
'(circle square triangle)
:printer
#'(lambda (item stream)
(case item
(circle (clim:draw-circle* stream 0 0 10))
(square (clim:draw-polygon* stream '(-8 -8 -8 8 8 8 8 -8)))
(triangle (clim:draw-polygon* stream '(10 8 0 -10 -10 8))))))
The :item-list option of the list form of menu item can be used to describe a set of hierarchical menus.
(clim:menu-choose
'(("Class: Osteichthyes" :documentation "Bony fishes"
:style (nil :italic nil))
("Class: Chondrichthyes"
:documentation "Cartilaginous fishes"
:style (nil :italic nil)
:item-list (("Order: Squaliformes" :documentation "Sharks")
("Order: Rajiformes" :documentation "Rays")))
("Class: Mammalia" :documentation "Mammals" :style (nil :italic nil)
:item-list
(("Order Rodentia" :item-list ("Family Sciuridae"
"Family Muridae"
"Family Cricetidae"
("..." :value nil)))
("Order Carnivora" :item-list ("Family: Felidae"
"Family: Canidae"
"Family: Ursidae"
("..." :value nil)))
("..." :value nil)))
("..." :value nil)) )