0

GNU guile マニュアルのマクロに関するドキュメント ( https://www.gnu.org/software/guile/manual/guile.pdf )の一部を理解するのに苦労しています。

セクション 6.10.2.1 (パターンの 259 ページ) には、省略記号キーワードのように不適切なリストがどのように一致するかについて説明しているセクションがあります。

(define-syntax let1
  (syntax-rules ()
    ((_ (var val) . exps)
     (let ((var val)) . exps))))

exps次に、のような非リスト(let (foo 'bar) . baz))が一致するため、これがどのように望ましくないかを言います。しかし、その表現を展開することはできません。ただし、次の式は展開されます。

  • (let1 (foo 'bar) . (baz))(let (foo 'bar) baz)
  • (let1 (foo 'bar) baz)(let (foo 'bar) baz)

改善に関する次の議論でも同様です。

(define-syntax let1
  (syntax-rules ()
    ((_ (var val) exp ...)
     (let ((var val)) exp ...))))

一致すると記載されてい(let1 (foo 'bar))ますが、これも一致しません。ただし、これを取得できます:

  • (let1 (foo 'bar) baz)(let (foo 'bar) baz)

これ以上頭を壁にぶつけてしまう前に、不適切なパターン マッチングと省略記号のパターン マッチングがどのように機能したか (また、ドキュメントにタイプミスがあるのか​​、それとも Guile のインストール/マクロ展開方法論に何か問題があるのか​​?) を誰かが明らかにしてくれると助かります。私は Guile 2.0.9 を使用しています (ドキュメントは 2.0.11 にありますが、これがそれほど重要であるとは思わなかったでしょう)。Geiserとマクロ展開のガイド(結果に違いはありません) を使用しています。

ice-9/psyntax.scm:1101:54: In procedure expand-top-sequence:
ice-9/psyntax.scm:1101:54: Syntax error:
unknown location: let: bad let in form (let ((foo (quote bar))))

In ice-9/psyntax.scm:
1101:54  0 (expand-top-sequence ((let2 (foo (quote bar)))) () ((top)) ...)

ありがとう!また、Scheme (優先的には Guile) マクロに関する他の優れた簡潔なリソースを誰かが推奨できる場合は、それも素晴らしいでしょう!

4

0 に答える 0