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