реализовать "Search by any of the worlds entered"
хочется такой написать такую функциюну так напиши
(defun add-ors (sexp)
(unless (listp sexp) (return-from add-ors sexp
(loop for x on sexp
for y = (car x)
for z = (cadr x)
unless (or (intersection (list y z) (list 'and 'or (endp (cdr x
collecting (add-ors y) and collecting 'or
else collecting (add-ors y
CL-USER> (add-ors '(1 2 and 3
(1 OR 2 AND 3)
CL-USER> (add-ors '(1 2 (4 and 5 6) and 3
(1 OR 2 OR (4 AND 5 OR 6) AND 3)
стильно. это на каком языке?
Для тех, кто ничего не понял: car - первый элемент списка, cadr - второй (можно писать first и second, но так короче sexp значит S-expression, а не то, что все подумали.
CL-USER> '(1 2 (4 and 5 6) and 3)
(1 2 (4 and 5 6) and 3)
а должно быть
(1 OR 2 OR (4 and 5 OR 6) and 3)
но не строку
А вызов самой функции забыл.
Надо (add-ors '(1 2 and 3 а не '(1 2 and 3). Это просто вызов квотировонного списка который его же и возвращает.
>но не строку
Ну, прочесть и напечатать список в строку ничего не стоит...
(defun add-ors-to-string (str)
(format nil "~a" (add-ors (with-input-from-string (in str) (read in
Оставить комментарий
pitrik2
задача такая: есть поисковикему передается строка, он возвращает результат
по умолчанию между всеми словами поисковик вставляет AND
и поменять это нельзя
поэтому хочется такой написать такую функцию, которая вставляла бы во все нужные места OR
замечания:
строка может содержать AND - их нужно оставить на месте, т.е. "a b AND c" должен превратиться в "a OR b AND c
строка может содержать кавычки, например "a (b c)" должно превратиться в "a OR (b OR c)"
строка может содержать точный поиск по подстроке, т.е. внутрях кавычек OR вставлять не надо
если OR будет стоять не на нужно месте - поисковик выругается, т.е. вариант "проставить OR между всеми словами" не канает