From 433be48f743dac7cefb83d305b03e4464adf1ade Mon Sep 17 00:00:00 2001 From: Brandon Olivier Date: Wed, 4 Jun 2025 17:03:22 -0500 Subject: [PATCH 1/8] Add Clojure code --- .../clojure/.codecrafters/compile.sh | 11 ++++++ .../clojure/.codecrafters/run.sh | 11 ++++++ compiled_starters/clojure/.gitattributes | 1 + compiled_starters/clojure/.gitignore | 15 ++++++++ compiled_starters/clojure/README.md | 38 +++++++++++++++++++ compiled_starters/clojure/build.clj | 22 +++++++++++ compiled_starters/clojure/codecrafters.yml | 11 ++++++ compiled_starters/clojure/deps.edn | 15 ++++++++ .../clojure/src/http_server/core.clj | 23 +++++++++++ compiled_starters/clojure/your_program.sh | 24 ++++++++++++ dockerfiles/clojure-1.12.0.Dockerfile | 13 +++++++ .../01-at4/code/.codecrafters/compile.sh | 11 ++++++ .../clojure/01-at4/code/.codecrafters/run.sh | 11 ++++++ solutions/clojure/01-at4/code/.gitattributes | 1 + solutions/clojure/01-at4/code/.gitignore | 15 ++++++++ solutions/clojure/01-at4/code/README.md | 38 +++++++++++++++++++ solutions/clojure/01-at4/code/build.clj | 22 +++++++++++ .../clojure/01-at4/code/codecrafters.yml | 11 ++++++ solutions/clojure/01-at4/code/deps.edn | 15 ++++++++ .../01-at4/code/src/http_server/core.clj | 20 ++++++++++ solutions/clojure/01-at4/code/your_program.sh | 24 ++++++++++++ .../01-at4/diff/src/http_server/core.clj.diff | 25 ++++++++++++ solutions/clojure/01-at4/explanation.md | 16 ++++++++ .../clojure/code/.codecrafters/compile.sh | 11 ++++++ .../clojure/code/.codecrafters/run.sh | 11 ++++++ starter_templates/clojure/code/.gitignore | 15 ++++++++ starter_templates/clojure/code/build.clj | 22 +++++++++++ starter_templates/clojure/code/deps.edn | 15 ++++++++ .../clojure/code/src/http_server/core.clj | 23 +++++++++++ starter_templates/clojure/config.yml | 3 ++ 30 files changed, 493 insertions(+) create mode 100755 compiled_starters/clojure/.codecrafters/compile.sh create mode 100755 compiled_starters/clojure/.codecrafters/run.sh create mode 100644 compiled_starters/clojure/.gitattributes create mode 100644 compiled_starters/clojure/.gitignore create mode 100644 compiled_starters/clojure/README.md create mode 100644 compiled_starters/clojure/build.clj create mode 100644 compiled_starters/clojure/codecrafters.yml create mode 100644 compiled_starters/clojure/deps.edn create mode 100644 compiled_starters/clojure/src/http_server/core.clj create mode 100755 compiled_starters/clojure/your_program.sh create mode 100644 dockerfiles/clojure-1.12.0.Dockerfile create mode 100755 solutions/clojure/01-at4/code/.codecrafters/compile.sh create mode 100755 solutions/clojure/01-at4/code/.codecrafters/run.sh create mode 100644 solutions/clojure/01-at4/code/.gitattributes create mode 100644 solutions/clojure/01-at4/code/.gitignore create mode 100644 solutions/clojure/01-at4/code/README.md create mode 100644 solutions/clojure/01-at4/code/build.clj create mode 100644 solutions/clojure/01-at4/code/codecrafters.yml create mode 100644 solutions/clojure/01-at4/code/deps.edn create mode 100644 solutions/clojure/01-at4/code/src/http_server/core.clj create mode 100755 solutions/clojure/01-at4/code/your_program.sh create mode 100644 solutions/clojure/01-at4/diff/src/http_server/core.clj.diff create mode 100644 solutions/clojure/01-at4/explanation.md create mode 100755 starter_templates/clojure/code/.codecrafters/compile.sh create mode 100755 starter_templates/clojure/code/.codecrafters/run.sh create mode 100644 starter_templates/clojure/code/.gitignore create mode 100644 starter_templates/clojure/code/build.clj create mode 100644 starter_templates/clojure/code/deps.edn create mode 100644 starter_templates/clojure/code/src/http_server/core.clj create mode 100644 starter_templates/clojure/config.yml diff --git a/compiled_starters/clojure/.codecrafters/compile.sh b/compiled_starters/clojure/.codecrafters/compile.sh new file mode 100755 index 0000000..8b3b695 --- /dev/null +++ b/compiled_starters/clojure/.codecrafters/compile.sh @@ -0,0 +1,11 @@ +#!/bin/sh +# +# This script is used to compile your program on CodeCrafters +# +# This runs before .codecrafters/run.sh +# +# Learn more: https://codecrafters.io/program-interface + +set -e # Exit on failure + +clj -T:build diff --git a/compiled_starters/clojure/.codecrafters/run.sh b/compiled_starters/clojure/.codecrafters/run.sh new file mode 100755 index 0000000..ca6c727 --- /dev/null +++ b/compiled_starters/clojure/.codecrafters/run.sh @@ -0,0 +1,11 @@ +#!/bin/sh +# +# This script is used to run your program on CodeCrafters +# +# This runs after .codecrafters/compile.sh +# +# Learn more: https://codecrafters.io/program-interface + +set -e # Exit on failure + +exec java -jar /tmp/codecrafters-build-http-server-clojure/target.jar "$@" diff --git a/compiled_starters/clojure/.gitattributes b/compiled_starters/clojure/.gitattributes new file mode 100644 index 0000000..176a458 --- /dev/null +++ b/compiled_starters/clojure/.gitattributes @@ -0,0 +1 @@ +* text=auto diff --git a/compiled_starters/clojure/.gitignore b/compiled_starters/clojure/.gitignore new file mode 100644 index 0000000..45e9092 --- /dev/null +++ b/compiled_starters/clojure/.gitignore @@ -0,0 +1,15 @@ +pom.xml +pom.xml.asc +*.jar +*.class +/lib/ +/classes/ +/target/ +/checkouts/ +.lein-deps-sum +.lein-repl-history +.lein-plugins/ +.lein-failures +.nrepl-port +.cpcache/ +deps/ \ No newline at end of file diff --git a/compiled_starters/clojure/README.md b/compiled_starters/clojure/README.md new file mode 100644 index 0000000..59462a5 --- /dev/null +++ b/compiled_starters/clojure/README.md @@ -0,0 +1,38 @@ +![progress-banner](https://codecrafters.io/landing/images/default_progress_banners/http-server.png) + +This is a starting point for Clojure solutions to the +["Build Your Own HTTP server" Challenge](https://app.codecrafters.io/courses/http-server/overview). + +[HTTP](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol) is the +protocol that powers the web. In this challenge, you'll build a HTTP/1.1 server +that is capable of serving multiple clients. + +Along the way you'll learn about TCP servers, +[HTTP request syntax](https://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html), +and more. + +**Note**: If you're viewing this repo on GitHub, head over to +[codecrafters.io](https://codecrafters.io) to try the challenge. + +# Passing the first stage + +The entry point for your HTTP server implementation is in +`src/http_server/core.clj`. Study and uncomment the relevant code, and push your +changes to pass the first stage: + +```sh +git commit -am "pass 1st stage" # any msg +git push origin master +``` + +Time to move on to the next stage! + +# Stage 2 & beyond + +Note: This section is for stages 2 and beyond. + +1. Ensure you have `clj` installed locally +1. Run `./your_program.sh` to run your program, which is implemented in + `src/http_server/core.clj`. +1. Commit your changes and run `git push origin master` to submit your solution + to CodeCrafters. Test output will be streamed to your terminal. diff --git a/compiled_starters/clojure/build.clj b/compiled_starters/clojure/build.clj new file mode 100644 index 0000000..033a637 --- /dev/null +++ b/compiled_starters/clojure/build.clj @@ -0,0 +1,22 @@ +(ns build + (:gen-class) + (:require [clojure.tools.build.api :as b])) + +(def lib 'io.codecrafters.http-server) +(def class-dir "/tmp/codecrafters-build-http-server-clojure/classes") +(def basis (b/create-basis {:project "deps.edn"})) +(def uber-file "/tmp/codecrafters-build-http-server-clojure/target.jar") + +(defn clean [_] + (b/delete {:path "/tmp/codecrafters-build-http-server-clojure"})) + +(defn uber [_] + (clean nil) + (b/copy-dir {:src-dirs ["src"] :target-dir class-dir}) + (b/compile-clj {:basis basis + :ns-compile '[http-server.core] + :class-dir class-dir}) + (b/uber {:class-dir class-dir + :uber-file uber-file + :basis basis + :main 'http-server.core})) diff --git a/compiled_starters/clojure/codecrafters.yml b/compiled_starters/clojure/codecrafters.yml new file mode 100644 index 0000000..4355673 --- /dev/null +++ b/compiled_starters/clojure/codecrafters.yml @@ -0,0 +1,11 @@ +# Set this to true if you want debug logs. +# +# These can be VERY verbose, so we suggest turning them off +# unless you really need them. +debug: true + +# Use this to change the Clojure version used to run your code +# on Codecrafters. +# +# Available versions: clojure-1.12.0 +language_pack: clojure-1.12.0 diff --git a/compiled_starters/clojure/deps.edn b/compiled_starters/clojure/deps.edn new file mode 100644 index 0000000..bec883e --- /dev/null +++ b/compiled_starters/clojure/deps.edn @@ -0,0 +1,15 @@ +{ + :paths ["src"] + + :deps { + org.clojure/clojure {:mvn/version "1.12.0"} + org.clojure/tools.cli {:mvn/version "1.1.230"} + } + + :aliases { + :build { + :extra-deps {io.github.clojure/tools.build {:mvn/version "0.10.9"}} + :exec-fn build/uber + } + } +} diff --git a/compiled_starters/clojure/src/http_server/core.clj b/compiled_starters/clojure/src/http_server/core.clj new file mode 100644 index 0000000..15c91c6 --- /dev/null +++ b/compiled_starters/clojure/src/http_server/core.clj @@ -0,0 +1,23 @@ +(ns http-server.core + (:require + [clojure.java.io :as io]) + (:import + [java.net ServerSocket]) + (:gen-class)) + +(def port 4221) + +(defn serve [] + (let [server-sock (ServerSocket. port)] + (.setReuseAddress server-sock true) + (.accept server-sock) + (println "accepted new connection"))) + +(defn -main [& args] + ;; You can use print statements as follows for debugging, they'll be visible when running tests. + (binding [*out* *err*] + (println "Logs from your program will appear here!")) + + ;; Uncomment this block to pass the first stage + ;;(serve) + ) diff --git a/compiled_starters/clojure/your_program.sh b/compiled_starters/clojure/your_program.sh new file mode 100755 index 0000000..f4fe509 --- /dev/null +++ b/compiled_starters/clojure/your_program.sh @@ -0,0 +1,24 @@ +#!/bin/sh +# +# Use this script to run your program LOCALLY. +# +# Note: Changing this script WILL NOT affect how CodeCrafters runs your program. +# +# Learn more: https://codecrafters.io/program-interface + +set -e # Exit early if any commands fail + +# Copied from .codecrafters/compile.sh +# +# - Edit this to change how your program compiles locally +# - Edit .codecrafters/compile.sh to change how your program compiles remotely +( + cd "$(dirname "$0")" # Ensure compile steps are run within the repository directory + clj -T:build +) + +# Copied from .codecrafters/run.sh +# +# - Edit this to change how your program runs locally +# - Edit .codecrafters/run.sh to change how your program runs remotely +exec java -jar /tmp/codecrafters-build-http-server-clojure/target.jar "$@" diff --git a/dockerfiles/clojure-1.12.0.Dockerfile b/dockerfiles/clojure-1.12.0.Dockerfile new file mode 100644 index 0000000..0014234 --- /dev/null +++ b/dockerfiles/clojure-1.12.0.Dockerfile @@ -0,0 +1,13 @@ +# syntax=docker/dockerfile:1.7-labs +FROM clojure:tools-deps-bookworm + +# Ensures the container is re-built if dependency files change +ENV CODECRAFTERS_DEPENDENCY_FILE_PATHS="deps.edn" + +WORKDIR /app + +# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses +COPY --exclude=.git --exclude=README.md . /app + +# Install language-specific dependencies +RUN .codecrafters/compile.sh diff --git a/solutions/clojure/01-at4/code/.codecrafters/compile.sh b/solutions/clojure/01-at4/code/.codecrafters/compile.sh new file mode 100755 index 0000000..8b3b695 --- /dev/null +++ b/solutions/clojure/01-at4/code/.codecrafters/compile.sh @@ -0,0 +1,11 @@ +#!/bin/sh +# +# This script is used to compile your program on CodeCrafters +# +# This runs before .codecrafters/run.sh +# +# Learn more: https://codecrafters.io/program-interface + +set -e # Exit on failure + +clj -T:build diff --git a/solutions/clojure/01-at4/code/.codecrafters/run.sh b/solutions/clojure/01-at4/code/.codecrafters/run.sh new file mode 100755 index 0000000..ca6c727 --- /dev/null +++ b/solutions/clojure/01-at4/code/.codecrafters/run.sh @@ -0,0 +1,11 @@ +#!/bin/sh +# +# This script is used to run your program on CodeCrafters +# +# This runs after .codecrafters/compile.sh +# +# Learn more: https://codecrafters.io/program-interface + +set -e # Exit on failure + +exec java -jar /tmp/codecrafters-build-http-server-clojure/target.jar "$@" diff --git a/solutions/clojure/01-at4/code/.gitattributes b/solutions/clojure/01-at4/code/.gitattributes new file mode 100644 index 0000000..176a458 --- /dev/null +++ b/solutions/clojure/01-at4/code/.gitattributes @@ -0,0 +1 @@ +* text=auto diff --git a/solutions/clojure/01-at4/code/.gitignore b/solutions/clojure/01-at4/code/.gitignore new file mode 100644 index 0000000..45e9092 --- /dev/null +++ b/solutions/clojure/01-at4/code/.gitignore @@ -0,0 +1,15 @@ +pom.xml +pom.xml.asc +*.jar +*.class +/lib/ +/classes/ +/target/ +/checkouts/ +.lein-deps-sum +.lein-repl-history +.lein-plugins/ +.lein-failures +.nrepl-port +.cpcache/ +deps/ \ No newline at end of file diff --git a/solutions/clojure/01-at4/code/README.md b/solutions/clojure/01-at4/code/README.md new file mode 100644 index 0000000..59462a5 --- /dev/null +++ b/solutions/clojure/01-at4/code/README.md @@ -0,0 +1,38 @@ +![progress-banner](https://codecrafters.io/landing/images/default_progress_banners/http-server.png) + +This is a starting point for Clojure solutions to the +["Build Your Own HTTP server" Challenge](https://app.codecrafters.io/courses/http-server/overview). + +[HTTP](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol) is the +protocol that powers the web. In this challenge, you'll build a HTTP/1.1 server +that is capable of serving multiple clients. + +Along the way you'll learn about TCP servers, +[HTTP request syntax](https://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html), +and more. + +**Note**: If you're viewing this repo on GitHub, head over to +[codecrafters.io](https://codecrafters.io) to try the challenge. + +# Passing the first stage + +The entry point for your HTTP server implementation is in +`src/http_server/core.clj`. Study and uncomment the relevant code, and push your +changes to pass the first stage: + +```sh +git commit -am "pass 1st stage" # any msg +git push origin master +``` + +Time to move on to the next stage! + +# Stage 2 & beyond + +Note: This section is for stages 2 and beyond. + +1. Ensure you have `clj` installed locally +1. Run `./your_program.sh` to run your program, which is implemented in + `src/http_server/core.clj`. +1. Commit your changes and run `git push origin master` to submit your solution + to CodeCrafters. Test output will be streamed to your terminal. diff --git a/solutions/clojure/01-at4/code/build.clj b/solutions/clojure/01-at4/code/build.clj new file mode 100644 index 0000000..033a637 --- /dev/null +++ b/solutions/clojure/01-at4/code/build.clj @@ -0,0 +1,22 @@ +(ns build + (:gen-class) + (:require [clojure.tools.build.api :as b])) + +(def lib 'io.codecrafters.http-server) +(def class-dir "/tmp/codecrafters-build-http-server-clojure/classes") +(def basis (b/create-basis {:project "deps.edn"})) +(def uber-file "/tmp/codecrafters-build-http-server-clojure/target.jar") + +(defn clean [_] + (b/delete {:path "/tmp/codecrafters-build-http-server-clojure"})) + +(defn uber [_] + (clean nil) + (b/copy-dir {:src-dirs ["src"] :target-dir class-dir}) + (b/compile-clj {:basis basis + :ns-compile '[http-server.core] + :class-dir class-dir}) + (b/uber {:class-dir class-dir + :uber-file uber-file + :basis basis + :main 'http-server.core})) diff --git a/solutions/clojure/01-at4/code/codecrafters.yml b/solutions/clojure/01-at4/code/codecrafters.yml new file mode 100644 index 0000000..4355673 --- /dev/null +++ b/solutions/clojure/01-at4/code/codecrafters.yml @@ -0,0 +1,11 @@ +# Set this to true if you want debug logs. +# +# These can be VERY verbose, so we suggest turning them off +# unless you really need them. +debug: true + +# Use this to change the Clojure version used to run your code +# on Codecrafters. +# +# Available versions: clojure-1.12.0 +language_pack: clojure-1.12.0 diff --git a/solutions/clojure/01-at4/code/deps.edn b/solutions/clojure/01-at4/code/deps.edn new file mode 100644 index 0000000..bec883e --- /dev/null +++ b/solutions/clojure/01-at4/code/deps.edn @@ -0,0 +1,15 @@ +{ + :paths ["src"] + + :deps { + org.clojure/clojure {:mvn/version "1.12.0"} + org.clojure/tools.cli {:mvn/version "1.1.230"} + } + + :aliases { + :build { + :extra-deps {io.github.clojure/tools.build {:mvn/version "0.10.9"}} + :exec-fn build/uber + } + } +} diff --git a/solutions/clojure/01-at4/code/src/http_server/core.clj b/solutions/clojure/01-at4/code/src/http_server/core.clj new file mode 100644 index 0000000..8a34496 --- /dev/null +++ b/solutions/clojure/01-at4/code/src/http_server/core.clj @@ -0,0 +1,20 @@ +(ns http-server.core + (:require + [clojure.java.io :as io]) + (:import + [java.net ServerSocket]) + (:gen-class)) + +(def port 4221) + +(defn serve [] + (let [server-sock (ServerSocket. port)] + (.setReuseAddress server-sock true) + (.accept server-sock) + (println "accepted new connection"))) + +(defn -main [& args] + (println "Logs from your program will appear here!")) + + (serve) + ) diff --git a/solutions/clojure/01-at4/code/your_program.sh b/solutions/clojure/01-at4/code/your_program.sh new file mode 100755 index 0000000..f4fe509 --- /dev/null +++ b/solutions/clojure/01-at4/code/your_program.sh @@ -0,0 +1,24 @@ +#!/bin/sh +# +# Use this script to run your program LOCALLY. +# +# Note: Changing this script WILL NOT affect how CodeCrafters runs your program. +# +# Learn more: https://codecrafters.io/program-interface + +set -e # Exit early if any commands fail + +# Copied from .codecrafters/compile.sh +# +# - Edit this to change how your program compiles locally +# - Edit .codecrafters/compile.sh to change how your program compiles remotely +( + cd "$(dirname "$0")" # Ensure compile steps are run within the repository directory + clj -T:build +) + +# Copied from .codecrafters/run.sh +# +# - Edit this to change how your program runs locally +# - Edit .codecrafters/run.sh to change how your program runs remotely +exec java -jar /tmp/codecrafters-build-http-server-clojure/target.jar "$@" diff --git a/solutions/clojure/01-at4/diff/src/http_server/core.clj.diff b/solutions/clojure/01-at4/diff/src/http_server/core.clj.diff new file mode 100644 index 0000000..b2cf5fa --- /dev/null +++ b/solutions/clojure/01-at4/diff/src/http_server/core.clj.diff @@ -0,0 +1,25 @@ +@@ -1,23 +1,20 @@ + (ns http-server.core + (:require + [clojure.java.io :as io]) + (:import + [java.net ServerSocket]) + (:gen-class)) + + (def port 4221) + + (defn serve [] + (let [server-sock (ServerSocket. port)] + (.setReuseAddress server-sock true) + (.accept server-sock) + (println "accepted new connection"))) + + (defn -main [& args] +- ;; You can use print statements as follows for debugging, they'll be visible when running tests. +- (binding [*out* *err*] + (println "Logs from your program will appear here!")) + +- ;; Uncomment this block to pass the first stage +- ;;(serve) ++ (serve) + ) diff --git a/solutions/clojure/01-at4/explanation.md b/solutions/clojure/01-at4/explanation.md new file mode 100644 index 0000000..08be28b --- /dev/null +++ b/solutions/clojure/01-at4/explanation.md @@ -0,0 +1,16 @@ +The entry point for your HTTP server implementation is in `src/http_server/core.clj`. + +Study and uncomment the relevant code: + +```clojure +;; Uncomment this block to pass the first stage +(serve) +``` + +Push your changes to pass the first stage: + +``` +git add . +git commit -m "pass 1st stage" # any msg +git push origin master +``` diff --git a/starter_templates/clojure/code/.codecrafters/compile.sh b/starter_templates/clojure/code/.codecrafters/compile.sh new file mode 100755 index 0000000..8b3b695 --- /dev/null +++ b/starter_templates/clojure/code/.codecrafters/compile.sh @@ -0,0 +1,11 @@ +#!/bin/sh +# +# This script is used to compile your program on CodeCrafters +# +# This runs before .codecrafters/run.sh +# +# Learn more: https://codecrafters.io/program-interface + +set -e # Exit on failure + +clj -T:build diff --git a/starter_templates/clojure/code/.codecrafters/run.sh b/starter_templates/clojure/code/.codecrafters/run.sh new file mode 100755 index 0000000..ca6c727 --- /dev/null +++ b/starter_templates/clojure/code/.codecrafters/run.sh @@ -0,0 +1,11 @@ +#!/bin/sh +# +# This script is used to run your program on CodeCrafters +# +# This runs after .codecrafters/compile.sh +# +# Learn more: https://codecrafters.io/program-interface + +set -e # Exit on failure + +exec java -jar /tmp/codecrafters-build-http-server-clojure/target.jar "$@" diff --git a/starter_templates/clojure/code/.gitignore b/starter_templates/clojure/code/.gitignore new file mode 100644 index 0000000..45e9092 --- /dev/null +++ b/starter_templates/clojure/code/.gitignore @@ -0,0 +1,15 @@ +pom.xml +pom.xml.asc +*.jar +*.class +/lib/ +/classes/ +/target/ +/checkouts/ +.lein-deps-sum +.lein-repl-history +.lein-plugins/ +.lein-failures +.nrepl-port +.cpcache/ +deps/ \ No newline at end of file diff --git a/starter_templates/clojure/code/build.clj b/starter_templates/clojure/code/build.clj new file mode 100644 index 0000000..033a637 --- /dev/null +++ b/starter_templates/clojure/code/build.clj @@ -0,0 +1,22 @@ +(ns build + (:gen-class) + (:require [clojure.tools.build.api :as b])) + +(def lib 'io.codecrafters.http-server) +(def class-dir "/tmp/codecrafters-build-http-server-clojure/classes") +(def basis (b/create-basis {:project "deps.edn"})) +(def uber-file "/tmp/codecrafters-build-http-server-clojure/target.jar") + +(defn clean [_] + (b/delete {:path "/tmp/codecrafters-build-http-server-clojure"})) + +(defn uber [_] + (clean nil) + (b/copy-dir {:src-dirs ["src"] :target-dir class-dir}) + (b/compile-clj {:basis basis + :ns-compile '[http-server.core] + :class-dir class-dir}) + (b/uber {:class-dir class-dir + :uber-file uber-file + :basis basis + :main 'http-server.core})) diff --git a/starter_templates/clojure/code/deps.edn b/starter_templates/clojure/code/deps.edn new file mode 100644 index 0000000..bec883e --- /dev/null +++ b/starter_templates/clojure/code/deps.edn @@ -0,0 +1,15 @@ +{ + :paths ["src"] + + :deps { + org.clojure/clojure {:mvn/version "1.12.0"} + org.clojure/tools.cli {:mvn/version "1.1.230"} + } + + :aliases { + :build { + :extra-deps {io.github.clojure/tools.build {:mvn/version "0.10.9"}} + :exec-fn build/uber + } + } +} diff --git a/starter_templates/clojure/code/src/http_server/core.clj b/starter_templates/clojure/code/src/http_server/core.clj new file mode 100644 index 0000000..15c91c6 --- /dev/null +++ b/starter_templates/clojure/code/src/http_server/core.clj @@ -0,0 +1,23 @@ +(ns http-server.core + (:require + [clojure.java.io :as io]) + (:import + [java.net ServerSocket]) + (:gen-class)) + +(def port 4221) + +(defn serve [] + (let [server-sock (ServerSocket. port)] + (.setReuseAddress server-sock true) + (.accept server-sock) + (println "accepted new connection"))) + +(defn -main [& args] + ;; You can use print statements as follows for debugging, they'll be visible when running tests. + (binding [*out* *err*] + (println "Logs from your program will appear here!")) + + ;; Uncomment this block to pass the first stage + ;;(serve) + ) diff --git a/starter_templates/clojure/config.yml b/starter_templates/clojure/config.yml new file mode 100644 index 0000000..132e125 --- /dev/null +++ b/starter_templates/clojure/config.yml @@ -0,0 +1,3 @@ +attributes: + required_executable: clj + user_editable_file: src/http_server/core.clj From 627af251df7faf6fdc185811e24d5718fb267c05 Mon Sep 17 00:00:00 2001 From: Brandon Olivier Date: Thu, 5 Jun 2025 15:06:29 -0500 Subject: [PATCH 2/8] Add Clojure to course-definition --- course-definition.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/course-definition.yml b/course-definition.yml index 7d37487..49e74b6 100644 --- a/course-definition.yml +++ b/course-definition.yml @@ -67,6 +67,7 @@ languages: - slug: "cpp" - slug: "csharp" - slug: "dart" + - slug: "clojure" - slug: "elixir" - slug: "gleam" - slug: "go" From f4c4fd53aa5a255e79751edd6b2655e8d0768bc1 Mon Sep 17 00:00:00 2001 From: Brandon Olivier Date: Thu, 5 Jun 2025 15:06:46 -0500 Subject: [PATCH 3/8] Update Clojure code --- .../clojure/src/http_server/core.clj | 13 ++++++++++--- .../clojure/01-at4/code/src/http_server/core.clj | 10 ++++++++-- .../01-at4/diff/src/http_server/core.clj.diff | 15 +++++++++++---- .../clojure/code/src/http_server/core.clj | 13 ++++++++++--- 4 files changed, 39 insertions(+), 12 deletions(-) diff --git a/compiled_starters/clojure/src/http_server/core.clj b/compiled_starters/clojure/src/http_server/core.clj index 15c91c6..3129ce6 100644 --- a/compiled_starters/clojure/src/http_server/core.clj +++ b/compiled_starters/clojure/src/http_server/core.clj @@ -7,17 +7,24 @@ (def port 4221) +(alter-var-root #'*out* (constantly *err*)) + (defn serve [] (let [server-sock (ServerSocket. port)] (.setReuseAddress server-sock true) (.accept server-sock) - (println "accepted new connection"))) + (binding [*out* (java.io.PrintWriter. System/out true)] + (println "accepted new connection")))) (defn -main [& args] ;; You can use print statements as follows for debugging, they'll be visible when running tests. - (binding [*out* *err*] - (println "Logs from your program will appear here!")) + (println "Logs from your program will appear here!") + + + (alter-var-root #'*out* (constantly (java.io.PrintWriter. System/out true))) + ;; Uncomment this block to pass the first stage ;;(serve) + ) diff --git a/solutions/clojure/01-at4/code/src/http_server/core.clj b/solutions/clojure/01-at4/code/src/http_server/core.clj index 8a34496..b3da78a 100644 --- a/solutions/clojure/01-at4/code/src/http_server/core.clj +++ b/solutions/clojure/01-at4/code/src/http_server/core.clj @@ -7,14 +7,20 @@ (def port 4221) +(alter-var-root #'*out* (constantly *err*)) + (defn serve [] (let [server-sock (ServerSocket. port)] (.setReuseAddress server-sock true) (.accept server-sock) - (println "accepted new connection"))) + (binding [*out* (java.io.PrintWriter. System/out true)] + (println "accepted new connection")))) (defn -main [& args] - (println "Logs from your program will appear here!")) + + (alter-var-root #'*out* (constantly (java.io.PrintWriter. System/out true))) + (serve) + ) diff --git a/solutions/clojure/01-at4/diff/src/http_server/core.clj.diff b/solutions/clojure/01-at4/diff/src/http_server/core.clj.diff index b2cf5fa..872e105 100644 --- a/solutions/clojure/01-at4/diff/src/http_server/core.clj.diff +++ b/solutions/clojure/01-at4/diff/src/http_server/core.clj.diff @@ -1,4 +1,4 @@ -@@ -1,23 +1,20 @@ +@@ -1,30 +1,26 @@ (ns http-server.core (:require [clojure.java.io :as io]) @@ -8,18 +8,25 @@ (def port 4221) + (alter-var-root #'*out* (constantly *err*)) + (defn serve [] (let [server-sock (ServerSocket. port)] (.setReuseAddress server-sock true) (.accept server-sock) - (println "accepted new connection"))) + (binding [*out* (java.io.PrintWriter. System/out true)] + (println "accepted new connection")))) (defn -main [& args] - ;; You can use print statements as follows for debugging, they'll be visible when running tests. -- (binding [*out* *err*] - (println "Logs from your program will appear here!")) +- (println "Logs from your program will appear here!") +- + + (alter-var-root #'*out* (constantly (java.io.PrintWriter. System/out true))) + - ;; Uncomment this block to pass the first stage - ;;(serve) + (serve) + ) diff --git a/starter_templates/clojure/code/src/http_server/core.clj b/starter_templates/clojure/code/src/http_server/core.clj index 15c91c6..3129ce6 100644 --- a/starter_templates/clojure/code/src/http_server/core.clj +++ b/starter_templates/clojure/code/src/http_server/core.clj @@ -7,17 +7,24 @@ (def port 4221) +(alter-var-root #'*out* (constantly *err*)) + (defn serve [] (let [server-sock (ServerSocket. port)] (.setReuseAddress server-sock true) (.accept server-sock) - (println "accepted new connection"))) + (binding [*out* (java.io.PrintWriter. System/out true)] + (println "accepted new connection")))) (defn -main [& args] ;; You can use print statements as follows for debugging, they'll be visible when running tests. - (binding [*out* *err*] - (println "Logs from your program will appear here!")) + (println "Logs from your program will appear here!") + + + (alter-var-root #'*out* (constantly (java.io.PrintWriter. System/out true))) + ;; Uncomment this block to pass the first stage ;;(serve) + ) From 28dac43a4d6987c33810ddc953be1757db35d7a5 Mon Sep 17 00:00:00 2001 From: Brandon Olivier Date: Thu, 5 Jun 2025 15:33:29 -0500 Subject: [PATCH 4/8] Remove clojure debug Modified-by: Brandon Olivier --- compiled_starters/clojure/codecrafters.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiled_starters/clojure/codecrafters.yml b/compiled_starters/clojure/codecrafters.yml index 4355673..addefcf 100644 --- a/compiled_starters/clojure/codecrafters.yml +++ b/compiled_starters/clojure/codecrafters.yml @@ -2,7 +2,7 @@ # # These can be VERY verbose, so we suggest turning them off # unless you really need them. -debug: true +debug: false # Use this to change the Clojure version used to run your code # on Codecrafters. From 3ee9efa0f6d7bb2366f0db7cd7c50809836a8bc3 Mon Sep 17 00:00:00 2001 From: Brandon Olivier Date: Thu, 5 Jun 2025 16:23:55 -0500 Subject: [PATCH 5/8] Remove debug config value --- solutions/clojure/01-at4/code/codecrafters.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solutions/clojure/01-at4/code/codecrafters.yml b/solutions/clojure/01-at4/code/codecrafters.yml index 4355673..addefcf 100644 --- a/solutions/clojure/01-at4/code/codecrafters.yml +++ b/solutions/clojure/01-at4/code/codecrafters.yml @@ -2,7 +2,7 @@ # # These can be VERY verbose, so we suggest turning them off # unless you really need them. -debug: true +debug: false # Use this to change the Clojure version used to run your code # on Codecrafters. From 5a8ff97355e1b2d8a6fc39f0be57acb95e2b24c3 Mon Sep 17 00:00:00 2001 From: Brandon Olivier Date: Mon, 9 Jun 2025 16:41:18 -0500 Subject: [PATCH 6/8] Skip over writing to stderr instead of stdout --- starter_templates/clojure/code/src/http_server/core.clj | 6 ------ 1 file changed, 6 deletions(-) diff --git a/starter_templates/clojure/code/src/http_server/core.clj b/starter_templates/clojure/code/src/http_server/core.clj index 3129ce6..7c4f444 100644 --- a/starter_templates/clojure/code/src/http_server/core.clj +++ b/starter_templates/clojure/code/src/http_server/core.clj @@ -7,8 +7,6 @@ (def port 4221) -(alter-var-root #'*out* (constantly *err*)) - (defn serve [] (let [server-sock (ServerSocket. port)] (.setReuseAddress server-sock true) @@ -20,10 +18,6 @@ ;; You can use print statements as follows for debugging, they'll be visible when running tests. (println "Logs from your program will appear here!") - - (alter-var-root #'*out* (constantly (java.io.PrintWriter. System/out true))) - - ;; Uncomment this block to pass the first stage ;;(serve) From 014fff457301eb5b4829a6cc0956d3440715471d Mon Sep 17 00:00:00 2001 From: Brandon Olivier Date: Mon, 9 Jun 2025 16:43:54 -0500 Subject: [PATCH 7/8] Add changes from template --- compiled_starters/clojure/src/http_server/core.clj | 6 ------ solutions/clojure/01-at4/code/src/http_server/core.clj | 6 ------ .../clojure/01-at4/diff/src/http_server/core.clj.diff | 8 +------- 3 files changed, 1 insertion(+), 19 deletions(-) diff --git a/compiled_starters/clojure/src/http_server/core.clj b/compiled_starters/clojure/src/http_server/core.clj index 3129ce6..7c4f444 100644 --- a/compiled_starters/clojure/src/http_server/core.clj +++ b/compiled_starters/clojure/src/http_server/core.clj @@ -7,8 +7,6 @@ (def port 4221) -(alter-var-root #'*out* (constantly *err*)) - (defn serve [] (let [server-sock (ServerSocket. port)] (.setReuseAddress server-sock true) @@ -20,10 +18,6 @@ ;; You can use print statements as follows for debugging, they'll be visible when running tests. (println "Logs from your program will appear here!") - - (alter-var-root #'*out* (constantly (java.io.PrintWriter. System/out true))) - - ;; Uncomment this block to pass the first stage ;;(serve) diff --git a/solutions/clojure/01-at4/code/src/http_server/core.clj b/solutions/clojure/01-at4/code/src/http_server/core.clj index b3da78a..a171382 100644 --- a/solutions/clojure/01-at4/code/src/http_server/core.clj +++ b/solutions/clojure/01-at4/code/src/http_server/core.clj @@ -7,8 +7,6 @@ (def port 4221) -(alter-var-root #'*out* (constantly *err*)) - (defn serve [] (let [server-sock (ServerSocket. port)] (.setReuseAddress server-sock true) @@ -17,10 +15,6 @@ (println "accepted new connection")))) (defn -main [& args] - - (alter-var-root #'*out* (constantly (java.io.PrintWriter. System/out true))) - - (serve) ) diff --git a/solutions/clojure/01-at4/diff/src/http_server/core.clj.diff b/solutions/clojure/01-at4/diff/src/http_server/core.clj.diff index 872e105..11cbf7a 100644 --- a/solutions/clojure/01-at4/diff/src/http_server/core.clj.diff +++ b/solutions/clojure/01-at4/diff/src/http_server/core.clj.diff @@ -1,4 +1,4 @@ -@@ -1,30 +1,26 @@ +@@ -1,24 +1,20 @@ (ns http-server.core (:require [clojure.java.io :as io]) @@ -8,8 +8,6 @@ (def port 4221) - (alter-var-root #'*out* (constantly *err*)) - (defn serve [] (let [server-sock (ServerSocket. port)] (.setReuseAddress server-sock true) @@ -21,10 +19,6 @@ - ;; You can use print statements as follows for debugging, they'll be visible when running tests. - (println "Logs from your program will appear here!") - - - (alter-var-root #'*out* (constantly (java.io.PrintWriter. System/out true))) - - - ;; Uncomment this block to pass the first stage - ;;(serve) + (serve) From 46c63a4602c13760da4fb07a9d35fc07fbcc94bf Mon Sep 17 00:00:00 2001 From: Brandon Olivier Date: Mon, 9 Jun 2025 17:08:29 -0500 Subject: [PATCH 8/8] Sort list alphabetically --- course-definition.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/course-definition.yml b/course-definition.yml index 49e74b6..8f94c43 100644 --- a/course-definition.yml +++ b/course-definition.yml @@ -64,10 +64,10 @@ concept_slugs: ["network-protocols", "tcp-overview"] # The languages that your course supports. languages: - slug: "c" + - slug: "clojure" - slug: "cpp" - slug: "csharp" - slug: "dart" - - slug: "clojure" - slug: "elixir" - slug: "gleam" - slug: "go"