2012-02-13 125 views
-1

我似乎被卡住试图通过字符串循环找到不在其他字符串中的字符。程序的目标是循环一个字符串并记录不在另一个字符串中的字符。所有检查完成后,不在另一个字符串中的字符将被打印出来。他们可能不会重复,因此我尝试使用三个循环。循环虽然字符串

我想调试下面的代码,因为我必须最终检查两个字符串对彼此,我想手动做这个知道如何。

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): 

回答

3

这样的事情呢?

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

这是一个很棒的解决方案,虽然我希望能够调试代码中列出的错误消息。 – Tequila 2012-02-13 05:41:05

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) 
+0

谢谢 - 将标签更新为家庭作业。我正在尝试使用非运算符(如果可能),但我找不到一个运算符。根据http://cl-cookbook.sourceforge.net/loop.html,我应该能够按照我的方式添加for循环,但似乎不起作用。我需要一些帮助才能使语法正确。 – Tequila 2012-02-13 13:02:27