2

私はelispの紹介に従っています。非常に最初の章。これが私がhtml本からコピー/貼り付けした2つの例です。両方の形式を評価しました。ここでは、*メッセージ*バッファーからの副作用として、戻り値と出力をコピーして貼り付けます(ミニバッファーの内容をコピーする方法がわかりません)。

最初のフォーム

(let ((zebra 'stripes)
      (tiger 'fierce))
  (message "One kind of animal has %s and another is %s."
           zebra tiger))

*メッセージ*からの出力

One kind of animal has stripes and another is fierce.
#("One kind of animal has stripes and another is fierce." 23 30 (fontified t))

2番目の形式

(let ((birch 3)
      pine
      fir
      (oak 'some))
  (message "Here are %d variables with %s, %s and %s value."
           birch pine fir oak))

*メッセージ*からの出力は次のとおりです。

Here are 3 variables with nil, nil and some value.
"Here are 3 variables with nil, nil and some value."

最初のフォームがラムダ値を返すのはなぜですか?最初のフォームが特別で、戻り値が文字列にならない理由は何ですか?

4

1 に答える 1

10

戻り値はmessage単なる文字列です。*Messages*バッファには、(評価コマンドによってエコー領域に引用符で囲まれて表示される)の戻り値と、エコー領域に単独で表示される引用符で囲まれていない文字列の両方が表示messageされmessageます。最初の結果はラムダではなく、テキストプロパティを持つ文字列でした。

Emacsでは、2番目の例のように、文字列オブジェクトの印刷可能な表現は通常、二重引用符で囲まれた内容です。ただし、テキストプロパティが付加された文字列は、のように、より複雑な方法で印刷され#("...string contents..." start end (property value...) ...)ます。この拡張構文は、文字列がテキスト表現から読み戻されたときにLispリーダーがプロパティを再作成できるようにするためのものです。新しいバッファで評価することでこれをテストできますM-: (insert #("foo" 0 3 (face (:foreground "yellow"))))。文字列自体に黄色にペイントするための指示が含まれているため、テキストは黄色になります。(これを確認するには、たとえば、で取得した新しいバッファを使用する必要があります。テキスト自体に色を付けるため、C-x b randomname RETなどの構文で強調表示されたバッファでは機能しません。)*scratch*

したがって、最初に印刷した文字列には、おそらくコピーと貼り付けのアーティファクトとしてプロパティが添付されていたため、として印刷されまし#("..." ...)た。2番目の文字列にはプロパティがなく、単純な文字列として印刷できました。

Emacs Lispのマニュアルには、テキストのプロパティに関するより多くの情報が含まれています。

于 2012-09-11T20:21:22.720 に答える