微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

稍微调整成员函数在 Common Lisp 中的作用的最优雅的方法是什么?

如何解决稍微调整成员函数在 Common Lisp 中的作用的最优雅的方法是什么?

成员函数对字符串的工作方式如下:

CL-USER> (member "a" '("a" "b" "c") :test #'equalp)
("a" "b" "c")
CL-USER> (member "a" '( "b" "c") :test #'equalp)
NIL

我想稍微改变它的行为。当元素不是列表的一部分时,我希望返回元素本身而不是nil。此外,如果该元素确实是列表的一部分,我想要nil

所以,例如:

CL-USER> (tweaked-member "a" '("a" "b" "c") :test #'equalp)
NIL
CL-USER> (tweaked-member "a" '( "b" "c") :test #'equalp)
"a"

因此,我采用了这种幼稚的方法

(defun so-question (str str-list)
  (if (member str str-list :test #'string=)
      nil
      str))

有没有更优雅的方法来做到这一点?

也许使用 member-if-not:key

解决方法

不知道这样是不是更优雅;您的“天真”解决方案可能更清晰,但您可以这样做:

(defun tweaked-member (needle haystack)
  (and (not (member needle haystack :test #'equalp)) needle))
CL-USER> (tweaked-member "a" '("a" "b" "c"))
NIL
CL-USER> (tweaked-member "a" '("b" "c"))
"a"

您可以使用 find 代替 member

(defun tweaked-member (needle haystack)
  (and (not (find needle haystack :test #'equalp)) needle))

直到现在我才注意到我的版本没有按照您的要求使用 :test 参数。但是:

(defun tweaked-member (needle haystack &rest args)
  (and (not (apply #'member needle haystack args)) needle))
CL-USER> (tweaked-member "a" '("a" "b" "c") :test #'equalp)
NIL
CL-USER> (tweaked-member "a" '("b" "c") :test #'equalp)
"a"
,
(defun tweaked-member (&rest args)
  (if (apply #'member args) nil (car args)))

它不是更优雅,但它需要 member 需要的所有关键字。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。