2012-03-31 4 views
0

Я пытаюсь протестировать некоторый код из учебника «Преподавание недетерминированных и универсальных автоматов с использованием схемы». Это схема, я настроил DrRacket как R5RS.Схема R5RS - Неопределенный идентификатор

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

ссылки на неопределенный идентификатор: только для чтения-лента

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

(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

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

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

+0

Оставляя эту часть: процедура meval: ожидает 2 аргумента, данный 1. запятая, однако, странно. Я думал, что это неправильно, но в учебнике есть комментарии «Запомните запятую!». – ercliou

+0

. Запятая («оператор недозвона») должна идти с оператором квазиквадрата (обратного хода). – erjiang

+0

в r5rs: (eval 'something (environment-environment)) будет оценивать «что-то с средой верхнего уровня» – FooBee

 Смежные вопросы

  • Нет связанных вопросов^_^