2014-06-23 30 views
2

我必須在這裏丟失一些非常基本的東西。提取普通lisp中的正則表達式匹配

我需要從普通lisp中的匹配中提取捕獲組。 當我在翻譯的eval(一SBCL實現):

`(cl-ppcre::scan-to-strings ".*?(\\d).png" "sample1.png")` 

我得到:

"sample1.png" 
#("1") 

但是,如果我綁定該表達式的值,說

`(setq number (cl-ppcre::scan-to-strings ".*(\\d).png" "sample1.png"))` 

值的數量變成"sample1.png"。我如何獲得打印的"1"

+0

可能的[Common Lisp中的值函數]重複(http://stackoverflow.com/questions/22795608/values-function-in-common-lisp) – sds

回答

4

你的問題

您正在尋找

(setf (values match position) 
     (cl-ppcre::scan-to-strings ".*(\\d).png" "sample1.png")) 

參見multiple-value-bind等。

引擎蓋下

Common Lisp的函數可以返回multiple values。 這對應於其他語言(如Python)中的「元組」返回值。 所以,當一個口齒不清的功能,如floor,返回多個值,一個Python用戶會喜歡寫東西

(f,r) = floor(10,3) 

floor(通常)分配一個元組,當你寫fr = floor(10,3)被抓獲。

CL多個值不分配額外的存儲空間,但多餘的值將被丟棄,除非你專門爲他們問:

(setf (values f r) (floor 10 3)) 

將捕捉這兩個值,但(setf f (floor 10 3))將丟棄r

+0

不久後,我問了這個問題,我有點想到如何提取我想要的,但沒有真正理解發生了什麼。感謝您的解釋 – erjoalgo

+0

是否可以綁定一個let表單中的多個值? – erjoalgo

+0

'multiple-value-bind'可能是你正在尋找的 –