循环穿过字符串

时间:2012-02-13 04:21:20

标签: lisp common-lisp

我似乎被困在尝试循环遍历字符串以查找不在另一个字符串中的字符。该程序的目标是循环第一个字符串并记录不在另一个字符串中的字符。在完成所有检查后,将打印出不在另一个字符串中的字符。它们可能不会重复,因此我尝试使用三个循环。

我正在尝试调试下面的代码,因为我必须最终检查两个字符串,并且我想手动完成这方面的知识。

CG-USER(258): (defun stringprod (string1 string2) 
(let ((newString nil))
(let ((letterSearchOn nil))
(loop for i from 0 below (length string1)
    always
    (setf (letterSearchOn (char string1 i))           
         (loop for j from 0 below (length string2)            
             (for ch =  (char string2 j)
             (/when (find ch letterSearchOn :test #'equal)
             (append newString ch)))))))))
STRINGPROD
CG-USER(260): (stringprod "abc" "abc")
Error: (FOR CH = (CHAR STRING2 J)
    (/WHEN (FIND CH LETTERSEARCHON :TEST #'EQUAL)
     (APPEND NEWSTRING CH))) found where LOOP keyword expected.
Current LOOP context: FOR J FROM 0 BELOW (LENGTH STRING2)
   (FOR CH = (CHAR STRING2 J)
    (/WHEN (FIND CH LETTERSEARCHON :TEST #'EQUAL) (APPEND NEWSTRING CH))).
[condition type: PROGRAM-ERROR]
CG-USER(261): 

2 个答案:

答案 0 :(得分:3)

这样的事情怎么样?

(defun remove-unsafe (str unsafe)
  (remove-duplicates
   (remove-if #'(lambda (c) (find c unsafe)) str)))

答案 1 :(得分:3)

您需要检查LOOP的语法:http://www.lispworks.com/documentation/HyperSpec/Body/m_loop.htm

(loop for i from start1
      for j from start2
      do ...)

您的代码添加了括号,缺少do个字词和奇怪的字符,例如/

如果你的问题是家庭作业,你应该这样标记。如果没有,您可以使用SET-DIFFERENCE

(set-difference (coerce "abc" 'list) (coerce "bcd" 'list))
-> (#\a)