#|                                      |#
     #|          KSAJ'S LISP THINGS          |#
     #|                                      |#

; If you use any of the code I put here, I would prefer credit is given. Just my initials KSAJ is fine. I share them because Lisp is cool, and maybe these snippets will be useful to someone. I won't be posting code that is readily available elsewhere, so everything here has some type of nice quirk to them.

; Until I get around to organizing a site, here are a few nice snippets to start with. Later I'll make a writeup describing how they (and other snippets I add) work.

; Everybody's got their version of how to calculate factorials in Lisp. Here's mine.

     (defun factorial (a &optional (fact 1))
      "Calculate factorial. Optional second arg for multifactorial."

         ((< 0) (format t      "Factorial of < 0 is not defined"))

          (t    (reduce #'*
                  (loop for     i
                        from    a
                        downto  1
                        by      fact
                        collect i)))))

; For regular factorials like 6!, you just call (factorial 6), which is the same as (factorial 6 1). This version also does multifactorials. For example, 6!!!! can be calculated with (factorial 6 4).

; If you are looking for a super-fast way to calculate the nth Fibonacci number, here is a method that doesn't use any form of looping or recursion whatsoever. It took a while to code it because I got the idea by translating Mathematical Notation, and then introduced a few shortcuts. Its workings are definitely non-obvious.

; It looks way simpler than it actually is.

     (defun fib-nth (n)
      "KSAJ's interesting way to calculate nth Fibonacci number."

       (logand (truncate (ash 4 (* n (+ 3 n)))

                         (-   (ash 4 (* 2 n))
                              (ash 2 n)

               (- (ash 2 n) 1)))

; I hope to share some of my Lispy ideas here. I'm still trying to feel my way around SDF.org so it might take a while.