3

我必须在这里遗漏一些非常基本的东西。

我需要从 common 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"))`

number 的值变为"sample1.png"。我如何获得"1"打印的 , ?

4

1 回答 1

6

你的问题

你正在寻找

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

另见multiple-value-bind等人。

在引擎盖下

常见的 lisp 函数可以返回多个值。这对应于其他语言(例如 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

于 2014-06-23T04:11:30.177 回答