(eval-when (:compile-toplevel :load-toplevel :execute)
(defun my-yoba-syntax-reader (stream char arg)
  (declare (ignore char arg))
  (flet ((skip-whitespaces ()
           (loop :for c := (read-char stream)
                 :unless (member c '(#\Space #\Tab))
                   :return (prog1 c (unless (member c '(#\) #\NewLine))
                                      (unread-char c stream)))))
         (expr (revline &aux (expr (nreverse revline)))
           (if (integerp (car expr))
               `(,(car expr) ,(cdr expr))
               `(,expr))))
    (loop :with body :and line :for c := (skip-whitespaces) :do
      (case c
        (#\NewLine
         (psetf line nil body (nconc body (expr line))))
        (#\)
         (return `(block nil (tagbody ,@body ,@(expr line)))))
        (t (push (read-preserving-whitespace stream t nil t) line))))))

(make-dispatch-macro-character #\$)
(set-dispatch-macro-character #\$ #\( 'my-yoba-syntax-reader))

(defun factorial (n &aux r)
  $(00 SETQ R 1
    10 IF (< N 1) (GO 50)
    20 SETQ R (* R N)
    30 SETQ N (1- N)
    40 GO 10
    50 RETURN R))

(dotimes (n 25)
   (format t "~&~d! = ~d" n (factorial n)))