Scheme 方案将列表列表中的a1替换为a2,a1和a2都是平面的
更进一步,现在我想用原子a2替换SEXP中所有出现的原子a1 比如说,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
(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?