Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除Scheme中的额外括号_Scheme_Mit Scheme - Fatal编程技术网

删除Scheme中的额外括号

删除Scheme中的额外括号,scheme,mit-scheme,Scheme,Mit Scheme,使用类似Scheme的语言,我正在转换 (quote (lambda (a b) (* a b) (+ a b)))) 致: 但是在我当前的实现中,我在表达式(+ab)和(*ab)周围得到了一对额外的括号: 我已经花了很多时间试图解决这个问题,但无法解决它。我觉得修复应该是微不足道的 这是我目前的代码: (define (conv lyst) (define (helper args) (cond ((null? args) (append (cddr lyst) a

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

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

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

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

这是我目前的代码:

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

我认为你的实施可以简化。这应该起作用:

(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)))
或者更简单,使用:

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

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

美好的这要简单得多。第一个解决方案唯一需要解决的问题是在“(lambda)之后添加一个额外的append。哦,我不知道在MIT Scheme
append
中只接受两个参数;我更新了我的答案。
(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)))
(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)))