2016-11-25 7 views
2

Я пытаюсь использовать элемент? чтобы определить наличие определенной строки слов во входе пользователя.Racket Scheme - участник? function conundrum

Член? функция использование:

(define (member? item seq) 
    (sequence-ormap (lambda (x) 
        (equal? item x)) 
        seq)) 

Однако структура моей программы требует от меня сделать следующее сравнение: (? член «(имена)» (имена этих подвала))

примера своей продукции ниже:

> (car (car *strong-cues*)) 
'((the names) (their names)) 
> (car (car (car *strong-cues*))) 
'(the names) 
> (member? (car (car (car *strong-cues*))) '(the names of the basemen)) 
#f 

«имена» явно на входе пользователя (который в данном случае является «именами подвала») Тем не менее, вопрос, который я вижу, что эТО есть t имеет место:

Является ли (имена) в 'или' именах или 'или' или 'подвале?

Есть ли способ сделать это сравнение правильно, так что поиск «имен» вернет true, если «имена» были строкой внутри входа пользователя?

ответ

3

Это действительно не member, так как вы ищете подсписок в списке. из-за этого вы не можете использовать ormap, поскольку каждая итерация будет иметь только один элемент, в то время как вы ожидаете сравнить несколько. Я предлагаю вам сделать prefix?:

(define (prefix? what lst) 
    ; implementation left as exercise 
    <???>) 

(prefix? '(b c) '(a b c d)) ; ==> #f 
(prefix? '(b c) '(b c d)) ; ==> #t 

Это довольно простой рекурсивной вещь, где вы сравниваете элемент к элементу, пока список поиска не пуст. Если либо каждый тест элемента является ложным, либо стог сена пуст, он неверен. Тогда вы можете легко сделать find-sublist с ним:

(define (find-sublist sub lst) 
    (cond ((null? lst) #f) 
     ((prefix? sub lst) lst) 
     (else (find-sublist sub (cdr lst)))))) 

(find-sublist '(c d) '(a b c d e f)) ; ==> (c d e f) 

Здесь я возвращаю список, который имеет префикс, как делает член, но это можно легко изменить все, что вы хотели бы это сделать .. индекс, #t, и т.д.

+0

Ваши объяснения кратки и информативны. Большое спасибо!! –

 Смежные вопросы

  • Нет связанных вопросов^_^