7

Racketで関数を記述しているときに、記号の前に1つではなく2つの一重引用符を誤って入れてしまいました。つまり、誤って'' aを記述し、ネストされた引用符の動作が奇妙に見えることを発見しました。私はDrRacketを使用しており、これをRacketlangとR5RSlangの両方でテストしました。

(write (pair? (quote (quote a))))

プリント:#t。

(write (car (quote (quote a))))

プリント:引用

だが

(write (quote (quote a)))

(write '(quote a)))

両方の印刷:'a

誰かがScheme(およびRacket)で関数ペアを使用する理由を教えてもらえますか?(quote(quote a)))を2つの要素quoteとaのペアとして解釈しますが、関数writeは(quote a)の代わりに'aを出力します。

4

1 に答える 1

8

用語を引用符(')で囲むことと、quoteフォームを用語で囲むことは同じです。つまり、それらreadは同じ用語になります。

したがって、Schemeでは次の式はすべて同じです。

''a
'(quote a)
(quote 'a)
(quote (quote a))

このquote形式は、「次に来るものをデータムとして解釈する---別のデータが含まれている場合でも」という意味quoteです。サブタームは括弧で囲まれているので、リストです。内側quoteは単なるシンボルです。

場合によっては、プリンターは'出力に引用符()のようなリーダーの略語を使用します。しかし、あなたがそれをしなければならなかったことに少し驚いていますwrite。私にとっては、常にとして書き込みます(quote a)

于 2011-11-02T17:20:44.757 に答える