My humble offering.
(defun c:p2e (/ ang intpt ent p1 p2 p3 p4 len)
;; global *LR_elast*
(defun 3dP->2dP (3dpt)(list (car 3dpt) (cadr 3dpt))) ;Make 2D point from 3D point
(setq len (getdist "\Enter fixed leg length [Enter for none]:"))
(if (or (setq ent (entsel "\nSelect base line: "))
(setq ent *LR_elast*))
(if (= "LINE" (cdr (assoc 0 (setq ent (entget (car ent))))))
(progn
(setq *LR_elast* (list (cdr (assoc -1 ent)) 1)) ; save ename in a list
(setq p1 (3dP->2dP(cdr (assoc 10 ent)))
p2 (3dP->2dP(cdr (assoc 11 ent)))
ang (angle p1 p2)
)
(while (setq p3 (getpoint "\nSelect point to draw perpendicular from, Enter to quit: "))
(setq p3 (3dP->2dP(trans p3 1 0))) ; adjust for non-World UCS
(setq p4 (polar p3 (+ ang (/ pi 2)) 100))
(setq intpt (inters p1 p2 p3 p4 nil))
(if len (setq intpt (polar p3 (angle p3 intpt) len)))
(entmake (list '(0 . "LINE") (cons 10 p3) (cons 11 intpt)))
) ; end while
) ; progn
(prompt "\nObject is not a LINE.")
) ; endif
(prompt "\nNothing Selected.")
) ; endif
(princ)
)