Primes by Trial Division - XLISP

20 May 2018
XLISP began with only a superficial resemblance to LISP, over time steadily becoming more and more LISP-like. It doesn't seem like source compatibility between versions was ever a priority.
XLISP v1.1
(defun div? (n list / rc)
  (setq rc nil)
  (while (&& (! (null list)) (!= rc t))
      (if (% n (car list)) () ((setq rc t)))
      (setq list (cdr list)))
  rc)
(defun primes (n / primes)
  (setq count 3)
  (setq primes (list 2))
  (while (> n (length primes))
      (if (div? count primes) () ((setq primes (append primes (list count)))))
      (setq count (+ 1 count)))
  primes)
XLISP v1.4
Same as v1.6, with the following addition:
(setq T t)
XLISP v1.6
(defun divp (n list)
  (prog () (mapc #'(lambda (p)
              (cond ((zerop (rem n p)) (return T)))) list)
    (return nil)))
(defun primes (n)
  (prog (count primes)
    (setq count 3)
    (setq primes (list 2))
    NEXT (cond ((< (length primes) n)
                (cond ((divp count primes) nil)
                      (T (nconc primes (list count)))))
               (T (return primes)))
    (setq count (+ 1 count))
    (go NEXT)))
XLISP v2.0
(defun divp (n list)
  (mapc #'(lambda (p)
    (cond ((zerop (rem n p)) (return-from divp T)))) list)
  (return-from divp nil))
(defun primes (n)
  (setq count 3)
  (setq primes (list 2))
  (tagbody NEXT (cond ((< (length primes) n)
                       (cond ((divp count primes) nil)
                             (T (nconc primes (list count)))))
                      (T (return-from primes primes)))
                (setq count (+ 1 count))
                (go NEXT)))