5

R5RS は、ライブラリ形式の構文に対して提案されたマクロ定義を示します。

http://schemers.org/Documents/Standards/R5RS/HTML/r5rs-ZH-10.html#%_sec_7.3

これはまた、非常に複雑な方法で letrec を定義します。確かに私がそれを定義する方法ではありません。

(define-syntax letrec2
  (syntax-rules ()
    ((letrec2 ((name val) ...) body bodies ...)
     ((lambda ()
       (define name val) ...
       body bodies ...)))))

letrec のセマンティクスを理解している限り、名前付き let として頻繁に使用します。このように機能しますが、特殊相対性理論や確立された音韻論を反証できると考えている哲学者とのかなりの議論を行ってきたので、複雑な問題に対する単純な解決策があると考えるとき、それはおそらく違う。このマクロが letrec のセマンティクスを満たさない点がいくつかあるに違いありません。

この定義では、定義は letrec の本体に対してローカルであり、相互再帰のために相互に参照できます。何が間違っているのか (もしあれば) よくわかりません。

4

4 に答える 4

5

R5RSの設計者が回避しようとしているように見えることを、マクロからコンパイラに実装の責任を押し付けたように私には思えます。

実際、ローカルの定義は R5RS の letrec で実装されています。6.2.2 内部定義を参照してください。

設計者の意図は、R5RSの紹介にうまくまとめられていると思います。

プログラミング言語は、機能の上に機能を積み上げるのではなく、追加の機能が必要と思われる弱点や制限を取り除くことによって設計されるべきです。スキームは、式の構成方法に制限がなく、式を形成するための非常に少数の規則で、今日使用されている主要なプログラミング パラダイムのほとんどをサポートするのに十分な柔軟性を備えた実用的で効率的なプログラミング言語を形成するのに十分であることを示しています。

edit1: letrec の r5rs バージョンに変換された内部定義の例。PLT スキーム 4.2.5 collects/r5rs/main.ss

(define-syntax (r5rs:body stx)
(syntax-case stx (let)
  [(_ (let () . body))
   #'(let () . body)]
  [_
   ;; Convert internal definitions to `r5rs:letrec', as opposed
   ;; to `letrec'.
...

R5RS モードの PLT スキームでは、内部定義を letre の R5RS バージョンに変換します。DrScheme のマクロ エキスパンダーを内部定義のある任意のコードで使用して、これを自分でテストすることもできます。

于 2010-05-14T17:55:42.603 に答える
3

R5RS は、 のセマンティクスがletrec内部定義のセマンティクスとまったく同じであると述べています。詳細については、後者に関するセクションを参照してください。以下に重要な部分を引用します。

内部定義を含む <body> は、常に完全に同等の式に変換できますletrec

したがってletrec、内部定義の観点から定義すると、問題がシフトするだけです。

また、複雑なコードをすべてハンドラーに詰め込み、その上にビルドするよりも、letrecマクロを定義してlambda内部定義を desugarする方が簡単だと思います。それは、トップレベル以外のスコープで相互に再帰的なバインディングを導入するよりきれいな形式はどれかという問題には触れていません... ;-)letreclambdaletrec

于 2010-05-15T02:37:36.037 に答える
0

良い質問。

のシーケンスの問題はこれだと思いますdefine

「式expr ...の評価の順序は指定されていないため、プログラムは、すべての値が計算される前に、letrec式によってバインドされた変数への参照を評価してはなりません」

ここ: http://www.scheme.com/tspl4/binding.html#./binding:s20

于 2010-05-14T19:28:04.253 に答える
0

わかりました、やっと理由がわかりました。それは役に立たないほど単純で、私の定義には何の問題もありません。実際には、R5RS のものより優れたいくつかのエラーが原因です。

http://community.schemewiki.org/?scheme-faq-macros

「letrec」を探してください。何が問題なのかという私の質問に皆さんは答えられませんでした。明らかに何も問題はありませんでした。R5RS の有益なセクションに「エラータ」があったようです。私は今、私自身の答えを受け入れることを余儀なくされるでしょう...

ここで疑問が生じるのは、なぜ R5RS の作成者がこの単純なソリューションを選択せず​​、エラーを含む非常に複雑なソリューションを選択したのかということです...

于 2010-06-07T03:41:19.737 に答える