LISP:计算子字符串以检查出现情况

LISP:计算子字符串以检查出现情况,lisp,Lisp,好的,我有计算子字符串的代码,但一次只需要子字符串的输入,我如何让它接受更多的输入 也就是说,输入如下: (计数子“abcde”“a”“d”“e”“c”) 而不仅仅是: (count sub“abcd”“a”)我将使用它,以便一元函数具有不同的名称: (defun count-sub (str pat) (loop with z = 0 with s = 0 while s do (when (setf s (search pat str :start6 s))

好的,我有计算子字符串的代码,但一次只需要子字符串的输入,我如何让它接受更多的输入

也就是说,输入如下:

(计数子“abcde”“a”“d”“e”“c”)

而不仅仅是:
(count sub“abcd”“a”)

我将使用它,以便一元函数具有不同的名称:

(defun count-sub (str pat)
 (loop with z = 0 with s = 0 while s do
       (when (setf s (search pat str :start6 s))
         (incf z) (incf s (length pat)))
       finally (return z))))
那么,N元API函数只是一个reduce作业:

(defun count-sub-1 (str pat)
 (loop with z = 0 with s = 0 while s do
       (when (setf s (search pat str :start2 s)) ;; :start6 typo fixed
         (incf z) (incf s (length pat)))
       finally (return z))))
一些测试:

(defun count-sub (str &rest patterns)
  (reduce #'+ patterns :key (lambda (item) (count-sub-1 str item))))
但是,您的逻辑中有一个bug。如果模式是空字符串,则会得到一个无限循环,因为
(incf s(length pat))
不会更改
s
的值:

(count-sub "aabc") -> 0
(count-sub "aabc" "a") -> 2
(count-sub "aabc" "a" "a") -> 4
(count-sub "aabc" "b") -> 1
(count-sub "aabc" "a" "b") -> 3
在零长度匹配的情况下,始终前进至少一个字符。在这种情况下,空字符串将在目标字符串中匹配多次;如果不希望出现这种情况(您希望空模式导致零),则必须对其进行检查:

(incf s (min (length pat) 1))
那么
(最小(长度pat)1)
补偿是不必要的。

不是
(计数子“abcde”a“b”)
等于
(+(计数子“abcde”a”)(计数子“abcde”b”)
(incf s (min (length pat) 1))
(if (plusp (length pat))
  (loop ...)
  0)