2016-02-28 54 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'只接受兩個參數;我更新了我的答案。 –