Skip to content
Back to skills

Swe Programming Clojure

ASecurity

Clojure coding standards from authoritative docs/explanation/software-engineering/programming-languages/clojure/ documentation

  • 4 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 12, 2026
developmentgojavatestingapisecurityperformancedocumentation

Works with

  • api

Security analysis

A100/100

Pro scans all 2 files and shows the line behind each finding

Scanned September 12, 2026

npx -y skills add aibot88/sec_skill_store --skill swe-programming-clojure --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Swe Programming Clojure?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Swe Programming Clojure
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/aibot88-swe-programming-clojure/badge)](https://www.skillsdirectory.com/skills/aibot88-swe-programming-clojure)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: swe-programming-clojure
description: Clojure coding standards from authoritative docs/explanation/software-engineering/programming-languages/clojure/ documentation
---

# Clojure Coding Standards

## Purpose

Progressive disclosure of Clojure coding standards for agents writing Clojure code.

**Usage**: Auto-loaded for agents when writing Clojure code. Provides quick reference to idioms, best practices, and antipatterns.

**Authoritative Source**: [docs/explanation/software-engineering/programming-languages/clojure/README.md](../../../docs/explanation/software-engineering/programming-languages/clojure/README.md)

## Prerequisite Knowledge

**IMPORTANT**: This skill provides **demo-specific style guides**, not educational tutorials.

Complete the demo Clojure learning path first:

## Quick Standards Reference

### Naming Conventions

**Functions/Variables**: kebab-case - `calculate-zakat`, `total-amount`, `validate-contract`

**Predicates**: end with `?` - `valid-nisab?`, `above-threshold?`

**Side-effecting functions**: end with `!` - `save-transaction!`, `send-notification!`

**Namespaces**: reverse-domain + feature - `com.demo.zakat.calculator`

**Namespace aliases**: standard abbreviations - `(require [clojure.string :as str])`

### Core Idioms

```clojure
;; CORRECT: Pure function for Zakat calculation
(defn calculate-zakat
  "Calculate Zakat amount. Returns 2.5% if wealth >= nisab, else 0."
  [wealth nisab]
  (if (>= wealth nisab)
    (* wealth 0.025M)
    0M))

;; CORRECT: Threading macro for readability
(defn process-contracts [contracts nisab]
  (->> contracts
       (filter #(>= (:wealth %) nisab))
       (map #(assoc % :zakat-amount (calculate-zakat (:wealth %) nisab)))
       (remove nil?)))

;; CORRECT: Destructuring in function args
(defn format-payment [{:keys [amount currency date]}]
  (str amount " " currency " on " date))
```

### Namespaced Keywords for Domain

```clojure
;; CORRECT: Namespaced keywords for domain concepts
{:zakat/wealth 10000M
 :zakat/nisab 5000M
 :zakat/amount 250M
 :contract/id "murabaha-001"
 :contract/type :murabaha
 :contract/status :active}

;; WRONG: Unnamespaced keywords for domain data
{:wealth 10000M  ; ambiguous in a larger system
 :id "001"}
```

### Error Handling

```clojure
;; CORRECT: ex-info for structured errors
(defn validate-wealth [wealth]
  (when (neg? wealth)
    (throw (ex-info "Invalid wealth amount"
                    {:type :validation-error
                     :field :wealth
                     :value wealth
                     :message "Wealth cannot be negative"}))))

;; CORRECT: Catch specific ex-info
(try
  (validate-wealth -100M)
  (catch clojure.lang.ExceptionInfo e
    (let [data (ex-data e)]
      (log/error "Validation failed" data))))
```

### Concurrency with Atoms

```clojure
;; CORRECT: Atom for uncoordinated state
(def zakat-cache (atom {}))

;; CORRECT: swap! for atomic update (pure function)
(defn cache-calculation! [wealth result]
  (swap! zakat-cache assoc wealth result))

;; CORRECT: Refs for coordinated STM
(def total-zakat (ref 0M))
(def transaction-log (ref []))

(defn record-zakat! [amount]
  (dosync
    (alter total-zakat + amount)
    (alter transaction-log conj {:amount amount :time (java.time.Instant/now)})))
```

### Transducers for Efficiency

```clojure
;; CORRECT: Transducer pipeline (lazy, composable)
(def eligible-contracts-xf
  (comp
    (filter #(>= (:wealth %) nisab-threshold))
    (map #(assoc % :zakat (* (:wealth %) 0.025M)))
    (take 100)))

;; Apply to any collection
(into [] eligible-contracts-xf all-contracts)
(transduce eligible-contracts-xf + all-contracts)
```

### Testing

```clojure
;; CORRECT: clojure.test with descriptive names
(ns com.demo.zakat.calculator-test
  (:require [clojure.test :refer [deftest testing is are]]
            [com.demo.zakat.calculator :refer [calculate-zakat]]))

(deftest calculate-zakat-test
  (testing "wealth above nisab"
    (is (= 250M (calculate-zakat 10000M 5000M))))

  (testing "wealth below nisab"
    (is (= 0M (calculate-zakat 1000M 5000M))))

  (testing "wealth equal to nisab"
    (is (= 125M (calculate-zakat 5000M 5000M)))))
```

## Comprehensive Documentation

**Authoritative Index**: [docs/explanation/software-engineering/programming-languages/clojure/README.md](../../../docs/explanation/software-engineering/programming-languages/clojure/README.md)

### Mandatory Standards

1. **[Coding Standards](../../../docs/explanation/software-engineering/programming-languages/clojure/coding-standards.md)**
2. **[Testing Standards](../../../docs/explanation/software-engineering/programming-languages/clojure/testing-standards.md)**
3. **[Code Quality Standards](../../../docs/explanation/software-engineering/programming-languages/clojure/code-quality-standards.md)**
4. **[Build Configuration](../../../docs/explanation/software-engineering/programming-languages/clojure/build-configuration.md)**

### Context-Specific Standards

1. **[Error Handling](../../../docs/explanation/software-engineering/programming-languages/clojure/error-handling-standards.md)**
2. **[Concurrency](../../../docs/explanation/software-engineering/programming-languages/clojure/concurrency-standards.md)**
3. **[Functional Programming](../../../docs/explanation/software-engineering/programming-languages/clojure/functional-programming-standards.md)**
4. **[Performance](../../../docs/explanation/software-engineering/programming-languages/clojure/performance-standards.md)**
5. **[Security](../../../docs/explanation/software-engineering/programming-languages/clojure/security-standards.md)**
6. **[API Standards](../../../docs/explanation/software-engineering/programming-languages/clojure/api-standards.md)**
7. **[DDD Standards](../../../docs/explanation/software-engineering/programming-languages/clojure/ddd-standards.md)**
8. **[Java Interop](../../../docs/explanation/software-engineering/programming-languages/clojure/interop-standards.md)**

## Related Skills

- docs-applying-content-quality
- repo-practicing-trunk-based-development

## References

- [Clojure README](../../../docs/explanation/software-engineering/programming-languages/clojure/README.md)
- [Functional Programming](../../../repo-governance/development/pattern/functional-programming.md)

Files in this skill

  • SKILL.md6.1 KB
  • source.json675 B

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.