Базовая схема рекурсии - PullRequest
       13

Базовая схема рекурсии

0 голосов
/ 27 февраля 2011

У меня есть такой файл:

    declare
    a = aexpress 
    b = bexpress 
    begin 

Моя программа-схема устанавливает текущий порт ввода в этот файл, затем вызывает (declarations (read)) Что я возвращаюсь, это #f. или, скорее, консоль говорит: «Объект #f не применим».

Я перестал использовать скобки и не могу найти причину, по которой он должен возвращать логическое значение, но я уверен, что что-то упустил.

То, что я хочу, это ((a aexpress) (b bexpress))

(define declarations
  (lambda (token)
    (cond (((eq? token 'begin) '())
           (else (let* ((name token)
                        (eqsign (read))
                        (value (read)))
                   (cons (list name value) (declarations (read)))))))))

Вызывается:

    (define convert
      (lambda (filename)

         (begin
           (set-current-input-port! (open-input-file filename))
           (statement (read))
           )

        )
      )
 (define statement (lambda (token) (

                                   cond (
                                     ( (eq? token 'declare) (declarations (read)) )
                                        ;       ( (eq? token 'declare) (declare_statement)  )
                                        ;       ( (eq? token 'begin) (begin_statement) )
                                        ;       ( (eq? token 'for) (for_statement) )
                                        ;       ( (eq? token 'if) (if_statement)  )
                                        ;       ( (eq? token 'set) (set_statement) )
                                        ;       (else (expression_token))


                                   ))))

1 Ответ

5 голосов
/ 27 февраля 2011

Я исправил форматирование кода, которое показывает, в чем проблема: у вас слишком много слоев скобок вокруг (eq? token 'begin).Исправленная версия будет выглядеть так:

(define declarations
  (lambda (token)
    (cond ((eq? token 'begin) '())
          (else (let* ((name token)
                       (eqsign (read))
                       (value (read)))
                  (cons (list name value) (declarations (read))))))))
...