1;; exercise from Recursion's video 2 3(defun str-swap (str) 4 (let* ((len (length str)) 5 (n (div len 2)) 6 (temp nil)) 7 (for ((i 0 (+ i 1))) 8 ((>= i n) str) 9 (setq temp (elt str i)) 10 (setf (elt str i) (elt str (- len i 1))) 11 (setf (elt str (- len i 1)) temp)))) 12 13 14(defun str-recur (str) 15 (let* ((len (length str)) 16 (n (div len 2))) 17 (str-recur1 str 0 n len))) 18 19(defun str-recur1 (str i n len) 20 (cond ((>= i n) str) 21 (t (let ((temp nil)) 22 (setq temp (elt str i)) 23 (setf (elt str i) (elt str (- len i 1))) 24 (setf (elt str (- len i 1)) temp) 25 (str-recur1 str (+ i 1) n len))))) 26 27 28(defun twocomplement (str) 29 (list-to-string (complement1 (convert str <list>)))) 30 31(defun twocomplement1 (ls) 32 (cond ((null ls) nil) 33 ((char= (car ls) #\0) 34 (cons #\1 (twocomplement1 (cdr ls)))) 35 ((char= (car ls) #\1) 36 (cons #\0 (twocomplement1 (cdr ls)))))) 37 38(defun list-to-string (ls) 39 (if (null ls) 40 "" 41 (string-append (convert (car ls) <string>) 42 (list-to-string (cdr ls))))) 43 44 45(defun pow (m n) 46 (cond ((= n 0) 1) 47 ((= n 1) m) 48 ((= (mod n 2) 2) (pow (* m m) (div n 2))) 49 (t (* m (pow m (- n 1))))))