Lisp: расширенное сравнение строк
Недавно я столкнулся с этой строкой в некотором общем коде библиотеки LISP:
(string-equal #1="http://" url :end2 (min (length url) #2=#.(length #1#)))
Здесь url
передается как строковая переменная. Я понимаю, что цель этого сравнения состоит в том, чтобы определить, начинается ли строка url
с http://
, и это сравнение без учета регистра. Я также понимаю ключи string-equal
, такие как :start
и :end
. Но знак фунта (#
) пунктов бросил меня. Я могу понять большую часть этого контекста, но я не нашел документацию о том, как это работает, и я по-прежнему немного озадачен тем, что действительно означает #2=#.(length #1#)
. Это выглядит немного мистически для меня.
Может ли кто-нибудь объяснить, как работает механизм знака фунта в этом конкретном контексте и если он универсально используется в других конструкциях таким же образом? Или укажите мне документ/веб-сайт, который его описывает.
Спасибо!
Ответы
Ответ 1
Функция знака фунта (или резкого) описана в Hyperspec здесь.
Обозначение #1=
обозначает следующую форму (здесь строка "http://"
) с числовым индексом для backreference в обозначении #1#
. #.
вызывает следующую форму оцененную во время чтения.
Общий эффект заключается в том, чтобы сделать так, как если бы код был написан как:
(string-equal "http://" url :end2 (min (length url) 7))