Найти в Дзене

Как небольшой косяк LLM мне спать не давал

На днях ввечеру буквально пару часов времени потерял на пустом месте, пытаясь отдебажить кейс, в котором у меня определение функции не появлялось в пакете после перекомпиляции приложения. - Глазами вижу в файле определение функции. Оно есть. - Компилирую её с помощью Ctlr-C Ctrl-C – она в пакете появляется. - Перезапускаю REPL, делаю (asdf:load-system ... ) - функции в пакете нет. Как так??? При этом при загрузке модуля с помощью asdf:load-system компилятор выдает только одно предупреждение о том, что функция не определена, но она где-то используется. В конце концов нашел проблему – иллюстрация на картинке выше. И эта проблема была принесена LLM. В чем же было дело? Дело в том, что, внося очередные изменения, LLM у одного определения функции убрала закрывающую скобку, а у другого определения функции добавила лишнюю закрывающую скобку. В итоге весь код, который был между первым и вторым определением функции, оказался внутри тела первой функции. Если коротко проиллюстрировать это, м

Как небольшой косяк LLM мне спать не давал

На днях ввечеру буквально пару часов времени потерял на пустом месте, пытаясь отдебажить кейс, в котором у меня определение функции не появлялось в пакете после перекомпиляции приложения.

- Глазами вижу в файле определение функции. Оно есть.

- Компилирую её с помощью Ctlr-C Ctrl-C – она в пакете появляется.

- Перезапускаю REPL, делаю (asdf:load-system ... ) - функции в пакете нет. Как так???

При этом при загрузке модуля с помощью asdf:load-system компилятор выдает только одно предупреждение о том, что функция не определена, но она где-то используется.

В конце концов нашел проблему – иллюстрация на картинке выше. И эта проблема была принесена LLM.

В чем же было дело? Дело в том, что, внося очередные изменения, LLM у одного определения функции убрала закрывающую скобку, а у другого определения функции добавила лишнюю закрывающую скобку. В итоге весь код, который был между первым и вторым определением функции, оказался внутри тела первой функции.

Если коротко проиллюстрировать это, можно сделать это таким кодом:

(defun foo ()

(loop repeat 3

do (format t "Iterating"))

(defun blah ()

(format t "Blah called"))

(defun bar ()

(blah)))

На первый взгляд тут все ок. Проблема еще состоит в том, что настоящий LISPR скобки не считает. Мы судим о структуре кода по отступам, и здесь на первый взгляд все хорошо.

Проблема в глаза не бросается, потому что LLM не заботится о том, чтобы сохранять отступы так, как это делает нормальный LISP редактор.

Если отформатировать этот код в соответствии с правилами форматирования LISP, проблема станет очевидна. Вот во что он превратится:

(defun foo ()

(loop repeat 3

do (format t "Iterating"))

(defun blah ()

(format t "Blah called"))

(defun bar ()

(blah)))

Внезапно сразу оказывается, что определения функций blah и bar попали внутрь определения функции foo. И компилятору Common Lisp это нормально. Никаких ошибок он не выдаёт. Такие дела :(

#lisp #llm #problems