Извлечение соответствия регулярному выражению в общем списке
Я, должно быть, здесь упускаю что-то очень простое.
Мне нужно извлечь группу захвата из совпадения в общем списке. Когда я 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"
который печатается?
1 ответ
Ваш вопрос
Ты ищешь
(setf (values match position)
(cl-ppcre::scan-to-strings ".*(\\d).png" "sample1.png"))
Смотрите также multiple-value-bind
и другие.
Под капотом
Общие функции lisp могут возвращать несколько значений. Это соответствует возвращаемому значению "tuple" в других языках, таких как 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
,