Удаление символов из строки в Найквисте

Как я могу удалить определенный символ из строки в Nyquist (который очень похож на xlisp) и вернуть результат?

Я хочу подсчитать, сколько букв «А» в строке типа «ABBAAAABBBBAABAAAB». (Да, в строке только буквы «А» и «Б».)

Поскольку в Найквисте нет функции (счетчика), я попробовал что-то вроде

(length (remove #\B mystring))

or

(length (remove #\B mystring :test equal))

Но это не работает.

Забыв на мгновение количество символов, как я могу удалить «B» из строки?


person David Costa    schedule 27.01.2012    source источник


Ответы (2)


Всегда ли в строке будут только A и B? Если нет, вы можете сделать что-то вроде

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

Согласно Справочник XLISP для remove, Найквист remove не работает с strings, только с lists. Вам нужно преобразовать string в list, чтобы работать с ним таким образом, но coerce тоже нет. Это немного хакерски, но самый простой способ обойти это, как я вижу, - это транслировать string и read-char. Это создаст list из char, которыми вы затем сможете управлять с помощью remove.

(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=)
person Inaimathi    schedule 28.01.2012
comment
К сожалению, это не работает. (setf yourstring ABBAABABCCCCBBCCCCAAA) (print (remove #\A yourstring :test-not 'char=)) приводит к ошибке: неверный тип аргумента - ABBAABABCCCCBBCCCCAAA Функция: #‹Subr-REMOVE: #168bbe8› Аргументы: #\A ABBAABABCCCCBBCCCCAAA :TEST -НЕ СИМВОЛ= 1› - person David Costa; 28.01.2012
comment
@ Дэвид Коста, ты пробовал это с 'equal? - person Inaimathi; 28.01.2012
comment
Та же ошибка. Интерпретатор говорит, что mystring имеет неправильный тип. И на самом деле в примерах нет строк. - person David Costa; 28.01.2012
comment
@ Дэвид Коста - Хм. Хорошая точка зрения; Я протестировал это на Common Lisp (где, кстати, ваш оригинал работает отлично). Если ошибка относится к типу mystring, возможно, строки представлены иначе, чем стандартные последовательности в XLISP. Есть ли функция coerce или аналогичная, которую вы могли бы использовать для преобразования string в список char? - person Inaimathi; 28.01.2012
comment
Судя по всему, в ссылке нет функции принуждения. - person David Costa; 29.01.2012
comment
@ Дэвид Коста - Вау. Теперь, когда я действительно смотрю на это, это довольно урезанная реализация Лиспа; у вас даже нет подходящего CL Loop для работы. Попробуйте определение string->list, которое я только что опубликовал. (remove #\A (string->list yourstring) :test-not 'char=) должен работать (я не проверял его, так как у меня нет здесь интерпретатора Найквиста, поэтому может потребоваться его тонкая настройка). - person Inaimathi; 29.01.2012

Я вижу, что это старый вопрос, но, поскольку у него более 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"
person Steve Daulton    schedule 03.09.2019