我正在尝试做一个包含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))
))
是我所需要的还是必须添加任何东西才能使圆形和矩形方法起作用?
答案 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)))