From: Dilip Barman
Subject: Reading a string into a list
Date:
Message-ID: <52901@brunix.UUCP>
Thanks to you all for helping solve my lexical analyzer problem.
I find LISP much more difficult than, say, PASCAL, for file
I/O and character operations. Anyway, I read the common LISP
book about varying length strings and readtables and settled on
the approach several of you suggested re: readtables. For
reference, here is what I did. Thanks again!!!
(Note: starred variables are globals - e.g.,
(defconstant *EOS* 'End-of-sentence))
; Thanks to Eliot Handelman (·····@phoenix.Princeton.edu) and
; Tim Moore (··················@cs.utah.edu) for helping us to
; understand character parsing and the readtable. Here is how we input
; our strings character-by-character.
; Define a readtable that allows us to handle periods, slashes, and dashes
(defvar lexanalyzers-read-table (copy-readtable))
(set-macro-character #\. #'(lambda (stream char) *EOS*)
nil lexanalyzers-read-table) ; replace period by *EOS*
(set-macro-character #\- #'(lambda (stream char) *DASH*)
nil lexanalyzers-read-table)
(set-macro-character #\/ #'(lambda (stream char) *SLASH*)
nil lexanalyzers-read-table)
; Define a function which translates a string into a list dkb 10/3
(defun stringToList (string)
(let ((words '())
(index 0)
(*readtable* lexanalyzers-read-table))
(loop
(multiple-value-bind (word next-index)
(read-from-string string nil nil :start index)
(setq index next-index)
(if word
(push word words)
(return (nreverse words)))))))
Dilip Barman ···@cs.brown.edu
U.S. mail: Brown University Home: 40 Everett Avenue
Dept. of Computer Science, Box 1910 Providence, RI 02906
Providence, RI 02912 (401)863-7666 (401)521-9731