Этот код вычисляется в t
список Emacs не список
(listp '(foo 0 . 0))
Эти код выдает ошибку: eval: Wrong type argument: listp, 0
(mapcar (lambda (x) x) '(foo 0 . 0))
(length '(foo 0 . 0))
Все три используют один и тот же «список», но mapcar
и length
ясно не думайте, что это список. Это связано с тем, что список заканчивается 0 . 0
, а не 0 0
, хотя я не знаю, почему это имеет значение для mapcar
, но не listp
.
Есть ли способ изменить выражение mapcar, чтобы принимать как обычные списки, такие как (foo 0 0)
, так и эти списки в стиле cons-style (foo 0 . 0)
? В самом деле приложение, мой вход имеет оба типа списков (например, ("a" (b 0 . 0) (c 0 . 0))
и лямбда-рекурсивная функция, которая вызывает mapcar
, если ее аргумент является списком.
(В случае, если предыдущий пункт не ясен, ответ «использовать (foo 0 0)
вместо» является неправильным.)
Я подозреваю, что ответ что-то вроде
(defun my-func (x)
(if (consp x)
(if (not-actually-a-list-p x)
(delistify (mapcar #'myfunc (listify x)))
(mapcar #'myfunc input))
; process the individual atoms
))
Однако, я не знаю, что not-actually-a-list-p
, listify
и delistify
ш быть.
Я очень хочется сказать «использовать (Foo 0 0) вместо», но вы, конечно, есть свой разум :-) – coredump
@coredump Мой входной является c-style-alist'. Это не под моим контролем. (Если бы это было под моим контролем, я бы просто изменил его, а не попытался найти его для проблем и исправить его.) –