我一定错过了一些非常基本的东西。
我需要从 Common Lisp 中的匹配中提取捕获组。 当我在解释器中 eval 时(sbcl 实现):
`(cl-ppcre::scan-to-strings ".*?(\\d).png" "sample1.png")`
我得到:
"sample1.png"
#("1")
但是如果我将该表达式绑定(bind)到一个值,比如说
`(setq number (cl-ppcre::scan-to-strings ".*(\\d).png" "sample1.png"))`
数字的值变为“sample1.png”
。如何获取打印的“1”
?
最佳答案
你的问题
您正在寻找
(setf (values match position)
(cl-ppcre::scan-to-strings ".*(\\d).png" "sample1.png"))
另请参阅multiple-value-bind
等人。
底层
常见的 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
。
关于common-lisp - 在 Common Lisp 中提取正则表达式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24358075/