Кложа - в репле работает, на сайте с задачами - ошибка компиляции - Lisp

Узнай цену своей работы

Формулировка задачи:

Вот кот - расчет чисел Хемминга, один в один со схемы из сикпа, только лези-сек добавлен.
Листинг программы
  1. (defn mrg [a b]
  2. (cond
  3. (empty? a) b
  4. (empty? b) a
  5. (< (first a) (first b)) (cons (first a) (lazy-seq (mrg (rest a) b)))
  6. (> (first a) (first b)) (cons (first b) (lazy-seq (mrg a (rest b))))
  7. :else (cons (first b) (lazy-seq (mrg (rest a) (rest b))))
  8. )
  9. )
  10. (defn f2 [n] (* 2 n))
  11. (defn f3 [n] (* 3 n))
  12. (defn f5 [n] (* 5 n))
  13. (def h ( cons 1 (mrg (mrg (map f2 h) (map f3 h)) (map f5 h) ) ))
  14. (defn hamming [n] (nth h (- n 1)) )
  15. (take 50 h)
Листинг программы
  1. => (1 2 3 4 5 6 8 9 10 12 15 16 18 20 24 25 27 30 32 36 40 45 48 50 54 60 64 72 75 80 81 90 96 100 108 120 125 128 135 144 150 160 162 180 192 200 216 225 240 243)
В репле идеи все компилируется и работает, на сайте с задачками ошибка:
Листинг программы
  1. java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Var$Unbound, compiling:(NO_SOURCE_FILE:15:22)
Что это может быть и как это исправить?

Не по теме:

Какие здесь все вежливые (кроме одного, который у меня в игноре), плюсы ставят за просто так, в других разделах и когда заслуживаешь - не всегда поставят, а тут за любой чих валом...

Вести с полей:

smoke853

подсказал мне как поиграться лезисеками, и вот такой вариант заработал везде:
Листинг программы
  1. (defn mrg [a b]
  2. (lazy-seq
  3. (cond
  4. (< (first a) (first b)) (cons (first a) (mrg (rest a) b))
  5. (> (first a) (first b)) (cons (first b) (mrg a (rest b)))
  6. :else (cons (first b) (mrg (rest a) (rest b)))
  7. )
  8. )
  9. )
  10. (defn f2 [n] (* 2 n))
  11. (defn f3 [n] (* 3 n))
  12. (defn f5 [n] (* 5 n))
  13. (def h ( cons 1 (lazy-seq (mrg (mrg (map f2 h) (map f3 h)) (map f5 h) )) ))
  14. (defn hamming [n] (nth h n) )
Из мержа убраны тормозящие проверки на окончание потоков (они все бесконечные), в сводный поток h добавлен свой лезисек, f1\f2\f3 сделаны по-уродски, знаю, но для надежности - пока не освоил лямбды\сечения\частичные применения\что там еще здесь есть. Но осталось много вопросов. 1) предыдущий кот (в первом посте) тоже не всегда работал в репле, зависит вроде от того, что было загружено до него, и перегружаю ли я ту же функцию с другим телом. Пока не разобрался. 2) какой конс из всего их полиморфного многообразия здесь выполняется? Ведь я нигде не задаю тип. И какой у меня получается поток - список, вектор или что-то еще? Судя по порядку элементов вроде список. А почему не вектор например? 3) Весь этот сексп с лезисеками конечно интересен, но хотелось бы в нем разобраться и понимать. В определенных краях всегда вызов по необходимости, там таких проблем нет. Надо еще в страну F# сходить, спросить как там с бесконечными потоками и их мержением справляются и каким синтаксисом побеждают их при умолчальном вызове по значению вроде.
4) Если я могу написать (+ 1 2 3 4 5 6), то это получается функция с переменным числом аргументов. А если я пытаюсь так же свою mrg вызвать - ругается. Подозреваю, что можно доработать синтаксис ее объявления, чтобы понимала и не ругалась.

Решение задачи: «Кложа - в репле работает, на сайте с задачами - ошибка компиляции»

textual
Листинг программы
  1. (ns aeon.core
  2.   (:gen-class))
  3.  
  4. (defn hamming-seq
  5.   ([] (hamming-seq (sorted-set 1)))
  6.   ([coll]
  7.    (let [n (first coll)
  8.          s (disj coll n)]
  9.      (cons n (lazy-seq (hamming-seq (into s (map #(* % n) [2 3 5]))))))))
  10. ;; => #'aeon.core/hamming-seq
  11.  
  12. (defn hamming-number [n]
  13.   (nth (hamming-seq) n))
  14. ;; => #'aeon.core/hamming-number
  15.  
  16. (defn -main []
  17.   (doseq [idx [1 10 100 500 1000 2000 5000]]
  18.     (println (hamming-number idx))))
  19. ;; => #'aeon.core/-main
  20.  
  21. ;; 2
  22. ;; 15
  23. ;; 1600
  24. ;; 944784
  25. ;; 51840000
  26. ;; 8100000000
  27. ;; 50960793600000
  28. ;; => nil

Объяснение кода листинга программы

В этом коде на языке Clojure определены три функции:

  1. hamming-seq — это рекурсивная функция, которая генерирует последовательность чисел, начиная с числа 1, используя динамическое программирование и операцию XOR (исключающее ИЛИ) над предыдущим и текущим числами в последовательности.
  2. hamming-number — это функция, которая принимает целое число и возвращает соответствующий элемент из последовательности hamming-seq.
  3. -main — это точка входа в программу, которая использует функцию doseq для перебора последовательности целых чисел от 1 до 2000 и выводит результат вызова функции hamming-number для каждого числа. Код не работает, потому что функция hamming-seq вызывает исключение ArityException, так как ей передают неправильное количество аргументов. Она определена для одного аргумента, но в вызове hamming-seq (sorted-set 1) ей передают два аргумента.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.154 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут