3

虽然以下代码在 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))))]))
4

2 回答 2

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

以上几乎适用于我能想到的任何方案实现,它是非常基本的标准方案代码。

于 2012-06-10T15:52:15.527 回答
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))
于 2012-06-10T12:59:45.027 回答