方案功能中不正确放置的闭括号

时间:2011-03-08 06:03:44

标签: scheme racket curly-braces

我有以下方案功能:

(define get-ivars
  (λ (ivars num)
    (cond ((null? ivars) '())
          (else
           (append (list (car ivars) `(nth args ,num)) (list (get-ivars (cdr ivars) (+ num 1))))))))

在特定实例中返回以下内容:

(x (nth args 1) (y (nth args 2) ()))

问题是,我需要它返回:

((x (nth args1)) (y (nth args 2)) ())

- 最后的两个右括号应该在(第n个陈述之后)。

我如何才能让它正常工作?

get-ivars来电者:

(define gen-classes
  (λ (classes)
    (cond ((null? classes) '())
          (else
           (let* ((class (car classes)))
             (eval
              `(define ,(cadr class)
                 (λ (args)
                   (let (
                          ,(get-ivars (cdr (cadddr class)) 1)
                          )
                     (eval
                      (let* ,(cdar (cddddr class))
                        (λ (method . args)
                          ,(get-methods (cdadr (cddddr class)))
     ))))))))))))

2 个答案:

答案 0 :(得分:1)

你的(list ...)条款中的第二个else正在惹恼你。它越来越深入地嵌入每个连续的呼叫。递归自然会创建列表;你不需要再包裹它。

尝试:

(define get-ivars
  (λ (ivars num)
    (if (null? ivars) '()
      (cons (list (car ivars) `(nth args ,num)) 
            (get-ivars (cdr ivars) (+ num 1))))))

关于get-ivars来电者代码,围绕未引用的get-ivars调用的括号是您在评论中提到的麻烦。有了它们,这段代码:

`(define ClassName
   (lambda (args)
     (let (,(get-ivars '(iVar1 iVar2 iVar3) 1))
       ;; your method-getting code
       )))

给你这个:

(define ClassName
  (lambda (args)
    (let (((iVar1 (nth args 1))
           (iVar2 (nth args 2))
           (iVar3 (nth args 3))))
      ;; method-getting code
     )))

正如您所看到的,在let中的赋值周围为您提供了一组额外的括号。

所以你想这样做:

`(define ClassName
   (lambda (args)
     (let ,(get-ivars '(iVar1 iVar2 iVar3) 1)
        ;; your method-getting code
      )))

get-ivars正在返回一个列表列表,这正是你想要的let中的赋值,所以你不需要包装或(如我之前所说)拼接它。只需单独使用unquote,结果就是:

(define ClassName
  (lambda (args)
    (let ((iVar1 (nth args 1))
          (iVar2 (nth args 2))
          (iVar3 (nth args 3)))
      ;; method-getting code
     )))

哪个应该可以做到。

顺便说一句,我发现当我玩这个时,离开eval很有帮助;然后,可以在视觉上检查结果,以确保其语法正常。

答案 1 :(得分:0)

我没试过这个,但我认为这样可行:

(define (get-ivars ivars num)
    (if (null? ivars)
    '()
    (list (list (car ivars) `(nth args ,num))
          (get-ivars (cdr ivars) (1+ num)))))