Common Lisp возвращает ассоциации из alist как новый список

У меня есть список помощников следующим образом:

(defparameter *experts2*
  `(
    ;; direction
    (:direction . ( (nn-direction-expert (process-signal) :number-of-neighbors 10)
                    (fn-direction-expert (process-signal) :number-of-neighbors 10) ))



    ;; evaluation
    (:evaluation . ( 

                    ;(avoid-line-crossing-evaluation-expert (process-signal))
                    (nn-single-evaluation-expert (candidate-point))
                    (fn-single-evaluation-expert (candidate-point))
                    ;(nn-all-evaluation-expert (ranking))
                    ))

    ;; coordination
    (:coordination . (
                      ;(ranking-process (candidate-point))
                      (action-process (candidate-point ranking))))))

Я ищу способ извлечь значения из списка ключей => значений и поместить их в новый список, например

(defparameter *experts*
  `(
    ;; direction
    (nn-direction-expert (process-signal) :number-of-neighbors 10)
    (fn-direction-expert (process-signal) :number-of-neighbors 10)

    ;eher als evaluationsexperte
    ;(avoid-line-crossing-evaluation-expert (process-signal) )

    ;; evaluation
    (nn-single-evaluation-expert (candidate-point))
    (fn-single-evaluation-expert (candidate-point))
    ;(nn-all-evaluation-expert (ranking))

    ;; coordination
    ;(ranking-process (candidate-point))
    (action-process (candidate-point ranking))
    ))

Какие-либо предложения? Спасибо за вашу помощь.

С Уважением


person Christopher van Damn    schedule 18.01.2013    source источник


Ответы (2)


Кажется, это дает ответ, который вы хотите, но он не кажется очень красивым:

(mapcan #'copy-list (mapcar #'cdr *experts2*))
person Samuel Edwin Ward    schedule 18.01.2013
comment
Это помогло. Большое спасибо! - person Christopher van Damn; 19.01.2013

Ответ Сэмюэля Эдвина Уорда работает, но вот еще один (теперь отредактированный, чтобы действительно делать то, что вам нужно). Итак, вы хотите для каждого элемента *experts2* взять его cdr, а затем взять значения из возвращаемых списков и объединить их в один список:

(apply #'append (mapcan #'cdr *experts2*))
person zck    schedule 19.01.2013
comment
Это работает, с первого раза. Я даже попробовал это сам на пути к моему ответу. Но, возможно, коварство здесь в том, что он изменяет *experts2*. Это может противоречить запросу на новый список. Это может быть лучшим методом для использования в некоторых обстоятельствах, но определенно стоит упомянуть о его недостатках. - person Samuel Edwin Ward; 19.01.2013
comment
Ах, черт. Я забыл, что mapcan деструктивен. Я подумал о другом способе, который, как мне кажется, более прост, чем ваш ответ, но не обязательно лучше. - person zck; 21.01.2013