gpt4 book ai didi

lisp - 使用嵌套列表 LISP

转载 作者:太空宇宙 更新时间:2023-11-03 19:02:59 27 4
gpt4 key购买 nike

我对 lisp 比较陌生,对在以下上下文中使用嵌套列表的最佳方法很好奇:

所以,我有以下功能:

(defun get-p0 (points)
(loop for (label x y) in points
; collect (list (if (> x y) (+ 2 3))))
collect (list (get-angle (first points) (second points))))
)

我这样调用它:

(get-p0 '((A 5 2) (B 2 3) (C 8 9)))

我一直试图做的是获取每个坐标相对于其他坐标的角度。例如AB、AC、BA、BC、CA、CB的角度打印出来。我得到的输出如下:

((161.56505) (161.56505) (161.56505))

那时候真的只是为了测试目的。虽然我真正想做的是输出最低和最左边的坐标。有什么想法吗?

最佳答案

我前段时间做过非常相似的练习。这看起来可能对您有用:

;; Define struct `point'
(defstruct point x y)

;; Define methods specializing on `point'
(defgeneric add (a b))

(defgeneric subtract (a b))

(defgeneric distance (a b))

(defgeneric projection (a))

(defmethod add ((this point) (that point))
(make-point :x (max (point-x this) (point-x that))
:y (max (point-y this) (point-y that))))

(defmethod subtract ((this point) (that point))
(make-point :x (min (point-x this) (point-x that))
:y (min (point-y this) (point-y that))))

(defmethod distance ((this point) (that point))
(let ((a (add this that)) (b (subtract this that)))
(make-point :x (- (point-x a) (point-x b))
:y (- (point-y a) (point-y b)))))

(defmethod projection ((this point))
(sqrt (+ (expt (point-x this) 2) (expt (point-y this) 2))))

;; Define helper functions
(defun angle (a b c)
(acos (/ (+ (* a a) (* b b) (- (* c c))) (* 2 a b))))

(defun radian->degree (radian) (/ (* 180 radian) pi))

;; Define struct `triangle'
(defstruct triangle
(a nil :type (or null point))
(b nil :type (or null point))
(c nil :type (or null point)))

;; Define methods specializing on `triangle'
(defgeneric angles-of (triangle))

(defgeneric sides-of (triangle))

(defgeneric points-of (triangle))

(defmethod points-of ((this triangle))
(let ((result (list (triangle-a this) (triangle-b this) (triangle-c this))))
(nconc result result)))

(defmethod sides-of ((this triangle))
(loop for (p . rest) on (points-of this)
for i from 0 below 3
collect (projection (distance p (car rest))) into result
finally (return (nconc result result))))

(defmethod angles-of ((this triangle))
(loop for (a b c) on (sides-of this)
for i from 0 below 3
collect (radian->degree (angle a b c)) into result
finally (return (nconc result result))))

;; Create some test triangle
(defvar *pythagorean-triangle*
(make-triangle :a (make-point :x 1 :y 2)
:b (make-point :x 4 :y 2)
:c (make-point :x 4 :y 6)))

;; Finally! don't forget to
(setf *print-circle* t)
;; so you can see circular lists' content
(angles-of *pythagorean-triangle*)

#1=(90.00000265626015d0 36.86989784081561d0 53.13009995842113d0 . #1#)

一些注释,我在另一个帖子中看到表格有些困惑

(loop for <list-like expression> in some-list ...)

这个类列表表达式就是通常所说的“解构绑定(bind)”。它是一个有限的模式匹配工具。实际上,这是一种模式,它将您在模式内定义的符号映射到您正在迭代的列表中找到的任何值。

因此,例如,(loop for (x y) on '(1 2 3 4)) 会将 xy 绑定(bind)到12,然后是 23,然后是 3 4 最后是 4nil。当然你可以使用更多变量/你可以使用虚线列表作为模式等。

关于lisp - 使用嵌套列表 LISP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15776420/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com