Not looking for a job, but I thought I'd give an example program written in Common Lisp for fun.

;;;;
;;;; A Common Lisp program to find the unique words in a text file that
;;;; are also in a dictionary word list
;;;;

(defparameter *words-file* "/usr/share/dict/words")

(defparameter *whitespace-chars*
  '(#\Newline #\Space #\Tab #\Page #\Return #\Linefeed))

(defvar *words*
  (with-open-file (words *words-file* :direction :input)
    (let ((hash (make-hash-table :test 'equal)))
      (loop (let ((line (read-line words nil)))
              (if line
                  (setf (gethash line hash) t)
                  (return))))
      hash)))

(defun present-in-hash (key hash)
  (second
   (multiple-value-list
    (gethash key hash))))

(defun read-word (stream)
  (with-output-to-string (s)
    ;; munch whitespace before
    (loop as c = (peek-char nil stream nil)
       while (and c (member c *whitespace-chars*))
       do (read-char stream))
    ;; copy non-whitespace to output
    (loop as c = (peek-char nil stream nil)
       while (and c (not (member c *whitespace-chars*)))
       do (write-char (read-char stream) s))))

(defun find-unique-words (filename)
  (with-open-file (doc-stream filename :direction :input)
    (let ((word-count (make-hash-table :test 'equal)))
      ;; Count the words
      (loop as w = (string-downcase (read-word doc-stream))
           while (not (string= w ""))
           do (when (present-in-hash w *words*)
                (if (present-in-hash w word-count)
                    (incf (gethash w word-count))
                    (setf (gethash w word-count) 1))))
      ;; Collect the unique words
      (loop for word being the hash-key of word-count
           for count = (gethash word word-count)
           when (= count 1) collect word))))


/*
PLUG: http://plug.org, #utah on irc.freenode.net
Unsubscribe: http://plug.org/mailman/options/plug
Don't fear the penguin.
*/

Reply via email to