#+TITLE: Common Lisp #+AUTHOR: Adam Mohammed * Blogs - [[https://malisper.me][malisper.me]] * Debugging Add this to set SBCL to have debug mode enabled. #+begin_src lisp CL-USER> (declaim (optimize (debug 3))) NIL #+end_src This is broken because of the divide by zero: #+begin_src lisp (defun fib (n) (if (<= 0 n 1) (/ 1 0) (+ (fib (- n 1)) (fib (- n 2))))) #+end_src Running the above puts us in the debugger once we hit the base case, but we can edit the function definition by adding =(break)= and then press ~r~ on the frame we wish to restart. Once we fix the code we can restart stepping and the issue can be fixed live! #+begin_src lisp (defun fib (n) (break) (if (<= 0 n 1) (/ 1 0) (+ (fib (- n 1)) (fib (- n 2))))) #+end_src You can toggle =C-c M-t= (slime trace dialog) on a funcion and then invoke it and then view the results with =C-c T=. =update-instance-for-redefined-class= is handy for defining migration behavior when you need to redefine a class. Restarts can be a handy tool where throw/catch would normally be used. Restarts allow for a user-defined failure functionality to be selected while still maintaining control in the function which caused the error. + References: - [[https://malisper.me/debugging-lisp-part-1-recompilation/][Recompilation]] - [[https://malisper.me/debugging-lisp-part-2-inspecting/][Inspecting]] - [[https://malisper.me/debugging-lisp-part-3-redefining-classes/][Redefining Classes]] - [[https://malisper.me/debugging-lisp-part-4-restarts/][Restarts]] - [[https://malisper.me/debugging-lisp-part-5-miscellaneous/][tricks]] * Libraries to look into - [[https://github.com/mmontone/ten/blob/master][Ten]] - templating library - [[https://scymtym.github.io/esrap/][Esrap]] - Parse backwards