Ответы пользователя по тегу Clojure
  • Как последовательно вычесть два списка в Clojure?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Функция map - https://clojuredocs.org/clojure.core/map
    (map - ;; указываем функцию
         [1 2 3] ;; список один
         [3 2 1] ;; список два
    )
    ;; => (-2 0 2)\
    ;; или
    (map (fn [x y] (- x y))
         [1 2 3]
         [3 2 1])
    Ответ написан
    Комментировать
  • Как работают case и cond в Clojure?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    1) cond - проверяет условия на true/false, на первом true выполняет вторую половину и заканчивается, :else - если ничего не подошло
    2) case - проверяет первый параметр (x) на соответсвие условиям и выполняет первое подходящее, возвращая результат. Очень интересна здесь работа сравнения x со списком (13 42 100500) или false.
    Но пример конечно с издевкой :) Можно было бы все в cond обернуть, и не мучить разум...
    Хотя, взял себе на заметку, понравилось.

    В общем, сам cond отвечает за три сущности (< x) - "Negative", case - проверка на список "Special" и все остальное "Boring"
    Ответ написан
    Комментировать
  • Как оптимизировать код и избавиться от костылей в рекурсии на первой и последней итерации?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Вот, накидал. Самому интересно стало :-) - https://repl.it/@AlexeyCheremisi/DelightfulValuabl...
    И да, не ругайте строго! Это мой первый код на этом языке, и кажется, не последний :-)
    PS. Немного облагородил через let т привел возвращаемое к vector, как в вопросе!
    ;; my recursion function
    (defn func [inp]
      (loop [ acc [] [cnt & rest] inp ] ;; accumulator, counter from rest, rest
        (let [head (take cnt rest) tail (drop cnt rest)] ;; get portion of data to head, get tail of data
          (if (= (count rest) 0) acc ;; return accumulator if no data
            (recur (conj acc (into [] head)) tail))))) ;; loop with convert list to vector
    
    ;; input data
    (def indata [3 4 0 2 1 2 2 4 5])
    
    ;; test recursion
    (func indata) ;; => [[4 0 2] [2] [4 5]]
    Ответ написан
    Комментировать