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