diff options
Diffstat (limited to 'loot.lsp')
-rw-r--r-- | loot.lsp | 49 |
1 files changed, 25 insertions, 24 deletions
diff --git a/loot.lsp b/loot.lsp index e5e9e81..4dfb2c8 100644 --- a/loot.lsp +++ b/loot.lsp @@ -1,4 +1,5 @@ ;;; Port of https://en.wikipedia.org/wiki/ModernPascal#Code_Sample[3]. +;;; And then to CL and ISLisp. ;;; I prefer my version. (defconstant +max-probability+ 1000) ;; Because this is a simple enum and not a full sum/product type, @@ -10,31 +11,31 @@ (defclass <looter> () ((probabilities :accessor probabilities))) (defgeneric choose (self)) (defmethod choose ((self <looter>)) - (let ((random-value (random (- +max-probability+ 1)))) - (for ((loop 0 (+ loop 1))) - ((>= (elt (probabilities self) (mod loop 13)) random-value) (elt +loot-type+ (mod loop 13)))))) + (let ((random-value (random (- +max-probability+ 1)))) + (for ((loop 0 (+ loop 1))) + ((>= (elt (probabilities self) (mod loop 13)) random-value) (elt +loot-type+ (mod loop 13)))))) (defmethod initialize-object :after ((self <looter>) initargs) - (setf (probabilities self) (vector 10 77 105 125 142 159 172 200 201 202 216 282 +max-probability+))) + (setf (probabilities self) (vector 10 77 105 125 142 159 172 200 201 202 216 282 +max-probability+))) (defun as-string (l) - ;; Could use assoc here, but this is closer to the original. - ;; Also saves translating nil to "". - (case l - ((bloodstone) "Bloodstone") - ((copper) "Copper") - ((emeraldite) "Emeraldite") - ((gold) "Gold") - ((heronite) "Heronite") - ((platinum) "Platinum") - ((shadownite) "Shadownite") - ((silver) "Silver") - ((soranite) "Soranite") - ((umbrarite) "Umbrarite") - ((cobalt) "Cobalt") - ((iron) "Iron") - (t ""))) + ;; Could use assoc here, but this is closer to the original. + ;; Also saves translating nil to "". + (case l + ((bloodstone) "Bloodstone") + ((copper) "Copper") + ((emeraldite) "Emeraldite") + ((gold) "Gold") + ((heronite) "Heronite") + ((platinum) "Platinum") + ((shadownite) "Shadownite") + ((silver) "Silver") + ((soranite) "Soranite") + ((umbrarite) "Umbrarite") + ((cobalt) "Cobalt") + ((iron) "Iron") + (t ""))) (defun main () - (let ((loot (create (class <looter>)))) - (for ((n 0 (+ n 1))) - ((> n 99)) - (format (standard-output) "~A~%" (as-string (choose loot)))))) + (let ((loot (create (class <looter>)))) + (for ((n 0 (+ n 1))) + ((> n 99)) + (format (standard-output) "~A~%" (as-string (choose loot)))))) (main) |