在 Common Lisp 中稍微调整成员函数的功能的最优雅方法是什么?
What is the most elegant way to slightly tweak what the member function does in Common Lisp?
成员函数像这样处理字符串:
CL-USER> (member "a" '("a" "b" "c") :test #'equalp)
("a" "b" "c")
CL-USER> (member "a" '( "b" "c") :test #'equalp)
NIL
我想稍微改变一下它的行为。当元素是 not 列表的一部分时,我想将 元素本身 而不是 [=13] 作为 return =].此外,如果元素确实是列表的一部分,我想要 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
包含的所有关键字。
成员函数像这样处理字符串:
CL-USER> (member "a" '("a" "b" "c") :test #'equalp)
("a" "b" "c")
CL-USER> (member "a" '( "b" "c") :test #'equalp)
NIL
我想稍微改变一下它的行为。当元素是 not 列表的一部分时,我想将 元素本身 而不是 [=13] 作为 return =].此外,如果元素确实是列表的一部分,我想要 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
包含的所有关键字。