Извлечение соответствия регулярному выражению в общем списке

Я, должно быть, здесь упускаю что-то очень простое.

Мне нужно извлечь группу захвата из совпадения в общем списке. Когда я 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,

Другие вопросы по тегам