(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)))
KGV2YWwtd2hlbiAoOmNvbXBpbGUtdG9wbGV2ZWwgOmxvYWQtdG9wbGV2ZWwgOmV4ZWN1dGUpCihkZWZ1biBteS15b2JhLXN5bnRheC1yZWFkZXIgKHN0cmVhbSBjaGFyIGFyZykKICAoZGVjbGFyZSAoaWdub3JlIGNoYXIgYXJnKSkKICAoZmxldCAoKHNraXAtd2hpdGVzcGFjZXMgKCkKICAgICAgICAgICAobG9vcCA6Zm9yIGMgOj0gKHJlYWQtY2hhciBzdHJlYW0pCiAgICAgICAgICAgICAgICAgOnVubGVzcyAobWVtYmVyIGMgJygjXFNwYWNlICNcVGFiKSkKICAgICAgICAgICAgICAgICAgIDpyZXR1cm4gKHByb2cxIGMgKHVubGVzcyAobWVtYmVyIGMgJygjXCkgI1xOZXdMaW5lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5yZWFkLWNoYXIgYyBzdHJlYW0pKSkpKQogICAgICAgICAoZXhwciAocmV2bGluZSAmYXV4IChleHByIChucmV2ZXJzZSByZXZsaW5lKSkpCiAgICAgICAgICAgKGlmIChpbnRlZ2VycCAoY2FyIGV4cHIpKQogICAgICAgICAgICAgICBgKCwoY2FyIGV4cHIpICwoY2RyIGV4cHIpKQogICAgICAgICAgICAgICBgKCxleHByKSkpKQogICAgKGxvb3AgOndpdGggYm9keSA6YW5kIGxpbmUgOmZvciBjIDo9IChza2lwLXdoaXRlc3BhY2VzKSA6ZG8KICAgICAgKGNhc2UgYwogICAgICAgICgjXE5ld0xpbmUKICAgICAgICAgKHBzZXRmIGxpbmUgbmlsIGJvZHkgKG5jb25jIGJvZHkgKGV4cHIgbGluZSkpKSkKICAgICAgICAoI1wpCiAgICAgICAgIChyZXR1cm4gYChibG9jayBuaWwgKHRhZ2JvZHkgLEBib2R5ICxAKGV4cHIgbGluZSkpKSkpCiAgICAgICAgKHQgKHB1c2ggKHJlYWQtcHJlc2VydmluZy13aGl0ZXNwYWNlIHN0cmVhbSB0IG5pbCB0KSBsaW5lKSkpKSkpCgoobWFrZS1kaXNwYXRjaC1tYWNyby1jaGFyYWN0ZXIgI1wkKQooc2V0LWRpc3BhdGNoLW1hY3JvLWNoYXJhY3RlciAjXCQgI1woICdteS15b2JhLXN5bnRheC1yZWFkZXIpKQoKKGRlZnVuIGZhY3RvcmlhbCAobiAmYXV4IHIpCiAgJCgwMCBTRVRRIFIgMQogICAgMTAgSUYgKDwgTiAxKSAoR08gNTApCiAgICAyMCBTRVRRIFIgKCogUiBOKQogICAgMzAgU0VUUSBOICgxLSBOKQogICAgNDAgR08gMTAKICAgIDUwIFJFVFVSTiBSKSkKCihkb3RpbWVzIChuIDI1KQogICAoZm9ybWF0IHQgIn4mfmQhID0gfmQiIG4gKGZhY3RvcmlhbCBuKSkp