Scheme 方案将列表列表中的a1替换为a2,a1和a2都是平面的

Scheme 方案将列表列表中的a1替换为a2,a1和a2都是平面的,scheme,racket,Scheme,Racket,更进一步,现在我想用原子a2替换SEXP中所有出现的原子a1 比如说, (replace (list (list 'a 'b) (list 1 3 )) 'a 'b) => (list (list 'b 'b) (list 1 3)) (replace (list (list 'a 'b) (list 1 3)) 1 2) => (list (list 'a 'b) (list 2 3)) ;; An ATOM is one of: ;; -- Symbol ;; -- Str

更进一步,现在我想用原子a2替换SEXP中所有出现的原子a1

比如说,

(replace (list (list 'a 'b) (list 1 3 )) 'a 'b) =>
(list (list 'b 'b) (list 1 3))

(replace (list (list 'a 'b) (list 1 3)) 1 2) =>
(list (list 'a 'b) (list 2 3))

;; An ATOM is one of: 
;; -- Symbol
;; -- String 
;; -- Number

(define-struct SEXP (ATOM SEXP))

;; An SEXP (S-expression) is one of: 
;; -- empty 
;; -- (cons ATOM SEXP)
;; -- (cons SEXP SEXP)
我的代码

;; replace: Atom atom sexp -> sexp

(define (replace a1 a2 sexp)
   (cond
      [(empty? sexp) empty]
      [(SEXP? sexp)
             (cons (replace a1 a2 (first sexp)) (replace a1 a2 (rest sexp)))]
      [else
         (cond 
             [(or (symbol=?  (first sexp) a1)
                  (string=?  (first sexp) a1)
                  (=  (first sexp)  a1))
              (cons a2 (replace a1 a2 (rest sexp)))]
             [else (cons (first sexp) (replace a1 a2 (rest sexp)))])])) 
对于确定它是否为a1的部分,我们是否需要调用一个辅助函数,我们可以用我现在的方式来实现

另外,由于sexp是一个列表列表,atom是平面的

 (symbol=?  (first sexp) a1) 
可能会导致问题,因为方案需要符号,但给出了符号(列表xxxxxx)


你如何解决这个问题呢

如果我们确保只有在确定
sexp
是原子时才执行相等比较,那么代码可以大大简化,请尝试以下操作:

(define (replace a1 a2 sexp)
  (cond
    [(empty? sexp) empty]
    [(SEXP? sexp) ; (define SEXP? pair?)
     (cons (replace a1 a2 (first sexp))
           (replace a1 a2 (rest  sexp)))]
    [(equal? sexp a1) a2]
    [else sexp]))
但是,对上一个问题的相同评论也适用:您必须保持一致,如果您使用的是
SEXP
结构,那么您必须坚持使用该结构的访问程序,而不是
first
rest
,请注意,当我们事先不知道元素的具体类型时,如何使用
equal?
进行比较。像这样测试,注意参数的正确顺序:

(replace 'a 'b (list (list 'a 'b) (list 1 3)))
=> '((b b) (1 3))

(replace 1 2 (list (list 'a 'b) (list 1 3)))
=> '((a b) (2 3))

你在用球拍吗?如果是,请在问题中添加相应的标签。谢谢!但是,测试没有给出预期的结果。@pnixsweet哪个测试?我的结果是什么,预期结果是什么?@pnixsweet还记得
(list(list'b'b)(list 13))
((b b)(13))
(替换'a'b(list'a'b)(list 13))=>(list(list'a'b)(list 13))@pnixsweet它对我有效。你是如何定义SEXP的?尝试将
SEXP?
替换为
pair?