Namespaces and Project Structure

File layout: namespace myapp.order-items → file src/myapp/order_items.clj (dots become directories, hyphens become underscores).

.clj (JVM), .cljs (ClojureScript), .cljc (shared, with reader conditionals), .edn (data).

;; src/myapp/orders.clj
(ns myapp.orders
  "Order processing functions."
  (:require [clojure.string :as str]
            [clojure.set :refer [union]]
            [myapp.db :as db])
  (:import (java.time LocalDate Instant)
           (java.util UUID)))

(defn new-order [items]
  {:id (UUID/randomUUID)
   :created (Instant/now)
   :items items})

(defn- validate [order] (seq (:items order)))   ; private
;; At the REPL
(require '[myapp.orders :as orders] :reload)    ; reload after edits
(in-ns 'myapp.orders)                           ; switch namespaces
(ns-publics 'myapp.orders)
(ns-unmap *ns* 'some-var)                       ; remove a var
(resolve 'orders/new-order)