1. ホーム
  2. scheme

[解決済み] Scheme/Racketにおけるletrecの意味

2022-02-19 21:26:30

質問事項

そこで、私が理解している範囲では、以下のようになります。 let , let* , letrecletrec* は、Scheme/Racketで使われている合成糖です。

さて、簡単なプログラムがあったとします。

(let ((x 1)
      (y 2))
     (+ x y))

と訳される。

((lambda (x y) (+ x y)) 1 2)

持っていれば

(let* ((x 1)
      (y 2))
     (+ x y))

と訳される。

((lambda (x) ((lambda (y) (+ x y))) 2) 1)

さて、最初の質問ですが、私は letrec この式は、let の内部で再帰を使用できるようにするものですが、具体的にどのように行うのかがわかりません。具体的には letrec に変換されるのですか?

例えば、次のようなことです。

(letrec ((x 1)
      (y 2))
     (+ x y)) 

に翻訳されるのですか?

2つ目の質問も同様で letrec* - しかし letrec* と具体的にどう違うのかがわからない。 letrec ? また letrec* という表現に変換されるのでしょうか?

どのように解決するのですか?

論文 "FixingLetrecを参照してください。忠実かつ効率的な実装 Schemeの再帰的バインディング構文" by Oscar Waddell, Dipanwita Sarkar, and, R. Kent Dybvigです。

この論文では、単純なバージョンから始まり、より洗練された拡張を説明する。

https://www.cs.indiana.edu/~dyb/pubs/fixing-letrec.pdf