What is going on here?
(ns test0.core
  (:gen-class)
  (:require [clojure.string :as s]))

;; const
(def N 3)
(def abc '("a" "b" "c"))
(def xyz '("x" "y" "z"))
(def abcd '("a" "b" "c" "d"))



(defn append-list-elem-to-string-1 [init-string init-list]
  ;;(println "[a-l-e-t-s]\t" "s:" init-string "l:" init-list)

  ; init-list is not empty
  (if (> (count init-list) 0)

    ; init-string[-1].endwith(init-list[i]) == True 
    (if (= (str (last init-string)) (first init-list))

      ; if True then work with rest ones
      (append-list-elem-to-string-1 init-string (rest init-list))

      ; if False then str = init-string + init-list[i]
      (concat
       (list (str init-string (first init-list)))
       (append-list-elem-to-string-1 init-string (rest init-list))))))



(defn append-list-elem-to-string-2
  ;; dev mode
  ([init-string init-list accumulator]

   ;;(println "[i-l-e-t-s-2]\t")

   ; init-list is not empty
   (if (> (count init-list) 0)

     ; init-string[-1].endwith(init-list[i]) == True  
     (if (= (str (last init-string)) (first init-list))

       ; if True then work with rest ones
       (recur init-string (rest init-list) accumulator)

       ; if False then str = init-string + init-list[i]
       (recur  init-string
               (rest init-list)
               (concat accumulator (list (str init-string (first init-list))))))
     accumulator))

  ;; user mode
  ([init-string init-list]
   (append-list-elem-to-string-2 init-string init-list '())))



(defn append-list-to-list-1 [init-list-to init-list-from]
  ;;(println "[a-l-t-l]\t" "l1:" init-list-to "l2:" init-list-from)

  ; len(init-list-from) == 0 => False
  (if (> (count init-list-from) 0)

    ; append for each elem
    (concat
     (append-list-elem-to-string-1 (first init-list-from) init-list-to)
     (append-list-to-list-1 init-list-to (rest init-list-from)))))



(defn append-list-to-list-2
  ;; dev mode
  ([init-list-to init-list-from accumulator]

   ; len(init-list-from) == 0 => False
   (if (> (count init-list-from) 0)

     ; append for each elem
     (recur  init-list-to
             (rest init-list-from)
             (concat accumulator (append-list-elem-to-string-2 (first init-list-from) init-list-to)))
     accumulator))

  ;; user mode
  ([init-list-to init-list-from]
   (append-list-to-list-2 init-list-to init-list-from '())))



(defn generate-combinations-1 [init-list-to init-list-from len]
  ;;(println "[g-c]\t" "l1:" init-list-to "l2:" init-list-from "len:" len)

  (if (> len 1)
    (append-list-to-list-1 init-list-to (generate-combinations-1 init-list-to init-list-from (dec len)))
    init-list-from))



(defn generate-combinations-2
  ; dev mode 
  ([init-list len accumulator]

   (if (> len 1)
     (recur  init-list
             (dec len)
             (append-list-to-list-2 init-list accumulator))
     accumulator))

  ;; user mode
  ([init-list len]
   (generate-combinations-2 init-list len init-list)))


(defn task-1-1 [chars n]
  ;;(println "[task-1-1]\t" "c:" chars "n:" n)

  (generate-combinations-1 chars chars n))



(defn -main
  [& args]

  (println "\nTest 1.1:")
  (println (append-list-elem-to-string-1 "xyz" abc))
  (println (append-list-elem-to-string-1 "abba" abc))

  (println "\nTest 1.2")
  (def abc-abc (append-list-to-list-1 abc abc))
  (println "abc-abc:" abc-abc)
  (println (append-list-to-list-1 abc abc-abc))

  (println "\nTest 1.3")
  (def res (generate-combinations-1 abcd xyz (dec N)))
  (println res "\n")

  (println "\nTest 1.4")
  (def res-2 (task-1-1 abcd N))
  (println res-2 "\n")
  (println "len:" (count res-2))

  (def res-2-2 (task-1-1 '("a") N))
  (println res-2-2 "\n")
  (println "len:" (count res-2-2))

  (println "\nTest 2.1:")
  (println (append-list-elem-to-string-2 "xyz" abc))
  (println (append-list-elem-to-string-2 "abba" abc))

  (println "\nTest 2.2")
  (def abc-abc (append-list-to-list-2 abc abc))
  (println "abc-abc:" abc-abc)
  (println (append-list-to-list-2 abc abc-abc))

  (println "\nTest 2.3")
  (def res-3 (generate-combinations-2 abcd N))
  (println res-3 "\n")
  (println "len:" (count res-3)))

;;(-main)