我有以下方案功能:
(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)))
))))))))))))
答案 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)))))