我必须在这里遗漏一些非常基本的东西。
我需要从常见的lisp中的匹配中提取捕获组。 当我在解释器中进行评估时(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 :(得分:4)
您正在寻找
(setf (values match position)
(cl-ppcre::scan-to-strings ".*(\\d).png" "sample1.png"))
常见的lisp函数可以返回multiple values。
这相当于"元组"返回其他语言的值,例如Python。
因此,当lisp函数(如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
。