5

私はやりたい:

(mapcar #'assoc '(a s) '((a . b) (c . d) (s . f)))

そして返してもらう

((A . B) (S . F))

(assoc 'a '((a . b) (c . d) (s . f)))返品(A . B)(assoc 's '((a . b) (c . d) (s . f)))返品を考えると、これはかなり合理的(S . F)です。しかし、残念ながらそれは機能しません:

*** - ASSOC: A is not a list
The following restarts are available:
ABORT          :R1      Abort main loop

何かご意見は?

4

2 に答える 2

7

2 つのリストで使用するとmapcar、関数がリストにペアごとに適用されます (また、リストが 3 つある場合は、トリプルごとに適用されます)。そう

(mapcar #'assoc '(a s) '((a . b) (c . d) (s . f)))

と同じです

( (assoc 'a (a . b)) (assoc 's (c . d)) )

(異なる長さのリストでmapcar使用する場合は、最小のリストのサイズを使用します)。必要なものを取得するには、次のことを行う必要があります。

(mapcar (lambda (x) (assoc x '((a . b) (c . d) (s . f)))) '(a s))
于 2011-01-29T23:46:21.850 に答える
5

別のリスト レベルが必要です。2 番目の引数は、連想リストのリストでなければなりません。

CL-USER >  (mapcar #'assoc '(a s) '(((a . b) (c . d) (s . f))))

((A . B))

しかし、2 番目の引数は 1 要素の長さしかありません。これで、トリックを使用して循環リストにすることができます。

CL-USER > (mapcar #'assoc '(a s) '#1=(((A . B) (C . D) (S . F)) . #1#))

((A . B) (S . F))

2 番目の引数に循環リストを作成すると、機能します。

関数として:

(defun circular (list)
  (if (null list)
      list
    (setf (cdr (last list)) list)))

CL-USER > (mapcar #'assoc '(a s) (circular '(((a . b) (c . d) (s . f)))))

((A . B) (S . F))
于 2011-01-30T02:42:34.290 に答える