Неправильно помещенные закрытые скобки в функции схемы - PullRequest
0 голосов
/ 08 марта 2011

У меня есть следующая схема функции:

(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 ]

1 голос
/ 08 марта 2011

Эта секунда (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, когда былиграть с этим;Затем можно визуально проверить результат, чтобы убедиться, что его синтаксис в порядке.

0 голосов
/ 08 марта 2011

Я не пробовал это, но я думаю, что это будет работать:

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