在计划中替换列表元素

时间:2014-11-09 07:50:32

标签: scheme substitution

(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))))))

我得到的错误说这是错误的语法 - 任何线索,为什么会这样? 该函数应该包含一个列表,以及一个旧单词,如果它存在于列表中,则由新单词替换。

1 个答案:

答案 0 :(得分:0)

(if (list? (car s) false)

我希望你认为这意味着" if(car 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)))))))

但级联ifcond通常最好放在一个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)