在剪辑中定义对象

时间:2019-03-02 05:03:14

标签: common-lisp clisp

我正在尝试做一个包含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 :(得分:2)

Common Lisp没有中缀算法。所有算术都是通过调用函数来完成的,而调用函数是通过写一个开始的括号,函数名称,参数然后是一个结束的括号来完成的。

在哪里写:

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

您可能想写:

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

(假设您试图计算半径而不是近似圆周)

答案 1 :(得分:1)

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)))