Кложа - в репле работает, на сайте с задачами - ошибка компиляции - Lisp
Формулировка задачи:
Вот кот - расчет чисел Хемминга, один в один со схемы из сикпа, только лези-сек добавлен.
В репле идеи все компилируется и работает, на сайте с задачками ошибка: Что это может быть и как это исправить?
Вести с полей: Из мержа убраны тормозящие проверки на окончание потоков (они все бесконечные), в сводный поток h добавлен свой лезисек, f1\f2\f3 сделаны по-уродски, знаю, но для надежности - пока не освоил лямбды\сечения\частичные применения\что там еще здесь есть.
Но осталось много вопросов.
1) предыдущий кот (в первом посте) тоже не всегда работал в репле, зависит вроде от того, что было загружено до него, и перегружаю ли я ту же функцию с другим телом. Пока не разобрался.
2) какой конс из всего их полиморфного многообразия здесь выполняется? Ведь я нигде не задаю тип. И какой у меня получается поток - список, вектор или что-то еще? Судя по порядку элементов вроде список. А почему не вектор например?
3) Весь этот сексп с лезисеками конечно интересен, но хотелось бы в нем разобраться и понимать. В определенных краях всегда вызов по необходимости, там таких проблем нет. Надо еще в страну F# сходить, спросить как там с бесконечными потоками и их мержением справляются и каким синтаксисом побеждают их при умолчальном вызове по значению вроде.
(defn mrg [a b] (cond (empty? a) b (empty? b) a (< (first a) (first b)) (cons (first a) (lazy-seq (mrg (rest a) b))) (> (first a) (first b)) (cons (first b) (lazy-seq (mrg a (rest b)))) :else (cons (first b) (lazy-seq (mrg (rest a) (rest b)))) ) ) (defn f2 [n] (* 2 n)) (defn f3 [n] (* 3 n)) (defn f5 [n] (* 5 n)) (def h ( cons 1 (mrg (mrg (map f2 h) (map f3 h)) (map f5 h) ) )) (defn hamming [n] (nth h (- n 1)) ) (take 50 h)
=> (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)
java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Var$Unbound, compiling:(NO_SOURCE_FILE:15:22)
Не по теме:
Какие здесь все вежливые (кроме одного, который у меня в игноре), плюсы ставят за просто так, в других разделах и когда заслуживаешь - не всегда поставят, а тут за любой чих валом...
smoke853
подсказал мне как поиграться лезисеками, и вот такой вариант заработал везде:(defn mrg [a b] (lazy-seq (cond (< (first a) (first b)) (cons (first a) (mrg (rest a) b)) (> (first a) (first b)) (cons (first b) (mrg a (rest b))) :else (cons (first b) (mrg (rest a) (rest b))) ) ) ) (defn f2 [n] (* 2 n)) (defn f3 [n] (* 3 n)) (defn f5 [n] (* 5 n)) (def h ( cons 1 (lazy-seq (mrg (mrg (map f2 h) (map f3 h)) (map f5 h) )) )) (defn hamming [n] (nth h n) )
4) Если я могу написать (+ 1 2 3 4 5 6), то это получается функция с переменным числом аргументов. А если я пытаюсь так же свою mrg вызвать - ругается. Подозреваю, что можно доработать синтаксис ее объявления, чтобы понимала и не ругалась.
Решение задачи: «Кложа - в репле работает, на сайте с задачами - ошибка компиляции»
textual
Листинг программы
(ns aeon.core (:gen-class)) (defn hamming-seq ([] (hamming-seq (sorted-set 1))) ([coll] (let [n (first coll) s (disj coll n)] (cons n (lazy-seq (hamming-seq (into s (map #(* % n) [2 3 5])))))))) ;; => #'aeon.core/hamming-seq (defn hamming-number [n] (nth (hamming-seq) n)) ;; => #'aeon.core/hamming-number (defn -main [] (doseq [idx [1 10 100 500 1000 2000 5000]] (println (hamming-number idx)))) ;; => #'aeon.core/-main ;; 2 ;; 15 ;; 1600 ;; 944784 ;; 51840000 ;; 8100000000 ;; 50960793600000 ;; => nil
Объяснение кода листинга программы
В этом коде на языке Clojure определены три функции:
hamming-seq
— это рекурсивная функция, которая генерирует последовательность чисел, начиная с числа 1, используя динамическое программирование и операцию XOR (исключающее ИЛИ) над предыдущим и текущим числами в последовательности.hamming-number
— это функция, которая принимает целое число и возвращает соответствующий элемент из последовательностиhamming-seq
.-main
— это точка входа в программу, которая использует функциюdoseq
для перебора последовательности целых чисел от 1 до 2000 и выводит результат вызова функцииhamming-number
для каждого числа. Код не работает, потому что функцияhamming-seq
вызывает исключениеArityException
, так как ей передают неправильное количество аргументов. Она определена для одного аргумента, но в вызовеhamming-seq (sorted-set 1)
ей передают два аргумента.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д