【问题标题】:Common Lisp idiom for filtering a list and applying a function to the unfiltered elements?用于过滤列表并将函数应用于未过滤元素的 Common Lisp 习惯用法?
【发布时间】:2016-04-14 21:45:07
【问题描述】:

Common Lisp 的成语是什么:

删除列表中不满足谓词和 for 的元素 那些满足谓词的应用函数。

这是 Common Lisp 的成语吗:

mapcar applied to remove-if

【问题讨论】:

  • 是的,它是 mapcar over remove-if

标签: lisp common-lisp idioms


【解决方案1】:

成语应该是MAPCAR 而不是REMOVE-IF-NOT,因为您希望保留与谓词匹配的元素。 -IF-NOT 函数根据标准已被弃用,但对于 Common Lisp 而言,弃用几乎没有意义1,因此我们很少看到有人将COMPLEMENTREMOVE-IF 一起使用.

但是大多数人会在这里使用LOOP

(lambda (elements test function)
  (loop
    for e in elements
    when (funcall test e)
      collect (funcall function e)))

MAPCAR 相对于REMOVE-IF-NOT 的一个可能问题是它会为临时列表分配内存,然后将其丢弃。你可以称之为过早优化,但如果我想使用高阶函数(例如,因为我想使用广义序列而不仅仅是列表),我会使用MAP-INTO

(lambda (elements test function)
  (let ((tmp (remove-if-not test elements)))
    (map-into tmp function tmp)))

1. "所有被标记为弃用的东西都可以被认为是未弃用的,因为不会有另一个标准。", R. Strandh (beach) .

【讨论】:

  • +1 提及被低估的map-into
猜你喜欢
  • 2016-12-13
  • 1970-01-01
  • 2016-04-10
  • 2014-11-13
  • 2021-03-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多