为什么(2,3)映射到一个点的y值而不是将2和3分别映射到该点的x和y值?Common Lisp

Tra*_*alk 0 mapping common-lisp

我一直致力于普通lisp的jarvis march实现.jarvis march算法采用一堆点并返回该点云的凸包.我将每个点表示为这样的结构:

(defstruct point x y)
Run Code Online (Sandbox Code Playgroud)

然后我继续定义一个测试集,但是,由于初始化结构的符号相当长(make-point :x 0 :y 1),我决定创建一个自动为我做的函数:

(defun make-points (list)
  (map 
    'list
    (lambda (e) (make-point :x (first e) :y (second e)))
    list))
Run Code Online (Sandbox Code Playgroud)

可悲的是,它不起作用.

(print (first (make-points '('(2 3)))))    ;prints out '#S(POINT :X QUOTE :Y (2 3))' => wrong
(print (make-point :x 2 :y 3))             ;prints out '#S(POINT :X 2 :Y 3)' => correct
Run Code Online (Sandbox Code Playgroud)

它将完整列表(2 3)绑定到所有事物的y值,并且它不为x值赋值.为什么会这样做以及如何解决它.

在此先感谢,我对lisp相当新鲜(正如你可能从这个问题中猜到的那样),如果有人可以帮助我,我将非常感激.如果有人知道任何捷径或对我的工作方法有任何好的论据也会很好,虽然在评论中告诉我他们可能会更好,因为他们不会直接回答这个问题.

Rai*_*wig 5

CL-USER 1 > (defstruct point x y)
POINT

CL-USER 2 > (defun make-points (list)
              (map 
               'list
               (lambda (e) (make-point :x (first e) :y (second e)))
               list))
MAKE-POINTS
Run Code Online (Sandbox Code Playgroud)

追踪它:

CL-USER 3 > (trace make-points)
(MAKE-POINTS)

CL-USER 4 > (make-points '('(2 3)))
0 MAKE-POINTS > ...
  >> LIST : ((QUOTE (2 3)))
0 MAKE-POINTS < ...
  << VALUE-0 : (#S(POINT :X QUOTE :Y (2 3)))
(#S(POINT :X QUOTE :Y (2 3)))
Run Code Online (Sandbox Code Playgroud)

传统的打印调试:

CL-USER 5 > (defun make-points (list)
              (map 
               'list
               (lambda (e)
                 (print (list :first (first e) :second (second e)))
                 (make-point :x (first e) :y (second e)))
               list))
MAKE-POINTS

CL-USER 6 > (untrace make-points)
(MAKE-POINTS)

CL-USER 7 > (make-points '('(2 3)))

(:FIRST QUOTE :SECOND (2 3)) 
(#S(POINT :X QUOTE :Y (2 3)))
Run Code Online (Sandbox Code Playgroud)

更改输入.该名单已被引用.无需引用两次.

CL-USER 8 > (make-points '((2 3)))

(:FIRST 2 :SECOND 3) 
(#S(POINT :X 2 :Y 3))

CL-USER 9 > 
Run Code Online (Sandbox Code Playgroud)