While Loop
(while condition sequence of expressions)
Examples
(defun count_div (x) (let ((count 0) (i 1)) (while (<= i x) (if (eq (% x i) 0) (setq count (1+ count))) (setq i (+ 1 i))) count)) (count_div 12) ; => 6
(defun last (L) (let ((M L)) (while (and M (cdr M)) (setq M (cdr M))) (print L) (if M (car M) nil))) (last '(1 2 3 4)) ;-> 4 (last ()) ;-> nil (last '(1)) ;-> (1)
Simplified version of last considering that both car and cdr return nil when the list is empty:
(defun last (L) (let ((M L)) (while (cdr M) (setq M (cdr M))) (car M))) (last '(1 2 3 4)) ;-> 4 (last ()) ;-> nil (last '(1)) ;-> 1
Function Parameters
All function parameters are value parameters in Lisp:
(defvar LL '(1 2 3 4)) (defun last (L) (while (and L (cdr L)) (setq L (cdr L))) (car L)) (last LL) ;=> 4 LL ;=> (1 2 3 4) (defun plus (x) (setq x (+ 1 x))) (setq n 3) ;=> 3 (plus n) ;=> 4 n ;=> 3
Associative Lists
Mutators
List Mutators
(setq L '(1 2 3)) (setcar (cdr L) 4) ;=> 4 L ;=> (1 4 3) (setcdr (cdr L) 5) ;=> L - (1 4 . 5)
(setcdr (assq 'rose flowers) 'pink) => flowers - ((rose . pink) (lily . white) ...)
Mutator Function
(defun set3rd (L val) (let ((M L)) (setq M (cdr M)) (setq M (cdr M)) (setcar M val) L)) (setq L '(3 5 9 1 2)) ;=> (3 5 9 1 2) (set3rd L 10) ;=> (3 5 10 1 2) L ;=> (3 5 10 1 2)
Complex Conditional
(cond (c1 exp1) (c2 exp2)... )
Examples
(defun last (L) (cond ((not L) nil) ((not (cdr L)) (car L)) (t (last (cdr L))))) (defun max3 (n1 n2 n3) (cond ((and (>= n1 n2) (>= n1 n3)) n1) ((and (>= n2 n1) (>= n2 n3)) n2) ((and (>= n3 n1) (>= n3 n2)) n3)))