95 lines
2.6 KiB
Common Lisp
95 lines
2.6 KiB
Common Lisp
;; setq defvar defun - examples of sideffectful things
|
|
|
|
(random 100)
|
|
|
|
;; setq could even change local variables (defined by function arguments)
|
|
(defun bad-style (p)
|
|
"This function will overdefine it's input P."
|
|
(setf p (+ p 2)) ; changes local variable
|
|
(setf r (* p 2))
|
|
`(result is ,p))
|
|
|
|
p ; this is not set by the setf
|
|
r ; this global value is changed
|
|
|
|
(bad-style 15)
|
|
|
|
;; wait, there's setf, what's different in setq?
|
|
;; setf has "place" as first item, so setter forms
|
|
|
|
(documentation `setf `function)
|
|
(documentation `setq `function)
|
|
|
|
(apropos "random")
|
|
|
|
;;; exercises
|
|
|
|
(defun throw-die ()
|
|
(+ 1 (random 6)))
|
|
(throw-die)
|
|
|
|
(defun throw-dice ()
|
|
(list (throw-die) (throw-die)))
|
|
(throw-dice)
|
|
|
|
(defun snake-eyes-p (thro)
|
|
(equal thro `(1 1)))
|
|
(snake-eyes-p `(1 1))
|
|
(snake-eyes-p `(1 2))
|
|
|
|
(defun boxcars-p (thro)
|
|
(equal thro `(6 6)))
|
|
(boxcars-p `(6 6))
|
|
(boxcars-p `(1 2))
|
|
|
|
(funcall `+ `(1 2)) ; 149
|
|
(apply `+ `(1 2 5))
|
|
|
|
(defun instant-win-p (the-throw)
|
|
(let ((win-hands `(7 11))
|
|
(sum (apply #'+ the-throw)))
|
|
(member sum win-hands)))
|
|
|
|
(defun instant-loss-p (the-throw)
|
|
(let ((loose-hands `(2 3 12))
|
|
(sum (apply #'+ the-throw)))
|
|
(member sum loose-hands)))
|
|
;;; breaking my head, looking for #'contains function for list
|
|
;;; apropos doesn't quite help
|
|
(member 7 (list 1 4 7 11)) ; well, member returns "rest"
|
|
|
|
(instant-win-p `(6 5)) ; so, this is correct. cool
|
|
(or `t nil)
|
|
|
|
(instant-loss-p `(6 5))
|
|
|
|
(defun say-throw (the-throw)
|
|
(cond ((equal the-throw `(1 1)) `snake-eyes)
|
|
((equal the-throw `(6 6)) `boxcars)
|
|
(t (apply #'+ the-throw))))
|
|
(say-throw '(1 1))
|
|
(say-throw '(6 6))
|
|
(say-throw '(2 5))
|
|
|
|
;; firsth throw either insta-win, insta-loose, or set point
|
|
(defun craps ()
|
|
(let* ((the-throw (throw-dice ))
|
|
(result (cond ((instant-loss-p the-throw) `(,(say-throw the-throw) -- you loose))
|
|
((instant-win-p the-throw) `(,(say-throw the-throw) -- you win))
|
|
(t `(your point is ,(say-throw the-throw))))))
|
|
(append `(throw ,(first the-throw) and ,(second the-throw) -- ) result)))
|
|
|
|
(craps)
|
|
|
|
(defun try-for-point (point)
|
|
(let* ((the-throw (throw-dice))
|
|
(value (apply #'+ the-throw))
|
|
(result (cond ((equal value point) `(you win))
|
|
((equal value 7) `(you loose))
|
|
(t `(throw again)))))
|
|
(append `(throw ,(first the-throw) and ,(second the-throw) -- ,value --) result)))
|
|
|
|
(try-for-point 8)
|
|
|
|
;; next onto the 6, list data structures
|