exercises and notes from "Gentle introduction"
This commit is contained in:
100
recursion.lisp
Normal file
100
recursion.lisp
Normal file
@@ -0,0 +1,100 @@
|
||||
|
||||
(null 'a)
|
||||
(null ())
|
||||
(null nil)
|
||||
|
||||
(defun anyoddp (x)
|
||||
(cond ((null x) nil)
|
||||
((odd (first x)) t)
|
||||
(t (anyoddp (rest x)))))
|
||||
|
||||
(trace anyoddp)
|
||||
(anyoddp (list 6 1))
|
||||
(untrace)
|
||||
(rest '(5 4 3 2 1))
|
||||
|
||||
;;; my error was - function wasn't named odd, it was oddp
|
||||
;;; and in the debugger it looked like:
|
||||
;;; ("undefined function" 6)
|
||||
;;; and I thought that 6 was treated as undefined function in list (6 1) for some reason
|
||||
|
||||
(defun laugh (n)
|
||||
(defun laugh-inner (n acc)
|
||||
(cond ((eq 0 n) acc)
|
||||
(t (laugh-inner (- n 1) (cons 'HA acc )))))
|
||||
(laugh-inner n ()))
|
||||
|
||||
;; I tried to use append
|
||||
;; but how the hell do I add elements to list?
|
||||
;; do I just fucking manually create cons? ugh
|
||||
(cons 1 '(4 5 6))
|
||||
|
||||
(laugh 4)
|
||||
|
||||
(defun square-list (x)
|
||||
(cond ((null x) ())
|
||||
(t (cons (* (first x) (first x))
|
||||
(square-list (rest x))))))
|
||||
|
||||
(square-list '(1 3 5 6))
|
||||
|
||||
;;; count atoms.
|
||||
;;; recursion on nested lists - think of them as binary trees, with car and cdr, that's it
|
||||
|
||||
(atom 1)
|
||||
|
||||
(defun count-atoms (tree)
|
||||
(cond
|
||||
((null tree) 0) ; without that ends of lists would be counted, but didn't include that due to misunderstanding
|
||||
((atom tree) 1)
|
||||
(t (+ (count-atoms (car tree))
|
||||
(count-atoms (cdr tree))))))
|
||||
|
||||
(count-atoms '(1 (4 5) 2 ))
|
||||
|
||||
(defun pairings (x y)
|
||||
(cond ((or (null x) (null y)) ())
|
||||
(t (cons (list (first x) (first y))
|
||||
(pairings (rest x) (rest y))))))
|
||||
|
||||
(pairings '(1 2 3 7) '(a b c d))
|
||||
|
||||
;;; looking into debugger
|
||||
(defun my-fact (n)
|
||||
(cond ((zerop n) (break "N is zero")
|
||||
;; 1
|
||||
)
|
||||
(t (* n (my-fact (- n 1))))))
|
||||
|
||||
(my-fact 4)
|
||||
|
||||
;;; So - debugger keys and functions
|
||||
;; C-j and C-k are for moving between frames
|
||||
;; for frame context commands R - return from frame with particular value (sly-db-return-from-frame)
|
||||
;; x - step over, s - step
|
||||
;; e - eval in frame, i - inspect in frame (show additional info on evaluated value)
|
||||
;; RET - toggle details for current frame
|
||||
;; v - show frames code
|
||||
;; d - pretty-print-eval-in-frame
|
||||
;; (searching all of functions by going into debugger bugger and looking at *helpful* (C-h C-f) "sly-db-"
|
||||
|
||||
;; could also try to recompile thing, maybe r for restart, or R to return with value 1 from last frame and check how it all works
|
||||
|
||||
;;; better way to define inner functions : LABELS
|
||||
;;; similar to LET form, binding names to arglists and body
|
||||
;;; they are "local functions"
|
||||
;;; can call each other, and reference parent variables
|
||||
|
||||
(defun factor-tree (n)
|
||||
(factors-help n 2))
|
||||
|
||||
(defun factors-help (n p)
|
||||
(cond
|
||||
((equal p n) n)
|
||||
((zerop (rem n p)) (list n p (factors-help (/ n p) p)))
|
||||
(t (factors-help n (+ 1 p)))))
|
||||
|
||||
(factor-tree 60)
|
||||
|
||||
(trace factors-help)
|
||||
(untrace) ; and there's no need to try to do println, and less errors in that
|
||||
Reference in New Issue
Block a user