Эта секунда (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
, так что вы нене нужно оборачивать или (как у меня было раньше) сращивать.Просто используйте кавычки сами по себе, и в результате вы получите:
(define ClassName
(lambda (args)
(let ((iVar1 (nth args 1))
(iVar2 (nth args 2))
(iVar3 (nth args 3)))
;; method-getting code
)))
Что и должно сработать.
Кстати, я счел полезным отказаться от eval
, когда былиграть с этим;Затем можно визуально проверить результат, чтобы убедиться, что его синтаксис в порядке.