4

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 です。

だから、ここに私の質問があります:

  1. 純粋な機能スキームを使用して begin() を本当に実装できるというのは本当ですか?
  2. マクロを使用するコードと関数を使用するコードの両方で、私のコードに何か問題がありますか?
  3. MIT-SCHEME と Racket で同じコードの動作が異なるのはなぜですか?
4

1 に答える 1