Определить объект в clisp - PullRequest
0 голосов
/ 02 марта 2019

Я пытаюсь сделать проект, который включает CLISP.У меня нет никаких знаний о CLISP, и я новичок в этом языке.

Ниже приведен код, который уже указан:

    #|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; POLYMORPHISM

TODO 2a. Define an object "cirle" with variables x,y
    (for  the center of the circle) and radius 
    (to hold the size of the circle). Add a method 
    "area" that returns 2 *pi*radius^2

; run this to peek inside circle
'(xpand (circle))

TODO 2b. Define an object "rectangle" with variables x1,x2,y1,y2
    that all default value of 0. Add
    a method "area" that returns the area of that rectangle
TODO 2c. Show the output from the following test

|#

(defun polymorphism()
  (let ((sum 0)
        (all (list (circle :radius 1) 
                   (rectangle :x2 10 :y2 10)
                   (circle :radius 2))))
    (dolist (one all)
      (incf sum (send one 'area)))
    (print `(polymorphism ,sum))))

; to run, uncomment the following
'(polymorphism)

#|

Я должен создать объект для круга и прямоугольника, который имеет атрибуты и метод.

Для круга это то, что я уже пробовал:

(defthing
  circle
  :has  ((x 0) (y 0) (radius 0))
  :does ((area (radius)
                   (2 * (22/7) * radius))
         ))

Для прямоугольника это то, что я уже попробовал:

(defthing
  rectangle
  :has  ((x1 0) (y1 0) (x2 0) (y2 0))
  :does ((area
                   ((x1-x2) * (y1-y2) * radius))
         ))

Этовсе, что мне нужно, или мне нужно что-нибудь добавить, чтобы методы круга и прямоугольника работали?

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Common Lisp не имеет инфиксной арифметики.Вся арифметика выполняется вызовом функций, а вызов функций - записью открывающей части, имени функции, аргументов, а затем закрывающей формы.

Где вы пишете:

                (area (radius)
                   (2 * (22/7) * radius))

Вывероятно, намеревался написать:

                (area (radius)
                   (* pi radius radius))

(Предполагается, что вы пытаетесь вычислить радиус, а не аппроксимируете окружность)

0 голосов
/ 03 марта 2019

defthing не является встроенным макросом.Мы строим объекты с defclass.Существует учебное пособие: https://lispcookbook.github.io/cl-cookbook/clos.html

(defclass person ()
  ((name
    :initarg :name
    :accessor name)
   (lisper
    :initform nil
    :accessor lisper)))

Создание объекта этого класса:

(make-instance 'person :name "me" )

Методы создаются с помощью defmethod:

(defmethod greet (obj)
  (format t "Are you a person ? You are a ~a.~&" (type-of obj)))

Они могут специализироваться на типе аргумента:

(defmethod greet ((obj person))
  (format t "Hello ~a !~&" (name obj)))
...