LINUX.ORG.RU

CLOS: (call-next-method)


0

0

Из описания в PCL не понял, как (call-next-method) выбирает нужный метод.

Поскольку я буду обсуждать вопросы создания новых классов только в следующей главе, для понимания вы можете просто представить, что определенные классы уже существуют: предположим, что существует класс bank-account и он имеет два подкласса – checking-account и savings-account. Иерархия классов выглядит следующим образом:

(картинки с иерархией нет в тексте)

(defgeneric withdraw (account amount)
  (:documentation "Withdraw the specified amount from the account.
Signal an error if the current balance is less than amount."))

(defmethod withdraw ((account bank-account) amount)
  (when (< (balance account) amount)
    (error "Account overdrawn."))
  (decf (balance account) amount))

(defmethod withdraw ((account checking-account) amount)
  (let ((overdraft (- amount (balance account))))
    (when (plusp overdraft)
      (withdraw (overdraft-account account) overdraft)
      (incf (balance account) overdraft)))
  (call-next-method))

Функция CALL-NEXT-METHOD является частью системы обобщенных функций и используется для комбинации методов. Она сообщает, что контроль должен быть передан от текущего метода, к методу, специализированному для bank-account.

И нигде нет объяснения почему управление должно передаться именно специализации для bank-account, а из приведённого кода я не понимаю. А если ещё есть десяток методов (withdraw)?

Ответ на: комментарий от Booster

> А какой компиль посоветуете? Пока остановился на SBCL,

как полноценном компиляторе в бинарный код.


SBCL для linux, для прочих систем возможно стоит также смотреть ClozureCL. Дело прежде всего в возможностях и поддержке со стороны сообщества. И надеюсь вы правильно поняли, что такое компилятор, а то думают, кто компилятор это то, что делает небольшие исполняемые файлы ;)

archimag ★★★
()
Ответ на: комментарий от archimag

>И надеюсь вы правильно поняли, что такое компилятор, а то думают, кто компилятор это то, что делает небольшие исполняемые файлы ;)
Плохо себе представляю как это происходит в CL. Поясните пожалуйста.

Booster ★★
()
Ответ на: комментарий от archimag

Я сейчас читаю PCL и иногда баги в тексте нахожу. Где-нибудь wiki с переводом есть, где их можно исправлять?

naryl ★★★★★
()
Ответ на: комментарий от Booster

Плохо себе представляю как это происходит в CL. Поясните пожалуйста.

Аналог обычного тулчейна сидит в памяти программы и доступен для вызова в любой момент. Свежескомпилированный код немедленно доступен для остальной части программы.

mv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.