在 Scheme 中手动评估函数调用
Evaluating a function call manually in Scheme
(define remove-leftmost
(lambda (item ls)
(cond
((null? ls) '())
((equal? (car ls) item) (cdr ls))
(pair? (car ls))
(let ((rem-list (remove-leftmost item (car ls)))
(cons rem-list (cond
((equal? (car ls) rem-list)
(remove-leftmost item (cdr ls)))
(else (cdr ls))))))
(else (cons (car ls) (remove-leftmost item (cdr ls)))))))
现在计算(删除最左边的'b(a(b c)(c(b a)))):
(cons a (remove-leftmost 'b ((b c) (c (b a)))))
(cons a (cons (c) ((c (b a)))))
(cons a ((c)(c (b a))))
(a (c)(c (b a)))
评价有效吗?如果不行,怎么解决?
您确实需要识别您的代码。将代码粘贴到 DrRacket 并按 CTRL+i 后,很明显您的代码中有很多错误:
(define remove-leftmost
(lambda (item ls)
(cond
((null? ls) '())
((equal? (car ls) item) (cdr ls))
(pair? (car ls))
(let ((rem-list (remove-leftmost item (car ls)))
(cons rem-list (cond
((equal? (car ls) rem-list)
(remove-leftmost item (cdr ls)))
(else (cdr ls))))))
(else (cons (car ls) (remove-leftmost item (cdr ls)))))))
当不满足前两个条件时,您将值 pair?
作为谓词 expression.The 其余条件从未尝试过,因为 pair?
始终为真,因此 (car ls)
是您程序最可能的结果(方案没有功能)。
只是想猜一下,我认为代码可能应该是这样的:
(define remove-leftmost
(lambda (item ls)
(cond
((null? ls) '())
((equal? (car ls) item) (cdr ls))
((pair? (car ls))
(let ((rem-list (remove-leftmost item (car ls))))
(cons rem-list
(cond
((equal? (car ls) rem-list)
(remove-leftmost item (cdr ls)))
(else (cdr ls))))))
(else
(cons (car ls)
(remove-leftmost item (cdr ls)))))))
(remove-leftmost 'b '(a (b c) (c (b a))))
; ==> (a (c) (c (b a)))
我已经添加了一些换行符,并且 DrRacket 已经根据代码识别了它。请注意额外的括号,人类几乎看不到这些括号,但格式化此类代码的 IDE 却看不到。
(define remove-leftmost
(lambda (item ls)
(cond
((null? ls) '())
((equal? (car ls) item) (cdr ls))
(pair? (car ls))
(let ((rem-list (remove-leftmost item (car ls)))
(cons rem-list (cond
((equal? (car ls) rem-list)
(remove-leftmost item (cdr ls)))
(else (cdr ls))))))
(else (cons (car ls) (remove-leftmost item (cdr ls)))))))
现在计算(删除最左边的'b(a(b c)(c(b a)))):
(cons a (remove-leftmost 'b ((b c) (c (b a)))))
(cons a (cons (c) ((c (b a)))))
(cons a ((c)(c (b a))))
(a (c)(c (b a)))
评价有效吗?如果不行,怎么解决?
您确实需要识别您的代码。将代码粘贴到 DrRacket 并按 CTRL+i 后,很明显您的代码中有很多错误:
(define remove-leftmost
(lambda (item ls)
(cond
((null? ls) '())
((equal? (car ls) item) (cdr ls))
(pair? (car ls))
(let ((rem-list (remove-leftmost item (car ls)))
(cons rem-list (cond
((equal? (car ls) rem-list)
(remove-leftmost item (cdr ls)))
(else (cdr ls))))))
(else (cons (car ls) (remove-leftmost item (cdr ls)))))))
当不满足前两个条件时,您将值 pair?
作为谓词 expression.The 其余条件从未尝试过,因为 pair?
始终为真,因此 (car ls)
是您程序最可能的结果(方案没有功能)。
只是想猜一下,我认为代码可能应该是这样的:
(define remove-leftmost
(lambda (item ls)
(cond
((null? ls) '())
((equal? (car ls) item) (cdr ls))
((pair? (car ls))
(let ((rem-list (remove-leftmost item (car ls))))
(cons rem-list
(cond
((equal? (car ls) rem-list)
(remove-leftmost item (cdr ls)))
(else (cdr ls))))))
(else
(cons (car ls)
(remove-leftmost item (cdr ls)))))))
(remove-leftmost 'b '(a (b c) (c (b a))))
; ==> (a (c) (c (b a)))
我已经添加了一些换行符,并且 DrRacket 已经根据代码识别了它。请注意额外的括号,人类几乎看不到这些括号,但格式化此类代码的 IDE 却看不到。