circular-sclist/at-start [ Methods ]

[ Top ] [ circular-sclist ] [ Methods ]

DESCRIPTION

 Determines whether the pointer for the given circular-sclist object is at
 the head of its list.

ARGUMENTS

 - A circular-sclist object.

RETURN VALUE

EXAMPLE

;; At creation the pointer is located at the start of the list
(let ((cscl (make-cscl '(0 1 2 3 4))))
  (at-start cscl))
=> T

;; Retrieve a number of the items using get-next, then determine whether the
;; pointer is located at the start of the list
(let ((cscl (make-cscl '(0 1 2 3 4))))
  (loop repeat 7 do (get-next cscl))
  (at-start cscl))
=> NIL

SYNOPSIS

(defmethod at-start ((cscl circular-sclist))

circular-sclist/get-current [ Methods ]

[ Top ] [ circular-sclist ] [ Methods ]

DESCRIPTION

 Return the current list element without incrementing the current slot.

ARGUMENTS

 - The circular-sclist object

RETURN VALUE

 The current list element, which can be of any type.

EXAMPLE

(let ((cscl (make-cscl '(0 1 2 3 4))))
  (loop for i below 10 do
     (print (if (oddp i) (get-next cscl) (get-current cscl)))))
(let ((cscl (make-cscl '(0 1 2 3 4))))
  (loop for i below 10 
     collect (if (oddp i) (get-next cscl) (get-current cscl))))
=>
(0 0 1 1 2 2 3 3 4 4)

SYNOPSIS

(defmethod get-current ((cscl circular-sclist))

circular-sclist/get-last [ Methods ]

[ Top ] [ circular-sclist ] [ Methods ]

DESCRIPTION

 Return the the most recent item retrieved in a circular-sclist object.

ARGUMENTS

 - A circular-sclist object.

RETURN VALUE

 An item from the given circular-sclist object.

EXAMPLE

;; Retrieves the final item in the list at creation
(let ((cscl (make-cscl '(0 1 2 3 4))))
  (get-last cscl))
=> 4

;; Get and print a number of items from the list using get-next, then return
;; the most recent item retrieved using get-last
(let ((cscl (make-cscl '(0 1 2 3 4))))
  (loop repeat 7 do (print (get-next cscl)))
  (get-last cscl))
=> 1

SYNOPSIS

(defmethod get-last ((cscl circular-sclist))

circular-sclist/get-next [ Methods ]

[ Top ] [ circular-sclist ] [ Methods ]

DESCRIPTION

 Get the next item in a given circular-sclist object. The class
 automatically keeps track of the last item retrieved. If the final item of
 the given circular-sclist object was the last item retrieved, the method
 begins again at the beginning of the list.

ARGUMENTS

 - A circular-sclist object.

RETURN VALUE

 An item from the given circular-sclist object.

EXAMPLE

;; Repeatedly calling get-next retrieves each subsequent item from the
;; given circular-sclist object. When the list has been exhausted, retrieval
;; begins again from the head of the list.
(let ((cscl (make-cscl '(0 1 2 3 4))))
  (loop repeat 10 collect (get-next cscl)))
=>
(0 1 2 3 4 0 1 2 3 4)

SYNOPSIS

(defmethod get-next ((cscl circular-sclist))

circular-sclist/make-cscl [ Functions ]

[ Top ] [ circular-sclist ] [ Functions ]

DESCRIPTION

 Create a circular-sclist object from a specified list of items. The items
 themselves may also be lists. 

ARGUMENTS

 - A list.

OPTIONAL ARGUMENTS

 keyword arguments:
 - :id. A symbol that will be used as the ID for the created circular-sclist
   object. Default = NIL.
 - :bounds-alert. T or NIL to indicate whether or not to print a warning if
   when an attempt is made to access the object using an out-of-bounds index
   number (i.e., not enough elements in the list).  T = print a
   warning. Default = T.
 - :copy. T or NIL to indicate whether the given data list should be copied
   (any slippery-chicken class instances will be cloned), with subsequent
   modifications being applied to the copy. T = copy. Default = T.

RETURN VALUE

 A circular-sclist object.

EXAMPLE

;; Returns a circular-sclist object with ID of NIL, bounds-alert=T and copy=T
;; by default
(make-cscl '(1 2 3 4))

=> 
CIRCULAR-SCLIST: current 0
SCLIST: sclist-length: 4, bounds-alert: T, copy: T
LINKED-NAMED-OBJECT: previous: NIL, this: NIL, next: NIL
NAMED-OBJECT: id: NIL, tag: NIL, 
data: (1 2 3 4)

;; Can be created using nested lists
(let ((cscl (make-cscl '((1 (4 5 6))
                         (2 (7 8 9))
                         (3 (10 11 12))))))
  (data cscl))

=> ((1 (4 5 6)) (2 (7 8 9)) (3 (10 11 12)))

;; Setting the ID
(make-cscl '(1 2 3 4) :id 'test-cscl)

=> 
CIRCULAR-SCLIST: current 0
SCLIST: sclist-length: 4, bounds-alert: T, copy: T
LINKED-NAMED-OBJECT: previous: NIL, this: NIL, next: NIL
NAMED-OBJECT: id: TEST-CSCL, tag: NIL, 
data: (1 2 3 4)

;; By default, attempts to access the object with an out-of-bounds index result 
;; in a warning being printed
(let ((cscl (make-cscl '(1 2 3 4))))
  (get-nth 11 cscl))

=>
NIL
WARNING: sclist::sclist-check-bounds: Illegal list reference: 11 
(length = 4) (sclist id = NIL)

;; This can be suppressed by creating the object with :bounds-alert set to NIL 
(let ((cscl (make-cscl '(1 2 3 4) :bounds-alert nil)))
  (get-nth 11 cscl))

=> NIL

SYNOPSIS

(defun make-cscl (list &key (id nil) (bounds-alert t) (copy t))

circular-sclist/reset [ Methods ]

[ Top ] [ circular-sclist ] [ Methods ]

DESCRIPTION

 Reset the pointer of a given circular-sclist object. The pointer is reset
 to 0 by default, but the desired index may be specified using the optional
 argument. 

 NB: An immediately subsequent get-next call will retrieve the item at the
     index to which the pointer is reset. An immediately subsequent
     get-last call will retrieve the item at the index one-less
     than the value to which the pointer is set.

ARGUMENTS

 - A circular-sclist object.

OPTIONAL ARGUMENTS

 - An index integer to which the pointer for the given circular-sclist
   object should be reset.

RETURN VALUE

 Returns T.

EXAMPLE

;; Resets to 0 by default. Here: Get a number of items using get-next, reset
;; the pointer, and apply get-next again.
(let ((cscl (make-cscl '(0 1 2 3 4))))
  (loop repeat 8 do (print (get-next cscl)))
  (reset cscl)
  (get-next cscl))
=> 0

;; Reset to a specified index
(let ((cscl (make-cscl '(0 1 2 3 4))))
  (loop repeat 8 do (print (get-next cscl)))
  (reset cscl 3)
  (get-next cscl))
=> 3

;; By default, get-last will then retrieve the item at index one less than the
;; reset value
(let ((cscl (make-cscl '(0 1 2 3 4))))
  (loop repeat 8 do (print (get-next cscl)))
  (reset cscl 3)
  (get-last cscl))
=> 2

SYNOPSIS

(defmethod reset ((cscl circular-sclist) &optional where (warn t))

sclist/circular-sclist [ Classes ]

[ Top ] [ sclist ] [ Classes ]

NAME

 circular-sclist

 File:             circular-sclist.lsp

 Class Hierarchy:  named-object -> linked-named-object -> sclist -> 
                   circular-sclist

 Version:          1.0.12

 Project:          slippery chicken (algorithmic composition)

 Purpose:          Implementation of the circular-sclist class which offers
                   the use of a function to cycle through the values in the
                   sclist, starting at the beginning again once we've
                   reached the end.

 Author:           Michael Edwards: m@michael-edwards.org

 Creation date:    February 19th 2001

 $$ Last modified:  11:26:03 Sat Sep 26 2020 CEST

 SVN ID: $Id$