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