mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2025-12-12 20:32:15 +00:00
91 lines
3.6 KiB
Common Lisp
91 lines
3.6 KiB
Common Lisp
;; https://github.com/emilybache/GildedRose-Refactoring-Kata
|
|
|
|
;; Common Lisp version: Rainer Joswig, joswig@lisp.de, 2016
|
|
;; Minor modifications (independent of CL impl.): Manfred Bergmann, 2022
|
|
;; Adaption to asdf: Nico Simoski, 2023
|
|
|
|
;;; ================================================================
|
|
;;; Code
|
|
|
|
(in-package :gilded-rose)
|
|
|
|
;;; Class ITEM
|
|
|
|
(defclass item ()
|
|
((name :initarg :name :type string)
|
|
(sell-in :initarg :sell-in :type integer)
|
|
(quality :initarg :quality :type integer)))
|
|
|
|
(defmethod to-string ((i item))
|
|
(with-slots (name quality sell-in) i
|
|
(format nil "~a, ~a, ~a" name sell-in quality)))
|
|
|
|
;;; Class gilded-rose
|
|
|
|
(defclass gilded-rose ()
|
|
((items :initarg :items)))
|
|
|
|
(defmethod update-quality ((gr gilded-rose))
|
|
(with-slots (items) gr
|
|
(dotimes (i (length items))
|
|
(with-slots (name quality sell-in)
|
|
(elt items i)
|
|
(if (and (not (equalp name "Aged Brie"))
|
|
(not (equalp name "Backstage passes to a TAFKAL80ETC concert")))
|
|
(if (> quality 0)
|
|
(if (not (equalp name "Sulfuras, Hand of Ragnaros"))
|
|
(setf quality (- quality 1))))
|
|
(when (< quality 50)
|
|
(setf quality (+ quality 1))
|
|
(when (equalp name "Backstage passes to a TAFKAL80ETC concert")
|
|
(if (< sell-in 11)
|
|
(if (< quality 50)
|
|
(setf quality (+ quality 1))))
|
|
(if (< sell-in 6)
|
|
(if (< quality 50)
|
|
(setf quality (+ quality 1)))))))
|
|
|
|
(if (not (equalp name "Sulfuras, Hand of Ragnaros"))
|
|
(setf sell-in (- sell-in 1)))
|
|
|
|
(if (< sell-in 0)
|
|
(if (not (equalp name "Aged Brie"))
|
|
(if (not (equalp name "Backstage passes to a TAFKAL80ETC concert"))
|
|
(if (> quality 0)
|
|
(if (not (equalp name "Sulfuras, Hand of Ragnaros"))
|
|
(setf quality (- quality 1))))
|
|
(setf quality (- quality quality)))
|
|
(if (< quality 50)
|
|
(setf quality (+ quality 1)))))))))
|
|
|
|
;;; Example
|
|
|
|
(defun run-gilded-rose (days)
|
|
(write-line "OMGHAI!")
|
|
(let* ((descriptions '(("+5 Dexterity Vest" 10 20)
|
|
("Aged Brie" 2 0)
|
|
("Elixir of the Mongoose" 5 7)
|
|
("Sulfuras, Hand of Ragnaros" 0 80)
|
|
("Sulfuras, Hand of Ragnaros" -1 80)
|
|
("Backstage passes to a TAFKAL80ETC concert" 15 20)
|
|
("Backstage passes to a TAFKAL80ETC concert" 10 49)
|
|
("Backstage passes to a TAFKAL80ETC concert" 5 49)
|
|
;; this conjured item does not work properly yet
|
|
("Conjured Mana Cake" 3 6)))
|
|
(items (loop :for (name sell-in quality) :in descriptions
|
|
:collect (make-instance 'item
|
|
:name name
|
|
:sell-in sell-in
|
|
:quality quality)))
|
|
(app (make-instance 'gilded-rose :items items)))
|
|
(dotimes (i days)
|
|
(format t "-------- day ~a --------~%" i)
|
|
(format t "name, sell-in, quality~%")
|
|
(dolist (item items)
|
|
(write-line (to-string item)))
|
|
(terpri)
|
|
(update-quality app))))
|
|
|
|
;;; ================================================================
|
|
;;; EOF
|