Lisp 从Nyquist中的字符串中删除字符

Lisp 从Nyquist中的字符串中删除字符,lisp,audacity,nyquist,Lisp,Audacity,Nyquist,如何从Nyquist(非常类似于xlisp)中的字符串中删除某个字符并返回结果 我想数一数像“abbaaabbbaaab”这样的字符串中有多少个“A”。(是的,字符串中只有“A”和“B”。) 因为Nyquist中没有(count)函数,所以我尝试了以下方法 (length (remove #\B mystring)) (remove #\A yourstring :test-not 'char=) 或 但它不起作用 暂时忘记字符计数,如何从字符串中删除“B”?字符串中是否总是只有as和Bs?

如何从Nyquist(非常类似于xlisp)中的字符串中删除某个字符并返回结果

我想数一数像“abbaaabbbaaab”这样的字符串中有多少个“A”。(是的,字符串中只有“A”和“B”。)

因为Nyquist中没有(count)函数,所以我尝试了以下方法

(length (remove #\B mystring))
(remove #\A yourstring :test-not 'char=)

但它不起作用


暂时忘记字符计数,如何从字符串中删除“B”?

字符串中是否总是只有
a
s和
B
s?如果没有,你可能想做一些类似的事情

(length (remove #\B mystring))
(remove #\A yourstring :test-not 'char=)
根据,Nyquist
remove
不处理
字符串
s,只处理
列表
s。您需要将
字符串
转换为
列表
,以便以这种方式对其进行操作,但也没有
强制
。这是一个简单的方法,但是我看到最简单的方法是流式传输
字符串
读取字符
它。这将生成一个
列表
,其中包含
字符
s,然后您可以使用
删除
对其进行操作

(defun string->list (a-string)
  (let ((collector nil)
        (stream (make-string-input-stream a-string)))
    (dotimes (c (length a-string) (reverse collector))
      (setf collector (cons (read-char stream) collector)))))
现在应该可以

(remove #\A (string->list yourstring) :test-not 'char=)

我知道这是一个老问题,但既然它有800多个视图,也许有一个简单的答案是值得的:

(defun remove-char (character sequence)
  (let ((out ""))
    (dotimes (i (length sequence) out)
      (setf ch (char sequence i))
      (unless (char= ch character)
        (setf out (format nil "~a~a" out ch))))))

(setf mystring "ABBAABABCCCCBBCCCCAAA")
(remove-char #\B mystring) ;returns "AAAACCCCCCCCAAA"

不幸的是,它不起作用。“(setf yourstring“abbababcccbbccaaa”)(print(remove#\A yourstring:test not'char=)”会导致“错误:错误的参数类型-“abbabababcccccaaa”函数:#参数:#\A“abbabababcccbbccaaa”:test-not char=1>”@David Costa-是否使用
'equal
尝试过相同的错误。解释器说mystring的类型不对。事实上,在这些例子中没有任何字符串。@David Costa-Hm。很好的观点;我已经在CommonLisp中测试过了(顺便说一句,你的原创作品很好)。如果错误与
mystring
的类型有关,则可能是字符串的表示方式与XLISP中的标准序列不同。是否有一个
强制
函数或类似的函数可用于将
字符串
转换为
字符
列表?显然,引用中没有强制函数。