anchor.diff:  
      The email is validated and the process does not stop until the user enters a valid email address."
     (prompt msg :default default
  -	      :required-p required-p
  -	      :validator (or (and validator (clavier:&& (clavier:valid-email)
  -							(make-validator validator)))
  -			     (clavier:valid-email))
  -	      :if-invalid (or (parse-if-invalid if-invalid)
  -			      (lambda (&optional value)
  -				(declare (ignore value))
  -				(say "Invalid email" :color error-color)))
  -	      :color color
  -	      :error-color error-color))
  -
  -(defun prompt-url (&optional msg &key default 
  -				   (required-p t) 
  -				   if-invalid
  -				   (color *prompt-color*)
  -				   (error-color *prompt-error-color*)
  -				   probe
  -				   if-exists
  -				   (if-does-not-exist :error))
  +              :required-p required-p
  +              :validator (or (and validator (clavier:&& (clavier:valid-email)
  +                                                        (make-validator validator)))
  +                             (clavier:valid-email))
  +              :if-invalid (or (parse-if-invalid if-invalid)
  +                              (lambda (&optional value)
  +                                (declare (ignore value))
  +                                (say "Invalid email" :color error-color)))
  +              :color color
  +              :error-color error-color))
  +
  +(defun prompt-url (&optional msg &key default
  +                                   (required-p t)
  +                                   if-invalid
  +                                   (color *prompt-color*)
  +                                   (error-color *prompt-error-color*)
  +                                   probe
  +                                   if-exists
  +                                   (if-does-not-exist :error))
     "Prompts for an url.
   
      Args: - msg: The prompt.
  
positive.code:          - color: Color to use at prompt. Default: *prompt-color*
           - error-color: Color to use when error ocurrs. Default: *prompt-error-color*
  
    Example: 
  
    ``(choose \"Choose: \" (list \"foo\" \"bar\" \"baz\") :default \"baz\")``
  
    Tags: menu, choose"
    (assert (or (not default)
  	      (member default options :test 'string=))
  	  nil "Invalid default: ~s" default)
    (flet ((print-options ()
  	   (loop 
  	      for option in options
  	      for i from 0 
  	      do
  		(format t "[~A] ~A" i option)
  		(when (< (1+ i) (length options))
  		  (format t separator)))
  	   (terpri))
  	 (read-option ()
  	   (cond 
  	     ((or complete completer)
  	      (let ((prompt (if color 
  				(with-output-to-string (s)
  				  (cl-ansi-text:with-color (color :stream s)
  				    (format s "~A~@[[~A]~]" msg default)))
  				(format nil "~A~@[[~A]~]" msg default))))
  		(complete-prompt prompt options completer)))
  	     (t
  	      (say msg :color color)
  	      (when default
  		(say "[~A] " default :color color))
  	      (string-trim (list #\ ) (read-line))))))
      (when print-options
        (print-options))
      (let* ((chosen-option (read-option))
  	   (option-number (ignore-errors (parse-integer chosen-option))))
        (loop 
  	 do 
  	   (cond ((and (equalp chosen-option "")
  		       default)
  		  (return default))
  		 ((find chosen-option (mapcar #'princ-to-string options) :test #'string=)
  		  (return (find chosen-option (mapcar #'princ-to-string options) :test #'string=)))
  		 ((and option-number
  		       (>= option-number 0)
  		       (< option-number (length options)))
  		  ;; Correct option
  		  (return (nth option-number options)))
  		 (t
  		  ;; Incorrect option
  		  (progn
  		    (if if-wrong-option
  			(funcall if-wrong-option)
  			(say "Wrong option." :color error-color))
  		    (when print-options
  		      (print-options)))))
  	   (setf chosen-option (read-option))
  	   (setf option-number (ignore-errors (parse-integer chosen-option)))))))
    
  (defun ask (&optional (msg "Yes or no: ") &key 
  					    (default nil default-p) 
  					    if-wrong-answer
  					    (color *prompt-color*)
  					    (error-color *prompt-error-color*))
    "Ask for yes or no.
  
     Args: - msg(string): The prompt to use. Default: 'Yes or no: '.
  
negative.code:            (prompt \"Item: \"))``
  
     Tags: flow"
  
    (alexandria:with-unique-names (result while)
      `(block ,while
         (let ((,result nil))
           (flet ((cancel ()
                    (return-from ,while nil))
                  (continue* ()
                    (return-from ,while ,result)))
             (loop
               :while (ask ,msg ,@options)
               :do (setf ,result (append ,result (list (progn ,@body)))))
             ,result)))))
  