I was trying make a function that return the closing bracket of a given opening bracket, I already can do this, but in my first attempt I can't understand where is my error, and I would like know to avoid the same problem in the future, here is my second function, It worked fine (see it working to let lighter what I tried in my first attempt):
(defun properties-without-spaces (s)
(let ((char-list nil)
(char-remove-p nil))
(loop for c across s do
(when (or (char-equal c #\:)
(char-equal c #\;))
(push c char-list)
(setf char-remove-p t))
(when (and char-remove-p
(not (or (char-equal c #\:)
(char-equal c #\;)))
(not (or (char-equal c #\Space)
(char-equal c #\Newline)
(char-equal c #\Tab))))
(setf char-remove-p nil))
(unless char-remove-p
(push c char-list)))
(trim (make-string-from-chars (reverse char-list)))))
(equal (end-bracket-index "div,ul,li:focus {outline:none; margin: 5px 0 0 1px;} body {background-color: blue;}" 16)
51) ;; => T
(equal (end-bracket-index "div,ul,li:focus {outline:none; margin: 5px 0 0 1px;} body {background-color: blue;} @media (min-width: 30em) {div {margin: 3px 0 1px 3px;} body {background-color: blue;}}" 109)
169) ;; => T
(equal (end-bracket-index "div,ul,li:focus {/*By Umaui*/
outline:none; /*something*/
margin: 5px 0 0 1px;
}
body {
background-color: pink;
}
@media (min-width: 30em) {
div {
margin: 3px 0 1px 3px;
}
body {
background-color: blue;
}
}" 154)
236) ;; => T
I know that have other ways to make this, I could use the cl-ppcre, but this is not my question, my question is where is my mistake in the recursive function below:
(defun end-bracket-index (css start-bracket &optional (open-bracket-level 1))
(let* ((css-before-start-bracket (subseq css 0 (+ start-bracket 1)))
(css-after-start-bracket (subseq css (+ start-bracket 1)))
(next-start-bracket
(search "{" css-after-start-bracket))
(next-end-bracket
(search "}" css-after-start-bracket)))
(cond ((and next-start-bracket
next-end-bracket)
(if (< next-start-bracket next-end-bracket)
(incf open-bracket-level)
(decf open-bracket-level)))
((and (null next-start-bracket)
next-end-bracket)
(decf open-bracket-level)))
(when (zerop open-bracket-level)
(return-from end-bracket-index
(+ next-end-bracket
(length css-before-start-bracket))))
(end-bracket-index css
(+ next-start-bracket
(length css-before-start-bracket))
open-bracket-level)))
(equal (end-bracket-index "div,ul,li:focus {outline:none; margin: 5px 0 0 1px;} body {background-color: blue;}" 16)
51) ;; => T
(equal (end-bracket-index "div,ul,li:focus {outline:none; margin: 5px 0 0 1px;} body {background-color: blue;} @media (min-width: 30em) {div {margin: 3px 0 1px 3px;} body {background-color: blue;}}" 109)
169) ;; => NIL because 168 not equal 169
(equal (end-bracket-index "div,ul,li:focus {/*By Umaui*/
outline:none; /*something*/
margin: 5px 0 0 1px;
}
body {
background-color: pink;
}
@media (min-width: 30em) {
div {
margin: 3px 0 1px 3px;
}
body {
background-color: blue;
}
}" 154)
236) ;; NIL because because 234 not equal 236