LINUX.ORG.RU

cl-defmacro, rest и key

 


0

1

(cl-defmacro test (x &rest y &key z)
`(list ,x ,y ,@z))

(test «+» "-" «*»)

Ожидаю получить: + nil - *
Но получаю ошибку: cond: Keyword argument - not one of (:y)
Как поправить?



Последнее исправление: blue-coke (всего исправлений: 1)

(test «+» "-" «*»)
Ожидаю получить: + nil - *

Неправильно. Ты фактически определил нечто с двумя параметрами, которое можно (насколько мне известно) вызвать только как (test 1 :z 2). Просто внутри определения список '(:z 2) будет доступен как y. Смысла в таком определении, по-моему, немного.

anonymous
()
Ответ на: комментарий от anonymous
(cl-defun test (x &rest y &key z &allow-other-keys)
  (list x y z))

Ввожу:

(test 1 :z 2 3 4 5)
Получаю:
(1 (:z 2 3 4 5) 2)
А как получить это?
(1 (:z 2) 2 3 4 5)
или
(1 (:z 2) 3 4 5)

blue-coke
() автор топика
Ответ на: комментарий от blue-coke

Я не понимаю чего конкетно ты пытаешься сделать. И по какому принципу список из трех элементов должен превратиться в список из пяти или шести.

Не факт, кстати, что то, что ты удумал получится сделать штатными средствами. В худшем случае придется написать (&rest rest) и распарсить руками.

Алсо, твой пример в настоящем общелиспе не работает:

* (defun test (x &rest y &key z &allow-other-keys) (list x y z))

TEST
* (test 1 :z 2 3 4 5)

debugger invoked on a SB-INT:SIMPLE-PROGRAM-ERROR in thread
#<THREAD "main thread" RUNNING {100293E4F3}>:
  odd number of &KEY arguments

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.