(defn tails [s]
  (take (count s) (reductions (fn [s _] (rest s)) s s))

(defn match[p s]
   (cond
     (empty? p) true
     (empty? s) false
     :else 
      (case (first p)
          \* (some (partial match (rest p)) (tails s))
          \? (recur (rest p) (rest s))
          \\ (and (= (ffirst p) (first s))
                  (recur (drop 2 p) (rest s)))
          (and (= (first p) (first s))
               (recur (rest p) (rest s))))))

(print (match  "as*d*?qwe*qwe" "as123dssqwe12345678qwe"))