lisp 裡的 ,@ 反引號 的解釋
【,@】 【】 中間包括的那倆個符號代表啥意思? 會鬱悶很久的。
解釋在這裡:
反引號 (Backquote)
反引號讀取宏 (read-macro)使得從模版 (templates)建構列表變得有可能。反引號廣泛使用在宏定義中。一個平常的引用是鍵盤上的右引號 (apostrophe),然而一個反引號是一個左引號。(譯註: open quote 左引號,closed quote 右引號)。它稱作“反引號”是因為它看起來像是反過來的引號 (titled backwards)。
(譯註: 反引號是鍵盤左上方數字 1 左邊那個: ` ,而引號是 enter 左邊那個 ')
一個反引號單獨使用時,等於普通的引號:
> `(a b c) (A B C)
和普通引號一樣,單一個反引號保護其引數被求值。
反引號的優點是,在一個反引號表示式裡,你可以使用 , (逗號)與 ,@ (comma-at)來重啟求值。如果你在反引號表示式裡,在某個東西前面加逗號,則它會被求值。所以我們可以使用反引號與逗號來建構列表模版:
> (setf a 1 b 2) 2 > `(a is ,a and b is ,b) (A IS 1 AND B IS 2)
透過使用反引號取代呼叫 list ,我們可以寫出宏會產生出的展開式的宏定義。舉例來說 nil! 可以定義為:
(defmacro nil! (x) `(setf ,x nil))
Comma-at 與逗號相似,但將其(本來應該是列表的)引數扒開。將列表的元素插入模版來取代列表。
> (setf lst '(a b c)) (A B C) > `(lst is ,lst) (LST IS (A B C)) > `(its elements are ,@lst) (ITS ELEMENTS ARE A B C)
Comma-at 在宏裡很有用,舉例來說,在用剩餘引數 (rest parameters)表示程式碼主體的宏。假設我們想要一個 while 宏,只要初始測試表示式為真,對其主體求值:
> (let ((x 0)) (while (< x 10) (princ x) (incf x))) 0123456789 NIL
我們可以透過使用一個剩餘引數 (rest parameter) ,蒐集主體的表示式列表,來定義一個這樣的宏,接著使用 comma-at 來扒開這個列表放至展開式裡:
(defmacro while (test &rest body) `(do () ((not ,test)) ,@body))
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/133735/viewspace-741742/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql反引號和引號的用法MySql
- Golang的單引號、雙引號與反引號Golang
- shell中單引號、雙引號、反引號、反斜槓的區別
- Linux Shell 中的反引號,單引號,雙引號Linux
- oracle 裡的單引號與雙引號Oracle
- shell 指令碼中雙引號、單引號、反引號的區別指令碼
- linux bash中的引號:單雙引號、反撇號Linux
- linux 單引號,雙引號,反引號Linux
- mysql建立表時反引號的作用MySql
- lisp 裡的相等(相同)的比較Lisp
- lisp 裡的條件判斷Lisp
- lisp 裡的迴圈loop macroLispOOPMac
- MySQL concat裡面單引號的使用MySql
- Bash 指令碼:`(反引號)運算子和 $()的使用方式指令碼
- JavaScript 反引號模板字面量巢狀JavaScript巢狀
- 反單引號在vue檔案的alert中怎麼換行Vue
- Oracle中的 單引號 和 雙引號Oracle
- 當resource bundle 的多語言檔案裡包含引號'時
- grep 後加單引號、雙引號和不加引號的區別
- Python中 單引號,雙引號和三引號的區別Python
- Jquery單引號和雙引號的使用注意jQuery
- SQL語句中的單引號與雙引號SQL
- javascript的雙引號和單引號的用法和區別JavaScript
- latex的雙引號 ``'
- newLISP 10.5.3 釋出,類 Lisp 的指令碼語言Lisp指令碼
- Oracle中單引號和雙引號的區別Oracle
- PHP中單引號和雙引號的區別PHP
- 瞭解 Oracle 中單引號與雙引號的用法,一篇文章教會你!Oracle
- [譯] 以 Vue 為例,解釋 JavaScript 的反應性VueJavaScript
- Lisp 的本質Lisp
- Lisp的誕生Lisp
- Oracle EXECUTE IMMEDIATE語句裡面的引號處理Oracle
- Chrome 開發者工具 Performances 皮膚裡的引數解讀ChromeORM
- Oracle中單引號與雙引號的區別分析Oracle
- 執行計劃裡statistics資料的解釋
- MySQL環境變數裡關於字符集character_set相關引數的解釋MySql變數
- 關於執行計劃裡recursive calls,db block gets和consistent gets引數的解釋BloC
- mysql語句中有引號的問題解決方案MySql