Почему (2, 3) отображается на значение y точки вместо отображения 2 и 3 соответственно на значения x и y этой точки?Common Lisp - PullRequest
0 голосов
/ 24 сентября 2018

Я работал над реализацией марша Джарвиса для обычного языка.Алгоритм марша Джарвиса берет набор точек и возвращает выпуклую оболочку этого облака точек.Я представляю каждую точку в виде структуры, подобной этой:

(defstruct point x y)

Затем я определил набор тестов, но, поскольку нотация для инициализации структуры довольно длинная (make-point :x 0 :y 1), я решилсоздайте функцию, которая автоматически сделала это для меня:

(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

Связывает полный список (2 3) со значением yвсе вещи, и это ничего не присваивает значение х.Почему это происходит и как я могу это исправить.

Заранее спасибо, я довольно новичок в lisp (как вы могли догадаться по этому вопросу), и я был бы очень признателен, если кто-томожет помочь мнеЕсли кто-то знает какие-либо ярлыки или имеет какие-либо веские аргументы против моего метода работы, это также было бы неплохо, хотя, возможно, было бы лучше сообщить мне их в комментариях, поскольку они не будут непосредственно отвечать на вопрос.

1 Ответ

0 голосов
/ 24 сентября 2018
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 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)))

Изменение ввода.Список уже цитируется.Не нужно указывать это дважды.

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

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

CL-USER 9 > 
...