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://"
) с числовым индексом для later backreference на #1#
нотации. #.
вызывает следующую форму оценивается во время чтения.
общий эффект, чтобы сделать его, как если бы код был написан так:
(string-equal "http://" url :end2 (min (length url) 7))