Несоответствие запуска закрывающей банки из командной строки - PullRequest
2 голосов
/ 04 декабря 2011

У меня есть программа clojure, которая в какой-то момент выполняет функцию с именем db-rebuild-files-table.Эта функция принимает имя файла каталога в качестве единственного строкового аргумента и вызывает рекурсивную функцию, которая спускается в дерево файлов каталога, извлекает определенные данные из файлов и регистрирует каждый файл в базе данных mysql.Конечным результатом этой команды является таблица «files», заполняемая всеми файлами в дереве в данном каталоге.

Мне нужно иметь возможность периодически запускать эту команду из оболочки.

Итак, я добавил директиву :gen-class в файл, содержащий мою функцию -main, которая фактически вызывает (db-rebuild-files-table *dirname*).Я запускаю lein uberjar и генерирую jar, который затем могу выполнить:

java -jar my-project-SNAPSHOT-1.0.0-standalone.jar namespace.containing.main

Конечно, функция выполняется, но в базе данных существует только одна запись, длякаталог * dirname *.Когда я выполняю точный того же самого sexp в закрытом REPL, я получаю правильное поведение: все дерево файлов под * dirname * обрабатываются.

Что я делаю не так?Почему вызов (db-rebuild-files-table *dirname*) ведет себя непоследовательно при вызове из REPL и при выполнении из командной строки?

[EDIT] Что еще страннее, я нигде не получаю ошибок.Кажется, что все вызовы функций работают должным образом.Я даже могу запустить функцию -main в REPL, и она корректно обновляет таблицу.

Ответы [ 2 ]

4 голосов
/ 04 декабря 2011

Если это работает в REPL, но не в автономном режиме, то, я думаю, вас укусила лень Clojure.

Возможно, вашему коду требуется doseq, чтобы получить преимущества от побочного эффекта (например, запись в вашу базу данных)?

0 голосов
/ 04 декабря 2011

прибил его. Это была очень коварная ошибка в моей программе. Меня укусила лень Clojure. Моя функция дерева файлов использовала map для внутреннего использования, и поэтому вырабатывала только первое значение, корневой каталог По какой-то причине я до сих пор не могу понять, когда при выполнении в REPL оценка была фактически принудительной, и был произведен весь seq дерева. Я просто добавил doall в свою функцию, и это решило ее.

Все еще пытаюсь понять, почему выполнение чего-либо при оценке сил REPL. Есть мысли?

...