どう書く?org ;コインを減らす払い方 を commonlispで その1

コインを減らす払い方
難しい。単純にロジックどう書けばいいかわからんぞ。
ひょっとして俺ってものすごいバカなのかも?(ショック)

とりあえず、今書いたところまでのせとく。
関数を作るマクロを初めて書いた。
おもしろーい。

;;コインを減らす払い方
(defstruct coin
  (name nil)
  (value nil))

(defmacro make-??yen(value)
  (let ((g (gensym))
    (nm (concatenate 'string "make-" (princ-to-string value) "yen")))
    `(defun ,(intern (string-upcase nm)) (count)
       (let ((,g (make-coin)))
     (setf (coin-name ,g) (intern (string-upcase (concatenate 'string ,(princ-to-string value) "yen"))))
     (setf (coin-value ,g) ,value)
     (list ,g count)))))

(defmacro force0(val)
  (if (null val)
      0
    val))

(make-??yen 1)
(make-??yen 5)
(make-??yen 10)
(make-??yen 50)
(make-??yen 100)
(make-??yen 500)

(defun make-moneybag(
            1yen-count
            5yen-count
            10yen-count
            50yen-count
            100yen-count
            500yen-count)
  (list 
   (make-1yen (force0 1yen-count))
   (make-5yen (force0 5yen-count))
   (make-10yen (force0 10yen-count))
   (make-50yen (force0 50yen-count))
   (make-100yen (force0 100yen-count))
   (make-500yen (force0 500yen-count))))

(defun get-coin(coins name)
  (assoc name coins :key #'(lambda (k) (coin-name k))))

(defun sum-coins(coins)
  (reduce #'(lambda (sum alist)
          (progn 
        (+ sum (* (coin-value (car alist)) (cadr alist)))))
      coins 
      :initial-value 0))

(defun get-oturi(kakaku shiharai)
  (let ((oturi (- shiharai kakaku))
    (ps (reverse (make-moneybag 0 0 0 0 0 0))))
    (get-oturi_ oturi ps)))

(defun get-oturi_(oturi coins)
  (if (null coins)
      nil
    (let ((coin (car (car coins))))
      (if (or (null coin)
          (< oturi 0))
      nil
    (let* ((multiple-value-bind (maisu amari) (truncate oturi (coin-value coin))))
           (nextoturi (- oturi (* maisu (coin-value coin)))))
      (append (get-oturi_ nextoturi (cdr coins)) (list coin maisu)))))))


(defun kono-coin-detariru?(kingaku alist)
  (let ((coin (car alist))
    (maisu (cadr alist)))
    (if (kingaku          

(defun kaisi-coin-search(kingaku moneybag)