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

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

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

Вот кот - расчет чисел Хемминга, один в один со схемы из сикпа, только лези-сек добавлен.
(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) )
Из мержа убраны тормозящие проверки на окончание потоков (они все бесконечные), в сводный поток h добавлен свой лезисек, f1\f2\f3 сделаны по-уродски, знаю, но для надежности - пока не освоил лямбды\сечения\частичные применения\что там еще здесь есть. Но осталось много вопросов. 1) предыдущий кот (в первом посте) тоже не всегда работал в репле, зависит вроде от того, что было загружено до него, и перегружаю ли я ту же функцию с другим телом. Пока не разобрался. 2) какой конс из всего их полиморфного многообразия здесь выполняется? Ведь я нигде не задаю тип. И какой у меня получается поток - список, вектор или что-то еще? Судя по порядку элементов вроде список. А почему не вектор например? 3) Весь этот сексп с лезисеками конечно интересен, но хотелось бы в нем разобраться и понимать. В определенных краях всегда вызов по необходимости, там таких проблем нет. Надо еще в страну F# сходить, спросить как там с бесконечными потоками и их мержением справляются и каким синтаксисом побеждают их при умолчальном вызове по значению вроде.
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 определены три функции:

  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