LINUX.ORG.RU

История изменений

Исправление theNamelessOne, (текущая версия) :

(setf (slot-value c 'radius) 7)

А почему это вообще должно работать? make-instance принимает название класса и список инициализации аргументов, а не произвольные выражения. Почему вообще (setf (slot value c ...)) должен работать, если сам c не объявлен? (Напоминаю, параметр c метода area является локальным для самого метода, т.е. извне он не существует.)

Если ты хочешь проинициализировать слот при создании инстанса, то это делается примерно так:

(defclass circle ()
  ((radius
   :initarg :radius))

(defmethod area ((c circle))
  (* pi (expt (slot-value c 'radius) 2)))

(area (make-instance 'circle :radius 7))

(Код не проверял, так что не уверен, что он работает; у меня не стоит интепретатор CL, я вообще не пишу на CL, я просто по нему одну книжку 10 лет назад прочитал.)

Выглядит так, как будто ты не совсем понимаешь, что ты делаешь (причём как в плане языка, так и в плане CLOS). Почитай какую-нибудь книгу по языку, даже тот же PCL (там есть и главы про CLOS).

Исходная версия theNamelessOne, :

(setf (slot-value c 'radius) 7)

А почему это вообще должно работать? make-instance принимает название класса и список инициализации аргументов, а не произвольные выражения. Почему вообще (setf (slot value c ...)) должен работать, если сам c не объявлен? (Напоминаю, параметр c метода area является локальным для самого метода, т.е. извне он не существует.)

Если ты хочешь проинициализировать слот при создании инстанса, то это делается примерно так:

(defclass circle ()
  ((radius
   :initarg :radius))

(defmethod area ((c circle))
  (* pi (expt (slot-value c 'radius) 2)))

(area (make-instance 'circle :radius 7))

(Код не проверял, так что не уверен, что он работает; я вообще не пишу на CL, я просто по нему одну книжку 10 лет назад прочитал.)

Выглядит так, как будто ты не совсем понимаешь, что ты делаешь (причём как в плане языка, так и в плане CLOS). Почитай какую-нибудь книгу по языку, даже тот же PCL (там есть и главы про CLOS).