(in-package "COMMON-LISP-USER") ;;------------------------------------------------------------------------------ ;; ;; File: ->LIST.LISP ;; Created: 2/25/93 ;; Author: Will Fitzgerald ;; ;; Description: Simple conversion utilities for strings to lists ;; ;;------------------------------------------------------------------------------ (defmethod ->list ((self string) &key (start 0) (char-bag '(#\Space)) (test #'(lambda (ch) (not (member ch char-bag :test 'char=)))) (post-process 'identity)) "Converts SELF into a list, starting at START; dividing words at boundaries defined by characters in CHAR-BAG, or at boundaries defined by TEST; each item is run through POST-PROCESS as it is created. POST-PROCESS can be destructive (eg, NSTRING-DOWNCASE)." (labels ((->list* (position) (let* ((pos (position-if-not test self :start position)) (new-pos (if pos (position-if test self :start pos) nil))) (cond ((and pos new-pos) (cons (funcall post-process (subseq self position pos)) (->list* new-pos))) (pos (list (funcall post-process (subseq self position pos)))) (t (list (funcall post-process (subseq self position)))))))) (let ((pos (position-if test self :start start))) (if pos (->list* pos) nil)))) (defmethod ->symbols ((self string) &optional (package *package*)) "Converts a string into a list of symbols interned into PACKAGE, ignoring everything but alphanumerics and dashes." (->list self :post-process #'(lambda (str) (intern (nstring-upcase str) package)) :test #'(lambda (ch) (or (alphanumericp ch) (char= ch #\-))))) (defmethod ->symbols ((self null) &optional (package *package*)) (declare (ignore package)) nil)