{"id":24084490,"url":"https://github.com/ilevd/cwp","last_synced_at":"2025-04-13T08:41:27.422Z","repository":{"id":269470999,"uuid":"885724152","full_name":"ilevd/cwp","owner":"ilevd","description":"Indentation-based syntax for Clojure","archived":false,"fork":false,"pushed_at":"2025-02-08T15:58:13.000Z","size":339,"stargazers_count":57,"open_issues_count":0,"forks_count":1,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-03-27T00:14:06.195Z","etag":null,"topics":["clojure","funcional-programming","programming-language-concepts","programming-language-design","python","syntax"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ilevd.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-11-09T08:12:50.000Z","updated_at":"2025-03-12T20:24:57.000Z","dependencies_parsed_at":"2024-12-23T20:23:59.294Z","dependency_job_id":"c49eb68a-90d9-4353-87cd-09791d4fa8dc","html_url":"https://github.com/ilevd/cwp","commit_stats":null,"previous_names":["ilevd/cwp"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ilevd%2Fcwp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ilevd%2Fcwp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ilevd%2Fcwp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ilevd%2Fcwp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ilevd","download_url":"https://codeload.github.com/ilevd/cwp/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248686694,"owners_count":21145546,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clojure","funcional-programming","programming-language-concepts","programming-language-design","python","syntax"],"created_at":"2025-01-10T00:37:17.602Z","updated_at":"2025-04-13T08:41:27.400Z","avatar_url":"https://github.com/ilevd.png","language":"Java","readme":"# cwp\n\n![alt words-count](doc/imgs/words-count.png)\n\n[![Clojars Project](https://img.shields.io/clojars/v/org.clojars.ilevd/cwp.svg)](https://clojars.org/org.clojars.ilevd/cwp)\n\nIndentation-based syntax for [Clojure](https://clojure.org/).\n\nClojure is a practical dynamic functional programming language.\nThis project provides familiar syntax, so it's easy to switch to it, from e.g. Python.\n\nFeatures:\n* Indentation-based, Python-like syntax\n* Easy to write math operations\n* In most cases separators: `,` - comma and `to`- keyword are optional\n* Readable Clojure code generation\n\nBeing just a syntax for Clojure, it provides access to Clojure features such as:\n* Functional programming - immutable data structures, higher-order functions...\n* Concurrent primitives\n* Clojure/Java (JVM) ecosystem with a lot of libraries\n\nIt's a transpiler and a [Leiningen](https://leiningen.org/) plugin.\n\n## Examples\n\nFizzBuzz\n\n```scala \ndoseq i to range(1, 101):\n  cond:\n    mod(i, 3) = 0 and mod(i, 5) = 0 to print(\"FizzBuzz\")\n    mod(i, 3) = 0 to print(\"Fizz\")\n    mod(i, 5) = 0 to print(\"Buzz\")\n    :else print(i)\n```\n\nCaesar cipher\n\n```scala \ndef encode(^String s, ^long i):\n  let sb StringBuilder.():\n    doseq c s:\n      cond:\n        int(c) \u003e= int(\\a) and int(c) \u003c= int(\\z) \n        .append(sb, char(int(\\a) + mod(int(c) - int(\\a) + i, 26)))\n        \n        int(c) \u003e= int(\\A) and int(c) \u003c= int(\\Z) \n        .append(sb, char(int(\\A) + mod(int(c) - int(\\A) + i, 26)))\n       \n        :else .append(sb, c)\n    .toString(sb)\n\ndef decode(^String s, ^long i):\n  encode(s, 26 - i)\n```\n\n\nData manipulation \n\n```scala \ndef users: [{:name to \"John\",  :age to 20}\n            {:name to \"Anna\",  :age to 32}\n            {:name to \"Smith\", :age to 27}]\n\ndef avg-age(users):\n  let ages to users |\u003e\u003e map(:age)\n                    |\u003e\u003e reduce(+):\n    ages / count(users) |\u003e double\n\ndef greetings(users):\n  let names to users |\u003e\u003e map(:name)\n                     |\u003e\u003e str/join(\", \"):\n    str(\"Hello, \", names, \"!\")\n\nprintln(avg-age(users))\nprintln(greetings(users))\n```\n\nSimple HTTP server with [http-kit](https://github.com/http-kit/http-kit),\n[Hiccup](https://github.com/weavejester/hiccup) and [Ring](https://github.com/ring-clojure/ring)\n\n```scala \nns my-project.server\n  require: [ring.middleware.params :as params]\n           [ring.middleware.keyword-params :as kparams]\n           [org.httpkit.server :refer [run-server]]\n           [hiccup2.core :as h]\n\ndef fruits: [\"Banana\", \"Apple\", \"Lemon\"]\n\ndef get-html(user):\n  [:div\n    [:p {:style {:font-weight :bold}} str(\"Hello, \", user or \"User\", \"!\")]\n    \"Fruits:\"\n    for fruit to fruits:\n      [:p {} fruit]]\n  |\u003e h/html |\u003e str\n\ndef app(req):\n {:status  200\n  :headers {\"Content-Type\" \"text/html\"}\n  :body    get-html(req |\u003e :params |\u003e :name)}\n\nrun-server(app |\u003e kparams/wrap-keyword-params \n               |\u003e params/wrap-params,\n           {:port 8080})\n```\n\nSome function from [clojure.core](https://github.com/clojure/clojure/blob/clojure-1.11.1/src/clj/clojure/core.clj#L7918)\nrewritten with CWP\n\n```scala\ndef load-data-reader-file(mappings, ^java.net.URL url):\n  with-open rdr to clojure.lang.LineNumberingPushbackReader.(\n                     java.io.InputStreamReader.(\n                       .openStream(url), \"UTF-8\")):\n    binding *file* to .getFile(url):\n      let read-opts to if .endsWith(.getPath(url), \"cljc\"):\n                         {:eof nil :read-cond :allow}\n                       else {:eof nil}\n          new-mappings to read(read-opts, rdr):\n        if not map?(new-mappings):\n          throw ex-info(str(\"Not a valid data-reader map\"), {:url url})\n        reduce(fn m, [k, v]:\n                  if not symbol?(k):\n                    throw ex-info(str(\"Invalid form in data-reader file\"),\n                                  {:url url\n                                   :form k})\n                  let v-var to data-reader-var(v):\n                    if contains?(mappings, k) and mappings(k) != v-var:\n                      throw ex-info(\"Conflicting data-reader mapping\",\n                                    {:url      url\n                                     :conflict k\n                                     :mappings m})\n                    assoc(m, k, v-var),\n               mappings,\n               new-mappings)\n```\n\n\n## Documentation\n* [Overview](doc/overview.md)\n* [Syntax and transpiling](doc/syntax-and-transpiling.md)\n\n\n## Usage\n\nAdd to `project.clj` :plugins section:\n```edn\n[org.clojars.ilevd/cwp  \"\u003cactual_version\u003e\"] \n```\n\nAdd builds info to `project.clj` root:\n```edn \n:cwp {:builds [{:in  \"src-cwp\"\n                :out \"src-out\"}]}\n```\n`:in` - folder where CWP sources are,\n`:out` - folder for generated Clojure code\n\nFiles extensions mapping:\n* `.cw` -\u003e `.clj`\n* `.cws` -\u003e `.cljs`\n* `.cwc` -\u003e `.cljc`\n\nRun: `lein cwp`\n\nAfter that you can compile Clojure code to `.jar`.\n\n\n## License\n\nCopyright © 2024 ilevd","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Filevd%2Fcwp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Filevd%2Fcwp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Filevd%2Fcwp/lists"}