rho*_*ron 5 lisp clisp common-lisp
我想要做:
(mapcar #'assoc '(a s) '((a . b) (c . d) (s . f)))
Run Code Online (Sandbox Code Playgroud)
并让它回来
((A . B) (S . F))
Run Code Online (Sandbox Code Playgroud)
考虑到(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
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?
当与两个列表一起使用时,mapcar将函数成对应用于列表(并且使用三个列表将它们应用于三个列表等).所以
(mapcar #'assoc '(a s) '((a . b) (c . d) (s . f)))
Run Code Online (Sandbox Code Playgroud)
是相同的
( (assoc 'a (a . b)) (assoc 's (c . d)) )
Run Code Online (Sandbox Code Playgroud)
(当与不同长度的列表一起使用时,mapcar使用最小列表的大小).为了得到你想要的东西,你应该这样做:
(mapcar (lambda (x) (assoc x '((a . b) (c . d) (s . f)))) '(a s))
Run Code Online (Sandbox Code Playgroud)
我们需要另一个列表级别.第二个参数应该是一个关联列表列表.
CL-USER > (mapcar #'assoc '(a s) '(((a . b) (c . d) (s . f))))
((A . B))
Run Code Online (Sandbox Code Playgroud)
但第二个论点只有一个元素.现在我们可以使用一个技巧并使其成为循环列表:
CL-USER > (mapcar #'assoc '(a s) '#1=(((A . B) (C . D) (S . F)) . #1#))
((A . B) (S . F))
Run Code Online (Sandbox Code Playgroud)
如果我们为第二个参数构造一个循环列表,那么它可以工作.
作为一个功能:
(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))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
596 次 |
| 最近记录: |