Схема R5RS - неопределенный идентификатор - PullRequest
0 голосов
/ 01 апреля 2012

Я пытаюсь протестировать код из учебника "Обучение недетерминированным и универсальным автоматам с использованием схемы".Это схема, я настроил DrRacket как R5RS.

Я скопировал определенную часть кода, но он все еще жалуется

ссылка на неопределенный идентификатор: read-only-tape

Вот соответствующий код.

(define tape
  (lambda()
    (let((blank '$))
      (let ((left-part(list blank))
            (right-part(list blank)))
        (lambda message
          (case(car message)
            ((init!)
             (set! left-part(reverse(caadr message)))
             (set! right-part(cadadr message)))
            ((write!)
             (if(equal? right-part(list blank))
                (set! right-part (cons(cadr message) right-part))
                (set! right-part (cons(cadr message)(cdr right-part)))))
            ((left!)
             (set! right-part (cons (car left-part) right-part))
             (if(not(equal? left-part (list blank)))
                (set! left-part(cdr left-part))))
            ((right!)
             (set! left-part (cons (car right-part) left-part))
             (if (not (equal? right-part (list blank)))
                 (set! right-part (cdr right-part))))
            ((show)
             (list (reverse left-part) right-part))
            ((read)
             (car right-part))
            (else (error 'rape "Message ~a cannot be evaluated" (car message)))))))))

(define read-only-tape
  (lambda()
    (let ((tape-obj (tape)))
      (lambda message
        (case(car message)
          ((reconfig!)(tape-obj 'right))
          ((left! right! write!)
           (error 'message "~a is prohibited for read-only-tapes" (car message)))
          (else(apply tape-obj message)))))))

Здесь используется лента только для чтения:

(define automaton
  (lambda(start)
        (eval
         '(letrec
           ((q0(lambda(tape)
                 (printf "~a~n~a~n" (contents tape) 'q0)
                 (case (at tape)
                   ((a)(reconfig! tape)(q2 tape))
                   ((b)(reconfig! tape)(q1 tape))
                   (else #f))))
            (q1(lambda(tape)
                 (printf "~a~n~a~n" (contents tape) 'q1)
                 (case (at tape)
                   ((a)(reconfig! tape)(q5 tape))
                   ((b)(reconfig! tape)(q5 tape))
                   (($) #t)
                   (else #f))))
            (q2(lambda(tape)
                 (printf "~a~n~a~n" (contents tape) 'q2)
                 (case (at tape)
                   ((a)(reconfig! tape)(q3 tape))
                   ((b)(reconfig! tape)(q6 tape))
                   (else #f))))
            (q3(lambda(tape)
                 (printf "~a~n~a~n" (contents tape) 'q3)
                 (case (at tape)
                   ((a)(reconfig! tape)(q3 tape))
                   ((b)(reconfig! tape)(q4 tape))
                   (else #f))))
            (q4(lambda(tape)
                 (printf "~a~n~a~n" (contents tape) 'q4)
                 (case (at tape)
                   ((a)(reconfig! tape)(q5 tape))
                   ((b)(reconfig! tape)(q5 tape))
                   (($) #t)
                   (else #f))))
            (q5(lambda(tape)
                 (printf "~a~n~a~n" (contents tape) 'q5)
                 (case (at tape)
                   ((a)(reconfig! tape)(q5 tape))
                   ((b)(reconfig! tape)(q5 tape))
                   (else #f))))
            (q6(lambda(tape)
                 (printf "~a~n~a~n" (contents tape) 'q6)
                 (case (at tape)
                   ((a)(reconfig! tape)(q5 tape))
                   ((b)(reconfig! tape)(q6 tape))
                   (($) #t)
                   (else #f)))))
           (let((t (read-only-tape)))
             (lambda(input)
               (init! t input)
               (eval (list ,start t)
                     (null-environment 5)))))
         (null-environment 5))))

Я запускаю ее с

(run automaton 'q0 '(($)(a a b $)))

это пример учебника.Это игнорирует код определения?

1 Ответ

1 голос
/ 01 апреля 2012

В последних нескольких строках вашей программы для eval указывается среда null-environment, что исключает все, что вы определили ранее. Если вы просто не включите эту часть, eval будет использовать вашу текущую среду верхнего уровня, чего вы и хотите.

Кроме того, у вас есть синтаксическая ошибка на (list ,start t). Я думаю, вы могли иметь в виду (list start #t). Редактировать: Или запятая может иметь больше смысла, если у вас есть `(letrec в верхней части automaton, а не '(letrec.

...