Advertisement
wbooze

ok no specializing on &optioal

Oct 13th, 2020
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.29 KB | None | 0 0
  1. (defclass standard-point ()
  2. ((x :initform 0 :initarg :x)
  3. (y :initform 0 :initarg :y)))
  4.  
  5.  
  6. (defgeneric distance-origin (point))
  7.  
  8. (defmethod distance-origin ((point1 standard-point))
  9. (when (and (slot-exists-p point1 'x) (slot-exists-p point1 'y))
  10. (sqrt (+ (expt (sb-mop:standard-instance-access point1 0) 2)
  11. (expt (sb-mop:standard-instance-access point1 1) 2)))))
  12.  
  13. (defgeneric distance (point1 point2))
  14.  
  15. (defmethod distance ((point1 null) (point2 null)))
  16.  
  17. (defmethod distance ((point1 standard-point) point2)
  18. (when (and (slot-exists-p point1 'x) (slot-exists-p point1 'y))
  19. (sqrt (+ (expt (sb-mop:standard-instance-access point1 0) 2)
  20. (expt (sb-mop:standard-instance-access point1 1) 2)))))
  21.  
  22. (defmethod distance (point1 (point2 standard-point))
  23. (when (and (slot-exists-p point2 'x) (slot-exists-p point2 'y))
  24. (sqrt (+ (expt (sb-mop:standard-instance-access point2 0) 2)
  25. (expt (sb-mop:standard-instance-access point2 1) 2)))))
  26.  
  27. (defmethod distance ((point1 null) (point2 standard-point))
  28. (when (and (slot-exists-p point2 'x) (slot-exists-p point2 'y))
  29. (sqrt (+ (expt (sb-mop:standard-instance-access point2 0) 2)
  30. (expt (sb-mop:standard-instance-access point2 1) 2)))))
  31.  
  32. (defmethod distance ((point1 standard-point) (point2 null))
  33. (when (and (slot-exists-p point1 'x) (slot-exists-p point1 'y))
  34. (sqrt (+ (expt (sb-mop:standard-instance-access point1 0) 2)
  35. (expt (sb-mop:standard-instance-access point1 1) 2)))))
  36.  
  37. (defmethod distance ((point1 standard-point) (point2 standard-point))
  38. (when (and (slot-exists-p point1 'x) (slot-exists-p point1 'y)
  39. (slot-exists-p point2 'x) (slot-exists-p point2 'y))
  40. (sqrt (+ (expt (- (sb-mop:standard-instance-access point2 0) (sb-mop:standard-instance-access point1 0)) 2)
  41. (expt (- (sb-mop:standard-instance-access point2 1) (sb-mop:standard-instance-access point1 1)) 2)))))
  42.  
  43. (defvar p1 (make-instance 'standard-point :x -3 :y 5))
  44. (defvar p2 (make-instance 'standard-point :x 7 :y -1))
  45.  
  46. (defun test ()
  47. (distance p2 p1))
  48.  
  49. * (test)
  50. 11.661903
  51. * (distance p1 nil)
  52. 5.8309517
  53. * (distance p1 0)
  54. 5.8309517
  55. * (distance nil p2)
  56. 7.071068
  57. * (distance 1 p2)
  58. 7.071068
  59. * (distance-origin p1)
  60. 5.8309517
  61. * (distance-origin p2)
  62. 7.071068
  63. *
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement