删除Scheme中的额外括号

时间:2016-02-28 02:44:14

标签: scheme mit-scheme

使用类似Scheme的语言,我正在转换

(quote (lambda (a b) (* a b) (+ a b))))

为:

(quote (lambda (a) (lambda (b) (+ a b) (* a b))))

但是对于我当前的实现,我在表达式(+ a b)(* a b)周围得到了一对额外的括号:

(lambda (a) (lambda (b) ((+ a b) (* a b))))

我花了很多时间来解决这个问题,但无法解决这个问题。我觉得修复应该是微不足道的。

这是我目前的代码:

(define (conv lyst)

  (define (helper args)
    (cond
      ((null? args) (append (cddr lyst) args))
      (else (cons (car lyst) 
                  (cons (list (car args)) 
                        (list (helper (cdr args))))))))

  (cond
    ((eq? 1 (length (car (cdr lyst)))) lyst)
    (else (helper (car (cdr lyst))))))

1 个答案:

答案 0 :(得分:2)

我认为您的实施可以简化。这应该有效:

(define (conv lyst)  
  (define (helper args)
    (if (null? (cdr args))
        (cons 'lambda
              (append (list (list (car args)))
                      (cddr lyst)))
        (list  'lambda
               (list (car args))
               (helper (cdr args)))))
  (helper (cadr lyst)))

甚至更简单,使用String.prototype.indexOf()

(define (conv lyst)  
  (define (helper args)
    (if (null? (cdr args))
        `(lambda (,(car args)) ,@(cddr lyst))
        `(lambda (,(car args)) ,(helper (cdr args)))))
  (helper (cadr lyst)))

无论哪种方式,它都按预期工作:

(conv '(lambda (a b) (* a b) (+ a b)))
=> '(lambda (a) (lambda (b) (* a b) (+ a b)))