Wescheme中的方案代码cond错误

时间:2012-06-10 12:21:22

标签: scheme racket wescheme

虽然以下代码在DrRacket环境中运行良好,但它在WeScheme中生成以下错误:

Inside a cond branch, I expect to see a question and an answer, but I see more than two things here.
at: line 15, column 4, in <definitions>

我该如何解决这个问题?实际代码位于http://www.wescheme.org/view?publicId=gutsy-buddy-woken-smoke-wrest

(define (insert l n e)
  (if (= 0 n)
      (cons e l)
      (cons (car l) 
          (insert (cdr l) (- n 1) e))))

(define (seq start end)
  (if (= start end)
      (list end)
      (cons start (seq (+ start 1) end))))

(define (permute l) 
  (cond 
    [(null? l) '(())]
    [else (define (silly1 p)
            (define (silly2 n) (insert p n (car l)))
            (map silly2 (seq 0 (length p))))
            (apply append (map silly1 (permute (cdr l))))]))

2 个答案:

答案 0 :(得分:4)

另一种选择是重构代码,提取内部定义(这似乎是WeScheme的问题)并传递缺少的参数,如下所示:

(define (insert l n e)
  (if (= 0 n)
      (cons e l)
      (cons (car l) 
            (insert (cdr l) (- n 1) e))))

(define (seq start end)
  (if (= start end)
      (list end)
      (cons start (seq (+ start 1) end))))

(define (permute l) 
  (cond 
    [(null? l) '(())]
    [else (apply append (map (lambda (p) (silly1 p l))
                             (permute (cdr l))))]))

(define (silly1 p l)
  (map (lambda (n) (silly2 n p l))
       (seq 0 (length p))))

(define (silly2 n p l)
  (insert p n (car l)))

以上几乎可以在我能想到的任何Scheme实现中使用,它是非常基本的标准Scheme代码。

答案 1 :(得分:3)

使用local进行教学语言的内部定义。

如果您在此处和邮件列表中发布您的问题, 记得写你这样做。如果有人在这里回答,那里 没有理由为什么邮件列表上的人应该采取 是时候回答那里了。

(define (insert l n e)
  (if (= 0 n)
      (cons e l)
      (cons (car l) 
            (insert (cdr l) (- n 1) e))))

(define (seq start end)
  (if (= start end)
      (list end)
      (cons start (seq (+ start 1) end))))

(define (permute2 l) 
  (cond 
    [(null? l) '(())]
    [else 
     (local [(define (silly1 p)
               (local [(define (silly2 n) (insert p n (car l)))]
                 (map silly2 (seq 0 (length p)))))]
       (apply append (map silly1 (permute2 (cdr l)))))]))

(permute2 '(3 2 1))