Lisp 循环遍历字符串

Lisp 循环遍历字符串,lisp,common-lisp,Lisp,Common Lisp,我似乎被困在尝试循环字符串以查找其他字符串中没有的字符。该程序的目标是循环遍历一个字符串,并记录不在另一个字符串中的字符。其他字符串中不包含的字符将在所有检查完成后打印出来。它们可能不会重复,因此我尝试使用三个循环 我正在尝试调试下面的代码,因为我最终必须检查这两个字符串是否相互匹配,并且我希望手动执行此操作,以获取相关技术 CG-USER(258): (defun stringprod (string1 string2) (let ((newString nil)) (let ((lette

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

我正在尝试调试下面的代码,因为我最终必须检查这两个字符串是否相互匹配,并且我希望手动执行此操作,以获取相关技术

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

像这样的怎么样

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

您需要检查循环的语法:

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

如果你的问题是家庭作业,你应该把它贴上这样的标签。如果没有,您可以使用
设置差异

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

这是一个很棒的解决方案,尽管我希望调试代码中列出的错误消息。谢谢——将标记更新为家庭作业。我正在尝试使用not运算符(如果可能),但找不到。据我所知,我应该能够像我那样添加for循环,但它似乎不起作用。我需要一些帮助来获得正确的语法。
(set-difference (coerce "abc" 'list) (coerce "bcd" 'list))
-> (#\a)