Updates on 2022/3/23

Sorting in Lisp

As I've been porting Klisp to Oak for fun this week, I wrote a couple of sorting algorithms that I think came out very elegant in Lisp:

(defn quicksort (xs)
      (if (< (size xs) 2)
        xs
        (let (pivot (nth xs (int (/ (dec (size xs)) 2)))) ; heuristic: pick midpoint
          (-> (quicksort (filter xs (partial (< ? pivot))))
              (append (filter xs (is pivot)))
              (append (quicksort (filter xs (partial (> ? pivot)))))))))
(defn merge (left right)
      (cond ((empty? left) right)
            ((empty? right) left)
            ((do
               (def l (first left))
               (def r (first right))
               (if (<= l r)
                 (conj l (merge (rest left) right))
                 (conj r (merge left (rest right))))))))

(defn mergesort (xs)
      (if (< (size xs) 2)
        xs
        (let (split-at (int (/ (size xs) 2)))
          (merge (mergesort (take xs split-at))
                 (mergesort (drop xs split-at))))))