gpt4 book ai didi

functional-programming - 替换符号表达式中的符号

转载 作者:太空宇宙 更新时间:2023-11-03 19:02:18 25 4
gpt4 key购买 nike

我想替换成对中第一次出现的符号。例如:拿

(define n '((a . b) . (a . d)))

我定义了一个方法上下文来用'()替换X的第一个实例(最左边)替换 a 应该给我:

((() . b) a . d)

但是我被卡住了,因为我的方法替换了所有实例,我不确定如何为此添加检查。我的代码如下:

(define (context s sym)
(cond ((null? s) #f)
((atom? s)
(if (equal? s sym) '() s ))
(else (cons (context (car s) sym)
(context (cdr s) sym)))))

给出:((() . b) () . d)

有什么帮助吗?谢谢

最佳答案

最快的方法是使用一个标志来指示替换是否已经完成,大致如下:

(define (context sxp sym)
(define done #f)
(let loop ((sxp sxp))
(cond (done sxp)
((pair? sxp) (cons (loop (car sxp)) (loop (cdr sxp))))
((eq? sym sxp) (set! done #t) '())
(else sxp))))

使用 set! 不是很优雅,但替代方案是让过程返回 2 个值,而生成的 let-values 代码会更糟在可读性 IMO 方面。

另请注意,我没有使用 atom? 因为它没有在标准 Scheme 中定义;通常的做法是依次测试null?,然后测试pair?,并在else子句中处理atom case。

关于functional-programming - 替换符号表达式中的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27205618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com