Я читаю стандарт схемы r5rs и обнаруживаю, что begin () на самом деле является синтаксисом библиотеки, что означает, что он может быть определен самой схемой, а стандарт дает реализацию в конце стандарта.
Я последовал за r5rs, чтобы реализовать begin (), используя синтаксис определения, как показано ниже:
(define-syntax mybegin
(syntax-rules ()
((mybegin expr) expr)
((mybegin expr1 expr2 ...)
(let ((x expr1))
(mybegin expr2 ...)))))
а затем я попытался реализовать это с помощью функции, вот мой код:
(define begin-func
(lambda (expr1 expr2)
((lambda (x) expr2) expr1)))
вот мои тестовые примеры:
(define x 3)
(define y 3)
(mybegin
(set! x 4)
(set! x 5))
(begin-func
(set! y 4)
(set! y 5))
Я запустил свой код в MIT-SCHEME и Racket, используя схему #lang, x равно 5 как в MIT-SCHEME, так и в Racket, однако y равно 4 в MIT-SCHEME, но 5 в Racket
Вот мой вопрос:
- Верно ли, что мы действительно могли бы реализовать begin (), используя чисто функциональную схему?
- Что-то не так в моем коде, как в коде, использующем макрос, так и в коде, использующем функцию?
- почему один и тот же код ведет себя по-разному в MIT-SCHEME и Racket?