Okay, thinking out loud. You may have already found these issues.
First, grdraw if passed nil to ans, crashes. Needs to be set in cond/if:
(if (/= ans nil)
(grdraw pt ans 2)
)
This keeps it from crashing, but now we're stuck in the eternal loop, because ans is the value of nil, which means x is the value of nil and will continue to use ((not x) as true, therefore continue to process. Tried passing ((= ans nil) (command "")) within the cond statement of startpoints, but that starts off ending. Question: What can we do to start ans off non-nil? Here's the code as the brainstorming I did. Beware:
(defun getpoints (pt)
(if (= cntr nil)
(setq cntr 1)
)
(cond
((/= pt nil)
(setq ans (getpoint pt "\nSpecify point:"))
(setq PointList (cons pt PointList))
(setq cntr (1+ cntr))
(if (/= ans nil)
(grdraw pt ans 2)
)
)
((not pt)
(setq ans (getpoint "\nSpecify point:"))
(setq PointList (cons ans PointList))
(setq cntr (1+ cntr))
)
)
ans
)
(defun startpoints (x)
(cond
((= ans nil)
(command "")
)
((not x)
(setq x (getpoints (setq x (getpoints nil))))
(startpoints x)
)
((/= x nil)
(cond ((/= ans nil)
(setq x (getpoints x))
(startpoints x)
)
((= ans nil)
(command "")
)
)
)
)
(princ)
)