Удаление / сравнение строкового значения со списком - схема - PullRequest
1 голос
/ 14 ноября 2010

Я пытаюсь удалить членов, которые существуют в строке, из списка, состоящего из этих членов.

Пример:

Строка: "ABC"

Список: ('A 'B 'C 'D)

Для этого: удалить первый элемент строки из списка

Чтобы удалить элемент из строки:

Я преобразую его в список, используя:

(car (string->list"ABC") 

Это дает мне список символов и первый элемент: #\A

Но я не понимаю, как я могу удалить его из списка, так как оба значения не сравниваются: символ и списокзначения.

Попробовал этот странный подход, который не сработал:

((eq? (make-string 1 (car (string->list"ABC"))) (car (list 'A 'B 'C 'D))))

Не работает, так как строковое значение не сравнивается с первым значением списка.

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

Ответы [ 2 ]

2 голосов
/ 14 ноября 2010

Ошибка, поскольку список не может иметь значения строковых элементов:

Это не правда. Список может иметь как строки, так и символы в качестве элементов, без проблем. Вы получаете сообщение об ошибке, потому что вы используете car в строке, а не в списке.

(car (list->string(list(car (string->list "ABC")))))

Хорошо, здесь вы звоните (string->list "ABC"), который дает вам список, содержащий символы A, B и C. Теперь вы вызываете car для этого и получаете символ A обратно. До здесь нет проблем.

Но затем вы вызываете list для этого символа, получая список, содержащий только символ A, и затем используете list-string, чтобы превратить это в строку "A". Это все еще совершенно законно. Но затем вы вызываете car для строки "A", и это ошибка, потому что вы вызываете car для строки, но car принимает только список (ну, фактически, любую пару) в качестве аргумента.

Поскольку вы пытаетесь сравнить A с этим первым элементом ('A 'B 'C 'D), то есть 'A, который является символом, вы, вероятно, хотите преобразовать строку "A" в символ 'A (или символ 'A в строку "A"). Для этого вы можете использовать функцию string->symbol вместо car.

Получив символ A, вы можете легко удалить его из списка с помощью функции filter:

(let ((a (string->symbol (list->string (list (car (string->list "ABC")))))))
  (filter (lambda (x) (not (eq? x a))) '(A B C)))
0 голосов
/ 14 ноября 2010

Примерно так:

(define lst '(#\a #\b #\c #\d))
(define str (string->list "abc"))

(define (reduce-list lst str)
  (cond
     [(empty? str) lst]
     [else (reduce-list (remove (first str) lst) (rest str))]
  )
)

(reduce-list lst str)

Результат:

(list #\d)
...