Mapping 为什么(2,3)映射到一个点的y值,而不是分别映射到该点的x和y值?公共口齿不清

Mapping 为什么(2,3)映射到一个点的y值,而不是分别映射到该点的x和y值?公共口齿不清,mapping,common-lisp,Mapping,Common Lisp,我一直在为CommonLisp开发JarvisMarch实现。jarvis-march算法获取一组点并返回该点云的凸包。我将每个点表示为如下结构: (defstruct point x y) 然后我继续定义了一个测试集,但是,由于初始化结构的符号相当长(makepoint:x0:y1),我决定创建一个函数,它会自动为我实现这一点: (defun make-points (list) (map 'list (lambda (e) (make-point :x (first

我一直在为CommonLisp开发JarvisMarch实现。jarvis-march算法获取一组点并返回该点云的凸包。我将每个点表示为如下结构:

(defstruct point x y)
然后我继续定义了一个测试集,但是,由于初始化结构的符号相当长
(makepoint:x0:y1)
,我决定创建一个函数,它会自动为我实现这一点:

(defun make-points (list)
  (map 
    'list
    (lambda (e) (make-point :x (first e) :y (second e)))
    list))
不幸的是,它不起作用

(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
它将完整的列表(23)绑定到所有事物的y值,而不为x值赋值。它为什么会这样做,我如何修复它

提前感谢您,我对lisp还比较陌生(您可能已经从这个问题中猜到了),如果有人能帮助我,我将不胜感激。如果有人知道任何捷径或对我的工作方法有任何好的论点,那也很好,尽管最好在评论中告诉我,因为他们不会直接回答问题

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
追踪它:

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)))
更改输入。名单已经被引用了。不需要引用两次

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

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

CL-USER 9 > 
追踪它:

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)))
更改输入。名单已经被引用了。不需要引用两次

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

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

CL-USER 9 > 
一句话就足够了:
(指出点((23))
。或者更好的是,
(指出要点(列表(列表2-3))
。宏允许一些灵活性。如果您发现命名参数在您的案例中太重,您可以定义一个BOA构造函数
(defstruct(point(:constructor make point(xy)))xy)
,然后您可以调用
(make point 23)
(apply#“make-point”(23))
。一个结构也可以有几个构造函数。一个引号就足够了:
(makepoints'((23))
。或者更好的是,
(指出要点(列表(列表2-3))
。宏允许一些灵活性。如果您发现命名参数在您的案例中太重,您可以定义一个BOA构造函数
(defstruct(point(:constructor make point(xy)))xy)
,然后您可以调用
(make point 23)
(apply#“make-point”(23))
。对于单个结构,还可以有多个构造函数。