All pastes #370911 Raw Edit

Someone

public text v1 · immutable
#370911 ·published 2007-02-24 23:55 UTC
rendered paste body
;;TODO: Implement a new package for the programm

(defvar *user-says*)
(defvar *user-line*)
(defvar *mylist*)
;; the cl-perl library, has to be in the same folder as the programm, 
;;or somewhere lisp finds it
(require 'cl-ppcre)

(defvar *possible-answers*
	   '(("hello" "hello" "hiz!!" "hey, hello")
	     ("really" "yes" "no, was just kidding" "why don't you believe me?")
	     ("why" "because" "What do you mean why?")
	     ("yes" "Are you sure?" "Why yes?")
	     ("no" "Why not?" "Why no" "You seem to be a bit negative...")
	     ("place-keeper" "What makes you say that?" "why is that" 
	      "Do you really mean that?" "I don't believe a word")))

(defun prompt-read (prompt)
  "A function to communicate with the user"
  (format *query-io* "~a~%" prompt)
  (force-output *query-io*)
  (read-line *query-io*))

(defun start ()
  "The main programm. It gets a phrase from the user, and writes a response"
  (setf *user-says* (prompt-read "Welcome..."))
  (loop
     (setf *user-line* (select-a-line *user-says*))
     (setf *user-says* 
	   (prompt-read 
	    (elt (cdr *user-line*) (random (length (cdr *user-line*))))))))

(defun select-a-line (phrase)
  "Select the line from the *possible-answers* alist that has a word from the 
phrase. If no word matches, get the last line with the defaults"
  (setf *mylist* (extract-words phrase))
  (or (loop for j in *possible-answers* do
	    (if (find (first j) *mylist* :test #'string=) (return j)))
      (elt *possible-answers* (- (length *possible-answers*) 1))))

(defun extract-words (text)
  "To extract words from the phrase. I use a library that allows me to run 
perl commands inside from lisp"
  (delete-duplicates
   (cl-ppcre:all-matches-as-strings "[a-zA-Z]{3,}" text)
   :test #'string=))