2014-11-09 4 views
0
(define (substitute s old new) 
(if (null? s) 
    '() 
(if (list? (car s) false) 
    (cond ((eq? (car s) old) 
      (cons new (substitute (cdr s) old new))) 
      (else 
      (cons (car s) (substitute (cdr s) old new))))) 
(if (list? (car s) 
    (cons (substitute (car s) old new) (substitute (cdr s) old new)))))) 

Ошибка, которую я получаю, говорит о том, что это плохой синтаксис - любая подсказка о том, почему это может быть? Функция должна принимать в списке, а также старое слово, которое, если оно существует в списке, заменяется новым словом.Замена элементов списка в схеме

ответ

0
(if (list? (car s) false) 

Я ожидаю, что вы думаете, это означает, что «если (автомобиль s) не список», но это на самом деле недопустимо, так как вы передаете 2 параметра в list?, который ожидает только один. Посмотрите правильный синтаксис для conditionals и особенно синтаксис для if.

Кроме того, в вашем коде есть несколько скобок, и абсолютно необходимо, чтобы вы правильно отпечатали свой код для своего понимания.

Вот ваш код, исправлено:

(define (substitute s old new) 
    (if (null? s) 
     '() 
     (if (list? (car s)) 
      ; true 
      (cons (substitute (car s) old new) (substitute (cdr s) old new)) 
      ; false 
      (cond ((eq? (car s) old) 
       (cons new (substitute (cdr s) old new))) 
       (else 
       (cons (car s) (substitute (cdr s) old new))))))) 

но каскадные if с и cond сек, как правило, лучше всего поместить в один cond, такие как:

(define (substitute s old new) 
    (cond 
    ((null? s) 
    '()) 
    ((list? (car s)) 
    (cons (substitute (car s) old new) (substitute (cdr s) old new))) 
    ((eq? (car s) old) 
    (cons new (substitute (cdr s) old new))) 
    (else 
    (cons (car s) (substitute (cdr s) old new))))) 

Тестирование:

> (substitute '(a b (h e l l o) c) 'l 'x) 
'(a b (h e x x o) c) 
> (substitute '(a b c) 'b 'x) 
'(a x c) 
Смежные вопросы