2016-02-28 60 views
3

使用方案,如语言额外的括号,我将删除方案

(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)))))) 

回答

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))) 

或者更简单,使用quasiquoting and splicing

(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))) 
+0

不错!这简单得多。 '(lambda)之后,唯一需要解决的问题是在第一个解决方案中添加额外的附加内容。 – User9193

+0

呵呵,我不知道在MIT Scheme里'append'只接受两个参数;我更新了我的答案。 –