scheme函数中的右括号位置不正确

scheme函数中的右括号位置不正确,scheme,racket,curly-braces,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) ())) 问题是,我

我有以下计划功能:

(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)个语句之后

我如何才能让它正常工作

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

我还没有尝试过,但我认为这会奏效:

(define (get-ivars ivars num)
    (if (null? ivars)
    '()
    (list (list (car ivars) `(nth args ,num))
          (get-ivars (cdr ivars) (1+ num)))))
你的
else
子句中的第二个
(list…
)就是把你搞得一团糟的原因。它将每个连续调用嵌套得越来越深。递归自然会创建列表;你不需要再包装它

尝试:

关于
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
是很有帮助的;然后可以直观地检查结果以确保其语法正确。

有点不相关,但是如果可以将
(define get ivars(λ(ivars num)…)
折叠成
(define(get ivars ivars num)…)
,因为这更容易阅读。另外,这里不需要
cond
——如果
也可以,那么
也可以。等等,你怎么可能返回
(x(n个args1))(y(n个args2))()
?这将返回多个值!你是不是想返回
((x(n个args1))(y(n个args2))
。我的错!我相信这里的
cons
把事情搞砸了(看看我的答案)--他确实希望
nil
在结尾保持不变,他不希望事情附加在一起。但我也可能错了。。。我也没有测试过。好吧,这返回了我想要的,但也许我不确定我想要什么。我将值传递给a(let…),但是let在:(x(n参数1))中抛出了“错误语法(不是标识符)”。你提供的函数返回:((x(n个参数1))(y(n个参数2))@Mehrdad:哦,我明白了。你说得很对。我还没有注册过它——想要保留
”()
似乎很奇怪。我刚刚测试了我们的两个函数,它们都工作了,唯一的区别是最后的
”()
。我想指出,如果我把预期的输出:
(x(n个args 1))(y(n个args 2))
,而不是调用
获取ivars
,代码工作正常。这可能会转向另一个问题。我假设您在某个地方定义了
args
?编辑:哦,是的,你说的。
(define ClassName
  (lambda (args)
    (let ((iVar1 (nth args 1))
          (iVar2 (nth args 2))
          (iVar3 (nth args 3)))
      ;; method-getting code
     )))