2012-09-11 130 views
2

我正在關注elisp的介紹。非常第一章。這裏是我從HTML書中複製/粘貼的兩個例子。我已經評估過這兩種形式,並且在這裏我將copie/paste粘貼返回值和輸出作爲* Messages *緩衝區的副作用(我不知道如何複製迷你緩衝區內容)。從*消息從消息*什麼是'消息返回類型請?

第一形式

(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)) 

第二種形式

(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." 

爲什麼第一個表單請返回一個lambda值? 什麼使第一種形式如此特殊以至於返回的值不會是字符串?

回答

10

message返回類型僅僅是一個字符串。在*Messages*緩衝區中,可以看到message的返回值(由評估命令在回顯區域中的引號中顯示)以及由message本身顯示在回顯區域中的未加引號的字符串。第一個結果不是lambda,而是帶有文本屬性的字符串。

在Emacs中,字符串對象的可打印表示通常是其雙引號中的內容,如第二個示例中所示。但是,帶有文本屬性的字符串以更復雜的方式打印,如#("...string contents..." start end (property value...) ...)。這種擴展語法是爲了讓Lisp閱讀器能夠在字符串從其文本表示中讀回時重新創建屬性。您可以通過在新鮮的緩衝區中評估M-: (insert #("foo" 0 3 (face (:foreground "yellow"))))來測試這一點 - 文本將呈現黃色,因爲該字符串本身包含指示將其塗成黃色。 (要看到這一點,你需要在,比方說,C-x b randomname RET獲得一個新的緩衝區 - 它不會在語法高亮緩衝劑,如*scratch*工作,因爲它們上色的文本本身。)

所以,第一個您打印的字符串附帶了屬性,可能是複製和粘貼的工件,這就是爲什麼它打印爲#("..." ...)。第二個字符串沒有屬性,可以打印爲簡單的字符串。

Emacs Lisp manual包含更多關於文本屬性的信息。

相關問題