在 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 却看不到。