我正在尝试做的是采用符号表达式,并将所有“叶子”替换为从左到右的列表中的数字,因此最左边的叶子应该替换为1,接下来的2等等。
这是我目前的代码(我正在使用R5RS,我试图不使用变异)
(define subst
(lambda (sexp num)
(cond ((null? sexp) '())
((not (pair? sexp)) (car num))
(else (cons (subst (car sexp) num)
(subst (cdr sexp) (cdr num)))))))
(define numbers (list 1 2 3 4 5 6 7 8 9 10))
输出:
(subst '(((a (d . e)) (b . c)) . (c . d)) numbers)
是:
'(((1 (2 . 3)) (2 . 3)) 2 . 3)
我想输出的是:
'(((1 (2 . 3)) (4 . 5)) 6 . 7)
当我遇到并替换一个叶子时,我想我需要在之前的subst递归中将num更改为cdr num,但我不知道如果不使用set我怎么做呢!
任何帮助都将不胜感激,谢谢。