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))
#lang スキームを使用して MIT-SCHEME と Racket でコードを実行しました。x は MIT-SCHEME と Racket の両方で 5 ですが、y は MIT-SCHEME では 4 ですが、Racket では 5 です。
だから、ここに私の質問があります:
- 純粋な機能スキームを使用して begin() を本当に実装できるというのは本当ですか?
- マクロを使用するコードと関数を使用するコードの両方で、私のコードに何か問題がありますか?
- MIT-SCHEME と Racket で同じコードの動作が異なるのはなぜですか?