Lisp中“apply”和“mapcar”之间的区别是什么?

时间:2011-05-05 23:19:25

标签: lisp common-lisp

(defun describe-paths (location edges) 
(apply #'append (mapcar #'describe-path (cdr (assoc location edges)))))

2 个答案:

答案 0 :(得分:11)

有什么相似之处?或者,这里潜伏着另一个问题吗?

(来自elisp的链接,因为这是我所知道的。引号只是摘录,链接包含可能与特定“Lisp”相关或不相关的示例。)

mapcar

  
    

mapcar是一个函数,它依次用第二个参数的每个元素调用它的第一个参数。第二个参数必须是序列。

  

apply (in Calling Functions)

  
    

使用参数应用调用函数,只需就像funcall但有一点不同:最后一个参数是一个对象列表,它们作为单独的参数传递给函数,而不是单个列表。我们说apply会传播这个列表,以便每个元素成为一个参数。

  

快乐的编码。

答案 1 :(得分:4)

describe-paths函数(来自Land of Lisp中的基于文本的冒险游戏!)生成对来自给定位置的路径的描述。 Lisp的土地中的页面74-77解释了示例中mapcarappend的角色。

(cdr (assoc location edges))提供了从该位置开始的所有路径的列表,例如living-room位置的路径:

((GARDEN WEST DOOR)
 (ATTIC UPSTAIRS LADDER))

mapcar为每个路径调用函数describe-path,将路径描述收集到列表中,其中每个子列表都是路径描述:

((THERE IS A DOOR GOING WEST FROM HERE.)
 (THERE IS A LADDER GOING UPSTAIRS FROM HERE.)) 

接下来,append函数将应用于路径描述列表,并将其连接到一个平面列表中:

(THERE IS A DOOR GOING WEST FROM HERE. THERE IS A 
  LADDER GOING UPSTAIRS FROM HERE.)